/ Hex Artifact Content
Login

Artifact 6efe66a38215c38eaa7603ee5f76848159f8669d:


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 62 50 65 72 73 69 73 74 57 61 6c    u8 bPersistWal
0790: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
07a0: 65 20 74 6f 20 70 65 72 73 69 73 74 20 57 41 4c  e to persist WAL
07b0: 20 66 69 6c 65 73 20 2a 2f 0a 20 20 44 57 4f 52   files */.  DWOR
07c0: 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20  D lastErrno;    
07d0: 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f      /* The Windo
07e0: 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68  ws errno from th
07f0: 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72  e last I/O error
0800: 20 2a 2f 0a 20 20 44 57 4f 52 44 20 73 65 63 74   */.  DWORD sect
0810: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a  orSize;       /*
0820: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   Sector size of 
0830: 74 68 65 20 64 65 76 69 63 65 20 66 69 6c 65 20  the device file 
0840: 69 73 20 6f 6e 20 2a 2f 0a 20 20 77 69 6e 53 68  is on */.  winSh
0850: 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20  m *pShm;        
0860: 20 20 20 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f     /* Instance o
0870: 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  f shared memory 
0880: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
0890: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
08a0: 61 74 68 3b 20 20 20 20 20 20 2f 2a 20 46 75 6c  ath;      /* Ful
08b0: 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
08c0: 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  is file */.  int
08d0: 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20   szChunk;       
08e0: 20 20 20 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69       /* Chunk si
08f0: 7a 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79  ze configured by
0900: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
0910: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
0920: 4f 53 5f 57 49 4e 43 45 0a 20 20 4c 50 57 53 54  OS_WINCE.  LPWST
0930: 52 20 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  R zDeleteOnClose
0940: 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69  ;  /* Name of fi
0950: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 77 68 65  le to delete whe
0960: 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 48  n closing */.  H
0970: 41 4e 44 4c 45 20 68 4d 75 74 65 78 3b 20 20 20  ANDLE hMutex;   
0980: 20 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20         /* Mutex 
0990: 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  used to control 
09a0: 61 63 63 65 73 73 20 74 6f 20 73 68 61 72 65 64  access to shared
09b0: 20 6c 6f 63 6b 20 2a 2f 20 20 0a 20 20 48 41 4e   lock */  .  HAN
09c0: 44 4c 45 20 68 53 68 61 72 65 64 3b 20 20 20 20  DLE hShared;    
09d0: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d       /* Shared m
09e0: 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 75 73  emory segment us
09f0: 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a  ed for locking *
0a00: 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f  /.  winceLock lo
0a10: 63 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  cal;        /* L
0a20: 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 62 79  ocks obtained by
0a30: 20 74 68 69 73 20 69 6e 73 74 61 6e 63 65 20 6f   this instance o
0a40: 66 20 77 69 6e 46 69 6c 65 20 2a 2f 0a 20 20 77  f winFile */.  w
0a50: 69 6e 63 65 4c 6f 63 6b 20 2a 73 68 61 72 65 64  inceLock *shared
0a60: 3b 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c  ;      /* Global
0a70: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6d 65 6d   shared lock mem
0a80: 6f 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ory for the file
0a90: 20 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a    */.#endif.};..
0aa0: 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65  /*. * If compile
0ab0: 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 57 49  d with SQLITE_WI
0ac0: 4e 33 32 5f 4d 41 4c 4c 4f 43 20 6f 6e 20 57 69  N32_MALLOC on Wi
0ad0: 6e 64 6f 77 73 2c 20 77 65 20 77 69 6c 6c 20 75  ndows, we will u
0ae0: 73 65 20 74 68 65 0a 20 2a 20 76 61 72 69 6f 75  se the. * variou
0af0: 73 20 57 69 6e 33 32 20 41 50 49 20 68 65 61 70  s Win32 API heap
0b00: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 73 74 65   functions inste
0b10: 61 64 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 20  ad of our own.. 
0b20: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0b30: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a  _WIN32_MALLOC./*
0b40: 0a 20 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20  . * The initial 
0b50: 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33  size of the Win3
0b60: 32 2d 73 70 65 63 69 66 69 63 20 68 65 61 70 2e  2-specific heap.
0b70: 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79    This value may
0b80: 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69   be zero.. */.#i
0b90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
0ba0: 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a  32_HEAP_INIT_SIZ
0bb0: 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  E.#  define SQLI
0bc0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e  TE_WIN32_HEAP_IN
0bd0: 49 54 5f 53 49 5a 45 20 28 28 53 51 4c 49 54 45  IT_SIZE ((SQLITE
0be0: 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53  _DEFAULT_CACHE_S
0bf0: 49 5a 45 29 20 2a 20 5c 0a 20 20 20 20 20 20 20  IZE) * \.       
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
0c30: 50 41 47 45 5f 53 49 5a 45 29 20 2b 20 34 31 39  PAGE_SIZE) + 419
0c40: 34 33 30 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  4304).#endif../*
0c50: 0a 20 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  . * The maximum 
0c60: 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33  size of the Win3
0c70: 32 2d 73 70 65 63 69 66 69 63 20 68 65 61 70 2e  2-specific heap.
0c80: 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79    This value may
0c90: 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69   be zero.. */.#i
0ca0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
0cb0: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45  32_HEAP_MAX_SIZE
0cc0: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
0cd0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58  E_WIN32_HEAP_MAX
0ce0: 5f 53 49 5a 45 20 20 28 30 29 0a 23 65 6e 64 69  _SIZE  (0).#endi
0cf0: 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 65 78 74  f../*. * The ext
0d00: 72 61 20 66 6c 61 67 73 20 74 6f 20 75 73 65 20  ra flags to use 
0d10: 69 6e 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20  in calls to the 
0d20: 57 69 6e 33 32 20 68 65 61 70 20 41 50 49 73 2e  Win32 heap APIs.
0d30: 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79    This value may
0d40: 20 62 65 0a 20 2a 20 7a 65 72 6f 20 66 6f 72 20   be. * zero for 
0d50: 74 68 65 20 64 65 66 61 75 6c 74 20 62 65 68 61  the default beha
0d60: 76 69 6f 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65  vior.. */.#ifnde
0d70: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
0d80: 45 41 50 5f 46 4c 41 47 53 0a 23 20 20 64 65 66  EAP_FLAGS.#  def
0d90: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
0da0: 5f 48 45 41 50 5f 46 4c 41 47 53 20 20 20 20 20  _HEAP_FLAGS     
0db0: 28 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (0).#endif../*.*
0dc0: 2a 20 54 68 65 20 77 69 6e 4d 65 6d 44 61 74 61  * The winMemData
0dd0: 20 73 74 72 75 63 74 75 72 65 20 73 74 6f 72 65   structure store
0de0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65  s information re
0df0: 71 75 69 72 65 64 20 62 79 20 74 68 65 20 57 69  quired by the Wi
0e00: 6e 33 32 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20  n32-specific.** 
0e10: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
0e20: 6f 64 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ods implementati
0e30: 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  on..*/.typedef s
0e40: 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61  truct winMemData
0e50: 20 77 69 6e 4d 65 6d 44 61 74 61 3b 0a 73 74 72   winMemData;.str
0e60: 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 7b  uct winMemData {
0e70: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
0e80: 20 20 75 33 32 20 6d 61 67 69 63 3b 20 20 20 20    u32 magic;    
0e90: 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20  /* Magic number 
0ea0: 74 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74  to detect struct
0eb0: 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ure corruption. 
0ec0: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 48 41 4e 44  */.#endif.  HAND
0ed0: 4c 45 20 68 48 65 61 70 3b 20 2f 2a 20 54 68 65  LE hHeap; /* The
0ee0: 20 68 61 6e 64 6c 65 20 74 6f 20 6f 75 72 20 68   handle to our h
0ef0: 65 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  eap. */.  BOOL b
0f00: 4f 77 6e 65 64 3b 20 20 2f 2a 20 44 6f 20 77 65  Owned;  /* Do we
0f10: 20 6f 77 6e 20 74 68 65 20 68 65 61 70 20 28 69   own the heap (i
0f20: 2e 65 2e 20 64 65 73 74 72 6f 79 20 69 74 20 6f  .e. destroy it o
0f30: 6e 20 73 68 75 74 64 6f 77 6e 29 3f 20 2a 2f 0a  n shutdown)? */.
0f40: 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  };..#ifndef NDEB
0f50: 55 47 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45  UG.#define WINME
0f60: 4d 5f 4d 41 47 49 43 20 20 20 20 20 30 78 34 32  M_MAGIC     0x42
0f70: 62 32 38 33 30 62 0a 23 65 6e 64 69 66 0a 0a 73  b2830b.#endif..s
0f80: 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e  tatic struct win
0f90: 4d 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65 6d 5f  MemData win_mem_
0fa0: 64 61 74 61 20 3d 20 7b 0a 23 69 66 6e 64 65 66  data = {.#ifndef
0fb0: 20 4e 44 45 42 55 47 0a 20 20 57 49 4e 4d 45 4d   NDEBUG.  WINMEM
0fc0: 5f 4d 41 47 49 43 2c 0a 23 65 6e 64 69 66 0a 20  _MAGIC,.#endif. 
0fd0: 20 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a 7d 3b 0a   NULL, FALSE.};.
0fe0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
0ff0: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73  #define winMemAs
1000: 73 65 72 74 4d 61 67 69 63 28 29 20 61 73 73 65  sertMagic() asse
1010: 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61  rt( win_mem_data
1020: 2e 6d 61 67 69 63 3d 3d 57 49 4e 4d 45 4d 5f 4d  .magic==WINMEM_M
1030: 41 47 49 43 20 29 0a 23 65 6c 73 65 0a 23 64 65  AGIC ).#else.#de
1040: 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72  fine winMemAsser
1050: 74 4d 61 67 69 63 28 29 0a 23 65 6e 64 69 66 0a  tMagic().#endif.
1060: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47  .#define winMemG
1070: 65 74 48 65 61 70 28 29 20 77 69 6e 5f 6d 65 6d  etHeap() win_mem
1080: 5f 64 61 74 61 2e 68 48 65 61 70 0a 0a 73 74 61  _data.hHeap..sta
1090: 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d  tic void *winMem
10a0: 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65  Malloc(int nByte
10b0: 73 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  s);.static void 
10c0: 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20  winMemFree(void 
10d0: 2a 70 50 72 69 6f 72 29 3b 0a 73 74 61 74 69 63  *pPrior);.static
10e0: 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61   void *winMemRea
10f0: 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f  lloc(void *pPrio
1100: 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a  r, int nBytes);.
1110: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
1120: 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 3b 0a  mSize(void *p);.
1130: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
1140: 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 3b  mRoundup(int n);
1150: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
1160: 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70  emInit(void *pAp
1170: 70 44 61 74 61 29 3b 0a 73 74 61 74 69 63 20 76  pData);.static v
1180: 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f  oid winMemShutdo
1190: 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74  wn(void *pAppDat
11a0: 61 29 3b 0a 0a 63 6f 6e 73 74 20 73 71 6c 69 74  a);..const sqlit
11b0: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a  e3_mem_methods *
11c0: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e  sqlite3MemGetWin
11d0: 33 32 28 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66  32(void);.#endif
11e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   /* SQLITE_WIN32
11f0: 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a  _MALLOC */../*.*
1200: 2a 20 46 6f 72 77 61 72 64 20 70 72 6f 74 6f 74  * Forward protot
1210: 79 70 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ypes..*/.static 
1220: 69 6e 74 20 67 65 74 53 65 63 74 6f 72 53 69 7a  int getSectorSiz
1230: 65 28 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  e(.    sqlite3_v
1240: 66 73 20 2a 70 56 66 73 2c 0a 20 20 20 20 63 6f  fs *pVfs,.    co
1250: 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74  nst char *zRelat
1260: 69 76 65 20 20 20 20 20 2f 2a 20 55 54 46 2d 38  ive     /* UTF-8
1270: 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 29 3b   file name */.);
1280: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
1290: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69  owing variable i
12a0: 73 20 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65 74  s (normally) set
12b0: 20 6f 6e 63 65 20 61 6e 64 20 6e 65 76 65 72 20   once and never 
12c0: 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72 65  changes.** there
12d0: 61 66 74 65 72 2e 20 20 49 74 20 72 65 63 6f 72  after.  It recor
12e0: 64 73 20 77 68 65 74 68 65 72 20 74 68 65 20 6f  ds whether the o
12f0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
1300: 69 73 20 57 69 6e 39 78 0a 2a 2a 20 6f 72 20 57  is Win9x.** or W
1310: 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20  inNT..**.** 0:  
1320: 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   Operating syste
1330: 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a  m unknown..** 1:
1340: 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73     Operating sys
1350: 74 65 6d 20 69 73 20 57 69 6e 39 78 2e 0a 2a 2a  tem is Win9x..**
1360: 20 32 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20   2:   Operating 
1370: 73 79 73 74 65 6d 20 69 73 20 57 69 6e 4e 54 2e  system is WinNT.
1380: 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20  .**.** In order 
1390: 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 65  to facilitate te
13a0: 73 74 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e 54  sting on a WinNT
13b0: 20 73 79 73 74 65 6d 2c 20 74 68 65 20 74 65 73   system, the tes
13c0: 74 20 66 69 78 74 75 72 65 0a 2a 2a 20 63 61 6e  t fixture.** can
13d0: 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20 74 68   manually set th
13e0: 69 73 20 76 61 6c 75 65 20 74 6f 20 31 20 74 6f  is value to 1 to
13f0: 20 65 6d 75 6c 61 74 65 20 57 69 6e 39 38 20 62   emulate Win98 b
1400: 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66 64  ehavior..*/.#ifd
1410: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
1420: 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  nt sqlite3_os_ty
1430: 70 65 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  pe = 0;.#else.st
1440: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
1450: 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65  _os_type = 0;.#e
1460: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79  ndif../*.** Many
1470: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72   system calls ar
1480: 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f 75  e accessed throu
1490: 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75  gh pointer-to-fu
14a0: 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a  nctions so that.
14b0: 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f  ** they may be o
14c0: 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e  verridden at run
14d0: 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61  time to facilita
14e0: 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69  te fault injecti
14f0: 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73  on during.** tes
1500: 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78  ting and sandbox
1510: 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ing.  The follow
1520: 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20  ing array holds 
1530: 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f  the names and po
1540: 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c  inters.** to all
1550: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
1560: 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 23  stem calls..*/.#
1570: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
1580: 4e 43 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  NCE.#  define SQ
1590: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
15a0: 4e 53 49 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  NSI.#endif..#if 
15b0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
15c0: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  || defined(_WIN3
15d0: 32 5f 57 49 4e 4e 54 29 0a 23 20 20 64 65 66 69  2_WINNT).#  defi
15e0: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
15f0: 48 41 53 5f 57 49 44 45 0a 23 65 6e 64 69 66 0a  HAS_WIDE.#endif.
1600: 0a 23 69 66 6e 64 65 66 20 53 59 53 43 41 4c 4c  .#ifndef SYSCALL
1610: 0a 23 20 20 64 65 66 69 6e 65 20 53 59 53 43 41  .#  define SYSCA
1620: 4c 4c 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  LL sqlite3_sysca
1630: 6c 6c 5f 70 74 72 0a 23 65 6e 64 69 66 0a 0a 23  ll_ptr.#endif..#
1640: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1650: 43 45 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 6d  CE./*.** These m
1660: 61 63 72 6f 73 20 61 72 65 20 6e 65 63 65 73 73  acros are necess
1670: 61 72 79 20 62 65 63 61 75 73 65 20 57 69 6e 64  ary because Wind
1680: 6f 77 73 20 43 45 20 64 6f 65 73 20 6e 6f 74 20  ows CE does not 
1690: 6e 61 74 69 76 65 6c 79 20 73 75 70 70 6f 72 74  natively support
16a0: 20 74 68 65 0a 2a 2a 20 57 69 6e 33 32 20 41 50   the.** Win32 AP
16b0: 49 73 20 4c 6f 63 6b 46 69 6c 65 2c 20 55 6e 6c  Is LockFile, Unl
16c0: 6f 63 6b 46 69 6c 65 2c 20 61 6e 64 20 4c 6f 63  ockFile, and Loc
16d0: 6b 46 69 6c 65 45 78 2e 0a 20 2a 2f 0a 0a 23 20  kFileEx.. */..# 
16e0: 20 64 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65   define LockFile
16f0: 28 61 2c 62 2c 63 2c 64 2c 65 29 20 20 20 20 20  (a,b,c,d,e)     
1700: 20 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28    winceLockFile(
1710: 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a  &a, b, c, d, e).
1720: 23 20 20 64 65 66 69 6e 65 20 55 6e 6c 6f 63 6b  #  define Unlock
1730: 46 69 6c 65 28 61 2c 62 2c 63 2c 64 2c 65 29 20  File(a,b,c,d,e) 
1740: 20 20 20 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46      winceUnlockF
1750: 69 6c 65 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c  ile(&a, b, c, d,
1760: 20 65 29 0a 23 20 20 64 65 66 69 6e 65 20 4c 6f   e).#  define Lo
1770: 63 6b 46 69 6c 65 45 78 28 61 2c 62 2c 63 2c 64  ckFileEx(a,b,c,d
1780: 2c 65 2c 66 29 20 20 20 77 69 6e 63 65 4c 6f 63  ,e,f)   winceLoc
1790: 6b 46 69 6c 65 45 78 28 26 61 2c 20 62 2c 20 63  kFileEx(&a, b, c
17a0: 2c 20 64 2c 20 65 2c 20 66 29 0a 0a 2f 2a 0a 2a  , d, e, f)../*.*
17b0: 2a 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20  * These are the 
17c0: 73 70 65 63 69 61 6c 20 73 79 73 63 61 6c 6c 20  special syscall 
17d0: 68 61 63 6b 73 20 66 6f 72 20 57 69 6e 64 6f 77  hacks for Window
17e0: 73 20 43 45 2e 20 20 54 68 65 20 6c 6f 63 6b 69  s CE.  The locki
17f0: 6e 67 20 72 65 6c 61 74 65 64 0a 2a 2a 20 64 65  ng related.** de
1800: 66 69 6e 65 73 20 68 65 72 65 20 72 65 66 65 72  fines here refer
1810: 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 73 20 64   to the macros d
1820: 65 66 69 6e 65 64 20 6a 75 73 74 20 61 62 6f 76  efined just abov
1830: 65 2e 0a 20 2a 2f 0a 0a 23 20 20 64 65 66 69 6e  e.. */..#  defin
1840: 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41  e osAreFileApisA
1850: 4e 53 49 28 29 20 20 20 20 20 20 20 31 0a 23 20  NSI()       1.# 
1860: 20 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69   define osLockFi
1870: 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  le              
1880: 20 20 4c 6f 63 6b 46 69 6c 65 0a 23 20 20 64 65    LockFile.#  de
1890: 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c  fine osUnlockFil
18a0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55  e              U
18b0: 6e 6c 6f 63 6b 46 69 6c 65 0a 23 20 20 64 65 66  nlockFile.#  def
18c0: 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78  ine osLockFileEx
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 6f                Lo
18e0: 63 6b 46 69 6c 65 45 78 0a 23 65 6e 64 69 66 0a  ckFileEx.#endif.
18f0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 77  .static struct w
1900: 69 6e 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63  in_syscall {.  c
1910: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1920: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1930: 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 74 65  Name of the syte
1940: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
1950: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
1960: 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72  pCurrent; /* Cur
1970: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
1980: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
1990: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
19a0: 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b  ll_ptr pDefault;
19b0: 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75   /* Default valu
19c0: 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b  e */.} aSyscall[
19d0: 5d 20 3d 20 7b 0a 23 69 66 20 21 53 51 4c 49 54  ] = {.#if !SQLIT
19e0: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22  E_OS_WINCE.  { "
19f0: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 22  AreFileApisANSI"
1a00: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
1a10: 4c 4c 29 41 72 65 46 69 6c 65 41 70 69 73 41 4e  LL)AreFileApisAN
1a20: 53 49 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c  SI,         0 },
1a30: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 41 72 65 46  ..#define osAreF
1a40: 69 6c 65 41 70 69 73 41 4e 53 49 20 28 28 42 4f  ileApisANSI ((BO
1a50: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44  OL(WINAPI*)(VOID
1a60: 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43  ))aSyscall[0].pC
1a70: 75 72 72 65 6e 74 29 0a 23 65 6c 73 65 0a 20 20  urrent).#else.  
1a80: 7b 20 22 41 72 65 46 69 6c 65 41 70 69 73 41 4e  { "AreFileApisAN
1a90: 53 49 22 2c 20 20 20 20 20 20 20 20 20 28 53 59  SI",         (SY
1aa0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
1ac0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20   },.#endif..#if 
1ad0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
1ae0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
1af0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
1b00: 29 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72  ).  { "CharLower
1b10: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
1b20: 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72 4c 6f   (SYSCALL)CharLo
1b30: 77 65 72 57 2c 20 20 20 20 20 20 20 20 20 20 20  werW,           
1b40: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
1b50: 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20  { "CharLowerW", 
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
1b70: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
1b90: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
1ba0: 69 6e 65 20 6f 73 43 68 61 72 4c 6f 77 65 72 57  ine osCharLowerW
1bb0: 20 28 28 4c 50 57 53 54 52 28 57 49 4e 41 50 49   ((LPWSTR(WINAPI
1bc0: 2a 29 28 4c 50 57 53 54 52 29 29 61 53 79 73 63  *)(LPWSTR))aSysc
1bd0: 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29  all[1].pCurrent)
1be0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
1bf0: 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64  WINCE && defined
1c00: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
1c10: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61  S_WIDE).  { "Cha
1c20: 72 55 70 70 65 72 57 22 2c 20 20 20 20 20 20 20  rUpperW",       
1c30: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
1c40: 43 68 61 72 55 70 70 65 72 57 2c 20 20 20 20 20  CharUpperW,     
1c50: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
1c60: 6c 73 65 0a 20 20 7b 20 22 43 68 61 72 55 70 70  lse.  { "CharUpp
1c70: 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  erW",           
1c80: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
1cb0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72  ..#define osChar
1cc0: 55 70 70 65 72 57 20 28 28 4c 50 57 53 54 52 28  UpperW ((LPWSTR(
1cd0: 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29  WINAPI*)(LPWSTR)
1ce0: 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75  )aSyscall[2].pCu
1cf0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 43 6c 6f  rrent)..  { "Clo
1d00: 73 65 48 61 6e 64 6c 65 22 2c 20 20 20 20 20 20  seHandle",      
1d10: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
1d20: 43 6c 6f 73 65 48 61 6e 64 6c 65 2c 20 20 20 20  CloseHandle,    
1d30: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
1d40: 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 48 61  define osCloseHa
1d50: 6e 64 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  ndle ((BOOL(WINA
1d60: 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79  PI*)(HANDLE))aSy
1d70: 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e  scall[3].pCurren
1d80: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
1d90: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
1da0: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 43 72 65 61  _ANSI).  { "Crea
1db0: 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20  teFileA",       
1dc0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
1dd0: 72 65 61 74 65 46 69 6c 65 41 2c 20 20 20 20 20  reateFileA,     
1de0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
1df0: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  se.  { "CreateFi
1e00: 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  leA",           
1e10: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e30: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
1e40: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
1e50: 65 46 69 6c 65 41 20 28 28 48 41 4e 44 4c 45 28  eFileA ((HANDLE(
1e60: 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c  WINAPI*)(LPCSTR,
1e70: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
1e80: 20 20 20 20 20 20 20 4c 50 53 45 43 55 52 49 54         LPSECURIT
1e90: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f  Y_ATTRIBUTES,DWO
1ea0: 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29  RD,DWORD,HANDLE)
1eb0: 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75  )aSyscall[4].pCu
1ec0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
1ed0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
1ee0: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
1ef0: 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20  CreateFileW",   
1f00: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
1f10: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 57 2c 20  LL)CreateFileW, 
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
1f30: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
1f40: 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20  teFileW",       
1f50: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
1f60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f70: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
1f80: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
1f90: 72 65 61 74 65 46 69 6c 65 57 20 28 28 48 41 4e  reateFileW ((HAN
1fa0: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  DLE(WINAPI*)(LPC
1fb0: 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WSTR,DWORD,DWORD
1fc0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45  , \.        LPSE
1fd0: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
1fe0: 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41  S,DWORD,DWORD,HA
1ff0: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35  NDLE))aSyscall[5
2000: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
2010: 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70   "CreateFileMapp
2020: 69 6e 67 22 2c 20 20 20 20 20 20 20 28 53 59 53  ing",       (SYS
2030: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d  CALL)CreateFileM
2040: 61 70 70 69 6e 67 2c 20 20 20 20 20 20 20 30 20  apping,       0 
2050: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72  },..#define osCr
2060: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 20  eateFileMapping 
2070: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
2080: 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52  )(HANDLE,LPSECUR
2090: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20  ITY_ATTRIBUTES, 
20a0: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
20b0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 54  DWORD,DWORD,LPCT
20c0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d  STR))aSyscall[6]
20d0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
20e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
20f0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
2100: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61   { "CreateFileMa
2110: 70 70 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53  ppingW",      (S
2120: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c  YSCALL)CreateFil
2130: 65 4d 61 70 70 69 6e 67 57 2c 20 20 20 20 20 20  eMappingW,      
2140: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
2150: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
2160: 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gW",      (SYSCA
2170: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
2180: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
2190: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
21a0: 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
21b0: 70 69 6e 67 57 20 28 28 48 41 4e 44 4c 45 28 57  pingW ((HANDLE(W
21c0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
21d0: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
21e0: 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20  UTES, \.        
21f0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
2200: 44 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73 63  D,LPCWSTR))aSysc
2210: 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29  all[7].pCurrent)
2220: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
2230: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
2240: 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65  IDE).  { "Create
2250: 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20 20 20  MutexW",        
2260: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
2270: 61 74 65 4d 75 74 65 78 57 2c 20 20 20 20 20 20  ateMutexW,      
2280: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
2290: 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65  .  { "CreateMute
22a0: 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  xW",            
22b0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
22e0: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 4d  define osCreateM
22f0: 75 74 65 78 57 20 28 28 48 41 4e 44 4c 45 28 57  utexW ((HANDLE(W
2300: 49 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49  INAPI*)(LPSECURI
2310: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 42 4f  TY_ATTRIBUTES,BO
2320: 4f 4c 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  OL, \.        LP
2330: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
2340: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
2350: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
2360: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
2370: 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65  .  { "DeleteFile
2380: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  A",             
2390: 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46  (SYSCALL)DeleteF
23a0: 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20 20  ileA,           
23b0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
23c0: 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20   "DeleteFileA", 
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
23e0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
2400: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
2410: 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41  ne osDeleteFileA
2420: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
2430: 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c  (LPCSTR))aSyscal
2440: 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[9].pCurrent)..
2450: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
2460: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
2470: 45 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69  E).  { "DeleteFi
2480: 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  leW",           
2490: 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74    (SYSCALL)Delet
24a0: 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20  eFileW,         
24b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
24c0: 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22   { "DeleteFileW"
24d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
24e0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2500: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
2510: 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c  fine osDeleteFil
2520: 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  eW ((BOOL(WINAPI
2530: 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73  *)(LPCWSTR))aSys
2540: 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e  call[10].pCurren
2550: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
2560: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c  S_WINCE.  { "Fil
2570: 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65  eTimeToLocalFile
2580: 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29  Time", (SYSCALL)
2590: 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46  FileTimeToLocalF
25a0: 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65  ileTime, 0 },.#e
25b0: 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d  lse.  { "FileTim
25c0: 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65  eToLocalFileTime
25d0: 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20  ", (SYSCALL)0,  
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
2600: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65  ..#define osFile
2610: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
2620: 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ime ((BOOL(WINAP
2630: 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49  I*)(CONST FILETI
2640: 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ME*, \.        L
2650: 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63  PFILETIME))aSysc
2660: 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74  all[11].pCurrent
2670: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
2680: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65  _WINCE.  { "File
2690: 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65  TimeToSystemTime
26a0: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46  ",    (SYSCALL)F
26b0: 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54  ileTimeToSystemT
26c0: 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ime,    0 },.#el
26d0: 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65  se.  { "FileTime
26e0: 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20  ToSystemTime",  
26f0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2710: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
2720: 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54  .#define osFileT
2730: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 20  imeToSystemTime 
2740: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
2750: 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c  CONST FILETIME*,
2760: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59 53   \.        LPSYS
2770: 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c  TEMTIME))aSyscal
2780: 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[12].pCurrent).
2790: 0a 20 20 7b 20 22 46 6c 75 73 68 46 69 6c 65 42  .  { "FlushFileB
27a0: 75 66 66 65 72 73 22 2c 20 20 20 20 20 20 20 20  uffers",        
27b0: 28 53 59 53 43 41 4c 4c 29 46 6c 75 73 68 46 69  (SYSCALL)FlushFi
27c0: 6c 65 42 75 66 66 65 72 73 2c 20 20 20 20 20 20  leBuffers,      
27d0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
27e0: 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65  osFlushFileBuffe
27f0: 72 73 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  rs ((BOOL(WINAPI
2800: 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63  *)(HANDLE))aSysc
2810: 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74  all[13].pCurrent
2820: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
2830: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2840: 41 4e 53 49 29 0a 20 20 7b 20 22 46 6f 72 6d 61  ANSI).  { "Forma
2850: 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20 20  tMessageA",     
2860: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f       (SYSCALL)Fo
2870: 72 6d 61 74 4d 65 73 73 61 67 65 41 2c 20 20 20  rmatMessageA,   
2880: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
2890: 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73  e.  { "FormatMes
28a0: 73 61 67 65 41 22 2c 20 20 20 20 20 20 20 20 20  sageA",         
28b0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
28e0: 23 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74  #define osFormat
28f0: 4d 65 73 73 61 67 65 41 20 28 28 44 57 4f 52 44  MessageA ((DWORD
2900: 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c  (WINAPI*)(DWORD,
2910: 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57  LPCVOID,DWORD,DW
2920: 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20  ORD,LPSTR, \.   
2930: 20 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69       DWORD,va_li
2940: 73 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 34  st*))aSyscall[14
2950: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
2960: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2970: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
2980: 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61    { "FormatMessa
2990: 67 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 28  geW",          (
29a0: 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65  SYSCALL)FormatMe
29b0: 73 73 61 67 65 57 2c 20 20 20 20 20 20 20 20 20  ssageW,         
29c0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
29d0: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22  "FormatMessageW"
29e0: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
29f0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
2a10: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
2a20: 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  e osFormatMessag
2a30: 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eW ((DWORD(WINAP
2a40: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49  I*)(DWORD,LPCVOI
2a50: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
2a60: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
2a70: 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29  DWORD,va_list*))
2a80: 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75  aSyscall[15].pCu
2a90: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 46 72 65  rrent)..  { "Fre
2aa0: 65 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 20  eLibrary",      
2ab0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
2ac0: 46 72 65 65 4c 69 62 72 61 72 79 2c 20 20 20 20  FreeLibrary,    
2ad0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
2ae0: 64 65 66 69 6e 65 20 6f 73 46 72 65 65 4c 69 62  define osFreeLib
2af0: 72 61 72 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41  rary ((BOOL(WINA
2b00: 50 49 2a 29 28 48 4d 4f 44 55 4c 45 29 29 61 53  PI*)(HMODULE))aS
2b10: 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72  yscall[16].pCurr
2b20: 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 43 75  ent)..  { "GetCu
2b30: 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 22 2c  rrentProcessId",
2b40: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
2b50: 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
2b60: 64 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65  d,     0 },..#de
2b70: 66 69 6e 65 20 6f 73 47 65 74 43 75 72 72 65 6e  fine osGetCurren
2b80: 74 50 72 6f 63 65 73 73 49 64 20 28 28 44 57 4f  tProcessId ((DWO
2b90: 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44  RD(WINAPI*)(VOID
2ba0: 29 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70  ))aSyscall[17].p
2bb0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
2bc0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
2bd0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
2be0: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
2bf0: 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65  .  { "GetDiskFre
2c00: 65 53 70 61 63 65 41 22 2c 20 20 20 20 20 20 20  eSpaceA",       
2c10: 28 53 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b  (SYSCALL)GetDisk
2c20: 46 72 65 65 53 70 61 63 65 41 2c 20 20 20 20 20  FreeSpaceA,     
2c30: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
2c40: 20 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61   "GetDiskFreeSpa
2c50: 63 65 41 22 2c 20 20 20 20 20 20 20 28 53 59 53  ceA",       (SYS
2c60: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
2c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
2c80: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
2c90: 6e 65 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65  ne osGetDiskFree
2ca0: 53 70 61 63 65 41 20 28 28 42 4f 4f 4c 28 57 49  SpaceA ((BOOL(WI
2cb0: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 4c 50  NAPI*)(LPCSTR,LP
2cc0: 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50  DWORD,LPDWORD,LP
2cd0: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
2ce0: 20 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63 61   LPDWORD))aSysca
2cf0: 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74 29  ll[18].pCurrent)
2d00: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
2d10: 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65  _WINCE && define
2d20: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
2d30: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65  AS_WIDE).  { "Ge
2d40: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 22  tDiskFreeSpaceW"
2d50: 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ,       (SYSCALL
2d60: 29 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  )GetDiskFreeSpac
2d70: 65 57 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  eW,       0 },.#
2d80: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73  else.  { "GetDis
2d90: 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20 20 20  kFreeSpaceW",   
2da0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
2db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
2dd0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
2de0: 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 20 28  DiskFreeSpaceW (
2df0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
2e00: 50 43 57 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c  PCWSTR,LPDWORD,L
2e10: 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20  PDWORD,LPDWORD, 
2e20: 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52  \.        LPDWOR
2e30: 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e  D))aSyscall[19].
2e40: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
2e50: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
2e60: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
2e70: 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62  { "GetFileAttrib
2e80: 75 74 65 73 41 22 2c 20 20 20 20 20 20 28 53 59  utesA",      (SY
2e90: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74  SCALL)GetFileAtt
2ea0: 72 69 62 75 74 65 73 41 2c 20 20 20 20 20 20 30  ributesA,      0
2eb0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
2ec0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
2ed0: 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  A",      (SYSCAL
2ee0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
2ef0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2f00: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
2f10: 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
2f20: 74 65 73 41 20 28 28 44 57 4f 52 44 28 57 49 4e  tesA ((DWORD(WIN
2f30: 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53  API*)(LPCSTR))aS
2f40: 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72  yscall[20].pCurr
2f50: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
2f60: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
2f70: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65  AS_WIDE).  { "Ge
2f80: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
2f90: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
2fa0: 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  )GetFileAttribut
2fb0: 65 73 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  esW,      0 },.#
2fc0: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c  else.  { "GetFil
2fd0: 65 41 74 74 72 69 62 75 74 65 73 57 22 2c 20 20  eAttributesW",  
2fe0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3010: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
3020: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 20  FileAttributesW 
3030: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
3040: 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  (LPCWSTR))aSysca
3050: 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[21].pCurrent)
3060: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
3070: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
3080: 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c  IDE).  { "GetFil
3090: 65 41 74 74 72 69 62 75 74 65 73 45 78 57 22 2c  eAttributesExW",
30a0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
30b0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
30c0: 57 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  W,    0 },.#else
30d0: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74  .  { "GetFileAtt
30e0: 72 69 62 75 74 65 73 45 78 57 22 2c 20 20 20 20  ributesExW",    
30f0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3110: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3120: 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65  define osGetFile
3130: 41 74 74 72 69 62 75 74 65 73 45 78 57 20 28 28  AttributesExW ((
3140: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
3150: 43 57 53 54 52 2c 47 45 54 5f 46 49 4c 45 45 58  CWSTR,GET_FILEEX
3160: 5f 49 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c 0a  _INFO_LEVELS, \.
3170: 20 20 20 20 20 20 20 20 4c 50 56 4f 49 44 29 29          LPVOID))
3180: 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75  aSyscall[22].pCu
3190: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74  rrent)..  { "Get
31a0: 46 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20 20  FileSize",      
31b0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
31c0: 47 65 74 46 69 6c 65 53 69 7a 65 2c 20 20 20 20  GetFileSize,    
31d0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
31e0: 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65  define osGetFile
31f0: 53 69 7a 65 20 28 28 44 57 4f 52 44 28 57 49 4e  Size ((DWORD(WIN
3200: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 44  API*)(HANDLE,LPD
3210: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 32  WORD))aSyscall[2
3220: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
3230: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
3240: 43 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  CE && defined(SQ
3250: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
3260: 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 46 75 6c  NSI).  { "GetFul
3270: 6c 50 61 74 68 4e 61 6d 65 41 22 2c 20 20 20 20  lPathNameA",    
3280: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
3290: 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 2c 20 20  FullPathNameA,  
32a0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
32b0: 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74  .  { "GetFullPat
32c0: 68 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20  hNameA",        
32d0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
32e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3300: 64 65 66 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c  define osGetFull
3310: 50 61 74 68 4e 61 6d 65 41 20 28 28 44 57 4f 52  PathNameA ((DWOR
3320: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  D(WINAPI*)(LPCST
3330: 52 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c  R,DWORD,LPSTR, \
3340: 0a 20 20 20 20 20 20 20 20 4c 50 53 54 52 2a 29  .        LPSTR*)
3350: 29 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43  )aSyscall[24].pC
3360: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
3370: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
3380: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3390: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
33a0: 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68    { "GetFullPath
33b0: 4e 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28  NameW",        (
33c0: 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50  SYSCALL)GetFullP
33d0: 61 74 68 4e 61 6d 65 57 2c 20 20 20 20 20 20 20  athNameW,       
33e0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
33f0: 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  "GetFullPathName
3400: 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  W",        (SYSC
3410: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3430: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
3440: 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e  e osGetFullPathN
3450: 61 6d 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e  ameW ((DWORD(WIN
3460: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57  API*)(LPCWSTR,DW
3470: 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20  ORD,LPWSTR, \.  
3480: 20 20 20 20 20 20 4c 50 57 53 54 52 2a 29 29 61        LPWSTR*))a
3490: 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72  Syscall[25].pCur
34a0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 4c  rent)..  { "GetL
34b0: 61 73 74 45 72 72 6f 72 22 2c 20 20 20 20 20 20  astError",      
34c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
34d0: 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20  etLastError,    
34e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
34f0: 65 66 69 6e 65 20 6f 73 47 65 74 4c 61 73 74 45  efine osGetLastE
3500: 72 72 6f 72 20 28 28 44 57 4f 52 44 28 57 49 4e  rror ((DWORD(WIN
3510: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
3520: 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e  call[26].pCurren
3530: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
3540: 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 20 54 68 65  S_WINCE.  /* The
3550: 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41   GetProcAddressA
3560: 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  () routine is on
3570: 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
3580: 57 69 6e 64 6f 77 73 20 43 45 2e 20 2a 2f 0a 20  Windows CE. */. 
3590: 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65   { "GetProcAddre
35a0: 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53  ssA",         (S
35b0: 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41 64  YSCALL)GetProcAd
35c0: 64 72 65 73 73 41 2c 20 20 20 20 20 20 20 20 20  dressA,         
35d0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 2f 2a 20  0 },.#else.  /* 
35e0: 41 6c 6c 20 6f 74 68 65 72 20 57 69 6e 64 6f 77  All other Window
35f0: 73 20 70 6c 61 74 66 6f 72 6d 73 20 65 78 70 65  s platforms expe
3600: 63 74 20 47 65 74 50 72 6f 63 41 64 64 72 65 73  ct GetProcAddres
3610: 73 28 29 20 74 6f 20 74 61 6b 65 0a 20 20 2a 2a  s() to take.  **
3620: 20 61 6e 20 41 4e 53 49 20 73 74 72 69 6e 67 20   an ANSI string 
3630: 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  regardless of th
3640: 65 20 5f 55 4e 49 43 4f 44 45 20 73 65 74 74 69  e _UNICODE setti
3650: 6e 67 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72  ng */.  { "GetPr
3660: 6f 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20  ocAddressA",    
3670: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
3680: 74 50 72 6f 63 41 64 64 72 65 73 73 2c 20 20 20  tProcAddress,   
3690: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
36a0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
36b0: 74 50 72 6f 63 41 64 64 72 65 73 73 41 20 28 28  tProcAddressA ((
36c0: 46 41 52 50 52 4f 43 28 57 49 4e 41 50 49 2a 29  FARPROC(WINAPI*)
36d0: 28 48 4d 4f 44 55 4c 45 2c 20 5c 0a 20 20 20 20  (HMODULE, \.    
36e0: 20 20 20 20 4c 50 43 53 54 52 29 29 61 53 79 73      LPCSTR))aSys
36f0: 63 61 6c 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e  call[27].pCurren
3700: 74 29 0a 0a 20 20 7b 20 22 47 65 74 53 79 73 74  t)..  { "GetSyst
3710: 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20  emInfo",        
3720: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53     (SYSCALL)GetS
3730: 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 20  ystemInfo,      
3740: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
3750: 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e  ne osGetSystemIn
3760: 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  fo ((VOID(WINAPI
3770: 2a 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f  *)(LPSYSTEM_INFO
3780: 29 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70  ))aSyscall[28].p
3790: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47  Current)..  { "G
37a0: 65 74 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20  etSystemTime",  
37b0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
37c0: 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 2c  L)GetSystemTime,
37d0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
37e0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79  .#define osGetSy
37f0: 73 74 65 6d 54 69 6d 65 20 28 28 56 4f 49 44 28  stemTime ((VOID(
3800: 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45  WINAPI*)(LPSYSTE
3810: 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b  MTIME))aSyscall[
3820: 32 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  29].pCurrent)..#
3830: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
3840: 4e 43 45 0a 20 20 7b 20 22 47 65 74 53 79 73 74  NCE.  { "GetSyst
3850: 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
3860: 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53  ", (SYSCALL)GetS
3870: 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
3880: 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ime, 0 },.#else.
3890: 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69    { "GetSystemTi
38a0: 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28  meAsFileTime", (
38b0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38d0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
38e0: 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65  efine osGetSyste
38f0: 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 20  mTimeAsFileTime 
3900: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
3910: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c   \.        LPFIL
3920: 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b  ETIME))aSyscall[
3930: 33 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  30].pCurrent)..#
3940: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
3950: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
3960: 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61  ).  { "GetTempPa
3970: 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  thA",           
3980: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d   (SYSCALL)GetTem
3990: 70 50 61 74 68 41 2c 20 20 20 20 20 20 20 20 20  pPathA,         
39a0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
39b0: 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 41 22  { "GetTempPathA"
39c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
39d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
39f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
3a00: 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74  ine osGetTempPat
3a10: 68 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  hA ((DWORD(WINAP
3a20: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54 52 29  I*)(DWORD,LPSTR)
3a30: 29 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70 43  )aSyscall[31].pC
3a40: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
3a50: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
3a60: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
3a70: 22 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20  "GetTempPathW", 
3a80: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
3a90: 41 4c 4c 29 47 65 74 54 65 6d 70 50 61 74 68 57  ALL)GetTempPathW
3aa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
3ab0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
3ac0: 54 65 6d 70 50 61 74 68 57 22 2c 20 20 20 20 20  TempPathW",     
3ad0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3ae0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3af0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3b00: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
3b10: 47 65 74 54 65 6d 70 50 61 74 68 57 20 28 28 44  GetTempPathW ((D
3b20: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57  WORD(WINAPI*)(DW
3b30: 4f 52 44 2c 4c 50 57 53 54 52 29 29 61 53 79 73  ORD,LPWSTR))aSys
3b40: 63 61 6c 6c 5b 33 32 5d 2e 70 43 75 72 72 65 6e  call[32].pCurren
3b50: 74 29 0a 0a 20 20 7b 20 22 47 65 74 54 69 63 6b  t)..  { "GetTick
3b60: 43 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20  Count",         
3b70: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54     (SYSCALL)GetT
3b80: 69 63 6b 43 6f 75 6e 74 2c 20 20 20 20 20 20 20  ickCount,       
3b90: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
3ba0: 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e  ne osGetTickCoun
3bb0: 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  t ((DWORD(WINAPI
3bc0: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
3bd0: 6c 5b 33 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[33].pCurrent).
3be0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
3bf0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
3c00: 53 49 29 0a 20 20 7b 20 22 47 65 74 56 65 72 73  SI).  { "GetVers
3c10: 69 6f 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20  ionExA",        
3c20: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 56     (SYSCALL)GetV
3c30: 65 72 73 69 6f 6e 45 78 41 2c 20 20 20 20 20 20  ersionExA,      
3c40: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
3c50: 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45    { "GetVersionE
3c60: 78 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  xA",           (
3c70: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c90: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3ca0: 65 66 69 6e 65 20 6f 73 47 65 74 56 65 72 73 69  efine osGetVersi
3cb0: 6f 6e 45 78 41 20 28 28 42 4f 4f 4c 28 57 49 4e  onExA ((BOOL(WIN
3cc0: 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20  API*)( \.       
3cd0: 20 4c 50 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f   LPOSVERSIONINFO
3ce0: 41 29 29 61 53 79 73 63 61 6c 6c 5b 33 34 5d 2e  A))aSyscall[34].
3cf0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3d00: 48 65 61 70 41 6c 6c 6f 63 22 2c 20 20 20 20 20  HeapAlloc",     
3d10: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3d20: 4c 4c 29 48 65 61 70 41 6c 6c 6f 63 2c 20 20 20  LL)HeapAlloc,   
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3d40: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
3d50: 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57  Alloc ((LPVOID(W
3d60: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
3d70: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
3d80: 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c  SIZE_T))aSyscall
3d90: 5b 33 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [35].pCurrent)..
3da0: 20 20 7b 20 22 48 65 61 70 43 72 65 61 74 65 22    { "HeapCreate"
3db0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
3dc0: 53 59 53 43 41 4c 4c 29 48 65 61 70 43 72 65 61  SYSCALL)HeapCrea
3dd0: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
3de0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
3df0: 73 48 65 61 70 43 72 65 61 74 65 20 28 28 48 41  sHeapCreate ((HA
3e00: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 44 57  NDLE(WINAPI*)(DW
3e10: 4f 52 44 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20 20  ORD,SIZE_T, \.  
3e20: 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53        SIZE_T))aS
3e30: 79 73 63 61 6c 6c 5b 33 36 5d 2e 70 43 75 72 72  yscall[36].pCurr
3e40: 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 44  ent)..  { "HeapD
3e50: 65 73 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20  estroy",        
3e60: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
3e70: 61 70 44 65 73 74 72 6f 79 2c 20 20 20 20 20 20  apDestroy,      
3e80: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
3e90: 66 69 6e 65 20 6f 73 48 65 61 70 44 65 73 74 72  fine osHeapDestr
3ea0: 6f 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  oy ((BOOL(WINAPI
3eb0: 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63  *)(HANDLE))aSysc
3ec0: 61 6c 6c 5b 33 37 5d 2e 70 43 75 72 72 65 6e 74  all[37].pCurrent
3ed0: 29 0a 0a 20 20 7b 20 22 48 65 61 70 46 72 65 65  )..  { "HeapFree
3ee0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
3ef0: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 46    (SYSCALL)HeapF
3f00: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ree,            
3f10: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
3f20: 65 20 6f 73 48 65 61 70 46 72 65 65 20 28 28 42  e osHeapFree ((B
3f30: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
3f40: 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44  DLE,DWORD,LPVOID
3f50: 29 29 61 53 79 73 63 61 6c 6c 5b 33 38 5d 2e 70  ))aSyscall[38].p
3f60: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48  Current)..  { "H
3f70: 65 61 70 52 65 41 6c 6c 6f 63 22 2c 20 20 20 20  eapReAlloc",    
3f80: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3f90: 4c 29 48 65 61 70 52 65 41 6c 6c 6f 63 2c 20 20  L)HeapReAlloc,  
3fa0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3fb0: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 52  .#define osHeapR
3fc0: 65 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28  eAlloc ((LPVOID(
3fd0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
3fe0: 44 57 4f 52 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a  DWORD,LPVOID, \.
3ff0: 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29          SIZE_T))
4000: 61 53 79 73 63 61 6c 6c 5b 33 39 5d 2e 70 43 75  aSyscall[39].pCu
4010: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61  rrent)..  { "Hea
4020: 70 53 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20  pSize",         
4030: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4040: 48 65 61 70 53 69 7a 65 2c 20 20 20 20 20 20 20  HeapSize,       
4050: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
4060: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 53 69 7a  define osHeapSiz
4070: 65 20 28 28 53 49 5a 45 5f 54 28 57 49 4e 41 50  e ((SIZE_T(WINAP
4080: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
4090: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 56  , \.        LPCV
40a0: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 30  OID))aSyscall[40
40b0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
40c0: 20 22 48 65 61 70 56 61 6c 69 64 61 74 65 22 2c   "HeapValidate",
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
40e0: 43 41 4c 4c 29 48 65 61 70 56 61 6c 69 64 61 74  CALL)HeapValidat
40f0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  e,            0 
4100: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
4110: 61 70 56 61 6c 69 64 61 74 65 20 28 28 42 4f 4f  apValidate ((BOO
4120: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
4130: 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  E,DWORD, \.     
4140: 20 20 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73     LPCVOID))aSys
4150: 63 61 6c 6c 5b 34 31 5d 2e 70 43 75 72 72 65 6e  call[41].pCurren
4160: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
4170: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
4180: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 4c 6f 61 64  _ANSI).  { "Load
4190: 4c 69 62 72 61 72 79 41 22 2c 20 20 20 20 20 20  LibraryA",      
41a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c        (SYSCALL)L
41b0: 6f 61 64 4c 69 62 72 61 72 79 41 2c 20 20 20 20  oadLibraryA,    
41c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
41d0: 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72  se.  { "LoadLibr
41e0: 61 72 79 41 22 2c 20 20 20 20 20 20 20 20 20 20  aryA",          
41f0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4210: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4220: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c  .#define osLoadL
4230: 69 62 72 61 72 79 41 20 28 28 48 4d 4f 44 55 4c  ibraryA ((HMODUL
4240: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  E(WINAPI*)(LPCST
4250: 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 32 5d 2e  R))aSyscall[42].
4260: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
4270: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4280: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
4290: 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22  { "LoadLibraryW"
42a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
42b0: 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72  SCALL)LoadLibrar
42c0: 79 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  yW,            0
42d0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c   },.#else.  { "L
42e0: 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20  oadLibraryW",   
42f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4300: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4310: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4320: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4330: 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 20 28  osLoadLibraryW (
4340: 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a  (HMODULE(WINAPI*
4350: 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63  )(LPCWSTR))aSysc
4360: 61 6c 6c 5b 34 33 5d 2e 70 43 75 72 72 65 6e 74  all[43].pCurrent
4370: 29 0a 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65  )..  { "LocalFre
4380: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
4390: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c    (SYSCALL)Local
43a0: 46 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20  Free,           
43b0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
43c0: 65 20 6f 73 4c 6f 63 61 6c 46 72 65 65 20 28 28  e osLocalFree ((
43d0: 48 4c 4f 43 41 4c 28 57 49 4e 41 50 49 2a 29 28  HLOCAL(WINAPI*)(
43e0: 48 4c 4f 43 41 4c 29 29 61 53 79 73 63 61 6c 6c  HLOCAL))aSyscall
43f0: 5b 34 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [44].pCurrent)..
4400: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
4410: 49 4e 43 45 0a 20 20 7b 20 22 4c 6f 63 6b 46 69  INCE.  { "LockFi
4420: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
4430: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63      (SYSCALL)Loc
4440: 6b 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  kFile,          
4450: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
4460: 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 20 28  ine osLockFile (
4470: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
4480: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52  ANDLE,DWORD,DWOR
4490: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
44a0: 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61     DWORD))aSysca
44b0: 6c 6c 5b 34 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[45].pCurrent)
44c0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b  .#else.  { "Lock
44d0: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
44e0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
44f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4500: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4510: 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  dif..#if !SQLITE
4520: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c  _OS_WINCE.  { "L
4530: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
4540: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4550: 4c 29 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20  L)LockFileEx,   
4560: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4570: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46  .#define osLockF
4580: 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e  ileEx ((BOOL(WIN
4590: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
45a0: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  RD,DWORD,DWORD,D
45b0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
45c0: 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53  LPOVERLAPPED))aS
45d0: 79 73 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72  yscall[46].pCurr
45e0: 65 6e 74 29 0a 23 65 6c 73 65 0a 20 20 7b 20 22  ent).#else.  { "
45f0: 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20  LockFileEx",    
4600: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4610: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4620: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4630: 0a 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 4d 61  .#endif..  { "Ma
4640: 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20  pViewOfFile",   
4650: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4660: 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c 20  )MapViewOfFile, 
4670: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
4680: 23 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65  #define osMapVie
4690: 77 4f 66 46 69 6c 65 20 28 28 4c 50 56 4f 49 44  wOfFile ((LPVOID
46a0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
46b0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f  ,DWORD,DWORD,DWO
46c0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49  RD, \.        SI
46d0: 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34  ZE_T))aSyscall[4
46e0: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  7].pCurrent)..  
46f0: 7b 20 22 4d 75 6c 74 69 42 79 74 65 54 6f 57 69  { "MultiByteToWi
4700: 64 65 43 68 61 72 22 2c 20 20 20 20 20 28 53 59  deChar",     (SY
4710: 53 43 41 4c 4c 29 4d 75 6c 74 69 42 79 74 65 54  SCALL)MultiByteT
4720: 6f 57 69 64 65 43 68 61 72 2c 20 20 20 20 20 30  oWideChar,     0
4730: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d   },..#define osM
4740: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
4750: 61 72 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a  ar ((int(WINAPI*
4760: 29 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43  )(UINT,DWORD,LPC
4770: 53 54 52 2c 69 6e 74 2c 4c 50 57 53 54 52 2c 20  STR,int,LPWSTR, 
4780: 5c 0a 20 20 20 20 20 20 20 20 69 6e 74 29 29 61  \.        int))a
4790: 53 79 73 63 61 6c 6c 5b 34 38 5d 2e 70 43 75 72  Syscall[48].pCur
47a0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 51 75 65 72  rent)..  { "Quer
47b0: 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e  yPerformanceCoun
47c0: 74 65 72 22 2c 20 28 53 59 53 43 41 4c 4c 29 51  ter", (SYSCALL)Q
47d0: 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43  ueryPerformanceC
47e0: 6f 75 6e 74 65 72 2c 20 30 20 7d 2c 0a 0a 23 64  ounter, 0 },..#d
47f0: 65 66 69 6e 65 20 6f 73 51 75 65 72 79 50 65 72  efine osQueryPer
4800: 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20  formanceCounter 
4810: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4820: 20 5c 0a 20 20 20 20 20 20 20 20 4c 41 52 47 45   \.        LARGE
4830: 5f 49 4e 54 45 47 45 52 2a 29 29 61 53 79 73 63  _INTEGER*))aSysc
4840: 61 6c 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74  all[49].pCurrent
4850: 29 0a 0a 20 20 7b 20 22 52 65 61 64 46 69 6c 65  )..  { "ReadFile
4860: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
4870: 20 20 28 53 59 53 43 41 4c 4c 29 52 65 61 64 46    (SYSCALL)ReadF
4880: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
4890: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
48a0: 65 20 6f 73 52 65 61 64 46 69 6c 65 20 28 28 42  e osReadFile ((B
48b0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
48c0: 44 4c 45 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44  DLE,LPVOID,DWORD
48d0: 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  ,LPDWORD, \.    
48e0: 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44      LPOVERLAPPED
48f0: 29 29 61 53 79 73 63 61 6c 6c 5b 35 30 5d 2e 70  ))aSyscall[50].p
4900: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53  Current)..  { "S
4910: 65 74 45 6e 64 4f 66 46 69 6c 65 22 2c 20 20 20  etEndOfFile",   
4920: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4930: 4c 29 53 65 74 45 6e 64 4f 66 46 69 6c 65 2c 20  L)SetEndOfFile, 
4940: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4950: 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74 45 6e  .#define osSetEn
4960: 64 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  dOfFile ((BOOL(W
4970: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29  INAPI*)(HANDLE))
4980: 61 53 79 73 63 61 6c 6c 5b 35 31 5d 2e 70 43 75  aSyscall[51].pCu
4990: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 65 74  rrent)..  { "Set
49a0: 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20 20  FilePointer",   
49b0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
49c0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 2c 20  SetFilePointer, 
49d0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
49e0: 64 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65  define osSetFile
49f0: 50 6f 69 6e 74 65 72 20 28 28 44 57 4f 52 44 28  Pointer ((DWORD(
4a00: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
4a10: 4c 4f 4e 47 2c 50 4c 4f 4e 47 2c 20 5c 0a 20 20  LONG,PLONG, \.  
4a20: 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79        DWORD))aSy
4a30: 73 63 61 6c 6c 5b 35 32 5d 2e 70 43 75 72 72 65  scall[52].pCurre
4a40: 6e 74 29 0a 0a 20 20 7b 20 22 53 6c 65 65 70 22  nt)..  { "Sleep"
4a50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4a60: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 6c 65      (SYSCALL)Sle
4a70: 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ep,             
4a80: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
4a90: 69 6e 65 20 6f 73 53 6c 65 65 70 20 28 28 56 4f  ine osSleep ((VO
4aa0: 49 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52  ID(WINAPI*)(DWOR
4ab0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 33 5d 2e  D))aSyscall[53].
4ac0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
4ad0: 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
4ae0: 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41  Time",    (SYSCA
4af0: 4c 4c 29 53 79 73 74 65 6d 54 69 6d 65 54 6f 46  LL)SystemTimeToF
4b00: 69 6c 65 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c  ileTime,    0 },
4b10: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 79 73 74  ..#define osSyst
4b20: 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
4b30: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4b40: 28 43 4f 4e 53 54 20 53 59 53 54 45 4d 54 49 4d  (CONST SYSTEMTIM
4b50: 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  E*, \.        LP
4b60: 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61  FILETIME))aSysca
4b70: 6c 6c 5b 35 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[54].pCurrent)
4b80: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
4b90: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55 6e 6c 6f  _WINCE.  { "Unlo
4ba0: 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  ckFile",        
4bb0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55        (SYSCALL)U
4bc0: 6e 6c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20  nlockFile,      
4bd0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
4be0: 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69  efine osUnlockFi
4bf0: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
4c00: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
4c10: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
4c20: 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53         DWORD))aS
4c30: 79 73 63 61 6c 6c 5b 35 35 5d 2e 70 43 75 72 72  yscall[55].pCurr
4c40: 65 6e 74 29 0a 23 65 6c 73 65 0a 20 20 7b 20 22  ent).#else.  { "
4c50: 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20  UnlockFile",    
4c60: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4c70: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4c80: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4c90: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51  .#endif..#if !SQ
4ca0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
4cb0: 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22  { "UnlockFileEx"
4cc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
4cd0: 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65  SCALL)UnlockFile
4ce0: 45 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  Ex,            0
4cf0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55   },..#define osU
4d00: 6e 6c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f  nlockFileEx ((BO
4d10: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
4d20: 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  LE,DWORD,DWORD,D
4d30: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
4d40: 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53  LPOVERLAPPED))aS
4d50: 79 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75 72 72  yscall[56].pCurr
4d60: 65 6e 74 29 0a 23 65 6c 73 65 0a 20 20 7b 20 22  ent).#else.  { "
4d70: 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20  UnlockFileEx",  
4d80: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4d90: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4db0: 0a 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 55 6e  .#endif..  { "Un
4dc0: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20  mapViewOfFile", 
4dd0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4de0: 29 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  )UnmapViewOfFile
4df0: 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a  ,         0 },..
4e00: 23 64 65 66 69 6e 65 20 6f 73 55 6e 6d 61 70 56  #define osUnmapV
4e10: 69 65 77 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c  iewOfFile ((BOOL
4e20: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 56 4f 49  (WINAPI*)(LPCVOI
4e30: 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 37 5d 2e  D))aSyscall[57].
4e40: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
4e50: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
4e60: 79 74 65 22 2c 20 20 20 20 20 28 53 59 53 43 41  yte",     (SYSCA
4e70: 4c 4c 29 57 69 64 65 43 68 61 72 54 6f 4d 75 6c  LL)WideCharToMul
4e80: 74 69 42 79 74 65 2c 20 20 20 20 20 30 20 7d 2c  tiByte,     0 },
4e90: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 69 64 65  ..#define osWide
4ea0: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 20  CharToMultiByte 
4eb0: 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 28 55  ((int(WINAPI*)(U
4ec0: 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54  INT,DWORD,LPCWST
4ed0: 52 2c 69 6e 74 2c 4c 50 53 54 52 2c 69 6e 74 2c  R,int,LPSTR,int,
4ee0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53 54   \.        LPCST
4ef0: 52 2c 4c 50 42 4f 4f 4c 29 29 61 53 79 73 63 61  R,LPBOOL))aSysca
4f00: 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e 74 29  ll[58].pCurrent)
4f10: 0a 0a 20 20 7b 20 22 57 72 69 74 65 46 69 6c 65  ..  { "WriteFile
4f20: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
4f30: 20 28 53 59 53 43 41 4c 4c 29 57 72 69 74 65 46   (SYSCALL)WriteF
4f40: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
4f50: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
4f60: 20 6f 73 57 72 69 74 65 46 69 6c 65 20 28 28 42   osWriteFile ((B
4f70: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
4f80: 44 4c 45 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52  DLE,LPCVOID,DWOR
4f90: 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20  D,LPDWORD, \.   
4fa0: 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45       LPOVERLAPPE
4fb0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 39 5d 2e  D))aSyscall[59].
4fc0: 70 43 75 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a  pCurrent)..}; /*
4fd0: 20 45 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72   End of the over
4fe0: 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20  rideable system 
4ff0: 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  calls */../*.** 
5000: 54 68 69 73 20 69 73 20 74 68 65 20 78 53 65 74  This is the xSet
5010: 53 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74  SystemCall() met
5020: 68 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76  hod of sqlite3_v
5030: 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68  fs for all of th
5040: 65 0a 2a 2a 20 22 77 69 6e 33 32 22 20 56 46 53  e.** "win32" VFS
5050: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
5060: 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65  TE_OK opon succe
5070: 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67  ssfully updating
5080: 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63   the.** system c
5090: 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20  all pointer, or 
50a0: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
50b0: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  if there is no c
50c0: 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73  onfigurable.** s
50d0: 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64  ystem call named
50e0: 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69   zName..*/.stati
50f0: 63 20 69 6e 74 20 77 69 6e 53 65 74 53 79 73 74  c int winSetSyst
5100: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
5110: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
5120: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
5130: 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74  FS pointer.  Not
5140: 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74   used */.  const
5150: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
5160: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
5170: 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20   of system call 
5180: 74 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20  to override */. 
5190: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
51a0: 5f 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f  _ptr pNewFunc  /
51b0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77  * Pointer to new
51c0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c   system call val
51d0: 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  ue */.){.  unsig
51e0: 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ned int i;.  int
51f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
5200: 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44  FOUND;..  UNUSED
5210: 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55  _PARAMETER(pNotU
5220: 73 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  sed);.  if( zNam
5230: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  e==0 ){.    /* I
5240: 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69  f no zName is gi
5250: 76 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c  ven, restore all
5260: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f   system calls to
5270: 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20   their default. 
5280: 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61     ** settings a
5290: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20  nd return NULL. 
52a0: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53     */.    rc = S
52b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f  QLITE_OK;.    fo
52c0: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
52d0: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
52e0: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
52f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
5300: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
5310: 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ult ){.        a
5320: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
5330: 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  ent = aSyscall[i
5340: 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20  ].pDefault;.    
5350: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
5360: 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61  e{.    /* If zNa
5370: 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
5380: 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79   operate on only
5390: 20 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20   the one system 
53a0: 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63  call.    ** spec
53b0: 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ified..    */.  
53c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
53d0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
53e0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
53f0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
5400: 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  f( strcmp(zName,
5410: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
5420: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
5430: 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69    if( aSyscall[i
5440: 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b  ].pDefault==0 ){
5450: 0a 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63  .          aSysc
5460: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20  all[i].pDefault 
5470: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43  = aSyscall[i].pC
5480: 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  urrent;.        
5490: 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  }.        rc = S
54a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
54b0: 20 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d    if( pNewFunc==
54c0: 30 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61  0 ) pNewFunc = a
54d0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
54e0: 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79  ult;.        aSy
54f0: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
5500: 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20  t = pNewFunc;.  
5510: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5520: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
5530: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
5540: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
5550: 76 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65  value of a syste
5560: 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20  m call.  Return 
5570: 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73  NULL if zName is
5580: 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e   not a.** recogn
5590: 69 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c  ized system call
55a0: 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20   name.  NULL is 
55b0: 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66  also returned if
55c0: 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   the system call
55d0: 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79  .** is currently
55e0: 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73   undefined..*/.s
55f0: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79  tatic sqlite3_sy
5600: 73 63 61 6c 6c 5f 70 74 72 20 77 69 6e 47 65 74  scall_ptr winGet
5610: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
5620: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
5630: 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  sed,.  const cha
5640: 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e  r *zName.){.  un
5650: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20  signed int i;.. 
5660: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
5670: 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66  R(pNotUsed);.  f
5680: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
5690: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
56a0: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
56b0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  i++){.    if( st
56c0: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
56d0: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
56e0: 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63  0 ) return aSysc
56f0: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b  all[i].pCurrent;
5700: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
5710: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
5720: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
5730: 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61   first system ca
5740: 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20  ll after zName. 
5750: 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a   If zName==NULL.
5760: 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  ** then return t
5770: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
5780: 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c  irst system call
5790: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
57a0: 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68  f zName.** is th
57b0: 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61  e last system ca
57c0: 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69  ll or if zName i
57d0: 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f  s not the name o
57e0: 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73  f a valid.** sys
57f0: 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61  tem call..*/.sta
5800: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
5810: 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  winNextSystemCal
5820: 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  l(sqlite3_vfs *p
5830: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
5840: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  ame){.  int i = 
5850: 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  -1;..  UNUSED_PA
5860: 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69 66  RAMETER(p);.  if
5870: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66  ( zName ){.    f
5880: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
5890: 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b  ize(aSyscall)-1;
58a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
58b0: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
58c0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
58d0: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
58e0: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b    }.  }.  for(i+
58f0: 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  +; i<ArraySize(a
5900: 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a  Syscall); i++){.
5910: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
5920: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30 20  [i].pCurrent!=0 
5930: 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c  ) return aSyscal
5940: 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a  l[i].zName;.  }.
5950: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
5960: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
5970: 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77   (non-zero) if w
5980: 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e  e are running un
5990: 64 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b  der WinNT, Win2K
59a0: 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57  , WinXP,.** or W
59b0: 69 6e 43 45 2e 20 20 52 65 74 75 72 6e 20 66 61  inCE.  Return fa
59c0: 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 20 57  lse (zero) for W
59d0: 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20  in95, Win98, or 
59e0: 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72  WinME..**.** Her
59f0: 65 20 69 73 20 61 6e 20 69 6e 74 65 72 65 73 74  e is an interest
5a00: 69 6e 67 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a  ing observation:
5a10: 20 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20    Win95, Win98, 
5a20: 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a  and WinME lack.*
5a30: 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  * the LockFileEx
5a40: 28 29 20 41 50 49 2e 20 20 42 75 74 20 77 65 20  () API.  But we 
5a50: 63 61 6e 20 73 74 69 6c 6c 20 73 74 61 74 69 63  can still static
5a60: 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73  ally link agains
5a70: 74 20 74 68 61 74 0a 2a 2a 20 41 50 49 20 61 73  t that.** API as
5a80: 20 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e 27   long as we don'
5a90: 74 20 63 61 6c 6c 20 69 74 20 77 68 65 6e 20 72  t call it when r
5aa0: 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f  unning Win95/98/
5ab0: 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a  ME.  A call to.*
5ac0: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
5ad0: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
5ae0: 69 6e 65 20 69 66 20 74 68 65 20 68 6f 73 74 20  ine if the host 
5af0: 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f  is Win95/98/ME o
5b00: 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50  r.** WinNT/2K/XP
5b10: 20 73 6f 20 74 68 61 74 20 77 65 20 77 69 6c 6c   so that we will
5b20: 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72   know whether or
5b30: 20 6e 6f 74 20 77 65 20 63 61 6e 20 73 61 66 65   not we can safe
5b40: 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c  ly call.** the L
5b50: 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e  ockFileEx() API.
5b60: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
5b70: 53 5f 57 49 4e 43 45 0a 23 20 64 65 66 69 6e 65  S_WINCE.# define
5b80: 20 69 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c   isNT()  (1).#el
5b90: 73 65 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  se.  static int 
5ba0: 69 73 4e 54 28 76 6f 69 64 29 7b 0a 20 20 20 20  isNT(void){.    
5bb0: 69 66 28 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74  if( sqlite3_os_t
5bc0: 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ype==0 ){.      
5bd0: 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 20 73  OSVERSIONINFOA s
5be0: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 49 6e 66  Info;.      sInf
5bf0: 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66  o.dwOSVersionInf
5c00: 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73  oSize = sizeof(s
5c10: 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 6f 73 47  Info);.      osG
5c20: 65 74 56 65 72 73 69 6f 6e 45 78 41 28 26 73 49  etVersionExA(&sI
5c30: 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
5c40: 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 73 49  te3_os_type = sI
5c50: 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64  nfo.dwPlatformId
5c60: 3d 3d 56 45 52 5f 50 4c 41 54 46 4f 52 4d 5f 57  ==VER_PLATFORM_W
5c70: 49 4e 33 32 5f 4e 54 20 3f 20 32 20 3a 20 31 3b  IN32_NT ? 2 : 1;
5c80: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
5c90: 6e 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  n sqlite3_os_typ
5ca0: 65 3d 3d 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  e==2;.  }.#endif
5cb0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   /* SQLITE_OS_WI
5cc0: 4e 43 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  NCE */..#ifdef S
5cd0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
5ce0: 4f 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  OC./*.** Allocat
5cf0: 65 20 6e 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f  e nBytes of memo
5d00: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
5d10: 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63  id *winMemMalloc
5d20: 28 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20  (int nBytes){.  
5d30: 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20  HANDLE hHeap;.  
5d40: 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d  void *p;..  winM
5d50: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b  emAssertMagic();
5d60: 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65  .  hHeap = winMe
5d70: 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73  mGetHeap();.  as
5d80: 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29  sert( hHeap!=0 )
5d90: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
5da0: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
5db0: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 64 65  E_VALUE );.#ifde
5dc0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  f SQLITE_WIN32_M
5dd0: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20  ALLOC_VALIDATE. 
5de0: 20 61 73 73 65 72 74 20 28 20 6f 73 48 65 61 70   assert ( osHeap
5df0: 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20  Validate(hHeap, 
5e00: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
5e10: 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29  P_FLAGS, NULL) )
5e20: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
5e30: 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a  t( nBytes>=0 );.
5e40: 20 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f    p = osHeapAllo
5e50: 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  c(hHeap, SQLITE_
5e60: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
5e70: 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73  , (SIZE_T)nBytes
5e80: 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  );.  if( !p ){. 
5e90: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
5ea0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61  QLITE_NOMEM, "fa
5eb0: 69 6c 65 64 20 74 6f 20 48 65 61 70 41 6c 6c 6f  iled to HeapAllo
5ec0: 63 20 25 75 20 62 79 74 65 73 20 28 25 64 29 2c  c %u bytes (%d),
5ed0: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
5ee0: 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65             nByte
5ef0: 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  s, osGetLastErro
5f00: 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61  r(), (void*)hHea
5f10: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
5f20: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65   p;.}../*.** Fre
5f30: 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  e memory..*/.sta
5f40: 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46  tic void winMemF
5f50: 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72  ree(void *pPrior
5f60: 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  ){.  HANDLE hHea
5f70: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
5f80: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
5f90: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
5fa0: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
5fb0: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
5fc0: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
5fd0: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
5fe0: 45 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  E );.#ifdef SQLI
5ff0: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
6000: 56 41 4c 49 44 41 54 45 0a 20 20 61 73 73 65 72  VALIDATE.  asser
6010: 74 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  t ( osHeapValida
6020: 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  te(hHeap, SQLITE
6030: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
6040: 53 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65  S, pPrior) );.#e
6050: 6e 64 69 66 0a 20 20 69 66 28 20 21 70 50 72 69  ndif.  if( !pPri
6060: 6f 72 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20  or ) return; /* 
6070: 50 61 73 73 69 6e 67 20 4e 55 4c 4c 20 74 6f 20  Passing NULL to 
6080: 48 65 61 70 46 72 65 65 20 69 73 20 75 6e 64 65  HeapFree is unde
6090: 66 69 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  fined. */.  if( 
60a0: 21 6f 73 48 65 61 70 46 72 65 65 28 68 48 65 61  !osHeapFree(hHea
60b0: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
60c0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69  HEAP_FLAGS, pPri
60d0: 6f 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  or) ){.    sqlit
60e0: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
60f0: 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  MEM, "failed to 
6100: 48 65 61 70 46 72 65 65 20 62 6c 6f 63 6b 20 25  HeapFree block %
6110: 70 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22  p (%d), heap=%p"
6120: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6130: 20 20 70 50 72 69 6f 72 2c 20 6f 73 47 65 74 4c    pPrior, osGetL
6140: 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69  astError(), (voi
6150: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 7d  d*)hHeap);.  }.}
6160: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
6170: 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 65 78  he size of an ex
6180: 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c  isting memory al
6190: 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  location.*/.stat
61a0: 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52  ic void *winMemR
61b0: 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72  ealloc(void *pPr
61c0: 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29  ior, int nBytes)
61d0: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  {.  HANDLE hHeap
61e0: 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20  ;.  void *p;..  
61f0: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
6200: 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77  c();.  hHeap = w
6210: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a  inMemGetHeap();.
6220: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
6230: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
6240: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
6250: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
6260: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
6270: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
6280: 54 45 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73  TE.  assert ( os
6290: 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65  HeapValidate(hHe
62a0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
62b0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72  _HEAP_FLAGS, pPr
62c0: 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ior) );.#endif. 
62d0: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e   assert( nBytes>
62e0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50 72  =0 );.  if( !pPr
62f0: 69 6f 72 20 29 7b 0a 20 20 20 20 70 20 3d 20 6f  ior ){.    p = o
6300: 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70  sHeapAlloc(hHeap
6310: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
6320: 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45  EAP_FLAGS, (SIZE
6330: 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d 65  _T)nBytes);.  }e
6340: 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48  lse{.    p = osH
6350: 65 61 70 52 65 41 6c 6c 6f 63 28 68 48 65 61 70  eapReAlloc(hHeap
6360: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
6370: 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f  EAP_FLAGS, pPrio
6380: 72 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65  r, (SIZE_T)nByte
6390: 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  s);.  }.  if( !p
63a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
63b0: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
63c0: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 25 73 20  , "failed to %s 
63d0: 25 75 20 62 79 74 65 73 20 28 25 64 29 2c 20 68  %u bytes (%d), h
63e0: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
63f0: 20 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 20           pPrior 
6400: 3f 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 20  ? "HeapReAlloc" 
6410: 3a 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 6e  : "HeapAlloc", n
6420: 42 79 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74  Bytes, osGetLast
6430: 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
6440: 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
6450: 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65  hHeap);.  }.  re
6460: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
6470: 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
6480: 20 6f 66 20 61 6e 20 6f 75 74 73 74 61 6e 64 69   of an outstandi
6490: 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69  ng allocation, i
64a0: 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  n bytes..*/.stat
64b0: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a  ic int winMemSiz
64c0: 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 48 41  e(void *p){.  HA
64d0: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 53 49  NDLE hHeap;.  SI
64e0: 5a 45 5f 54 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65  ZE_T n;..  winMe
64f0: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a  mAssertMagic();.
6500: 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d    hHeap = winMem
6510: 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73  GetHeap();.  ass
6520: 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b  ert( hHeap!=0 );
6530: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
6540: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
6550: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66  _VALUE );.#ifdef
6560: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
6570: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20  LLOC_VALIDATE.  
6580: 61 73 73 65 72 74 20 28 20 6f 73 48 65 61 70 56  assert ( osHeapV
6590: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
65a0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
65b0: 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b  _FLAGS, NULL) );
65c0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70  .#endif.  if( !p
65d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
65e0: 20 3d 20 6f 73 48 65 61 70 53 69 7a 65 28 68 48   = osHeapSize(hH
65f0: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
6600: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29  2_HEAP_FLAGS, p)
6610: 3b 0a 20 20 69 66 28 20 6e 3d 3d 28 53 49 5a 45  ;.  if( n==(SIZE
6620: 5f 54 29 2d 31 20 29 7b 0a 20 20 20 20 73 71 6c  _T)-1 ){.    sql
6630: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
6640: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
6650: 6f 20 48 65 61 70 53 69 7a 65 20 62 6c 6f 63 6b  o HeapSize block
6660: 20 25 70 20 28 25 64 29 2c 20 68 65 61 70 3d 25   %p (%d), heap=%
6670: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
6680: 20 20 20 20 70 2c 20 6f 73 47 65 74 4c 61 73 74      p, osGetLast
6690: 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29  Error(), (void*)
66a0: 68 48 65 61 70 29 3b 0a 20 20 20 20 72 65 74 75  hHeap);.    retu
66b0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
66c0: 72 6e 20 28 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a  rn (int)n;.}../*
66d0: 0a 2a 2a 20 52 6f 75 6e 64 20 75 70 20 61 20 72  .** Round up a r
66e0: 65 71 75 65 73 74 20 73 69 7a 65 20 74 6f 20 74  equest size to t
66f0: 68 65 20 6e 65 78 74 20 76 61 6c 69 64 20 61 6c  he next valid al
6700: 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 2a  location size..*
6710: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
6720: 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e  MemRoundup(int n
6730: 29 7b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  ){.  return n;.}
6740: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
6750: 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a  ze this module..
6760: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
6770: 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70  nMemInit(void *p
6780: 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d  AppData){.  winM
6790: 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44  emData *pWinMemD
67a0: 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74  ata = (winMemDat
67b0: 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20  a *)pAppData;.. 
67c0: 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74   if( !pWinMemDat
67d0: 61 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  a ) return SQLIT
67e0: 45 5f 45 52 52 4f 52 3b 0a 20 20 61 73 73 65 72  E_ERROR;.  asser
67f0: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
6800: 6d 61 67 69 63 3d 3d 57 49 4e 4d 45 4d 5f 4d 41  magic==WINMEM_MA
6810: 47 49 43 20 29 3b 0a 20 20 69 66 28 20 21 70 57  GIC );.  if( !pW
6820: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
6830: 20 29 7b 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44   ){.    pWinMemD
6840: 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 48  ata->hHeap = osH
6850: 65 61 70 43 72 65 61 74 65 28 53 51 4c 49 54 45  eapCreate(SQLITE
6860: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
6870: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
6880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6890: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
68a0: 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f  WIN32_HEAP_INIT_
68b0: 53 49 5a 45 2c 0a 20 20 20 20 20 20 20 20 20 20  SIZE,.          
68c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68d0: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
68e0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41  TE_WIN32_HEAP_MA
68f0: 58 5f 53 49 5a 45 29 3b 0a 20 20 20 20 69 66 28  X_SIZE);.    if(
6900: 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68   !pWinMemData->h
6910: 48 65 61 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Heap ){.      sq
6920: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
6930: 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20  _NOMEM,.        
6940: 20 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61    "failed to Hea
6950: 70 43 72 65 61 74 65 20 28 25 64 29 2c 20 66 6c  pCreate (%d), fl
6960: 61 67 73 3d 25 75 2c 20 69 6e 69 74 53 69 7a 65  ags=%u, initSize
6970: 3d 25 75 2c 20 6d 61 78 53 69 7a 65 3d 25 75 22  =%u, maxSize=%u"
6980: 2c 0a 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  ,.          osGe
6990: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 53 51  tLastError(), SQ
69a0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
69b0: 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20  FLAGS,.         
69c0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
69d0: 41 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 20 53 51  AP_INIT_SIZE, SQ
69e0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
69f0: 4d 41 58 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  MAX_SIZE);.     
6a00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
6a10: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
6a20: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
6a30: 6e 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 7d 0a  ned = TRUE;.  }.
6a40: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
6a50: 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 30 20  mData->hHeap!=0 
6a60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69  );.  assert( pWi
6a70: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21  nMemData->hHeap!
6a80: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
6a90: 56 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66 20  VALUE );.#ifdef 
6aa0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
6ab0: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20 61  LOC_VALIDATE.  a
6ac0: 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c  ssert( osHeapVal
6ad0: 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74  idate(pWinMemDat
6ae0: 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45  a->hHeap, SQLITE
6af0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
6b00: 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64  S, NULL) );.#end
6b10: 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
6b20: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6b30: 44 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 69  Deinitialize thi
6b40: 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61  s module..*/.sta
6b50: 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53  tic void winMemS
6b60: 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41  hutdown(void *pA
6b70: 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65  ppData){.  winMe
6b80: 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61  mData *pWinMemDa
6b90: 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61  ta = (winMemData
6ba0: 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20   *)pAppData;..  
6bb0: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
6bc0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
6bd0: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48   pWinMemData->hH
6be0: 65 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  eap ){.    asser
6bf0: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
6c00: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
6c10: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
6c20: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
6c30: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
6c40: 54 45 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  TE.    assert( o
6c50: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 70 57  sHeapValidate(pW
6c60: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
6c70: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
6c80: 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29  EAP_FLAGS, NULL)
6c90: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69   );.#endif.    i
6ca0: 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  f( pWinMemData->
6cb0: 62 4f 77 6e 65 64 20 29 7b 0a 20 20 20 20 20 20  bOwned ){.      
6cc0: 69 66 28 20 21 6f 73 48 65 61 70 44 65 73 74 72  if( !osHeapDestr
6cd0: 6f 79 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  oy(pWinMemData->
6ce0: 68 48 65 61 70 29 20 29 7b 0a 20 20 20 20 20 20  hHeap) ){.      
6cf0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
6d00: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
6d10: 6c 65 64 20 74 6f 20 48 65 61 70 44 65 73 74 72  led to HeapDestr
6d20: 6f 79 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70  oy (%d), heap=%p
6d30: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
6d40: 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74         osGetLast
6d50: 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29  Error(), (void*)
6d60: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
6d70: 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ap);.      }.   
6d80: 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e     pWinMemData->
6d90: 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a  bOwned = FALSE;.
6da0: 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65      }.    pWinMe
6db0: 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e  mData->hHeap = N
6dc0: 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ULL;.  }.}../*.*
6dd0: 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6c  * Populate the l
6de0: 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20  ow-level memory 
6df0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74  allocation funct
6e00: 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a  ion pointers in.
6e10: 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  ** sqlite3Global
6e20: 43 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20 70 6f  Config.m with po
6e30: 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 72 6f  inters to the ro
6e40: 75 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66  utines in this f
6e50: 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75  ile. The.** argu
6e60: 6d 65 6e 74 73 20 73 70 65 63 69 66 79 20 74 68  ments specify th
6e70: 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72  e block of memor
6e80: 79 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a  y to manage..**.
6e90: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6ea0: 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  is only called b
6eb0: 79 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  y sqlite3_config
6ec0: 28 29 2c 20 61 6e 64 20 74 68 65 72 65 66 6f 72  (), and therefor
6ed0: 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75  e.** is not requ
6ee0: 69 72 65 64 20 74 6f 20 62 65 20 74 68 72 65 61  ired to be threa
6ef0: 64 73 61 66 65 20 28 69 74 20 69 73 20 6e 6f 74  dsafe (it is not
6f00: 29 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69  )..*/.const sqli
6f10: 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20  te3_mem_methods 
6f20: 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69  *sqlite3MemGetWi
6f30: 6e 33 32 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  n32(void){.  sta
6f40: 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
6f50: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69  3_mem_methods wi
6f60: 6e 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a  nMemMethods = {.
6f70: 20 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63      winMemMalloc
6f80: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72 65 65  ,.    winMemFree
6f90: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c  ,.    winMemReal
6fa0: 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53  loc,.    winMemS
6fb0: 69 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52  ize,.    winMemR
6fc0: 6f 75 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d  oundup,.    winM
6fd0: 65 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d  emInit,.    winM
6fe0: 65 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20  emShutdown,.    
6ff0: 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20  &win_mem_data.  
7000: 7d 3b 0a 20 20 72 65 74 75 72 6e 20 26 77 69 6e  };.  return &win
7010: 4d 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76  MemMethods;.}..v
7020: 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 65  oid sqlite3MemSe
7030: 74 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a  tDefault(void){.
7040: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67    sqlite3_config
7050: 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d  (SQLITE_CONFIG_M
7060: 41 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65  ALLOC, sqlite3Me
7070: 6d 47 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a  mGetWin32());.}.
7080: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7090: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f  _WIN32_MALLOC */
70a0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
70b0: 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74  a UTF-8 string t
70c0: 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63  o Microsoft Unic
70d0: 6f 64 65 20 28 55 54 46 2d 31 36 3f 29 2e 20 0a  ode (UTF-16?). .
70e0: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
70f0: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
7100: 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69   string is obtai
7110: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ned from malloc.
7120: 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54  .*/.static LPWST
7130: 52 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28  R utf8ToUnicode(
7140: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
7150: 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43  ename){.  int nC
7160: 68 61 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57  har;.  LPWSTR zW
7170: 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20  ideFilename;..  
7180: 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42  nChar = osMultiB
7190: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50  yteToWideChar(CP
71a0: 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e  _UTF8, 0, zFilen
71b0: 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30  ame, -1, NULL, 0
71c0: 29 3b 0a 20 20 7a 57 69 64 65 46 69 6c 65 6e 61  );.  zWideFilena
71d0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  me = sqlite3_mal
71e0: 6c 6f 63 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f  loc( nChar*sizeo
71f0: 66 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b  f(zWideFilename[
7200: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 57 69  0]) );.  if( zWi
7210: 64 65 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b  deFilename==0 ){
7220: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
7230: 20 7d 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d   }.  nChar = osM
7240: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
7250: 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a  ar(CP_UTF8, 0, z
7260: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57  Filename, -1, zW
7270: 69 64 65 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  ideFilename,.   
7280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 68               nCh
72a0: 61 72 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72  ar);.  if( nChar
72b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
72c0: 65 33 5f 66 72 65 65 28 7a 57 69 64 65 46 69 6c  e3_free(zWideFil
72d0: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69 64  ename);.    zWid
72e0: 65 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  eFilename = 0;. 
72f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57 69 64   }.  return zWid
7300: 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  eFilename;.}../*
7310: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63 72  .** Convert Micr
7320: 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 74 6f  osoft Unicode to
7330: 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74   UTF-8.  Space t
7340: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
7350: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a  ned string is.**
7360: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
7370: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
7380: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
7390: 2a 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 4c  *unicodeToUtf8(L
73a0: 50 43 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65  PCWSTR zWideFile
73b0: 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79  name){.  int nBy
73c0: 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  te;.  char *zFil
73d0: 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42 79 74 65 20  ename;..  nByte 
73e0: 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  = osWideCharToMu
73f0: 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c  ltiByte(CP_UTF8,
7400: 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d   0, zWideFilenam
7410: 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20  e, -1, 0, 0, 0, 
7420: 30 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20  0);.  zFilename 
7430: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
7440: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  ( nByte );.  if(
7450: 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b   zFilename==0 ){
7460: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
7470: 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57   }.  nByte = osW
7480: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
7490: 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a  te(CP_UTF8, 0, z
74a0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  WideFilename, -1
74b0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 42 79  , zFilename, nBy
74c0: 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  te,.            
74d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74e0: 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 69 66 28      0, 0);.  if(
74f0: 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20   nByte == 0 ){. 
7500: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
7510: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
7520: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  zFilename = 0;. 
7530: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c   }.  return zFil
7540: 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
7550: 43 6f 6e 76 65 72 74 20 61 6e 20 41 4e 53 49 20  Convert an ANSI 
7560: 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73  string to Micros
7570: 6f 66 74 20 55 6e 69 63 6f 64 65 2c 20 62 61 73  oft Unicode, bas
7580: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72  ed on the.** cur
7590: 72 65 6e 74 20 63 6f 64 65 70 61 67 65 20 73 65  rent codepage se
75a0: 74 74 69 6e 67 73 20 66 6f 72 20 66 69 6c 65 20  ttings for file 
75b0: 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a 20 53 70 61  apis..** .** Spa
75c0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
75d0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
75e0: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  s obtained.** fr
75f0: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
7600: 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57  c..*/.static LPW
7610: 53 54 52 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64  STR mbcsToUnicod
7620: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
7630: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ilename){.  int 
7640: 6e 42 79 74 65 3b 0a 20 20 4c 50 57 53 54 52 20  nByte;.  LPWSTR 
7650: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 20  zMbcsFilename;. 
7660: 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20   int codepage = 
7670: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
7680: 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43  I() ? CP_ACP : C
7690: 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74  P_OEMCP;..  nByt
76a0: 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54  e = osMultiByteT
76b0: 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61  oWideChar(codepa
76c0: 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  ge, 0, zFilename
76d0: 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20  , -1, NULL,.    
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 29 2a 73              0)*s
7700: 69 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 20  izeof(WCHAR);.  
7710: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20  zMbcsFilename = 
7720: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
7730: 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62  nByte*sizeof(zMb
7740: 63 73 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29  csFilename[0]) )
7750: 3b 0a 20 20 69 66 28 20 7a 4d 62 63 73 46 69 6c  ;.  if( zMbcsFil
7760: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ename==0 ){.    
7770: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
7780: 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42  nByte = osMultiB
7790: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f  yteToWideChar(co
77a0: 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65  depage, 0, zFile
77b0: 6e 61 6d 65 2c 20 2d 31 2c 20 7a 4d 62 63 73 46  name, -1, zMbcsF
77c0: 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
77d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77e0: 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 29 3b           nByte);
77f0: 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20  .  if( nByte==0 
7800: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
7810: 72 65 65 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  ree(zMbcsFilenam
7820: 65 29 3b 0a 20 20 20 20 7a 4d 62 63 73 46 69 6c  e);.    zMbcsFil
7830: 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  ename = 0;.  }. 
7840: 20 72 65 74 75 72 6e 20 7a 4d 62 63 73 46 69 6c   return zMbcsFil
7850: 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
7860: 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f 66  Convert Microsof
7870: 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 6d 75 6c  t Unicode to mul
7880: 74 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65  ti-byte characte
7890: 72 20 73 74 72 69 6e 67 2c 20 62 61 73 65 64 20  r string, based 
78a0: 6f 6e 20 74 68 65 0a 2a 2a 20 75 73 65 72 27 73  on the.** user's
78b0: 20 41 4e 53 49 20 63 6f 64 65 70 61 67 65 2e 0a   ANSI codepage..
78c0: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
78d0: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
78e0: 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69   string is obtai
78f0: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  ned from.** sqli
7900: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  te3_malloc()..*/
7910: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 6e  .static char *un
7920: 69 63 6f 64 65 54 6f 4d 62 63 73 28 4c 50 43 57  icodeToMbcs(LPCW
7930: 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  STR zWideFilenam
7940: 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  e){.  int nByte;
7950: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
7960: 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61  me;.  int codepa
7970: 67 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70  ge = osAreFileAp
7980: 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43  isANSI() ? CP_AC
7990: 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20  P : CP_OEMCP;.. 
79a0: 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43   nByte = osWideC
79b0: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63  harToMultiByte(c
79c0: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64  odepage, 0, zWid
79d0: 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30  eFilename, -1, 0
79e0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7a 46  , 0, 0, 0);.  zF
79f0: 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ilename = sqlite
7a00: 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  3_malloc( nByte 
7a10: 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  );.  if( zFilena
7a20: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
7a30: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
7a40: 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54  te = osWideCharT
7a50: 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70  oMultiByte(codep
7a60: 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c  age, 0, zWideFil
7a70: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65  ename, -1, zFile
7a80: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7aa0: 20 20 20 20 20 20 6e 42 79 74 65 2c 20 30 2c 20        nByte, 0, 
7ab0: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
7ac0: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  == 0 ){.    sqli
7ad0: 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61  te3_free(zFilena
7ae0: 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  me);.    zFilena
7af0: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
7b00: 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  turn zFilename;.
7b10: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
7b20: 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72 61   multibyte chara
7b30: 63 74 65 72 20 73 74 72 69 6e 67 20 74 6f 20 55  cter string to U
7b40: 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20  TF-8.  Space to 
7b50: 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74 75  hold the.** retu
7b60: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
7b70: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
7b80: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
7b90: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
7ba0: 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74  win32_mbcs_to_ut
7bb0: 66 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  f8(const char *z
7bc0: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61  Filename){.  cha
7bd0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38  r *zFilenameUtf8
7be0: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57  ;.  LPWSTR zTmpW
7bf0: 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65  ide;..  zTmpWide
7c00: 20 3d 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65   = mbcsToUnicode
7c10: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
7c20: 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29  f( zTmpWide==0 )
7c30: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
7c40: 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55    }.  zFilenameU
7c50: 74 66 38 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55  tf8 = unicodeToU
7c60: 74 66 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20  tf8(zTmpWide);. 
7c70: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
7c80: 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72  mpWide);.  retur
7c90: 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b  n zFilenameUtf8;
7ca0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
7cb0: 74 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69  t UTF-8 to multi
7cc0: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
7cd0: 74 72 69 6e 67 2e 20 20 53 70 61 63 65 20 74 6f  tring.  Space to
7ce0: 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72 65   hold the .** re
7cf0: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
7d00: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
7d10: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
7d20: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
7d30: 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
7d40: 6d 62 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20  mbcs(const char 
7d50: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63  *zFilename){.  c
7d60: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62  har *zFilenameMb
7d70: 63 73 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d  cs;.  LPWSTR zTm
7d80: 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69  pWide;..  zTmpWi
7d90: 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f  de = utf8ToUnico
7da0: 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
7db0: 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30   if( zTmpWide==0
7dc0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
7dd0: 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d  ;.  }.  zFilenam
7de0: 65 4d 62 63 73 20 3d 20 75 6e 69 63 6f 64 65 54  eMbcs = unicodeT
7df0: 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64 65 29 3b  oMbcs(zTmpWide);
7e00: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
7e10: 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74  zTmpWide);.  ret
7e20: 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63  urn zFilenameMbc
7e30: 73 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  s;.}.../*.** The
7e40: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
7e50: 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67   getLastErrorMsg
7e60: 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74  .** is zero if t
7e70: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
7e80: 20 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66   fits in the buf
7e90: 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  fer, or non-zero
7ea0: 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69  .** otherwise (i
7eb0: 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61  f the message wa
7ec0: 73 20 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f  s truncated)..*/
7ed0: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4c  .static int getL
7ee0: 61 73 74 45 72 72 6f 72 4d 73 67 28 44 57 4f 52  astErrorMsg(DWOR
7ef0: 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74  D lastErrno, int
7f00: 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
7f10: 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d  f){.  /* FormatM
7f20: 65 73 73 61 67 65 20 72 65 74 75 72 6e 73 20 30  essage returns 0
7f30: 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f 74   on failure.  Ot
7f40: 68 65 72 77 69 73 65 20 69 74 0a 20 20 2a 2a 20  herwise it.  ** 
7f50: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
7f60: 65 72 20 6f 66 20 54 43 48 41 52 73 20 77 72 69  er of TCHARs wri
7f70: 74 74 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70  tten to the outp
7f80: 75 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c 20  ut.  ** buffer, 
7f90: 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65  excluding the te
7fa0: 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63  rminating null c
7fb0: 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52  har..  */.  DWOR
7fc0: 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63  D dwLen = 0;.  c
7fd0: 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a  har *zOut = 0;..
7fe0: 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
7ff0: 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70      LPWSTR zTemp
8000: 57 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  Wide = NULL;.   
8010: 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61   dwLen = osForma
8020: 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54  tMessageW(FORMAT
8030: 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54  _MESSAGE_ALLOCAT
8040: 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20  E_BUFFER |.     
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8060: 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d          FORMAT_M
8070: 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54  ESSAGE_FROM_SYST
8080: 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  EM |.           
8090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80a0: 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45    FORMAT_MESSAGE
80b0: 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c  _IGNORE_INSERTS,
80c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
80d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
80e0: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
80f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8100: 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20   lastErrno,.    
8110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8120: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
8130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8140: 20 20 20 20 20 20 20 20 20 28 4c 50 57 53 54 52           (LPWSTR
8150: 29 20 26 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20  ) &zTempWide,.  
8160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8170: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
8180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8190: 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20             0);. 
81a0: 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30     if( dwLen > 0
81b0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c   ){.      /* all
81c0: 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61  ocate a buffer a
81d0: 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54  nd convert to UT
81e0: 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  F8 */.      sqli
81f0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
8200: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f  lloc();.      zO
8210: 75 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74  ut = unicodeToUt
8220: 66 38 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20  f8(zTempWide);. 
8230: 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
8240: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
8250: 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65       /* free the
8260: 20 73 79 73 74 65 6d 20 62 75 66 66 65 72 20 61   system buffer a
8270: 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d  llocated by Form
8280: 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20  atMessage */.   
8290: 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a     osLocalFree(z
82a0: 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20 20 7d  TempWide);.    }
82b0: 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20  ./* isNT() is 1 
82c0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
82d0: 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65  CE==1, so this e
82e0: 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65  lse is never exe
82f0: 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65  cuted. .** Since
8300: 20 74 68 65 20 41 4e 53 49 20 76 65 72 73 69 6f   the ANSI versio
8310: 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f  n of these Windo
8320: 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78  ws API do not ex
8330: 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a  ist for WINCE,.*
8340: 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74  * it's important
8350: 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63   to not referenc
8360: 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45  e them for WINCE
8370: 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20   builds..*/.#if 
8380: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
8390: 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  =0.  }else{.    
83a0: 63 68 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55  char *zTemp = NU
83b0: 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20  LL;.    dwLen = 
83c0: 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41  osFormatMessageA
83d0: 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f  (FORMAT_MESSAGE_
83e0: 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20  ALLOCATE_BUFFER 
83f0: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
8400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
8410: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52  ORMAT_MESSAGE_FR
8420: 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20  OM_SYSTEM |.    
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8440: 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f           FORMAT_
8450: 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49  MESSAGE_IGNORE_I
8460: 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20  NSERTS,.        
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8480: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
8490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84a0: 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e          lastErrn
84b0: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84d0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
84e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84f0: 28 4c 50 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a  (LPSTR) &zTemp,.
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a               0,.
8520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8530: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b               0);
8540: 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e  .    if( dwLen >
8550: 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61   0 ){.      /* a
8560: 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65 72  llocate a buffer
8570: 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20   and convert to 
8580: 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71  UTF8 */.      sq
8590: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
85a0: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
85b0: 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77  zOut = sqlite3_w
85c0: 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
85d0: 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  8(zTemp);.      
85e0: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
85f0: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
8600: 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79 73 74  /* free the syst
8610: 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61  em buffer alloca
8620: 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73  ted by FormatMes
8630: 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73  sage */.      os
8640: 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 29  LocalFree(zTemp)
8650: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
8660: 20 7d 0a 20 20 69 66 28 20 30 20 3d 3d 20 64 77   }.  if( 0 == dw
8670: 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Len ){.    sqlit
8680: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
8690: 2c 20 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f 72  , zBuf, "OsError
86a0: 20 30 78 25 78 20 28 25 75 29 22 2c 20 6c 61 73   0x%x (%u)", las
86b0: 74 45 72 72 6e 6f 2c 20 6c 61 73 74 45 72 72 6e  tErrno, lastErrn
86c0: 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
86d0: 20 2f 2a 20 63 6f 70 79 20 61 20 6d 61 78 69 6d   /* copy a maxim
86e0: 75 6d 20 6f 66 20 6e 42 75 66 20 63 68 61 72 73  um of nBuf chars
86f0: 20 74 6f 20 6f 75 74 70 75 74 20 62 75 66 66 65   to output buffe
8700: 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  r */.    sqlite3
8710: 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20  _snprintf(nBuf, 
8720: 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74  zBuf, "%s", zOut
8730: 29 3b 0a 20 20 20 20 2f 2a 20 66 72 65 65 20 74  );.    /* free t
8740: 68 65 20 55 54 46 38 20 62 75 66 66 65 72 20 2a  he UTF8 buffer *
8750: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  /.    sqlite3_fr
8760: 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20  ee(zOut);.  }.  
8770: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
8780: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
8790: 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f  ion - winLogErro
87a0: 72 41 74 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f  rAtLine() - is o
87b0: 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20  nly ever called 
87c0: 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a  via the macro.**
87d0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0a   winLogError()..
87e0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
87f0: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66  ne is invoked af
8800: 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  ter an error occ
8810: 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e  urs in an OS fun
8820: 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67  ction..** It log
8830: 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e  s a message usin
8840: 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  g sqlite3_log() 
8850: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
8860: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a  urrent value of.
8870: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  ** error code an
8880: 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20  d, if possible, 
8890: 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  the human-readab
88a0: 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72  le equivalent fr
88b0: 6f 6d 20 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73  om .** FormatMes
88c0: 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sage..**.** The 
88d0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  first argument p
88e0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63  assed to the mac
88f0: 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ro should be the
8900: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74   error code that
8910: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75  .** will be retu
8920: 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28  rned to SQLite (
8930: 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52  e.g. SQLITE_IOER
8940: 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45  R_DELETE, SQLITE
8950: 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20  _CANTOPEN). .** 
8960: 54 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65  The two subseque
8970: 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f  nt arguments sho
8980: 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20  uld be the name 
8990: 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69  of the OS functi
89a0: 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65  on that.** faile
89b0: 64 20 61 6e 64 20 74 68 65 20 74 68 65 20 61 73  d and the the as
89c0: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79  sociated file-sy
89d0: 73 74 65 6d 20 70 61 74 68 2c 20 69 66 20 61 6e  stem path, if an
89e0: 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69  y..*/.#define wi
89f0: 6e 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 2c  nLogError(a,b,c,
8a00: 64 29 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  d)   winLogError
8a10: 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 64 2c 5f  AtLine(a,b,c,d,_
8a20: 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20  _LINE__).static 
8a30: 69 6e 74 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41  int winLogErrorA
8a40: 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72  tLine(.  int err
8a50: 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  code,           
8a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69           /* SQLi
8a70: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  te error code */
8a80: 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
8a90: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  no,             
8aa0: 20 20 20 2f 2a 20 57 69 6e 33 32 20 6c 61 73 74     /* Win32 last
8ab0: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73   error */.  cons
8ac0: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20  t char *zFunc,  
8ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8ae0: 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69  ame of OS functi
8af0: 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a  on that failed *
8b00: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
8b10: 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
8b20: 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68      /* File path
8b30: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
8b40: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20   error */.  int 
8b50: 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20 20 20  iLine           
8b60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8b70: 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65  ource line numbe
8b80: 72 20 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63  r where error oc
8b90: 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63  curred */.){.  c
8ba0: 68 61 72 20 7a 4d 73 67 5b 35 30 30 5d 3b 20 20  har zMsg[500];  
8bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8bc0: 2a 20 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65  * Human readable
8bd0: 20 65 72 72 6f 72 20 74 65 78 74 20 2a 2f 0a 20   error text */. 
8be0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
8bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c00: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
8c10: 20 2a 2f 0a 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d   */..  zMsg[0] =
8c20: 20 30 3b 0a 20 20 67 65 74 4c 61 73 74 45 72 72   0;.  getLastErr
8c30: 6f 72 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c  orMsg(lastErrno,
8c40: 20 73 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a   sizeof(zMsg), z
8c50: 4d 73 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Msg);.  assert( 
8c60: 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errcode!=SQLITE_
8c70: 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74  OK );.  if( zPat
8c80: 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22  h==0 ) zPath = "
8c90: 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d  ";.  for(i=0; zM
8ca0: 73 67 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d  sg[i] && zMsg[i]
8cb0: 21 3d 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69  !='\r' && zMsg[i
8cc0: 5d 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a  ]!='\n'; i++){}.
8cd0: 20 20 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20    zMsg[i] = 0;. 
8ce0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72   sqlite3_log(err
8cf0: 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f  code,.      "os_
8d00: 77 69 6e 2e 63 3a 25 64 3a 20 28 25 64 29 20 25  win.c:%d: (%d) %
8d10: 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20  s(%s) - %s",.   
8d20: 20 20 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72     iLine, lastEr
8d30: 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74  rno, zFunc, zPat
8d40: 68 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20  h, zMsg.  );..  
8d50: 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a  return errcode;.
8d60: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d  }../*.** The num
8d70: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61  ber of times tha
8d80: 74 20 61 20 52 65 61 64 46 69 6c 65 28 29 2c 20  t a ReadFile(), 
8d90: 57 72 69 74 65 46 69 6c 65 28 29 2c 20 61 6e 64  WriteFile(), and
8da0: 20 44 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a   DeleteFile().**
8db0: 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 64   will be retried
8dc0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63   following a loc
8dd0: 6b 69 6e 67 20 65 72 72 6f 72 20 2d 20 70 72 6f  king error - pro
8de0: 62 61 62 6c 79 20 63 61 75 73 65 64 20 62 79 20  bably caused by 
8df0: 0a 2a 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f  .** antivirus so
8e00: 66 74 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68  ftware.  Also th
8e10: 65 20 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20  e initial delay 
8e20: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
8e30: 20 72 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64   retry..** The d
8e40: 65 6c 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c  elay increases l
8e50: 69 6e 65 61 72 6c 79 20 77 69 74 68 20 65 61 63  inearly with eac
8e60: 68 20 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e  h retry..*/.#ifn
8e70: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
8e80: 5f 49 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64  _IOERR_RETRY.# d
8e90: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
8ea0: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31  32_IOERR_RETRY 1
8eb0: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
8ec0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
8ed0: 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a  ERR_RETRY_DELAY.
8ee0: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
8ef0: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
8f00: 59 5f 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69  Y_DELAY 25.#endi
8f10: 66 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  f.static int win
8f20: 33 32 49 6f 65 72 72 52 65 74 72 79 20 3d 20 53  32IoerrRetry = S
8f30: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
8f40: 52 5f 52 45 54 52 59 3b 0a 73 74 61 74 69 63 20  R_RETRY;.static 
8f50: 69 6e 74 20 77 69 6e 33 32 49 6f 65 72 72 52 65  int win32IoerrRe
8f60: 74 72 79 44 65 6c 61 79 20 3d 20 53 51 4c 49 54  tryDelay = SQLIT
8f70: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
8f80: 54 52 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a  TRY_DELAY;../*.*
8f90: 2a 20 49 66 20 61 20 52 65 61 64 46 69 6c 65 28  * If a ReadFile(
8fa0: 29 20 6f 72 20 57 72 69 74 65 46 69 6c 65 28 29  ) or WriteFile()
8fb0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 69   error occurs, i
8fc0: 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69  nvoke this routi
8fd0: 6e 65 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  ne.** to see if 
8fe0: 69 74 20 73 68 6f 75 6c 64 20 62 65 20 72 65 74  it should be ret
8ff0: 72 69 65 64 2e 20 20 52 65 74 75 72 6e 20 54 52  ried.  Return TR
9000: 55 45 20 74 6f 20 72 65 74 72 79 2e 20 20 52 65  UE to retry.  Re
9010: 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 74 6f  turn FALSE.** to
9020: 20 67 69 76 65 20 75 70 20 77 69 74 68 20 61 6e   give up with an
9030: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
9040: 63 20 69 6e 74 20 72 65 74 72 79 49 6f 65 72 72  c int retryIoerr
9050: 28 69 6e 74 20 2a 70 6e 52 65 74 72 79 2c 20 44  (int *pnRetry, D
9060: 57 4f 52 44 20 2a 70 45 72 72 6f 72 29 7b 0a 20  WORD *pError){. 
9070: 20 44 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74   DWORD e = osGet
9080: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69  LastError();.  i
9090: 66 28 20 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e  f( *pnRetry>=win
90a0: 33 32 49 6f 65 72 72 52 65 74 72 79 20 29 7b 0a  32IoerrRetry ){.
90b0: 20 20 20 20 69 66 28 20 70 45 72 72 6f 72 20 29      if( pError )
90c0: 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20  {.      *pError 
90d0: 3d 20 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  = e;.    }.    r
90e0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
90f0: 66 28 20 65 3d 3d 45 52 52 4f 52 5f 41 43 43 45  f( e==ERROR_ACCE
9100: 53 53 5f 44 45 4e 49 45 44 20 7c 7c 0a 20 20 20  SS_DENIED ||.   
9110: 20 20 20 65 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b     e==ERROR_LOCK
9120: 5f 56 49 4f 4c 41 54 49 4f 4e 20 7c 7c 0a 20 20  _VIOLATION ||.  
9130: 20 20 20 20 65 3d 3d 45 52 52 4f 52 5f 53 48 41      e==ERROR_SHA
9140: 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 20 29  RING_VIOLATION )
9150: 7b 0a 20 20 20 20 6f 73 53 6c 65 65 70 28 77 69  {.    osSleep(wi
9160: 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c  n32IoerrRetryDel
9170: 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29 29  ay*(1+*pnRetry))
9180: 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79  ;.    ++*pnRetry
9190: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
91a0: 20 20 7d 0a 20 20 69 66 28 20 70 45 72 72 6f 72    }.  if( pError
91b0: 20 29 7b 0a 20 20 20 20 2a 70 45 72 72 6f 72 20   ){.    *pError 
91c0: 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = e;.  }.  retur
91d0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  n 0;.}../*.** Lo
91e0: 67 20 61 20 49 2f 4f 20 65 72 72 6f 72 20 72 65  g a I/O error re
91f0: 74 72 79 20 65 70 69 73 6f 64 65 2e 0a 2a 2f 0a  try episode..*/.
9200: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 67 49  static void logI
9210: 6f 65 72 72 28 69 6e 74 20 6e 52 65 74 72 79 29  oerr(int nRetry)
9220: 7b 0a 20 20 69 66 28 20 6e 52 65 74 72 79 20 29  {.  if( nRetry )
9230: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
9240: 67 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  g(SQLITE_IOERR, 
9250: 0a 20 20 20 20 20 20 22 64 65 6c 61 79 65 64 20  .      "delayed 
9260: 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b 2f 73 68  %dms for lock/sh
9270: 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63 74 22 2c  aring conflict",
9280: 0a 20 20 20 20 20 20 77 69 6e 33 32 49 6f 65 72  .      win32Ioer
9290: 72 52 65 74 72 79 44 65 6c 61 79 2a 6e 52 65 74  rRetryDelay*nRet
92a0: 72 79 2a 28 6e 52 65 74 72 79 2b 31 29 2f 32 0a  ry*(nRetry+1)/2.
92b0: 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69      );.  }.}..#i
92c0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
92d0: 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  E./*************
92e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
92f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
9320: 54 68 69 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e  This section con
9330: 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 57  tains code for W
9340: 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 2f 2a  inCE only..*/./*
9350: 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 43 45 20 64  .** Windows CE d
9360: 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 6c  oes not have a l
9370: 6f 63 61 6c 74 69 6d 65 28 29 20 66 75 6e 63 74  ocaltime() funct
9380: 69 6f 6e 2e 20 20 53 6f 20 63 72 65 61 74 65 20  ion.  So create 
9390: 61 0a 2a 2a 20 73 75 62 73 74 69 74 75 74 65 2e  a.** substitute.
93a0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69  .*/.#include <ti
93b0: 6d 65 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d 20  me.h>.struct tm 
93c0: 2a 5f 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69  *__cdecl localti
93d0: 6d 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20  me(const time_t 
93e0: 2a 74 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 73  *t).{.  static s
93f0: 74 72 75 63 74 20 74 6d 20 79 3b 0a 20 20 46 49  truct tm y;.  FI
9400: 4c 45 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b  LETIME uTm, lTm;
9410: 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20 70 54  .  SYSTEMTIME pT
9420: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  m;.  sqlite3_int
9430: 36 34 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20  64 t64;.  t64 = 
9440: 2a 74 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34  *t;.  t64 = (t64
9450: 20 2b 20 31 31 36 34 34 34 37 33 36 30 30 29 2a   + 11644473600)*
9460: 31 30 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e  10000000;.  uTm.
9470: 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20  dwLowDateTime = 
9480: 28 44 57 4f 52 44 29 28 74 36 34 20 26 20 30 78  (DWORD)(t64 & 0x
9490: 46 46 46 46 46 46 46 46 29 3b 0a 20 20 75 54 6d  FFFFFFFF);.  uTm
94a0: 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 3d  .dwHighDateTime=
94b0: 20 28 44 57 4f 52 44 29 28 74 36 34 20 3e 3e 20   (DWORD)(t64 >> 
94c0: 33 32 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d  32);.  osFileTim
94d0: 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65  eToLocalFileTime
94e0: 28 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 6f  (&uTm,&lTm);.  o
94f0: 73 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65  sFileTimeToSyste
9500: 6d 54 69 6d 65 28 26 6c 54 6d 2c 26 70 54 6d 29  mTime(&lTm,&pTm)
9510: 3b 0a 20 20 79 2e 74 6d 5f 79 65 61 72 20 3d 20  ;.  y.tm_year = 
9520: 70 54 6d 2e 77 59 65 61 72 20 2d 20 31 39 30 30  pTm.wYear - 1900
9530: 3b 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70  ;.  y.tm_mon = p
9540: 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20  Tm.wMonth - 1;. 
9550: 20 79 2e 74 6d 5f 77 64 61 79 20 3d 20 70 54 6d   y.tm_wday = pTm
9560: 2e 77 44 61 79 4f 66 57 65 65 6b 3b 0a 20 20 79  .wDayOfWeek;.  y
9570: 2e 74 6d 5f 6d 64 61 79 20 3d 20 70 54 6d 2e 77  .tm_mday = pTm.w
9580: 44 61 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75 72  Day;.  y.tm_hour
9590: 20 3d 20 70 54 6d 2e 77 48 6f 75 72 3b 0a 20 20   = pTm.wHour;.  
95a0: 79 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77  y.tm_min = pTm.w
95b0: 4d 69 6e 75 74 65 3b 0a 20 20 79 2e 74 6d 5f 73  Minute;.  y.tm_s
95c0: 65 63 20 3d 20 70 54 6d 2e 77 53 65 63 6f 6e 64  ec = pTm.wSecond
95d0: 3b 0a 20 20 72 65 74 75 72 6e 20 26 79 3b 0a 7d  ;.  return &y;.}
95e0: 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45  ..#define HANDLE
95f0: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28  _TO_WINFILE(a) (
9600: 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72  winFile*)&((char
9610: 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65  *)a)[-(int)offse
9620: 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a  tof(winFile,h)].
9630: 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
9640: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e   lock on the han
9650: 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20  dle h.*/.static 
9660: 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41  void winceMutexA
9670: 63 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29  cquire(HANDLE h)
9680: 7b 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72 72  {.   DWORD dwErr
9690: 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64  ;.   do {.     d
96a0: 77 45 72 72 20 3d 20 57 61 69 74 46 6f 72 53 69  wErr = WaitForSi
96b0: 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e  ngleObject(h, IN
96c0: 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77 68  FINITE);.   } wh
96d0: 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20 57 41  ile (dwErr != WA
96e0: 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20 64  IT_OBJECT_0 && d
96f0: 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41 42 41  wErr != WAIT_ABA
9700: 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a  NDONED);.}./*.**
9710: 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20   Release a lock 
9720: 61 63 71 75 69 72 65 64 20 62 79 20 77 69 6e 63  acquired by winc
9730: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 29 0a  eMutexAcquire().
9740: 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 63 65  */.#define wince
9750: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68 29 20  MutexRelease(h) 
9760: 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68 29 0a  ReleaseMutex(h).
9770: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  ./*.** Create th
9780: 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68 61 72  e mutex and shar
9790: 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 66  ed memory used f
97a0: 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68  or locking in th
97b0: 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  e file.** descri
97c0: 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74  ptor pFile.*/.st
97d0: 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 43  atic BOOL winceC
97e0: 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20  reateLock(const 
97f0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
9800: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29   winFile *pFile)
9810: 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b 3b  {.  LPWSTR zTok;
9820: 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65 3b  .  LPWSTR zName;
9830: 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20  .  BOOL bInit = 
9840: 54 52 55 45 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d  TRUE;..  zName =
9850: 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a   utf8ToUnicode(z
9860: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
9870: 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
9880: 20 2f 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72   /* out of memor
9890: 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  y */.    return 
98a0: 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  FALSE;.  }..  /*
98b0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
98c0: 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a  local lockdata *
98d0: 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 46 69 6c  /.  memset(&pFil
98e0: 65 2d 3e 6c 6f 63 61 6c 2c 20 30 2c 20 73 69 7a  e->local, 0, siz
98f0: 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  eof(pFile->local
9900: 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63  ));..  /* Replac
9910: 65 20 74 68 65 20 62 61 63 6b 73 6c 61 73 68 65  e the backslashe
9920: 73 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e  s from the filen
9930: 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72 63 61 73  ame and lowercas
9940: 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72  e it.  ** to der
9950: 69 76 65 20 61 20 6d 75 74 65 78 20 6e 61 6d 65  ive a mutex name
9960: 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73  . */.  zTok = os
9970: 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65  CharLowerW(zName
9980: 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b  );.  for (;*zTok
9990: 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66  ;zTok++){.    if
99a0: 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29   (*zTok == '\\')
99b0: 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20   *zTok = '_';.  
99c0: 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f  }..  /* Create/o
99d0: 70 65 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d 75  pen the named mu
99e0: 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e  tex */.  pFile->
99f0: 68 4d 75 74 65 78 20 3d 20 6f 73 43 72 65 61 74  hMutex = osCreat
9a00: 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41  eMutexW(NULL, FA
9a10: 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69  LSE, zName);.  i
9a20: 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65  f (!pFile->hMute
9a30: 78 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  x){.    pFile->l
9a40: 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
9a50: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
9a60: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
9a70: 49 54 45 5f 45 52 52 4f 52 2c 20 70 46 69 6c 65  ITE_ERROR, pFile
9a80: 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69  ->lastErrno, "wi
9a90: 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 31 22 2c  nceCreateLock1",
9aa0: 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
9ab0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
9ac0: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
9ad0: 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f   FALSE;.  }..  /
9ae0: 2a 20 41 63 71 75 69 72 65 20 74 68 65 20 6d 75  * Acquire the mu
9af0: 74 65 78 20 62 65 66 6f 72 65 20 63 6f 6e 74 69  tex before conti
9b00: 6e 75 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65  nuing */.  wince
9b10: 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69  MutexAcquire(pFi
9b20: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 0a  le->hMutex);.  .
9b30: 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 6e    /* Since the n
9b40: 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d 75  ames of named mu
9b50: 74 65 78 65 73 2c 20 73 65 6d 61 70 68 6f 72 65  texes, semaphore
9b60: 73 2c 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 73  s, file mappings
9b70: 20 65 74 63 20 61 72 65 20 0a 20 20 2a 2a 20 63   etc are .  ** c
9b80: 61 73 65 2d 73 65 6e 73 69 74 69 76 65 2c 20 74  ase-sensitive, t
9b90: 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66  ake advantage of
9ba0: 20 74 68 61 74 20 62 79 20 75 70 70 65 72 63 61   that by upperca
9bb0: 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 20 6e  sing the mutex n
9bc0: 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69  ame.  ** and usi
9bd0: 6e 67 20 74 68 61 74 20 61 73 20 74 68 65 20 73  ng that as the s
9be0: 68 61 72 65 64 20 66 69 6c 65 6d 61 70 70 69 6e  hared filemappin
9bf0: 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 6f  g name..  */.  o
9c00: 73 43 68 61 72 55 70 70 65 72 57 28 7a 4e 61 6d  sCharUpperW(zNam
9c10: 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53 68  e);.  pFile->hSh
9c20: 61 72 65 64 20 3d 20 6f 73 43 72 65 61 74 65 46  ared = osCreateF
9c30: 69 6c 65 4d 61 70 70 69 6e 67 57 28 49 4e 56 41  ileMappingW(INVA
9c40: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
9c50: 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  , NULL,.        
9c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c80: 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20  PAGE_READWRITE, 
9c90: 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c  0, sizeof(winceL
9ca0: 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ock),.          
9cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
9cd0: 61 6d 65 29 3b 20 20 0a 0a 20 20 2f 2a 20 53 65  ame);  ..  /* Se
9ce0: 74 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e  t a flag that in
9cf0: 64 69 63 61 74 65 73 20 77 65 27 72 65 20 74 68  dicates we're th
9d00: 65 20 66 69 72 73 74 20 74 6f 20 63 72 65 61 74  e first to creat
9d10: 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20  e the memory so 
9d20: 69 74 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65  it .  ** must be
9d30: 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65   zero-initialize
9d40: 64 20 2a 2f 0a 20 20 69 66 20 28 6f 73 47 65 74  d */.  if (osGet
9d50: 4c 61 73 74 45 72 72 6f 72 28 29 20 3d 3d 20 45  LastError() == E
9d60: 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58 49  RROR_ALREADY_EXI
9d70: 53 54 53 29 7b 0a 20 20 20 20 62 49 6e 69 74 20  STS){.    bInit 
9d80: 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20  = FALSE;.  }..  
9d90: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61  sqlite3_free(zNa
9da0: 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  me);..  /* If we
9db0: 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 6d 61   succeeded in ma
9dc0: 6b 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  king the shared 
9dd0: 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20 6d  memory handle, m
9de0: 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66 20 28  ap it. */.  if (
9df0: 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 7b  pFile->hShared){
9e00: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72  .    pFile->shar
9e10: 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a  ed = (winceLock*
9e20: 29 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  )osMapViewOfFile
9e30: 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 2c  (pFile->hShared,
9e40: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 46   .             F
9e50: 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49 4c  ILE_MAP_READ|FIL
9e60: 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c 20  E_MAP_WRITE, 0, 
9e70: 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c  0, sizeof(winceL
9e80: 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66  ock));.    /* If
9e90: 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2c   mapping failed,
9ea0: 20 63 6c 6f 73 65 20 74 68 65 20 73 68 61 72 65   close the share
9eb0: 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20  d memory handle 
9ec0: 61 6e 64 20 65 72 61 73 65 20 69 74 20 2a 2f 0a  and erase it */.
9ed0: 20 20 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e      if (!pFile->
9ee0: 73 68 61 72 65 64 29 7b 0a 20 20 20 20 20 20 70  shared){.      p
9ef0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
9f00: 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
9f10: 28 29 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67  ();.      winLog
9f20: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52  Error(SQLITE_ERR
9f30: 4f 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  OR, pFile->lastE
9f40: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
9f50: 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74       "winceCreat
9f60: 65 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61  eLock2", zFilena
9f70: 6d 65 29 3b 0a 20 20 20 20 20 20 6f 73 43 6c 6f  me);.      osClo
9f80: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
9f90: 68 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  hShared);.      
9fa0: 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d  pFile->hShared =
9fb0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d   NULL;.    }.  }
9fc0: 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61 72 65 64  ..  /* If shared
9fd0: 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e 6f   memory could no
9fe0: 74 20 62 65 20 63 72 65 61 74 65 64 2c 20 74 68  t be created, th
9ff0: 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d 75 74  en close the mut
a000: 65 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a 20  ex and fail */. 
a010: 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61   if (pFile->hSha
a020: 72 65 64 20 3d 3d 20 4e 55 4c 4c 29 7b 0a 20 20  red == NULL){.  
a030: 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
a040: 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
a050: 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48  x);.    osCloseH
a060: 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75  andle(pFile->hMu
a070: 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  tex);.    pFile-
a080: 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a  >hMutex = NULL;.
a090: 20 20 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45      return FALSE
a0a0: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 6e  ;.  }.  .  /* In
a0b0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 68 61  itialize the sha
a0c0: 72 65 64 20 6d 65 6d 6f 72 79 20 69 66 20 77 65  red memory if we
a0d0: 27 72 65 20 73 75 70 70 6f 73 65 64 20 74 6f 20  're supposed to 
a0e0: 2a 2f 0a 20 20 69 66 20 28 62 49 6e 69 74 29 20  */.  if (bInit) 
a0f0: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69  {.    memset(pFi
a100: 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20 73  le->shared, 0, s
a110: 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29  izeof(winceLock)
a120: 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d  );.  }..  winceM
a130: 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
a140: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65  e->hMutex);.  re
a150: 74 75 72 6e 20 54 52 55 45 3b 0a 7d 0a 0a 2f 2a  turn TRUE;.}../*
a160: 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74 68 65 20  .** Destroy the 
a170: 70 61 72 74 20 6f 66 20 77 69 6e 46 69 6c 65 20  part of winFile 
a180: 74 68 61 74 20 64 65 61 6c 73 20 77 69 74 68 20  that deals with 
a190: 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73  wince locks.*/.s
a1a0: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65  tatic void wince
a1b0: 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46  DestroyLock(winF
a1c0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
a1d0: 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  f (pFile->hMutex
a1e0: 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75 69 72  ){.    /* Acquir
a1f0: 65 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20  e the mutex */. 
a200: 20 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71     winceMutexAcq
a210: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
a220: 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ex);..    /* The
a230: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
a240: 73 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c  s should probabl
a250: 79 20 61 73 73 65 72 74 20 69 6e 20 64 65 62 75  y assert in debu
a260: 67 20 6d 6f 64 65 2c 20 62 75 74 20 74 68 65 79  g mode, but they
a270: 0a 20 20 20 20 20 20 20 61 72 65 20 74 6f 20 63  .       are to c
a280: 6c 65 61 6e 75 70 20 69 6e 20 63 61 73 65 20 61  leanup in case a
a290: 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65  ny locks remaine
a2a0: 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66  d open */.    if
a2b0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
a2c0: 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20  Readers){.      
a2d0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e  pFile->shared->n
a2e0: 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20  Readers --;.    
a2f0: 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  }.    if (pFile-
a300: 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
a310: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
a320: 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65  shared->bReserve
a330: 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d  d = FALSE;.    }
a340: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
a350: 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b  local.bPending){
a360: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
a370: 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d  ared->bPending =
a380: 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20   FALSE;.    }.  
a390: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
a3a0: 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a  al.bExclusive){.
a3b0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
a3c0: 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
a3d0: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a  = FALSE;.    }..
a3e0: 20 20 20 20 2f 2a 20 44 65 2d 72 65 66 65 72 65      /* De-refere
a3f0: 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75  nce and close ou
a400: 72 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 68  r copy of the sh
a410: 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64  ared memory hand
a420: 6c 65 20 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d 61  le */.    osUnma
a430: 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c  pViewOfFile(pFil
a440: 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20 20 20  e->shared);.    
a450: 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
a460: 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 0a  ile->hShared);..
a470: 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74 68      /* Done with
a480: 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20   the mutex */.  
a490: 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
a4a0: 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
a4b0: 78 29 3b 20 20 20 20 0a 20 20 20 20 6f 73 43 6c  x);    .    osCl
a4c0: 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
a4d0: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46  >hMutex);.    pF
a4e0: 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55  ile->hMutex = NU
a4f0: 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a  LL;.  }.}../* .*
a500: 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  * An implementat
a510: 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46  ion of the LockF
a520: 69 6c 65 28 29 20 41 50 49 20 6f 66 20 57 69 6e  ile() API of Win
a530: 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73  dows for CE.*/.s
a540: 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65  tatic BOOL wince
a550: 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 48 41 4e 44  LockFile(.  HAND
a560: 4c 45 20 2a 70 68 46 69 6c 65 2c 0a 20 20 44 57  LE *phFile,.  DW
a570: 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
a580: 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  Low,.  DWORD dwF
a590: 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20  ileOffsetHigh,. 
a5a0: 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
a5b0: 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a  BytesToLockLow,.
a5c0: 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
a5d0: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68  fBytesToLockHigh
a5e0: 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
a5f0: 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f  File = HANDLE_TO
a600: 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29  _WINFILE(phFile)
a610: 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e  ;.  BOOL bReturn
a620: 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55   = FALSE;..  UNU
a630: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77  SED_PARAMETER(dw
a640: 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b  FileOffsetHigh);
a650: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
a660: 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74  TER(nNumberOfByt
a670: 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a  esToLockHigh);..
a680: 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d    if (!pFile->hM
a690: 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52 55  utex) return TRU
a6a0: 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41  E;.  winceMutexA
a6b0: 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d  cquire(pFile->hM
a6c0: 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e  utex);..  /* Wan
a6d0: 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ting an exclusiv
a6e0: 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20  e lock? */.  if 
a6f0: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
a700: 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
a710: 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20 20 26  D_FIRST.       &
a720: 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
a730: 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57  ToLockLow == (DW
a740: 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29  ORD)SHARED_SIZE)
a750: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
a760: 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72  >shared->nReader
a770: 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c 65 2d  s == 0 && pFile-
a780: 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
a790: 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20  ive == 0){.     
a7a0: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
a7b0: 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52  >bExclusive = TR
a7c0: 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69 6c 65  UE;.       pFile
a7d0: 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
a7e0: 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ve = TRUE;.     
a7f0: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
a800: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
a810: 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e  * Want a read-on
a820: 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c  ly lock? */.  el
a830: 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
a840: 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
a850: 29 53 48 41 52 45 44 5f 46 49 52 53 54 20 26 26  )SHARED_FIRST &&
a860: 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e 75 6d  .           nNum
a870: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
a880: 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
a890: 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
a8a0: 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20  ->bExclusive == 
a8b0: 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  0){.      pFile-
a8c0: 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
a8d0: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46  ++;.      if (pF
a8e0: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
a8f0: 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20  ers == 1){.     
a900: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
a910: 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20  ->nReaders ++;. 
a920: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65       }.      bRe
a930: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
a940: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e   }.  }..  /* Wan
a950: 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  t a pending lock
a960: 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  ? */.  else if (
a970: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
a980: 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e  == (DWORD)PENDIN
a990: 47 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65  G_BYTE && nNumbe
a9a0: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
a9b0: 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20  w == 1){.    /* 
a9c0: 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f  If no pending lo
a9d0: 63 6b 20 68 61 73 20 62 65 65 6e 20 61 63 71 75  ck has been acqu
a9e0: 69 72 65 64 2c 20 74 68 65 6e 20 61 63 71 75 69  ired, then acqui
a9f0: 72 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 20  re it */.    if 
aa00: 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e  (pFile->shared->
aa10: 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b  bPending == 0) {
aa20: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
aa30: 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d  ared->bPending =
aa40: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69   TRUE;.      pFi
aa50: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69  le->local.bPendi
aa60: 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ng = TRUE;.     
aa70: 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
aa80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
aa90: 20 57 61 6e 74 20 61 20 72 65 73 65 72 76 65 64   Want a reserved
aaa0: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65   lock? */.  else
aab0: 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
aac0: 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52  tLow == (DWORD)R
aad0: 45 53 45 52 56 45 44 5f 42 59 54 45 20 26 26 20  ESERVED_BYTE && 
aae0: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
aaf0: 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20  LockLow == 1){. 
ab00: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68     if (pFile->sh
ab10: 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20  ared->bReserved 
ab20: 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46  == 0) {.      pF
ab30: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65  ile->shared->bRe
ab40: 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20  served = TRUE;. 
ab50: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
ab60: 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20 54 52  l.bReserved = TR
ab70: 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  UE;.      bRetur
ab80: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
ab90: 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65    }..  winceMute
aba0: 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e  xRelease(pFile->
abb0: 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  hMutex);.  retur
abc0: 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  n bReturn;.}../*
abd0: 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74  .** An implement
abe0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 55 6e 6c  ation of the Unl
abf0: 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f 66 20 57  ockFile API of W
ac00: 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f  indows for CE.*/
ac10: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
ac20: 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20  ceUnlockFile(.  
ac30: 48 41 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a  HANDLE *phFile,.
ac40: 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66    DWORD dwFileOf
ac50: 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  fsetLow,.  DWORD
ac60: 20 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67   dwFileOffsetHig
ac70: 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62  h,.  DWORD nNumb
ac80: 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
ac90: 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  kLow,.  DWORD nN
aca0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
acb0: 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69  lockHigh.){.  wi
acc0: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48  nFile *pFile = H
acd0: 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45  ANDLE_TO_WINFILE
ace0: 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c  (phFile);.  BOOL
acf0: 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45   bReturn = FALSE
ad00: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
ad10: 4d 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73  METER(dwFileOffs
ad20: 65 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45  etHigh);.  UNUSE
ad30: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d  D_PARAMETER(nNum
ad40: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
ad50: 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28  ckHigh);..  if (
ad60: 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20  !pFile->hMutex) 
ad70: 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77  return TRUE;.  w
ad80: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
ad90: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
ada0: 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67  ..  /* Releasing
adb0: 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f   a reader lock o
adc0: 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
add0: 6f 63 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77 46  ock */.  if (dwF
ade0: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
adf0: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49  (DWORD)SHARED_FI
ae00: 52 53 54 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64  RST){.    /* Did
ae10: 20 77 65 20 68 61 76 65 20 61 6e 20 65 78 63 6c   we have an excl
ae20: 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  usive lock? */. 
ae30: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
ae40: 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b  cal.bExclusive){
ae50: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e  .      assert(nN
ae60: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
ae70: 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  lockLow == (DWOR
ae80: 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29 3b 0a  D)SHARED_SIZE);.
ae90: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
aea0: 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  al.bExclusive = 
aeb0: 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69  FALSE;.      pFi
aec0: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63  le->shared->bExc
aed0: 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a  lusive = FALSE;.
aee0: 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
aef0: 54 52 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  TRUE;.    }..   
af00: 20 2f 2a 20 44 69 64 20 77 65 20 6a 75 73 74 20   /* Did we just 
af10: 68 61 76 65 20 61 20 72 65 61 64 65 72 20 6c 6f  have a reader lo
af20: 63 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  ck? */.    else 
af30: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
af40: 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20  .nReaders){.    
af50: 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72    assert(nNumber
af60: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
af70: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
af80: 52 45 44 5f 53 49 5a 45 20 7c 7c 20 6e 4e 75 6d  RED_SIZE || nNum
af90: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
afa0: 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20 20 20  ckLow == 1);.   
afb0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
afc0: 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20  nReaders --;.   
afd0: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
afe0: 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20  cal.nReaders == 
aff0: 30 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  0).      {.     
b000: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
b010: 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20  ->nReaders --;. 
b020: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65       }.      bRe
b030: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
b040: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c   }.  }..  /* Rel
b050: 65 61 73 69 6e 67 20 61 20 70 65 6e 64 69 6e 67  easing a pending
b060: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20   lock */.  else 
b070: 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
b080: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45  Low == (DWORD)PE
b090: 4e 44 49 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e  NDING_BYTE && nN
b0a0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
b0b0: 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20  lockLow == 1){. 
b0c0: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
b0d0: 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20  cal.bPending){. 
b0e0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
b0f0: 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c  l.bPending = FAL
b100: 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  SE;.      pFile-
b110: 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
b120: 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  g = FALSE;.     
b130: 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
b140: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
b150: 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73 65  Releasing a rese
b160: 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65  rved lock */.  e
b170: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
b180: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
b190: 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 20  D)RESERVED_BYTE 
b1a0: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
b1b0: 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
b1c0: 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  1){.    if (pFil
b1d0: 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
b1e0: 65 64 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ed) {.      pFil
b1f0: 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
b200: 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ed = FALSE;.    
b210: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
b220: 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c  >bReserved = FAL
b230: 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  SE;.      bRetur
b240: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
b250: 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65    }..  winceMute
b260: 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e  xRelease(pFile->
b270: 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  hMutex);.  retur
b280: 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  n bReturn;.}../*
b290: 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74  .** An implement
b2a0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63  ation of the Loc
b2b0: 6b 46 69 6c 65 45 78 28 29 20 41 50 49 20 6f 66  kFileEx() API of
b2c0: 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a   Windows for CE.
b2d0: 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
b2e0: 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45 78 28 0a  inceLockFileEx(.
b2f0: 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69 6c 65    HANDLE *phFile
b300: 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67  ,.  DWORD dwFlag
b310: 73 2c 0a 20 20 44 57 4f 52 44 20 64 77 52 65 73  s,.  DWORD dwRes
b320: 65 72 76 65 64 2c 0a 20 20 44 57 4f 52 44 20 6e  erved,.  DWORD n
b330: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
b340: 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  ockLow,.  DWORD 
b350: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
b360: 4c 6f 63 6b 48 69 67 68 2c 0a 20 20 4c 50 4f 56  LockHigh,.  LPOV
b370: 45 52 4c 41 50 50 45 44 20 6c 70 4f 76 65 72 6c  ERLAPPED lpOverl
b380: 61 70 70 65 64 0a 29 7b 0a 20 20 55 4e 55 53 45  apped.){.  UNUSE
b390: 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77 52 65  D_PARAMETER(dwRe
b3a0: 73 65 72 76 65 64 29 3b 0a 20 20 55 4e 55 53 45  served);.  UNUSE
b3b0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d  D_PARAMETER(nNum
b3c0: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
b3d0: 48 69 67 68 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  High);..  /* If 
b3e0: 74 68 65 20 63 61 6c 6c 65 72 20 77 61 6e 74 73  the caller wants
b3f0: 20 61 20 73 68 61 72 65 64 20 72 65 61 64 20 6c   a shared read l
b400: 6f 63 6b 2c 20 66 6f 72 77 61 72 64 20 74 68 69  ock, forward thi
b410: 73 20 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 77  s call.  ** to w
b420: 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 20 2a 2f 0a  inceLockFile */.
b430: 20 20 69 66 20 28 6c 70 4f 76 65 72 6c 61 70 70    if (lpOverlapp
b440: 65 64 2d 3e 4f 66 66 73 65 74 20 3d 3d 20 28 44  ed->Offset == (D
b450: 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53  WORD)SHARED_FIRS
b460: 54 20 26 26 0a 20 20 20 20 20 20 64 77 46 6c 61  T &&.      dwFla
b470: 67 73 20 3d 3d 20 31 20 26 26 0a 20 20 20 20 20  gs == 1 &&.     
b480: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
b490: 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f  oLockLow == (DWO
b4a0: 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29 7b  RD)SHARED_SIZE){
b4b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 63  .    return winc
b4c0: 65 4c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65  eLockFile(phFile
b4d0: 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
b4e0: 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 1, 0);.  }.  
b4f0: 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a  return FALSE;.}.
b500: 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  /*.** End of the
b510: 20 73 70 65 63 69 61 6c 20 63 6f 64 65 20 66 6f   special code fo
b520: 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a  r wince.********
b530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b570: 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  *****/.#endif /*
b580: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
b590: 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   */../**********
b5a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20  ***.** The next 
b5f0: 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65  group of routine
b600: 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  s implement the 
b610: 49 2f 4f 20 6d 65 74 68 6f 64 73 20 73 70 65 63  I/O methods spec
b620: 69 66 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  ified.** by the 
b630: 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
b640: 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a  ds object..*****
b650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
b6a0: 2a 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74  * Some Microsoft
b6b0: 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20   compilers lack 
b6c0: 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e  this definition.
b6d0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41  .*/.#ifndef INVA
b6e0: 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
b6f0: 4e 54 45 52 0a 23 20 64 65 66 69 6e 65 20 49 4e  NTER.# define IN
b700: 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
b710: 4f 49 4e 54 45 52 20 28 28 44 57 4f 52 44 29 2d  OINTER ((DWORD)-
b720: 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  1).#endif../*.**
b730: 20 4d 6f 76 65 20 74 68 65 20 63 75 72 72 65 6e   Move the curren
b740: 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68  t position of th
b750: 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 61  e file handle pa
b760: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
b770: 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74  t .** argument t
b780: 6f 20 6f 66 66 73 65 74 20 69 4f 66 66 73 65 74  o offset iOffset
b790: 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 6c 65   within the file
b7a0: 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
b7b0: 20 72 65 74 75 72 6e 20 30 2e 20 0a 2a 2a 20 4f   return 0. .** O
b7c0: 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 70 46  therwise, set pF
b7d0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 61  ile->lastErrno a
b7e0: 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  nd return non-ze
b7f0: 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
b800: 74 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 77 69  t seekWinFile(wi
b810: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71  nFile *pFile, sq
b820: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 66  lite3_int64 iOff
b830: 73 65 74 29 7b 0a 20 20 4c 4f 4e 47 20 75 70 70  set){.  LONG upp
b840: 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20 20  erBits;         
b850: 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20          /* Most 
b860: 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20  sig. 32 bits of 
b870: 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  new offset */.  
b880: 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73 3b 20  LONG lowerBits; 
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8a0: 2f 2a 20 4c 65 61 73 74 20 73 69 67 2e 20 33 32  /* Least sig. 32
b8b0: 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66   bits of new off
b8c0: 73 65 74 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64  set */.  DWORD d
b8d0: 77 52 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  wRet;           
b8e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
b8f0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 65  e returned by Se
b900: 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a  tFilePointer() *
b910: 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  /.  DWORD lastEr
b920: 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  rno;            
b930: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
b940: 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74  urned by GetLast
b950: 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20 20 75 70  Error() */..  up
b960: 70 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29  perBits = (LONG)
b970: 28 28 69 4f 66 66 73 65 74 3e 3e 33 32 29 20 26  ((iOffset>>32) &
b980: 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20   0x7fffffff);.  
b990: 6c 6f 77 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e  lowerBits = (LON
b9a0: 47 29 28 69 4f 66 66 73 65 74 20 26 20 30 78 66  G)(iOffset & 0xf
b9b0: 66 66 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20  fffffff);..  /* 
b9c0: 41 50 49 20 6f 64 64 69 74 79 3a 20 49 66 20 73  API oddity: If s
b9d0: 75 63 63 65 73 73 66 75 6c 2c 20 53 65 74 46 69  uccessful, SetFi
b9e0: 6c 65 50 6f 69 6e 74 65 72 28 29 20 72 65 74 75  lePointer() retu
b9f0: 72 6e 73 20 61 20 64 77 6f 72 64 20 0a 20 20 2a  rns a dword .  *
ba00: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
ba10: 20 6c 6f 77 65 72 20 33 32 2d 62 69 74 73 20 6f   lower 32-bits o
ba20: 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f  f the new file-o
ba30: 66 66 73 65 74 2e 20 4f 72 2c 20 69 66 20 69 74  ffset. Or, if it
ba40: 20 66 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20   fails,.  ** it 
ba50: 72 65 74 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f  returns INVALID_
ba60: 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
ba70: 2e 20 48 6f 77 65 76 65 72 20 61 63 63 6f 72 64  . However accord
ba80: 69 6e 67 20 74 6f 20 4d 53 44 4e 2c 20 0a 20 20  ing to MSDN, .  
ba90: 2a 2a 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  ** INVALID_SET_F
baa0: 49 4c 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20  ILE_POINTER may 
bab0: 61 6c 73 6f 20 62 65 20 61 20 76 61 6c 69 64 20  also be a valid 
bac0: 6e 65 77 20 6f 66 66 73 65 74 2e 20 53 6f 20 74  new offset. So t
bad0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a  o determine .  *
bae0: 2a 20 77 68 65 74 68 65 72 20 61 6e 20 65 72 72  * whether an err
baf0: 6f 72 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20  or has actually 
bb00: 6f 63 63 75 72 65 64 2c 20 69 74 20 69 73 20 61  occured, it is a
bb10: 6c 73 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f  lso necessary to
bb20: 20 63 61 6c 6c 20 0a 20 20 2a 2a 20 47 65 74 4c   call .  ** GetL
bb30: 61 73 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f  astError()..  */
bb40: 0a 20 20 64 77 52 65 74 20 3d 20 6f 73 53 65 74  .  dwRet = osSet
bb50: 46 69 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c  FilePointer(pFil
bb60: 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c  e->h, lowerBits,
bb70: 20 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c   &upperBits, FIL
bb80: 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28  E_BEGIN);..  if(
bb90: 20 28 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44   (dwRet==INVALID
bba0: 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  _SET_FILE_POINTE
bbb0: 52 0a 20 20 20 20 20 20 26 26 20 28 28 6c 61 73  R.      && ((las
bbc0: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
bbd0: 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45  stError())!=NO_E
bbe0: 52 52 4f 52 29 29 20 29 7b 0a 20 20 20 20 70 46  RROR)) ){.    pF
bbf0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
bc00: 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
bc10: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
bc20: 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70  TE_IOERR_SEEK, p
bc30: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
bc40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 73  .             "s
bc50: 65 65 6b 57 69 6e 46 69 6c 65 22 2c 20 70 46 69  eekWinFile", pFi
bc60: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
bc70: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
bc80: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
bc90: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
bca0: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65  ..**.** It is re
bcb0: 70 6f 72 74 65 64 20 74 68 61 74 20 61 6e 20 61  ported that an a
bcc0: 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20  ttempt to close 
bcd0: 61 20 68 61 6e 64 6c 65 20 6d 69 67 68 74 20 73  a handle might s
bce0: 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c  ometimes.** fail
bcf0: 2e 20 20 54 68 69 73 20 69 73 20 61 20 76 65 72  .  This is a ver
bd00: 79 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72  y unreasonable r
bd10: 65 73 75 6c 74 2c 20 62 75 74 20 57 69 6e 64 6f  esult, but Windo
bd20: 77 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a  ws is notorious.
bd30: 2a 2a 20 66 6f 72 20 62 65 69 6e 67 20 75 6e 72  ** for being unr
bd40: 65 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64  easonable so I d
bd50: 6f 20 6e 6f 74 20 64 6f 75 62 74 20 74 68 61 74  o not doubt that
bd60: 20 69 74 20 6d 69 67 68 74 20 68 61 70 70 65 6e   it might happen
bd70: 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f  .  If.** the clo
bd80: 73 65 20 66 61 69 6c 73 2c 20 77 65 20 70 61 75  se fails, we pau
bd90: 73 65 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69  se for 100 milli
bda0: 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20  seconds and try 
bdb0: 61 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61  again.  As.** ma
bdc0: 6e 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41  ny as MX_CLOSE_A
bdd0: 54 54 45 4d 50 54 20 61 74 74 65 6d 70 74 73 20  TTEMPT attempts 
bde0: 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 68 61 6e  to close the han
bdf0: 64 6c 65 20 61 72 65 20 6d 61 64 65 20 62 65 66  dle are made bef
be00: 6f 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70  ore.** giving up
be10: 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
be20: 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66  n error..*/.#def
be30: 69 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54  ine MX_CLOSE_ATT
be40: 45 4d 50 54 20 33 0a 73 74 61 74 69 63 20 69 6e  EMPT 3.static in
be50: 74 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69 74  t winClose(sqlit
be60: 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
be70: 69 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20 30 3b  int rc, cnt = 0;
be80: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
be90: 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
bea0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ;..  assert( id!
beb0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
bec0: 70 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30 20 29  pFile->pShm==0 )
bed0: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c  ;.  OSTRACE(("CL
bee0: 4f 53 45 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65  OSE %d\n", pFile
bef0: 2d 3e 68 29 29 3b 0a 20 20 64 6f 7b 0a 20 20 20  ->h));.  do{.   
bf00: 20 72 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e   rc = osCloseHan
bf10: 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  dle(pFile->h);. 
bf20: 20 20 20 2f 2a 20 53 69 6d 75 6c 61 74 65 49 4f     /* SimulateIO
bf30: 45 72 72 6f 72 28 20 72 63 3d 30 3b 20 63 6e 74  Error( rc=0; cnt
bf40: 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50  =MX_CLOSE_ATTEMP
bf50: 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d 77 68 69 6c  T; ); */.  }whil
bf60: 65 28 20 72 63 3d 3d 30 20 26 26 20 2b 2b 63 6e  e( rc==0 && ++cn
bf70: 74 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54  t < MX_CLOSE_ATT
bf80: 45 4d 50 54 20 26 26 20 28 6f 73 53 6c 65 65 70  EMPT && (osSleep
bf90: 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23 69 66  (100), 1) );.#if
bfa0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
bfb0: 0a 23 64 65 66 69 6e 65 20 57 49 4e 43 45 5f 44  .#define WINCE_D
bfc0: 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53  ELETION_ATTEMPTS
bfd0: 20 33 0a 20 20 77 69 6e 63 65 44 65 73 74 72 6f   3.  winceDestro
bfe0: 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  yLock(pFile);.  
bff0: 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  if( pFile->zDele
c000: 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20  teOnClose ){.   
c010: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
c020: 20 20 77 68 69 6c 65 28 0a 20 20 20 20 20 20 20    while(.       
c030: 20 20 20 20 6f 73 44 65 6c 65 74 65 46 69 6c 65      osDeleteFile
c040: 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65  W(pFile->zDelete
c050: 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20 20 20 20  OnClose)==0.    
c060: 20 20 20 20 26 26 20 6f 73 47 65 74 46 69 6c 65      && osGetFile
c070: 41 74 74 72 69 62 75 74 65 73 57 28 70 46 69 6c  AttributesW(pFil
c080: 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
c090: 65 29 21 3d 30 78 66 66 66 66 66 66 66 66 20 0a  e)!=0xffffffff .
c0a0: 20 20 20 20 20 20 20 20 26 26 20 63 6e 74 2b 2b          && cnt++
c0b0: 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f   < WINCE_DELETIO
c0c0: 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20 20 20 29  N_ATTEMPTS.    )
c0d0: 7b 0a 20 20 20 20 20 20 20 6f 73 53 6c 65 65 70  {.       osSleep
c0e0: 28 31 30 30 29 3b 20 20 2f 2a 20 57 61 69 74 20  (100);  /* Wait 
c0f0: 61 20 6c 69 74 74 6c 65 20 62 65 66 6f 72 65 20  a little before 
c100: 74 72 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a  trying again */.
c110: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
c120: 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44  3_free(pFile->zD
c130: 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20  eleteOnClose);. 
c140: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52   }.#endif.  OSTR
c150: 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 20 25  ACE(("CLOSE %d %
c160: 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  s\n", pFile->h, 
c170: 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  rc ? "ok" : "fai
c180: 6c 65 64 22 29 29 3b 0a 20 20 4f 70 65 6e 43 6f  led"));.  OpenCo
c190: 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 72 65 74  unter(-1);.  ret
c1a0: 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f  urn rc ? SQLITE_
c1b0: 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 3a  OK.            :
c1c0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
c1d0: 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c  ITE_IOERR_CLOSE,
c1e0: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
c1f0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
c200: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
c210: 6e 43 6c 6f 73 65 22 2c 20 70 46 69 6c 65 2d 3e  nClose", pFile->
c220: 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zPath);.}../*.**
c230: 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20   Read data from 
c240: 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75  a file into a bu
c250: 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ffer.  Return SQ
c260: 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a  LITE_OK if all.*
c270: 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61  * bytes were rea
c280: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61  d successfully a
c290: 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  nd SQLITE_IOERR 
c2a0: 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
c2b0: 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  .** wrong..*/.st
c2c0: 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65 61 64  atic int winRead
c2d0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
c2e0: 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *id,          /
c2f0: 2a 20 46 69 6c 65 20 74 6f 20 72 65 61 64 20 66  * File to read f
c300: 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  rom */.  void *p
c310: 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
c320: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 6f 6e      /* Write con
c330: 74 65 6e 74 20 69 6e 74 6f 20 74 68 69 73 20 62  tent into this b
c340: 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61  uffer */.  int a
c350: 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
c360: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c370: 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61 64  of bytes to read
c380: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
c390: 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 20 20  t64 offset      
c3a0: 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
c3b0: 67 20 61 74 20 74 68 69 73 20 6f 66 66 73 65 74  g at this offset
c3c0: 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65   */.){.  winFile
c3d0: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
c3e0: 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c 65  le*)id;  /* file
c3f0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57 4f   handle */.  DWO
c400: 52 44 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  RD nRead;       
c410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c420: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
c430: 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72  actually read fr
c440: 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  om file */.  int
c450: 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20   nRetry = 0;    
c460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c470: 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 79 73  Number of retrys
c480: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
c490: 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61  d!=0 );.  Simula
c4a0: 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
c4b0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
c4c0: 41 44 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  AD);.  OSTRACE((
c4d0: 22 52 45 41 44 20 25 64 20 6c 6f 63 6b 3d 25 64  "READ %d lock=%d
c4e0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
c4f0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
c500: 3b 0a 0a 20 20 69 66 28 20 73 65 65 6b 57 69 6e  ;..  if( seekWin
c510: 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73  File(pFile, offs
c520: 65 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  et) ){.    retur
c530: 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
c540: 20 7d 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52   }.  while( !osR
c550: 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  eadFile(pFile->h
c560: 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52  , pBuf, amt, &nR
c570: 65 61 64 2c 20 30 29 20 29 7b 0a 20 20 20 20 44  ead, 0) ){.    D
c580: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
c590: 20 20 20 20 69 66 28 20 72 65 74 72 79 49 6f 65      if( retryIoe
c5a0: 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73  rr(&nRetry, &las
c5b0: 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e  tErrno) ) contin
c5c0: 75 65 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ue;.    pFile->l
c5d0: 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
c5e0: 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
c5f0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
c600: 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c 20  ITE_IOERR_READ, 
c610: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
c620: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
c630: 77 69 6e 52 65 61 64 22 2c 20 70 46 69 6c 65 2d  winRead", pFile-
c640: 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 6c  >zPath);.  }.  l
c650: 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79 29 3b  ogIoerr(nRetry);
c660: 0a 20 20 69 66 28 20 6e 52 65 61 64 3c 28 44 57  .  if( nRead<(DW
c670: 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20 20 20 2f  ORD)amt ){.    /
c680: 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f  * Unread parts o
c690: 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75 73  f the buffer mus
c6a0: 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64  t be zero-filled
c6b0: 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
c6c0: 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 6e 52  ((char*)pBuf)[nR
c6d0: 65 61 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52 65  ead], 0, amt-nRe
c6e0: 61 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ad);.    return 
c6f0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
c700: 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20  RT_READ;.  }..  
c710: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c720: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
c730: 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
c740: 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e  fer into a file.
c750: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
c760: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a  OK on success.**
c770: 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
c780: 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69  rror code on fai
c790: 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
c7a0: 69 6e 74 20 77 69 6e 57 72 69 74 65 28 0a 20 20  int winWrite(.  
c7b0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
c7c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c7d0: 2f 2a 20 46 69 6c 65 20 74 6f 20 77 72 69 74 65  /* File to write
c7e0: 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74   into */.  const
c7f0: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
c800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
c810: 65 20 62 79 74 65 73 20 74 6f 20 62 65 20 77 72  e bytes to be wr
c820: 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  itten */.  int a
c830: 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
c840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c850: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
c860: 20 77 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69   write */.  sqli
c870: 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
c880: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
c890: 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66  ffset into the f
c8a0: 69 6c 65 20 74 6f 20 62 65 67 69 6e 20 77 72 69  ile to begin wri
c8b0: 74 69 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20  ting at */.){.  
c8c0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8e0: 2f 2a 20 54 72 75 65 20 69 66 20 65 72 72 6f 72  /* True if error
c8f0: 20 68 61 73 20 6f 63 63 75 72 65 64 2c 20 65 6c   has occured, el
c900: 73 65 20 66 61 6c 73 65 20 2a 2f 0a 20 20 77 69  se false */.  wi
c910: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
c920: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a  winFile*)id;  /*
c930: 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a   File handle */.
c940: 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30    int nRetry = 0
c950: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c960: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
c970: 65 74 72 69 65 73 20 2a 2f 0a 0a 20 20 61 73 73  etries */..  ass
c980: 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20  ert( amt>0 );.  
c990: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
c9a0: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
c9b0: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
c9c0: 5f 49 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a 20  _IOERR_WRITE);. 
c9d0: 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
c9e0: 6c 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  lError(return SQ
c9f0: 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f  LITE_FULL);..  O
ca00: 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20 25  STRACE(("WRITE %
ca10: 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46  d lock=%d\n", pF
ca20: 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
ca30: 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 72 63  ocktype));..  rc
ca40: 20 3d 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70   = seekWinFile(p
ca50: 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20  File, offset);. 
ca60: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
ca70: 20 20 75 38 20 2a 61 52 65 6d 20 3d 20 28 75 38    u8 *aRem = (u8
ca80: 20 2a 29 70 42 75 66 3b 20 20 20 20 20 20 20 20   *)pBuf;        
ca90: 2f 2a 20 44 61 74 61 20 79 65 74 20 74 6f 20 62  /* Data yet to b
caa0: 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20  e written */.   
cab0: 20 69 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b   int nRem = amt;
cac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cad0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
cae0: 73 20 79 65 74 20 74 6f 20 62 65 20 77 72 69 74  s yet to be writ
caf0: 74 65 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44  ten */.    DWORD
cb00: 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
cb10: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
cb20: 73 20 77 72 69 74 74 65 6e 20 62 79 20 65 61 63  s written by eac
cb30: 68 20 57 72 69 74 65 46 69 6c 65 28 29 20 63 61  h WriteFile() ca
cb40: 6c 6c 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20  ll */.    DWORD 
cb50: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45  lastErrno = NO_E
cb60: 52 52 4f 52 3b 20 20 20 2f 2a 20 56 61 6c 75 65  RROR;   /* Value
cb70: 20 72 65 74 75 72 6e 65 64 20 62 79 20 47 65 74   returned by Get
cb80: 4c 61 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a  LastError() */..
cb90: 20 20 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e      while( nRem>
cba0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
cbb0: 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c  osWriteFile(pFil
cbc0: 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d  e->h, aRem, nRem
cbd0: 2c 20 26 6e 57 72 69 74 65 2c 20 30 29 20 29 7b  , &nWrite, 0) ){
cbe0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 74  .        if( ret
cbf0: 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c  ryIoerr(&nRetry,
cc00: 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63   &lastErrno) ) c
cc10: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
cc20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
cc30: 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74 65        if( nWrite
cc40: 3c 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  <=0 ) break;.   
cc50: 20 20 20 61 52 65 6d 20 2b 3d 20 6e 57 72 69 74     aRem += nWrit
cc60: 65 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d  e;.      nRem -=
cc70: 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 7d 0a 20   nWrite;.    }. 
cc80: 20 20 20 69 66 28 20 6e 52 65 6d 3e 30 20 29 7b     if( nRem>0 ){
cc90: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
cca0: 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
ccb0: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
ccc0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
ccd0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66  if( rc ){.    if
cce0: 28 20 20 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73  (   ( pFile->las
ccf0: 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41  tErrno==ERROR_HA
cd00: 4e 44 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29  NDLE_DISK_FULL )
cd10: 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 70 46 69  .       || ( pFi
cd20: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  le->lastErrno==E
cd30: 52 52 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29  RROR_DISK_FULL )
cd40: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
cd50: 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
cd60: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69   }.    return wi
cd70: 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
cd80: 5f 49 4f 45 52 52 5f 57 52 49 54 45 2c 20 70 46  _IOERR_WRITE, pF
cd90: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
cda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
cdb0: 6e 57 72 69 74 65 22 2c 20 70 46 69 6c 65 2d 3e  nWrite", pFile->
cdc0: 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b  zPath);.  }else{
cdd0: 0a 20 20 20 20 6c 6f 67 49 6f 65 72 72 28 6e 52  .    logIoerr(nR
cde0: 65 74 72 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74  etry);.  }.  ret
cdf0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
ce00: 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
ce10: 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f   an open file to
ce20: 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a   a specified siz
ce30: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
ce40: 77 69 6e 54 72 75 6e 63 61 74 65 28 73 71 6c 69  winTruncate(sqli
ce50: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71  te3_file *id, sq
ce60: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74  lite3_int64 nByt
ce70: 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  e){.  winFile *p
ce80: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
ce90: 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61  )id;  /* File ha
cea0: 6e 64 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ndle object */. 
ceb0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
cec0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
ced0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
cee0: 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  for this functio
cef0: 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  n */..  assert( 
cf00: 70 46 69 6c 65 20 29 3b 0a 0a 20 20 4f 53 54 52  pFile );..  OSTR
cf10: 41 43 45 28 28 22 54 52 55 4e 43 41 54 45 20 25  ACE(("TRUNCATE %
cf20: 64 20 25 6c 6c 64 5c 6e 22 2c 20 70 46 69 6c 65  d %lld\n", pFile
cf30: 2d 3e 68 2c 20 6e 42 79 74 65 29 29 3b 0a 20 20  ->h, nByte));.  
cf40: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
cf50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
cf60: 45 52 52 5f 54 52 55 4e 43 41 54 45 29 3b 0a 0a  ERR_TRUNCATE);..
cf70: 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72    /* If the user
cf80: 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20   has configured 
cf90: 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72  a chunk-size for
cfa0: 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e   this file, trun
cfb0: 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69  cate the.  ** fi
cfc0: 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f  le so that it co
cfd0: 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74  nsists of an int
cfe0: 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63  eger number of c
cff0: 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a  hunks (i.e. the.
d000: 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65    ** actual file
d010: 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 65 20   size after the 
d020: 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65  operation may be
d030: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
d040: 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20   requested.  ** 
d050: 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  size)..  */.  if
d060: 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
d070: 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  >0 ){.    nByte 
d080: 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c  = ((nByte + pFil
d090: 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f  e->szChunk - 1)/
d0a0: 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20  pFile->szChunk) 
d0b0: 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  * pFile->szChunk
d0c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 45  ;.  }..  /* SetE
d0d0: 6e 64 4f 66 46 69 6c 65 28 29 20 72 65 74 75 72  ndOfFile() retur
d0e0: 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e  ns non-zero when
d0f0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
d100: 7a 65 72 6f 20 77 68 65 6e 20 69 74 20 66 61 69  zero when it fai
d110: 6c 73 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 65  ls. */.  if( see
d120: 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20  kWinFile(pFile, 
d130: 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 72 63  nByte) ){.    rc
d140: 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
d150: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
d160: 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  CATE, pFile->las
d170: 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
d180: 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74       "winTruncat
d190: 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  e1", pFile->zPat
d1a0: 68 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  h);.  }else if( 
d1b0: 30 3d 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c  0==osSetEndOfFil
d1c0: 65 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20  e(pFile->h) ){. 
d1d0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
d1e0: 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
d1f0: 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d  rror();.    rc =
d200: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
d210: 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
d220: 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  TE, pFile->lastE
d230: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
d240: 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65 32     "winTruncate2
d250: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
d260: 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45  ;.  }..  OSTRACE
d270: 28 28 22 54 52 55 4e 43 41 54 45 20 25 64 20 25  (("TRUNCATE %d %
d280: 6c 6c 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65  lld %s\n", pFile
d290: 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 72 63 20 3f  ->h, nByte, rc ?
d2a0: 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22   "failed" : "ok"
d2b0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
d2c0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
d2d0: 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75  E_TEST./*.** Cou
d2e0: 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
d2f0: 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e   fullsyncs and n
d300: 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68  ormal syncs.  Th
d310: 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  is is used to te
d320: 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73  st.** that syncs
d330: 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61   and fullsyncs a
d340: 72 65 20 6f 63 63 75 72 69 6e 67 20 61 74 20 74  re occuring at t
d350: 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a  he right times..
d360: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
d370: 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69  ync_count = 0;.i
d380: 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73  nt sqlite3_fulls
d390: 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  ync_count = 0;.#
d3a0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  endif../*.** Mak
d3b0: 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65  e sure all write
d3c0: 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61  s to a particula
d3d0: 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69  r file are commi
d3e0: 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f  tted to disk..*/
d3f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
d400: 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ync(sqlite3_file
d410: 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29   *id, int flags)
d420: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
d430: 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a 20 20  _NO_SYNC.  /*.  
d440: 2a 2a 20 55 73 65 64 20 6f 6e 6c 79 20 77 68 65  ** Used only whe
d450: 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  n SQLITE_NO_SYNC
d460: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e   is not defined.
d470: 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63  .   */.  BOOL rc
d480: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
d490: 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c  fined(NDEBUG) ||
d4a0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d4b0: 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c 0a 20  _NO_SYNC) || \. 
d4c0: 20 20 20 28 64 65 66 69 6e 65 64 28 53 51 4c 49     (defined(SQLI
d4d0: 54 45 5f 54 45 53 54 29 20 26 26 20 64 65 66 69  TE_TEST) && defi
d4e0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
d4f0: 29 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65  )).  /*.  ** Use
d500: 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f  d when SQLITE_NO
d510: 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66  _SYNC is not def
d520: 69 6e 65 64 20 61 6e 64 20 62 79 20 74 68 65 20  ined and by the 
d530: 61 73 73 65 72 74 28 29 20 61 6e 64 2f 6f 72 0a  assert() and/or.
d540: 20 20 2a 2a 20 4f 53 54 52 41 43 45 28 29 20 6d    ** OSTRACE() m
d550: 61 63 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20 77  acros..   */.  w
d560: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
d570: 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 23 65  (winFile*)id;.#e
d580: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
d590: 41 4d 45 54 45 52 28 69 64 29 3b 0a 23 65 6e 64  AMETER(id);.#end
d5a0: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  if..  assert( pF
d5b0: 69 6c 65 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63  ile );.  /* Chec
d5c0: 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51  k that one of SQ
d5d0: 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
d5e0: 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73   or FULL was pas
d5f0: 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  sed */.  assert(
d600: 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
d610: 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
d620: 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73  .      || (flags
d630: 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
d640: 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20  YNC_FULL.  );.. 
d650: 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20   OSTRACE(("SYNC 
d660: 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70  %d lock=%d\n", p
d670: 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
d680: 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f  locktype));..  /
d690: 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62  * Unix cannot, b
d6a0: 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20  ut some systems 
d6b0: 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
d6c0: 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65  E_FULL from here
d6d0: 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65  . This.  ** line
d6e0: 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74   is to test that
d6f0: 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e   doing so does n
d700: 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f  ot cause any pro
d710: 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69  blems..  */.  Si
d720: 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
d730: 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
d740: 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 23 69 66 6e  TE_FULL );..#ifn
d750: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
d760: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
d770: 45 52 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65  ER(flags);.#else
d780: 0a 20 20 69 66 28 20 28 66 6c 61 67 73 26 30 78  .  if( (flags&0x
d790: 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
d7a0: 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c  _FULL ){.    sql
d7b0: 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
d7c0: 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c  unt++;.  }.  sql
d7d0: 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b  ite3_sync_count+
d7e0: 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  +;.#endif..  /* 
d7f0: 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77  If we compiled w
d800: 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e  ith the SQLITE_N
d810: 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65  O_SYNC flag, the
d820: 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20  n syncing is a. 
d830: 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23   ** no-op.  */.#
d840: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
d850: 53 59 4e 43 0a 20 20 72 65 74 75 72 6e 20 53 51  SYNC.  return SQ
d860: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20  LITE_OK;.#else. 
d870: 20 72 63 20 3d 20 6f 73 46 6c 75 73 68 46 69 6c   rc = osFlushFil
d880: 65 42 75 66 66 65 72 73 28 70 46 69 6c 65 2d 3e  eBuffers(pFile->
d890: 68 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  h);.  SimulateIO
d8a0: 45 72 72 6f 72 28 20 72 63 3d 46 41 4c 53 45 20  Error( rc=FALSE 
d8b0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
d8c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d8d0: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
d8e0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
d8f0: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
d900: 72 6f 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72  ror();.    retur
d910: 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
d920: 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
d930: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
d940: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
d950: 20 22 77 69 6e 53 79 6e 63 22 2c 20 70 46 69 6c   "winSync", pFil
d960: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23  e->zPath);.  }.#
d970: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  endif.}../*.** D
d980: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72  etermine the cur
d990: 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66  rent size of a f
d9a0: 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a  ile in bytes.*/.
d9b0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69  static int winFi
d9c0: 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  leSize(sqlite3_f
d9d0: 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33  ile *id, sqlite3
d9e0: 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a  _int64 *pSize){.
d9f0: 20 20 44 57 4f 52 44 20 75 70 70 65 72 42 69 74    DWORD upperBit
da00: 73 3b 0a 20 20 44 57 4f 52 44 20 6c 6f 77 65 72  s;.  DWORD lower
da10: 42 69 74 73 3b 0a 20 20 77 69 6e 46 69 6c 65 20  Bits;.  winFile 
da20: 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
da30: 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 6c  e*)id;.  DWORD l
da40: 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 61 73 73  astErrno;..  ass
da50: 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
da60: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
da70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
da80: 45 52 52 5f 46 53 54 41 54 29 3b 0a 20 20 6c 6f  ERR_FSTAT);.  lo
da90: 77 65 72 42 69 74 73 20 3d 20 6f 73 47 65 74 46  werBits = osGetF
daa0: 69 6c 65 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68  ileSize(pFile->h
dab0: 2c 20 26 75 70 70 65 72 42 69 74 73 29 3b 0a 20  , &upperBits);. 
dac0: 20 69 66 28 20 20 20 28 6c 6f 77 65 72 42 69 74   if(   (lowerBit
dad0: 73 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c  s == INVALID_FIL
dae0: 45 5f 53 49 5a 45 29 0a 20 20 20 20 20 26 26 20  E_SIZE).     && 
daf0: 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ((lastErrno = os
db00: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21  GetLastError())!
db10: 3d 4e 4f 5f 45 52 52 4f 52 29 20 29 0a 20 20 7b  =NO_ERROR) ).  {
db20: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
db30: 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
db40: 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69  o;.    return wi
db50: 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
db60: 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46  _IOERR_FSTAT, pF
db70: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
db90: 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c  nFileSize", pFil
dba0: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20  e->zPath);.  }. 
dbb0: 20 2a 70 53 69 7a 65 20 3d 20 28 28 28 73 71 6c   *pSize = (((sql
dbc0: 69 74 65 33 5f 69 6e 74 36 34 29 75 70 70 65 72  ite3_int64)upper
dbd0: 42 69 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77  Bits)<<32) + low
dbe0: 65 72 42 69 74 73 3b 0a 20 20 72 65 74 75 72 6e  erBits;.  return
dbf0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
dc00: 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  *.** LOCKFILE_FA
dc10: 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 69  IL_IMMEDIATELY i
dc20: 73 20 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73  s undefined on s
dc30: 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73 79 73 74  ome Windows syst
dc40: 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ems..*/.#ifndef 
dc50: 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
dc60: 4d 45 44 49 41 54 45 4c 59 0a 23 20 64 65 66 69  MEDIATELY.# defi
dc70: 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ne LOCKFILE_FAIL
dc80: 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a 23  _IMMEDIATELY 1.#
dc90: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  endif../*.** Acq
dca0: 75 69 72 65 20 61 20 72 65 61 64 65 72 20 6c 6f  uire a reader lo
dcb0: 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74  ck..** Different
dcc0: 20 41 50 49 20 72 6f 75 74 69 6e 65 73 20 61 72   API routines ar
dcd0: 65 20 63 61 6c 6c 65 64 20 64 65 70 65 6e 64 69  e called dependi
dce0: 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
dcf0: 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73 20   not this.** is 
dd00: 57 69 6e 39 78 20 6f 72 20 57 69 6e 4e 54 2e 0a  Win9x or WinNT..
dd10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
dd20: 74 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c  tReadLock(winFil
dd30: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74  e *pFile){.  int
dd40: 20 72 65 73 3b 0a 20 20 69 66 28 20 69 73 4e 54   res;.  if( isNT
dd50: 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41  () ){.    OVERLA
dd60: 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6f  PPED ovlp;.    o
dd70: 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 53 48 41  vlp.Offset = SHA
dd80: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6f  RED_FIRST;.    o
dd90: 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d  vlp.OffsetHigh =
dda0: 20 30 3b 0a 20 20 20 20 6f 76 6c 70 2e 68 45 76   0;.    ovlp.hEv
ddb0: 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 73  ent = 0;.    res
ddc0: 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 28   = osLockFileEx(
ddd0: 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 46 49  pFile->h, LOCKFI
dde0: 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
ddf0: 45 4c 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ELY,.           
de00: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 53              0, S
de10: 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 2c 20 26  HARED_SIZE, 0, &
de20: 6f 76 6c 70 29 3b 0a 2f 2a 20 69 73 4e 54 28 29  ovlp);./* isNT()
de30: 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f   is 1 if SQLITE_
de40: 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20  OS_WINCE==1, so 
de50: 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76  this else is nev
de60: 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2f  er executed. .*/
de70: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
de80: 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b  INCE==0.  }else{
de90: 0a 20 20 20 20 69 6e 74 20 6c 6b 3b 0a 20 20 20  .    int lk;.   
dea0: 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
deb0: 65 73 73 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20  ess(sizeof(lk), 
dec0: 26 6c 6b 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  &lk);.    pFile-
ded0: 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20  >sharedLockByte 
dee0: 3d 20 28 73 68 6f 72 74 29 28 28 6c 6b 20 26 20  = (short)((lk & 
def0: 30 78 37 66 66 66 66 66 66 66 29 25 28 53 48 41  0x7fffffff)%(SHA
df00: 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 29 3b 0a  RED_SIZE - 1));.
df10: 20 20 20 20 72 65 73 20 3d 20 6f 73 4c 6f 63 6b      res = osLock
df20: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53  File(pFile->h, S
df30: 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c  HARED_FIRST+pFil
df40: 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e->sharedLockByt
df50: 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65 6e  e, 0, 1, 0);.#en
df60: 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 72 65  dif.  }.  if( re
df70: 73 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 70 46  s == 0 ){.    pF
df80: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
df90: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
dfa0: 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65  );.    /* No nee
dfb0: 64 20 74 6f 20 6c 6f 67 20 61 20 66 61 69 6c 75  d to log a failu
dfc0: 72 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  re to lock */.  
dfd0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  }.  return res;.
dfe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20  }../*.** Undo a 
dff0: 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74  readlock.*/.stat
e000: 69 63 20 69 6e 74 20 75 6e 6c 6f 63 6b 52 65 61  ic int unlockRea
e010: 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70  dLock(winFile *p
e020: 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73  File){.  int res
e030: 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
e040: 72 6e 6f 3b 0a 20 20 69 66 28 20 69 73 4e 54 28  rno;.  if( isNT(
e050: 29 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 6f  ) ){.    res = o
e060: 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c  sUnlockFile(pFil
e070: 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
e080: 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49  ST, 0, SHARED_SI
e090: 5a 45 2c 20 30 29 3b 0a 2f 2a 20 69 73 4e 54 28  ZE, 0);./* isNT(
e0a0: 29 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 45  ) is 1 if SQLITE
e0b0: 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f  _OS_WINCE==1, so
e0c0: 20 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65   this else is ne
e0d0: 76 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a  ver executed. .*
e0e0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
e0f0: 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65  WINCE==0.  }else
e100: 7b 0a 20 20 20 20 72 65 73 20 3d 20 6f 73 55 6e  {.    res = osUn
e110: 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e  lockFile(pFile->
e120: 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20  h, SHARED_FIRST 
e130: 2b 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  + pFile->sharedL
e140: 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30  ockByte, 0, 1, 0
e150: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
e160: 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20 28 28  if( res==0 && ((
e170: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
e180: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45  tLastError())!=E
e190: 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29  RROR_NOT_LOCKED)
e1a0: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
e1b0: 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
e1c0: 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
e1d0: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
e1e0: 52 52 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65  RR_UNLOCK, pFile
e1f0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
e200: 20 20 20 20 20 20 20 20 20 20 22 75 6e 6c 6f 63            "unloc
e210: 6b 52 65 61 64 4c 6f 63 6b 22 2c 20 70 46 69 6c  kReadLock", pFil
e220: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20  e->zPath);.  }. 
e230: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
e240: 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
e250: 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
e260: 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
e270: 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70  arameter locktyp
e280: 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  e - one.** of th
e290: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
e2a0: 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
e2b0: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
e2c0: 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
e2d0: 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
e2e0: 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
e2f0: 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
e300: 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
e310: 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
e320: 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
e330: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
e340: 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
e350: 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
e360: 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
e370: 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
e380: 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
e390: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
e3a0: 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
e3b0: 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
e3c0: 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
e3d0: 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
e3e0: 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
e3f0: 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
e400: 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
e410: 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
e420: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
e430: 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
e440: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
e450: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
e460: 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
e470: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
e480: 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
e490: 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
e4a0: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
e4b0: 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
e4c0: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
e4d0: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
e4e0: 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
e4f0: 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
e500: 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
e510: 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
e520: 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29   The winUnlock()
e530: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73   routine.** eras
e540: 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20  es all locks at 
e550: 6f 6e 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73  once and returns
e560: 20 75 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   us immediately 
e570: 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  to locking level
e580: 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74   0..** It is not
e590: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77   possible to low
e5a0: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
e5b0: 65 76 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74  evel one step at
e5c0: 20 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a   a time.  You.**
e5d0: 20 6d 75 73 74 20 67 6f 20 73 74 72 61 69 67 68   must go straigh
e5e0: 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  t to locking lev
e5f0: 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  el 0..*/.static 
e600: 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69  int winLock(sqli
e610: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
e620: 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
e630: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
e640: 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  K;    /* Return 
e650: 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75  code from subrou
e660: 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  tines */.  int r
e670: 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  es = 1;         
e680: 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61    /* Result of a
e690: 20 57 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61   Windows lock ca
e6a0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c  ll */.  int newL
e6b0: 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f  ocktype;       /
e6c0: 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63  * Set pFile->loc
e6d0: 6b 74 79 70 65 20 74 6f 20 74 68 69 73 20 76 61  ktype to this va
e6e0: 6c 75 65 20 62 65 66 6f 72 65 20 65 78 69 74 69  lue before exiti
e6f0: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50  ng */.  int gotP
e700: 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f  endingLock = 0;/
e710: 2a 20 54 72 75 65 20 69 66 20 77 65 20 61 63 71  * True if we acq
e720: 75 69 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20  uired a PENDING 
e730: 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a  lock this time *
e740: 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  /.  winFile *pFi
e750: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
e760: 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  d;.  DWORD lastE
e770: 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b  rrno = NO_ERROR;
e780: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
e790: 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  0 );.  OSTRACE((
e7a0: 22 4c 4f 43 4b 20 25 64 20 25 64 20 77 61 73 20  "LOCK %d %d was 
e7b0: 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20  %d(%d)\n",.     
e7c0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
e7d0: 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d  locktype, pFile-
e7e0: 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65  >locktype, pFile
e7f0: 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
e800: 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ));..  /* If the
e810: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
e820: 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70  lock of this typ
e830: 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69  e or more restri
e840: 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a  ctive on the.  *
e850: 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74  * OsFile, do not
e860: 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20  hing. Don't use 
e870: 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78  the end_lock: ex
e880: 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a  it path, as.  **
e890: 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
e8a0: 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65  utex() hasn't be
e8b0: 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20  en called yet.. 
e8c0: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
e8d0: 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74  >locktype>=lockt
e8e0: 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ype ){.    retur
e8f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
e900: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
e910: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71   the locking seq
e920: 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74  uence is correct
e930: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
e940: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21  pFile->locktype!
e950: 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b  =NO_LOCK || lock
e960: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
e970: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  K );.  assert( l
e980: 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47  ocktype!=PENDING
e990: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
e9a0: 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53  t( locktype!=RES
e9b0: 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
e9c0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53  ile->locktype==S
e9d0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  HARED_LOCK );.. 
e9e0: 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e   /* Lock the PEN
e9f0: 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69  DING_LOCK byte i
ea00: 66 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71  f we need to acq
ea10: 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c  uire a PENDING l
ea20: 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48  ock or.  ** a SH
ea30: 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77  ARED lock.  If w
ea40: 65 20 61 72 65 20 61 63 71 75 69 72 69 6e 67 20  e are acquiring 
ea50: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  a SHARED lock, t
ea60: 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f  he acquisition o
ea70: 66 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49  f.  ** the PENDI
ea80: 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20  NG_LOCK byte is 
ea90: 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a  temporary..  */.
eaa0: 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
eab0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b  pFile->locktype;
eac0: 0a 20 20 69 66 28 20 20 20 28 70 46 69 6c 65 2d  .  if(   (pFile-
ead0: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f  >locktype==NO_LO
eae0: 43 4b 29 0a 20 20 20 20 20 7c 7c 20 28 20 20 20  CK).     || (   
eaf0: 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55  (locktype==EXCLU
eb00: 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  SIVE_LOCK).     
eb10: 20 20 20 20 26 26 20 28 70 46 69 6c 65 2d 3e 6c      && (pFile->l
eb20: 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45  ocktype==RESERVE
eb30: 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20  D_LOCK)).  ){.  
eb40: 20 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20    int cnt = 3;. 
eb50: 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e     while( cnt-->
eb60: 30 20 26 26 20 28 72 65 73 20 3d 20 6f 73 4c 6f  0 && (res = osLo
eb70: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
eb80: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30   PENDING_BYTE, 0
eb90: 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20  , 1, 0))==0 ){. 
eba0: 20 20 20 20 20 2f 2a 20 54 72 79 20 33 20 74 69       /* Try 3 ti
ebb0: 6d 65 73 20 74 6f 20 67 65 74 20 74 68 65 20 70  mes to get the p
ebc0: 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68  ending lock.  Th
ebd0: 69 73 20 69 73 20 6e 65 65 64 65 64 20 74 6f 20  is is needed to 
ebe0: 77 6f 72 6b 0a 20 20 20 20 20 20 2a 2a 20 61 72  work.      ** ar
ebf0: 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63 61  ound problems ca
ec00: 75 73 65 64 20 62 79 20 69 6e 64 65 78 69 6e 67  used by indexing
ec10: 20 61 6e 64 2f 6f 72 20 61 6e 74 69 2d 76 69 72   and/or anti-vir
ec20: 75 73 20 73 6f 66 74 77 61 72 65 20 6f 6e 0a 20  us software on. 
ec30: 20 20 20 20 20 2a 2a 20 57 69 6e 64 6f 77 73 20       ** Windows 
ec40: 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20 20 2a  systems..      *
ec50: 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 73 69  * If you are usi
ec60: 6e 67 20 74 68 69 73 20 63 6f 64 65 20 61 73 20  ng this code as 
ec70: 61 20 6d 6f 64 65 6c 20 66 6f 72 20 61 6c 74 65  a model for alte
ec80: 72 6e 61 74 69 76 65 20 56 46 53 65 73 2c 20 64  rnative VFSes, d
ec90: 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63  o not.      ** c
eca0: 6f 70 79 20 74 68 69 73 20 72 65 74 72 79 20 6c  opy this retry l
ecb0: 6f 67 69 63 2e 20 20 49 74 20 69 73 20 61 20 68  ogic.  It is a h
ecc0: 61 63 6b 20 69 6e 74 65 6e 64 65 64 20 66 6f 72  ack intended for
ecd0: 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79 2e 0a 20   Windows only.. 
ece0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4f 53       */.      OS
ecf0: 54 52 41 43 45 28 28 22 63 6f 75 6c 64 20 6e 6f  TRACE(("could no
ed00: 74 20 67 65 74 20 61 20 50 45 4e 44 49 4e 47 20  t get a PENDING 
ed10: 6c 6f 63 6b 2e 20 63 6e 74 3d 25 64 5c 6e 22 2c  lock. cnt=%d\n",
ed20: 20 63 6e 74 29 29 3b 0a 20 20 20 20 20 20 69 66   cnt));.      if
ed30: 28 20 63 6e 74 20 29 20 6f 73 53 6c 65 65 70 28  ( cnt ) osSleep(
ed40: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f  1);.    }.    go
ed50: 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72  tPendingLock = r
ed60: 65 73 3b 0a 20 20 20 20 69 66 28 20 21 72 65 73  es;.    if( !res
ed70: 20 29 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72   ){.      lastEr
ed80: 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
ed90: 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20  rror();.    }.  
eda0: 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
edb0: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20  a shared lock.  
edc0: 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
edd0: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26  e==SHARED_LOCK &
ede0: 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73  & res ){.    ass
edf0: 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
ee00: 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b  type==NO_LOCK );
ee10: 0a 20 20 20 20 72 65 73 20 3d 20 67 65 74 52 65  .    res = getRe
ee20: 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
ee30: 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20     if( res ){.  
ee40: 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20      newLocktype 
ee50: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
ee60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ee70: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
ee80: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
ee90: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63    }.  }..  /* Ac
eea0: 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44  quire a RESERVED
eeb0: 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28   lock.  */.  if(
eec0: 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52   locktype==RESER
eed0: 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20  VED_LOCK && res 
eee0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
eef0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
ef00: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
ef10: 20 20 20 72 65 73 20 3d 20 6f 73 4c 6f 63 6b 46     res = osLockF
ef20: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45  ile(pFile->h, RE
ef30: 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
ef40: 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
ef50: 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
ef60: 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56  ocktype = RESERV
ef70: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
ef80: 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72  se{.      lastEr
ef90: 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
efa0: 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20  rror();.    }.  
efb0: 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
efc0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20  a PENDING lock. 
efd0: 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
efe0: 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
eff0: 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  CK && res ){.   
f000: 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50   newLocktype = P
f010: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20  ENDING_LOCK;.   
f020: 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
f030: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  = 0;.  }..  /* A
f040: 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53  cquire an EXCLUS
f050: 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  IVE lock.  */.  
f060: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
f070: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
f080: 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72  res ){.    asser
f090: 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
f0a0: 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe>=SHARED_LOCK 
f0b0: 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 75 6e 6c  );.    res = unl
f0c0: 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  ockReadLock(pFil
f0d0: 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  e);.    OSTRACE(
f0e0: 28 22 75 6e 72 65 61 64 6c 6f 63 6b 20 3d 20 25  ("unreadlock = %
f0f0: 64 5c 6e 22 2c 20 72 65 73 29 29 3b 0a 20 20 20  d\n", res));.   
f100: 20 72 65 73 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c   res = osLockFil
f110: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  e(pFile->h, SHAR
f120: 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41  ED_FIRST, 0, SHA
f130: 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
f140: 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
f150: 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d     newLocktype =
f160: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b   EXCLUSIVE_LOCK;
f170: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f180: 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
f190: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
f1a0: 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
f1b0: 65 72 72 6f 72 2d 63 6f 64 65 20 3d 20 25 64 5c  error-code = %d\
f1c0: 6e 22 2c 20 6c 61 73 74 45 72 72 6e 6f 29 29 3b  n", lastErrno));
f1d0: 0a 20 20 20 20 20 20 67 65 74 52 65 61 64 4c 6f  .      getReadLo
f1e0: 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d  ck(pFile);.    }
f1f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
f200: 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 50   are holding a P
f210: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74  ENDING lock that
f220: 20 6f 75 67 68 74 20 74 6f 20 62 65 20 72 65 6c   ought to be rel
f230: 65 61 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a  eased, then.  **
f240: 20 72 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e   release it now.
f250: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50  .  */.  if( gotP
f260: 65 6e 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f  endingLock && lo
f270: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
f280: 4f 43 4b 20 29 7b 0a 20 20 20 20 6f 73 55 6e 6c  OCK ){.    osUnl
f290: 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  ockFile(pFile->h
f2a0: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
f2b0: 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  0, 1, 0);.  }.. 
f2c0: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 73   /* Update the s
f2d0: 74 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b  tate of the lock
f2e0: 20 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65   has held in the
f2f0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
f300: 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72   then.  ** retur
f310: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
f320: 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20  e result code.. 
f330: 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 29 7b   */.  if( res ){
f340: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
f350: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
f360: 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
f370: 20 46 41 49 4c 45 44 20 25 64 20 74 72 79 69 6e   FAILED %d tryin
f380: 67 20 66 6f 72 20 25 64 20 62 75 74 20 67 6f 74  g for %d but got
f390: 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %d\n", pFile->h
f3a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63  ,.           loc
f3b0: 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79  ktype, newLockty
f3c0: 70 65 29 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  pe));.    pFile-
f3d0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
f3e0: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d  tErrno;.    rc =
f3f0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
f400: 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  }.  pFile->lockt
f410: 79 70 65 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63  ype = (u8)newLoc
f420: 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20  ktype;.  return 
f430: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
f440: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
f450: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
f460: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
f470: 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
f480: 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
f490: 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
f4a0: 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
f4b0: 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
f4c0: 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
f4d0: 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 7a  ero, otherwise z
f4e0: 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
f4f0: 6e 74 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72  nt winCheckReser
f500: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
f510: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
f520: 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
f530: 63 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  c;.  winFile *pF
f540: 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
f550: 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
f560: 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
f570: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
f580: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
f590: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ;..  assert( id!
f5a0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  =0 );.  if( pFil
f5b0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53  e->locktype>=RES
f5c0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
f5d0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 4f 53    rc = 1;.    OS
f5e0: 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
f5f0: 4c 4f 43 4b 20 25 64 20 25 64 20 28 6c 6f 63 61  LOCK %d %d (loca
f600: 6c 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  l)\n", pFile->h,
f610: 20 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   rc));.  }else{.
f620: 20 20 20 20 72 63 20 3d 20 6f 73 4c 6f 63 6b 46      rc = osLockF
f630: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45  ile(pFile->h, RE
f640: 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
f650: 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
f660: 63 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c  c ){.      osUnl
f670: 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  ockFile(pFile->h
f680: 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
f690: 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 1, 0);.    }
f6a0: 0a 20 20 20 20 72 63 20 3d 20 21 72 63 3b 0a 20  .    rc = !rc;. 
f6b0: 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53     OSTRACE(("TES
f6c0: 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
f6d0: 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 70 46 69  (remote)\n", pFi
f6e0: 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d  le->h, rc));.  }
f6f0: 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63  .  *pResOut = rc
f700: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
f710: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  E_OK;.}../*.** L
f720: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
f730: 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
f740: 65 73 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20  escriptor id to 
f750: 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74  locktype.  lockt
f760: 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ype.** must be e
f770: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
f780: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
f790: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
f7a0: 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
f7b0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
f7c0: 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
f7d0: 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
f7e0: 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
f7f0: 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
f800: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
f810: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20  **.** It is not 
f820: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69  possible for thi
f830: 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69  s routine to fai
f840: 6c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  l if the second 
f850: 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e  argument.** is N
f860: 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20  O_LOCK.  If the 
f870: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
f880: 69 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74  is SHARED_LOCK t
f890: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
f8a0: 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e  .** might return
f8b0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a   SQLITE_IOERR;.*
f8c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
f8d0: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
f8e0: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
f8f0: 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 74 79  ktype){.  int ty
f900: 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  pe;.  winFile *p
f910: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
f920: 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  )id;.  int rc = 
f930: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
f940: 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b  ert( pFile!=0 );
f950: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
f960: 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype<=SHARED_LOCK
f970: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
f980: 55 4e 4c 4f 43 4b 20 25 64 20 74 6f 20 25 64 20  UNLOCK %d to %d 
f990: 77 61 73 20 25 64 28 25 64 29 5c 6e 22 2c 20 70  was %d(%d)\n", p
f9a0: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
f9b0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  e,.          pFi
f9c0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46  le->locktype, pF
f9d0: 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
f9e0: 79 74 65 29 29 3b 0a 20 20 74 79 70 65 20 3d 20  yte));.  type = 
f9f0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b  pFile->locktype;
fa00: 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 45 58 43  .  if( type>=EXC
fa10: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
fa20: 20 20 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28     osUnlockFile(
fa30: 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
fa40: 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45  _FIRST, 0, SHARE
fa50: 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20  D_SIZE, 0);.    
fa60: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
fa70: 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21 67 65  ARED_LOCK && !ge
fa80: 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  tReadLock(pFile)
fa90: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
faa0: 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
fab0: 61 70 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c  appen.  We shoul
fac0: 64 20 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65  d always be able
fad0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   to.      ** rea
fae0: 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
faf0: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63  lock */.      rc
fb00: 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
fb10: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
fb20: 43 4b 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  CK, osGetLastErr
fb30: 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
fb40: 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22       "winUnlock"
fb50: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
fb60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
fb70: 20 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f   type>=RESERVED_
fb80: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 6f 73 55 6e  LOCK ){.    osUn
fb90: 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e  lockFile(pFile->
fba0: 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
fbb0: 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
fbc0: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
fbd0: 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e  NO_LOCK && type>
fbe0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
fbf0: 20 20 20 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f      unlockReadLo
fc00: 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20  ck(pFile);.  }. 
fc10: 20 69 66 28 20 74 79 70 65 3e 3d 50 45 4e 44 49   if( type>=PENDI
fc20: 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 6f  NG_LOCK ){.    o
fc30: 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c  sUnlockFile(pFil
fc40: 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59  e->h, PENDING_BY
fc50: 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
fc60: 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  }.  pFile->lockt
fc70: 79 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79  ype = (u8)lockty
fc80: 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  pe;.  return rc;
fc90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f  .}../*.** Contro
fca0: 6c 20 61 6e 64 20 71 75 65 72 79 20 6f 66 20 74  l and query of t
fcb0: 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e  he open file han
fcc0: 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
fcd0: 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f  nt winFileContro
fce0: 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
fcf0: 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64  id, int op, void
fd00: 20 2a 70 41 72 67 29 7b 0a 20 20 77 69 6e 46 69   *pArg){.  winFi
fd10: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
fd20: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69 74  File*)id;.  swit
fd30: 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
fd40: 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
fd50: 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20  LOCKSTATE: {.   
fd60: 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
fd70: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
fd80: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
fd90: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
fda0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
fdb0: 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20  LAST_ERRNO: {.  
fdc0: 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
fdd0: 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e 6c 61  = (int)pFile->la
fde0: 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  stErrno;.      r
fdf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fe00: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
fe10: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55  SQLITE_FCNTL_CHU
fe20: 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  NK_SIZE: {.     
fe30: 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
fe40: 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a  = *(int *)pArg;.
fe50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
fe60: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
fe70: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
fe80: 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b  NTL_SIZE_HINT: {
fe90: 0a 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65  .      if( pFile
fea0: 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20  ->szChunk>0 ){. 
feb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
fec0: 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a 20 20 20 20  nt64 oldSz;.    
fed0: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e      int rc = win
fee0: 46 69 6c 65 53 69 7a 65 28 69 64 2c 20 26 6f 6c  FileSize(id, &ol
fef0: 64 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  dSz);.        if
ff00: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
ff10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
ff20: 69 74 65 33 5f 69 6e 74 36 34 20 6e 65 77 53 7a  ite3_int64 newSz
ff30: 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74   = *(sqlite3_int
ff40: 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  64*)pArg;.      
ff50: 20 20 20 20 69 66 28 20 6e 65 77 53 7a 3e 6f 6c      if( newSz>ol
ff60: 64 53 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  dSz ){.         
ff70: 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
ff80: 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
ff90: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69           rc = wi
ffa0: 6e 54 72 75 6e 63 61 74 65 28 69 64 2c 20 6e 65  nTruncate(id, ne
ffb0: 77 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wSz);.          
ffc0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
ffd0: 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
ffe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
fff0: 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
10000 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
10010 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10020 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
10030 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
10040 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a  _PERSIST_WAL: {.
10050 20 20 20 20 20 20 69 6e 74 20 62 50 65 72 73 69        int bPersi
10060 73 74 20 3d 20 2a 28 69 6e 74 2a 29 70 41 72 67  st = *(int*)pArg
10070 3b 0a 20 20 20 20 20 20 69 66 28 20 62 50 65 72  ;.      if( bPer
10080 73 69 73 74 3c 30 20 29 7b 0a 20 20 20 20 20 20  sist<0 ){.      
10090 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
100a0 70 46 69 6c 65 2d 3e 62 50 65 72 73 69 73 74 57  pFile->bPersistW
100b0 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  al;.      }else{
100c0 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
100d0 62 50 65 72 73 69 73 74 57 61 6c 20 3d 20 62 50  bPersistWal = bP
100e0 65 72 73 69 73 74 21 3d 30 3b 0a 20 20 20 20 20  ersist!=0;.     
100f0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
10100 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
10110 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
10120 5f 46 43 4e 54 4c 5f 53 59 4e 43 5f 4f 4d 49 54  _FCNTL_SYNC_OMIT
10130 54 45 44 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  TED: {.      ret
10140 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10150 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
10160 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32  LITE_FCNTL_WIN32
10170 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a 20 20 20  _AV_RETRY: {.   
10180 20 20 20 69 6e 74 20 2a 61 20 3d 20 28 69 6e 74     int *a = (int
10190 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69 66  *)pArg;.      if
101a0 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20 20 20 20  ( a[0]>0 ){.    
101b0 20 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52 65      win32IoerrRe
101c0 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20  try = a[0];.    
101d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
101e0 20 61 5b 30 5d 20 3d 20 77 69 6e 33 32 49 6f 65   a[0] = win32Ioe
101f0 72 72 52 65 74 72 79 3b 0a 20 20 20 20 20 20 7d  rrRetry;.      }
10200 0a 20 20 20 20 20 20 69 66 28 20 61 5b 31 5d 3e  .      if( a[1]>
10210 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e  0 ){.        win
10220 33 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  32IoerrRetryDela
10230 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20  y = a[1];.      
10240 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
10250 5b 31 5d 20 3d 20 77 69 6e 33 32 49 6f 65 72 72  [1] = win32Ioerr
10260 52 65 74 72 79 44 65 6c 61 79 3b 0a 20 20 20 20  RetryDelay;.    
10270 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
10280 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
10290 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
102a0 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
102b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
102c0 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
102d0 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  in bytes of the 
102e0 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b  underlying block
102f0 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74   device for.** t
10300 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
10310 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73  e. This is almos
10320 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  t always 512 byt
10330 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a  es, but may be.*
10340 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d  * larger for som
10350 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a  e devices..**.**
10360 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73   SQLite code ass
10370 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69  umes this functi
10380 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20  on cannot fail. 
10390 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20  It also assumes 
103a0 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66  that.** if two f
103b0 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64  iles are created
103c0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   in the same fil
103d0 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f  e-system directo
103e0 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61  ry (i.e..** a da
103f0 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a  tabase and its j
10400 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61  ournal file) tha
10410 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  t the sector siz
10420 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a  e will be the.**
10430 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a   same for both..
10440 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
10450 6e 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  nSectorSize(sqli
10460 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
10470 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
10480 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  ;.  return (int)
10490 28 28 28 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d  (((winFile*)id)-
104a0 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 7d 0a  >sectorSize);.}.
104b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
104c0 76 65 63 74 6f 72 20 6f 66 20 64 65 76 69 63 65  vector of device
104d0 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
104e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
104f0 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63 74  winDeviceCharact
10500 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33  eristics(sqlite3
10510 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 55 4e  _file *id){.  UN
10520 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
10530 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  d);.  return SQL
10540 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45  ITE_IOCAP_UNDELE
10550 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 3b  TABLE_WHEN_OPEN;
10560 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
10570 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 20  TE_OMIT_WAL../* 
10580 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77 69 6c 6c  .** Windows will
10590 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75 20 63 72   only let you cr
105a0 65 61 74 65 20 66 69 6c 65 20 76 69 65 77 20 6d  eate file view m
105b0 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c  appings.** on al
105c0 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 67 72  location size gr
105d0 61 6e 75 6c 61 72 69 74 79 20 62 6f 75 6e 64 61  anularity bounda
105e0 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69 6e 67 20  ries..** During 
105f0 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28  sqlite3_os_init(
10600 29 20 77 65 20 64 6f 20 61 20 47 65 74 53 79 73  ) we do a GetSys
10610 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20  temInfo().** to 
10620 67 65 74 20 74 68 65 20 67 72 61 6e 75 6c 61 72  get the granular
10630 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a 53 59 53  ity size..*/.SYS
10640 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73 49  TEM_INFO winSysI
10650 6e 66 6f 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  nfo;../*.** Help
10660 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
10670 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e  obtain and relin
10680 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c  quish the global
10690 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67   mutex. The.** g
106a0 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75  lobal mutex is u
106b0 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74  sed to protect t
106c0 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20 6f  he winLockInfo o
106d0 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20 0a  bjects used by .
106e0 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c  ** this file, al
106f0 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62  l of which may b
10700 65 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74  e shared by mult
10710 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a  iple threads..**
10720 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77 69 6e  .** Function win
10730 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69  ShmMutexHeld() i
10740 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74  s used to assert
10750 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62  () that the glob
10760 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20  al mutex .** is 
10770 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72  held when requir
10780 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
10790 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
107a0 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74  s part of assert
107b0 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  () .** statement
107c0 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  s. e.g..**.**   
107d0 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
107e0 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ().**     assert
107f0 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  ( winShmMutexHel
10800 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69 6e 53  d() );.**   winS
10810 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 0a 2a  hmLeaveMutex().*
10820 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
10830 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 76  nShmEnterMutex(v
10840 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
10850 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69  mutex_enter(sqli
10860 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
10870 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
10880 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74  C_MASTER));.}.st
10890 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d  atic void winShm
108a0 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29  LeaveMutex(void)
108b0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
108c0 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d  x_leave(sqlite3M
108d0 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
108e0 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
108f0 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66  STER));.}.#ifdef
10900 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
10910 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d  atic int winShmM
10920 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b  utexHeld(void) {
10930 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
10940 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c  3_mutex_held(sql
10950 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
10960 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
10970 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23  IC_MASTER));.}.#
10980 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  endif../*.** Obj
10990 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72  ect used to repr
109a0 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65 20 66  esent a single f
109b0 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64 20 6d  ile opened and m
109c0 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76 69 64  mapped to provid
109d0 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f  e.** shared memo
109e0 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74 69 70  ry.  When multip
109f0 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72  le threads all r
10a00 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d  eference the sam
10a10 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79  e.** log-summary
10a20 2c 20 65 61 63 68 20 74 68 72 65 61 64 20 68 61  , each thread ha
10a30 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46 69 6c  s its own winFil
10a40 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68  e object, but th
10a50 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20  ey all.** point 
10a60 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74  to a single inst
10a70 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
10a80 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ect.  In other w
10a90 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f  ords, each.** lo
10aa0 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f 70 65  g-summary is ope
10ab0 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65  ned only once pe
10ac0 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  r process..**.**
10ad0 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
10ae0 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20  () must be true 
10af0 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72  when creating or
10b00 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74   destroying.** t
10b10 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68  his object or wh
10b20 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77  ile reading or w
10b30 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  riting the follo
10b40 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a  wing fields:.**.
10b50 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 20  **      nRef.** 
10b60 20 20 20 20 20 70 4e 65 78 74 20 0a 2a 2a 0a 2a       pNext .**.*
10b70 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
10b80 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d  fields are read-
10b90 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f  only after the o
10ba0 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
10bb0 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69  :.** .**      fi
10bc0 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e  d.**      zFilen
10bd0 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72  ame.**.** Either
10be0 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74 65   winShmNode.mute
10bf0 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f  x must be held o
10c00 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65  r winShmNode.nRe
10c10 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e 53  f==0 and.** winS
10c20 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  hmMutexHeld() is
10c30 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64 69   true when readi
10c40 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e  ng or writing an
10c50 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a  y other field.**
10c60 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
10c70 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74  re..**.*/.struct
10c80 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20 20   winShmNode {.  
10c90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
10ca0 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75  utex;      /* Mu
10cb0 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68  tex to access th
10cc0 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  is object */.  c
10cd0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
10ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
10cf0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f  e of the file */
10d00 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69 6c 65  .  winFile hFile
10d10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
10d20 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f   File handle fro
10d30 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20  m winOpen */..  
10d40 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20  int szRegion;   
10d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
10d60 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d  ze of shared-mem
10d70 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20  ory regions */. 
10d80 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20   int nRegion;   
10d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
10da0 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52  ize of array apR
10db0 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63  egion */.  struc
10dc0 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20 20  t ShmRegion {.  
10dd0 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20    HANDLE hMap;  
10de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
10df0 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 43  le handle from C
10e00 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
10e10 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4d   */.    void *pM
10e20 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f 6e  ap;.  } *aRegion
10e30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
10e40 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rno;           /
10e50 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72  * The Windows er
10e60 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73  rno from the las
10e70 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a  t I/O error */..
10e80 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
10e90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10ea0 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53 68 6d  Number of winShm
10eb0 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
10ec0 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77  g to this */.  w
10ed0 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20  inShm *pFirst;  
10ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
10ef0 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20   winShm objects 
10f00 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
10f10 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65   */.  winShmNode
10f20 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
10f30 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73 74   /* Next in list
10f40 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f   of all winShmNo
10f50 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69  de objects */.#i
10f60 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
10f70 47 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64  G.  u8 nextShmId
10f80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
10f90 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65  * Next available
10fa0 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75 65   winShm.id value
10fb0 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
10fc0 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72  *.** A global ar
10fd0 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68  ray of all winSh
10fe0 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a 2a  mNode objects..*
10ff0 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d 4d  *.** The winShmM
11000 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20  utexHeld() must 
11010 62 65 20 74 72 75 65 20 77 68 69 6c 65 20 72 65  be true while re
11020 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
11030 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73   this list..*/.s
11040 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64 65  tatic winShmNode
11050 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74   *winShmNodeList
11060 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72   = 0;../*.** Str
11070 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74 65  ucture used inte
11080 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56  rnally by this V
11090 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  FS to record the
110a0 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20   state of an.** 
110b0 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  open shared memo
110c0 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ry connection..*
110d0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
110e0 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e  ng fields are in
110f0 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74  itialized when t
11100 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72  his object is cr
11110 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65  eated and.** are
11120 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65   read-only there
11130 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  after:.**.**    
11140 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a  winShm.pShmNode.
11150 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69 64 0a  **    winShm.id.
11160 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20  **.** All other 
11170 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f  fields are read/
11180 77 72 69 74 65 2e 20 20 54 68 65 20 77 69 6e 53  write.  The winS
11190 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  hm.pShmNode->mut
111a0 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  ex must be held.
111b0 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69  ** while accessi
111c0 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74  ng any read/writ
111d0 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72  e fields..*/.str
111e0 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77  uct winShm {.  w
111f0 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
11200 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  ode;      /* The
11210 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e 53   underlying winS
11220 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f  hmNode object */
11230 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74  .  winShm *pNext
11240 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
11250 20 4e 65 78 74 20 77 69 6e 53 68 6d 20 77 69 74   Next winShm wit
11260 68 20 74 68 65 20 73 61 6d 65 20 77 69 6e 53 68  h the same winSh
11270 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61  mNode */.  u8 ha
11280 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20  sMutex;         
11290 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
112a0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 77 69 6e   holding the win
112b0 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f  ShmNode mutex */
112c0 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73  .  u16 sharedMas
112d0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
112e0 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
112f0 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
11300 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20  u16 exclMask;   
11310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
11320 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
11330 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69  locks held */.#i
11340 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
11350 47 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 20  G.  u8 id;      
11360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11370 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e  * Id of this con
11380 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 69 74 73  nection with its
11390 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23   winShmNode */.#
113a0 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
113b0 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66  Constants used f
113c0 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64  or locking.*/.#d
113d0 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 42 41  efine WIN_SHM_BA
113e0 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45  SE   ((22+SQLITE
113f0 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20  _SHM_NLOCK)*4)  
11400 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c        /* first l
11410 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66  ock byte */.#def
11420 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 20  ine WIN_SHM_DMS 
11430 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41 53 45     (WIN_SHM_BASE
11440 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
11450 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73  K)  /* deadman s
11460 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  witch */../*.** 
11470 41 70 70 6c 79 20 61 64 76 69 73 6f 72 79 20 6c  Apply advisory l
11480 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e 20 62  ocks for all n b
11490 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 61  ytes beginning a
114a0 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65 66 69  t ofst..*/.#defi
114b0 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20 31  ne _SHM_UNLCK  1
114c0 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 52 44  .#define _SHM_RD
114d0 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e 65 20 5f  LCK  2.#define _
114e0 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a 73 74 61  SHM_WRLCK  3.sta
114f0 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 53 79  tic int winShmSy
11500 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e 53  stemLock(.  winS
11510 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65 2c 20 20  hmNode *pFile,  
11520 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73    /* Apply locks
11530 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68   to this open sh
11540 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d  ared-memory segm
11550 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63  ent */.  int loc
11560 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 2f  kType,         /
11570 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 5f 53  * _SHM_UNLCK, _S
11580 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f 53 48  HM_RDLCK, or _SH
11590 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74  M_WRLCK */.  int
115a0 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20   ofst,          
115b0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
115c0 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65  first byte to be
115d0 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64   locked/unlocked
115e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 20   */.  int nByte 
115f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
11600 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
11610 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b  o lock or unlock
11620 20 2a 2f 0a 29 7b 0a 20 20 4f 56 45 52 4c 41 50   */.){.  OVERLAP
11630 50 45 44 20 6f 76 6c 70 3b 0a 20 20 44 57 4f 52  PED ovlp;.  DWOR
11640 44 20 64 77 46 6c 61 67 73 3b 0a 20 20 69 6e 74  D dwFlags;.  int
11650 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
11660 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
11670 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f  e form Lock/Unlo
11680 63 6b 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20  ckFileEx() */.. 
11690 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68   /* Access to th
116a0 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a  e winShmNode obj
116b0 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65  ect is serialize
116c0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
116d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
116e0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
116f0 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c  pFile->mutex) ||
11700 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20   pFile->nRef==0 
11710 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  );..  /* Initial
11720 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ize the locking 
11730 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
11740 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49  dwFlags = LOCKFI
11750 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
11760 45 4c 59 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 54  ELY;.  if( lockT
11770 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43  ype == _SHM_WRLC
11780 4b 20 29 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c  K ) dwFlags |= L
11790 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56  OCKFILE_EXCLUSIV
117a0 45 5f 4c 4f 43 4b 3b 0a 0a 20 20 6d 65 6d 73 65  E_LOCK;..  memse
117b0 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65  t(&ovlp, 0, size
117c0 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b  of(OVERLAPPED));
117d0 0a 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d  .  ovlp.Offset =
117e0 20 6f 66 73 74 3b 0a 0a 20 20 2f 2a 20 52 65 6c   ofst;..  /* Rel
117f0 65 61 73 65 2f 41 63 71 75 69 72 65 20 74 68 65  ease/Acquire the
11800 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f   system-level lo
11810 63 6b 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  ck */.  if( lock
11820 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b  Type==_SHM_UNLCK
11830 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 55   ){.    rc = osU
11840 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 70 46 69 6c  nlockFileEx(pFil
11850 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 30 2c 20 6e  e->hFile.h, 0, n
11860 42 79 74 65 2c 20 30 2c 20 26 6f 76 6c 70 29 3b  Byte, 0, &ovlp);
11870 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
11880 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 28   = osLockFileEx(
11890 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  pFile->hFile.h, 
118a0 64 77 46 6c 61 67 73 2c 20 30 2c 20 6e 42 79 74  dwFlags, 0, nByt
118b0 65 2c 20 30 2c 20 26 6f 76 6c 70 29 3b 0a 20 20  e, 0, &ovlp);.  
118c0 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 21 3d 20  }.  .  if( rc!= 
118d0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
118e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
118f0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
11900 74 45 72 72 6e 6f 20 3d 20 20 6f 73 47 65 74 4c  tErrno =  osGetL
11910 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
11920 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
11930 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45  ;.  }..  OSTRACE
11940 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 25 64 20 25  (("SHM-LOCK %d %
11950 73 20 25 73 20 30 78 25 30 38 6c 78 5c 6e 22 2c  s %s 0x%08lx\n",
11960 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69   .           pFi
11970 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20  le->hFile.h,.   
11980 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
11990 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
119a0 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 20 20 20  failed",.       
119b0 20 20 20 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53      lockType==_S
119c0 48 4d 5f 55 4e 4c 43 4b 20 3f 20 22 55 6e 6c 6f  HM_UNLCK ? "Unlo
119d0 63 6b 46 69 6c 65 45 78 22 20 3a 20 22 4c 6f 63  ckFileEx" : "Loc
119e0 6b 46 69 6c 65 45 78 22 2c 0a 20 20 20 20 20 20  kFileEx",.      
119f0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
11a00 45 72 72 6e 6f 29 29 3b 0a 0a 20 20 72 65 74 75  Errno));..  retu
11a10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
11a20 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
11a30 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73 20 2a  to VFS methods *
11a40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
11a50 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
11a60 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71  *,const char*,sq
11a70 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c  lite3_file*,int,
11a80 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  int*);.static in
11a90 74 20 77 69 6e 44 65 6c 65 74 65 28 73 71 6c 69  t winDelete(sqli
11aa0 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20  te3_vfs *,const 
11ab0 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a  char*,int);../*.
11ac0 2a 2a 20 50 75 72 67 65 20 74 68 65 20 77 69 6e  ** Purge the win
11ad0 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74  ShmNodeList list
11ae0 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   of all entries 
11af0 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e  with winShmNode.
11b00 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54  nRef==0..**.** T
11b10 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53  his is not a VFS
11b20 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d   shared-memory m
11b30 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75  ethod; it is a u
11b40 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20  tility function 
11b50 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53  called.** by VFS
11b60 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d   shared-memory m
11b70 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  ethods..*/.stati
11b80 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 50 75 72  c void winShmPur
11b90 67 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ge(sqlite3_vfs *
11ba0 70 56 66 73 2c 20 69 6e 74 20 64 65 6c 65 74 65  pVfs, int delete
11bb0 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e  Flag){.  winShmN
11bc0 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53  ode **pp;.  winS
11bd0 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 42 4f 4f  hmNode *p;.  BOO
11be0 4c 20 62 52 63 3b 0a 20 20 61 73 73 65 72 74 28  L bRc;.  assert(
11bf0 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
11c00 28 29 20 29 3b 0a 20 20 70 70 20 3d 20 26 77 69  () );.  pp = &wi
11c10 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20  nShmNodeList;.  
11c20 77 68 69 6c 65 28 20 28 70 20 3d 20 2a 70 70 29  while( (p = *pp)
11c30 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  !=0 ){.    if( p
11c40 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
11c50 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
11c60 69 66 28 20 70 2d 3e 6d 75 74 65 78 20 29 20 73  if( p->mutex ) s
11c70 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
11c80 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  e(p->mutex);.   
11c90 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
11ca0 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a  >nRegion; i++){.
11cb0 20 20 20 20 20 20 20 20 62 52 63 20 3d 20 6f 73          bRc = os
11cc0 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
11cd0 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d  p->aRegion[i].pM
11ce0 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54  ap);.        OST
11cf0 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45  RACE(("SHM-PURGE
11d00 20 70 69 64 2d 25 64 20 75 6e 6d 61 70 20 72 65   pid-%d unmap re
11d10 67 69 6f 6e 3d 25 64 20 25 73 5c 6e 22 2c 0a 20  gion=%d %s\n",. 
11d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d30 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e  (int)osGetCurren
11d40 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c  tProcessId(), i,
11d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11d60 20 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22    bRc ? "ok" : "
11d70 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20  failed"));.     
11d80 20 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f 73 65     bRc = osClose
11d90 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67 69 6f  Handle(p->aRegio
11da0 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20 20 20  n[i].hMap);.    
11db0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48      OSTRACE(("SH
11dc0 4d 2d 50 55 52 47 45 20 70 69 64 2d 25 64 20 63  M-PURGE pid-%d c
11dd0 6c 6f 73 65 20 72 65 67 69 6f 6e 3d 25 64 20 25  lose region=%d %
11de0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
11df0 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73 47 65         (int)osGe
11e00 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
11e10 64 28 29 2c 20 69 2c 0a 20 20 20 20 20 20 20 20  d(), i,.        
11e20 20 20 20 20 20 20 20 20 20 62 52 63 20 3f 20 22           bRc ? "
11e30 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
11e40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11e50 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68 20 21  if( p->hFile.h !
11e60 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  = INVALID_HANDLE
11e70 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 20 20  _VALUE ){.      
11e80 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
11e90 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
11ea0 20 20 20 20 77 69 6e 43 6c 6f 73 65 28 28 73 71      winClose((sq
11eb0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 2d  lite3_file *)&p-
11ec0 3e 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  >hFile);.       
11ed0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
11ee0 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
11ef0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c   }.      if( del
11f00 65 74 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 20  eteFlag ){.     
11f10 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
11f20 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
11f30 20 20 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70       winDelete(p
11f40 56 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d  Vfs, p->zFilenam
11f50 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 53  e, 0);.        S
11f60 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
11f70 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d  nign(0);.      }
11f80 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e  .      *pp = p->
11f90 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c  pNext;.      sql
11fa0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52 65  ite3_free(p->aRe
11fb0 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  gion);.      sql
11fc0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
11fd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
11fe0 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20  p = &p->pNext;. 
11ff0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
12000 2a 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72 65  * Open the share
12010 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73  d-memory area as
12020 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 61  sociated with da
12030 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46  tabase file pDbF
12040 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70  d..**.** When op
12050 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72  ening a new shar
12060 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20  ed-memory file, 
12070 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74  if no other inst
12080 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a  ances of that.**
12090 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e   file are curren
120a0 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69  tly open, in thi
120b0 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20  s process or in 
120c0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c  other processes,
120d0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c   then.** the fil
120e0 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61  e must be trunca
120f0 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ted to zero leng
12100 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68  th or have its h
12110 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a  eader cleared..*
12120 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
12130 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79  OpenSharedMemory
12140 28 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 29  (winFile *pDbFd)
12150 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68  {.  struct winSh
12160 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  m *p;           
12170 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
12180 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f  nnection to be o
12190 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  pened */.  struc
121a0 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53  t winShmNode *pS
121b0 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a  hmNode = 0;   /*
121c0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
121d0 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a  mmapped file */.
121e0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
121f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12200 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
12210 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ode */.  struct 
12220 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77  winShmNode *pNew
12230 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
12240 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 77  ewly allocated w
12250 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69  inShmNode */.  i
12260 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12280 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61    /* Size of zNa
12290 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a  me in bytes */..
122a0 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d    assert( pDbFd-
122b0 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f  >pShm==0 );    /
122c0 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79  * Not previously
122d0 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a   opened */..  /*
122e0 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
122f0 66 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c 69  for the new sqli
12300 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20  te3_shm object. 
12310 20 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69 76   Also speculativ
12320 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  ely.  ** allocat
12330 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65  e space for a ne
12340 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64  w winShmNode and
12350 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   filename..  */.
12360 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    p = sqlite3_ma
12370 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29  lloc( sizeof(*p)
12380 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
12390 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
123a0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  OERR_NOMEM;.  me
123b0 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
123c0 66 28 2a 70 29 29 3b 0a 20 20 6e 4e 61 6d 65 20  f(*p));.  nName 
123d0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
123e0 30 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  0(pDbFd->zPath);
123f0 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
12400 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
12410 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 4e  (*pShmNode) + nN
12420 61 6d 65 20 2b 20 31 35 20 29 3b 0a 20 20 69 66  ame + 15 );.  if
12430 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
12440 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
12450 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
12460 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
12470 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e  .  }.  memset(pN
12480 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  ew, 0, sizeof(*p
12490 4e 65 77 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a  New));.  pNew->z
124a0 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
124b0 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 71  *)&pNew[1];.  sq
124c0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
124d0 4e 61 6d 65 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a  Name+15, pNew->z
124e0 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68  Filename, "%s-sh
124f0 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  m", pDbFd->zPath
12500 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 6c 65  );.  sqlite3File
12510 53 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a  Suffix3(pDbFd->z
12520 50 61 74 68 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c  Path, pNew->zFil
12530 65 6e 61 6d 65 29 3b 20 0a 0a 20 20 2f 2a 20 4c  ename); ..  /* L
12540 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  ook to see if th
12550 65 72 65 20 69 73 20 61 6e 20 65 78 69 73 74 69  ere is an existi
12560 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 74 68  ng winShmNode th
12570 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a  at can be used..
12580 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68    ** If no match
12590 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 63  ing winShmNode c
125a0 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73 2c  urrently exists,
125b0 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   create a new on
125c0 65 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  e..  */.  winShm
125d0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
125e0 66 6f 72 28 70 53 68 6d 4e 6f 64 65 20 3d 20 77  for(pShmNode = w
125f0 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 20 70  inShmNodeList; p
12600 53 68 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f 64  ShmNode; pShmNod
12610 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78  e=pShmNode->pNex
12620 74 29 7b 0a 20 20 20 20 2f 2a 20 54 42 44 20 6e  t){.    /* TBD n
12630 65 65 64 20 74 6f 20 63 6f 6d 65 20 75 70 20 77  eed to come up w
12640 69 74 68 20 62 65 74 74 65 72 20 6d 61 74 63 68  ith better match
12650 20 68 65 72 65 2e 20 20 50 65 72 68 61 70 73 0a   here.  Perhaps.
12660 20 20 20 20 2a 2a 20 75 73 65 20 46 49 4c 45 5f      ** use FILE_
12670 49 44 5f 42 4f 54 48 5f 44 49 52 5f 49 4e 46 4f  ID_BOTH_DIR_INFO
12680 20 53 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20   Structure..    
12690 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
126a0 65 33 53 74 72 49 43 6d 70 28 70 53 68 6d 4e 6f  e3StrICmp(pShmNo
126b0 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  de->zFilename, p
126c0 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d  New->zFilename)=
126d0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  =0 ) break;.  }.
126e0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 20 29    if( pShmNode )
126f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
12700 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73  ee(pNew);.  }els
12710 65 7b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20  e{.    pShmNode 
12720 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77  = pNew;.    pNew
12730 20 3d 20 30 3b 0a 20 20 20 20 28 28 77 69 6e 46   = 0;.    ((winF
12740 69 6c 65 2a 29 28 26 70 53 68 6d 4e 6f 64 65 2d  ile*)(&pShmNode-
12750 3e 68 46 69 6c 65 29 29 2d 3e 68 20 3d 20 49 4e  >hFile))->h = IN
12760 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
12770 55 45 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  UE;.    pShmNode
12780 2d 3e 70 4e 65 78 74 20 3d 20 77 69 6e 53 68 6d  ->pNext = winShm
12790 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 69  NodeList;.    wi
127a0 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 70  nShmNodeList = p
127b0 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20 70 53  ShmNode;..    pS
127c0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20  hmNode->mutex = 
127d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
127e0 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
127f0 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66 28 20  _FAST);.    if( 
12800 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d  pShmNode->mutex=
12810 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
12820 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
12830 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
12840 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
12850 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 69    }..    rc = wi
12860 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e 70 56 66  nOpen(pDbFd->pVf
12870 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
12880 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46      pShmNode->zF
12890 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20  ilename,        
128a0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
128b0 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29  the file (UTF-8)
128c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
128d0 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69       (sqlite3_fi
128e0 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  le*)&pShmNode->h
128f0 46 69 6c 65 2c 20 20 2f 2a 20 46 69 6c 65 20 68  File,  /* File h
12900 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20  andle here */.  
12910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
12920 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c  QLITE_OPEN_WAL |
12930 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
12940 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
12950 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 2f 2a 20  OPEN_CREATE, /* 
12960 4d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20  Mode flags */.  
12970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
12980 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
12990 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
129a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
129b0 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
129c0 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
129d0 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
129e0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
129f0 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63   if another proc
12a00 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ess is holding t
12a10 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74  he dead-man swit
12a20 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f  ch..    ** If no
12a30 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  t, truncate the 
12a40 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  file to zero len
12a50 67 74 68 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  gth. .    */.   
12a60 20 69 66 28 20 77 69 6e 53 68 6d 53 79 73 74 65   if( winShmSyste
12a70 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
12a80 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f  _SHM_WRLCK, WIN_
12a90 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c  SHM_DMS, 1)==SQL
12aa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12ab0 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65  rc = winTruncate
12ac0 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
12ad0 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
12ae0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 0);.      if(
12af0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12b00 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
12b10 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
12b20 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c  E_IOERR_SHMOPEN,
12b30 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
12b40 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
12b50 20 20 20 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22      "winOpenShm"
12b60 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
12b70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12b80 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12b90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 69  E_OK ){.      wi
12ba0 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
12bb0 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e  ShmNode, _SHM_UN
12bc0 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
12bd0 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , 1);.      rc =
12be0 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
12bf0 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
12c00 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f  _RDLCK, WIN_SHM_
12c10 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  DMS, 1);.    }. 
12c20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
12c30 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
12c40 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68   }..  /* Make th
12c50 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e  e new connection
12c60 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20   a child of the 
12c70 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  winShmNode */.  
12c80 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53  p->pShmNode = pS
12c90 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53  hmNode;.#ifdef S
12ca0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d  QLITE_DEBUG.  p-
12cb0 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  >id = pShmNode->
12cc0 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e  nextShmId++;.#en
12cd0 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  dif.  pShmNode->
12ce0 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d  nRef++;.  pDbFd-
12cf0 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e  >pShm = p;.  win
12d00 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
12d10 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72  ..  /* The refer
12d20 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53  ence count on pS
12d30 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61  hmNode has alrea
12d40 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e  dy been incremen
12d50 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74  ted under.  ** t
12d60 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20  he cover of the 
12d70 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
12d80 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65  () mutex and the
12d90 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68   pointer from th
12da0 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75  e.  ** new (stru
12db0 63 74 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63  ct winShm) objec
12dc0 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64  t to the pShmNod
12dd0 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  e has been set. 
12de0 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  All that is.  **
12df0 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74   left to do is t
12e00 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f  o link the new o
12e10 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c  bject into the l
12e20 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74  inked list start
12e30 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d  ing.  ** at pShm
12e40 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68  Node->pFirst. Th
12e50 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20  is must be done 
12e60 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68  while holding th
12e70 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e pShmNode->mute
12e80 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20  x .  ** mutex.. 
12e90 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
12ea0 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
12eb0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d  de->mutex);.  p-
12ec0 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64  >pNext = pShmNod
12ed0 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68  e->pFirst;.  pSh
12ee0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20  mNode->pFirst = 
12ef0 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  p;.  sqlite3_mut
12f00 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
12f10 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  e->mutex);.  ret
12f20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
12f30 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f    /* Jump here o
12f40 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73  n any error */.s
12f50 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77  hm_open_err:.  w
12f60 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
12f70 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55  pShmNode, _SHM_U
12f80 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  NLCK, WIN_SHM_DM
12f90 53 2c 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50  S, 1);.  winShmP
12fa0 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73  urge(pDbFd->pVfs
12fb0 2c 20 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68  , 0);      /* Th
12fc0 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53  is call frees pS
12fd0 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72  hmNode if requir
12fe0 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
12ff0 66 72 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74  free(p);.  sqlit
13000 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
13010 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
13020 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
13030 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
13040 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
13050 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20   shared-memory. 
13060 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65   Delete the unde
13070 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61  rlying .** stora
13080 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67  ge if deleteFlag
13090 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61   is true..*/.sta
130a0 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e  tic int winShmUn
130b0 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  map(.  sqlite3_f
130c0 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
130d0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f    /* Database ho
130e0 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d  lding shared mem
130f0 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c  ory */.  int del
13100 65 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20  eteFlag         
13110 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66      /* Delete af
13120 74 65 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74  ter closing if t
13130 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  rue */.){.  winF
13140 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20  ile *pDbFd;     
13150 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f    /* Database ho
13160 6c 64 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lding shared-mem
13170 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ory */.  winShm 
13180 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p;            /
13190 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
131a0 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f   to be closed */
131b0 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
131c0 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20  ShmNode; /* The 
131d0 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65  underlying share
131e0 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  d-memory file */
131f0 0a 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20  .  winShm **pp; 
13200 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
13210 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62  looping over sib
13220 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
13230 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28   */..  pDbFd = (
13240 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70  winFile*)fd;.  p
13250 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
13260 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
13270 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
13280 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70   pShmNode = p->p
13290 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52  ShmNode;..  /* R
132a0 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  emove connection
132b0 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20   p from the set 
132c0 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  of connections a
132d0 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77  ssociated.  ** w
132e0 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a  ith pShmNode */.
132f0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
13300 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
13310 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70  mutex);.  for(pp
13320 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  =&pShmNode->pFir
13330 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70  st; (*pp)!=p; pp
13340 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74   = &(*pp)->pNext
13350 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70  ){}.  *pp = p->p
13360 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  Next;..  /* Free
13370 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
13380 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  p */.  sqlite3_f
13390 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d  ree(p);.  pDbFd-
133a0 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c  >pShm = 0;.  sql
133b0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
133c0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
133d0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d  );..  /* If pShm
133e0 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72  Node->nRef has r
133f0 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63  eached 0, then c
13400 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lose the underly
13410 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d  ing.  ** shared-
13420 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f  memory file, too
13430 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65   */.  winShmEnte
13440 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65  rMutex();.  asse
13450 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  rt( pShmNode->nR
13460 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f  ef>0 );.  pShmNo
13470 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  de->nRef--;.  if
13480 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
13490 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68  ==0 ){.    winSh
134a0 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56  mPurge(pDbFd->pV
134b0 66 73 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b  fs, deleteFlag);
134c0 0a 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61  .  }.  winShmLea
134d0 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65  veMutex();..  re
134e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
134f0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
13500 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66  the lock state f
13510 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  or a shared-memo
13520 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73  ry segment..*/.s
13530 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
13540 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f  Lock(.  sqlite3_
13550 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
13560 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
13570 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
13580 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
13590 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20  .  int ofst,    
135a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
135b0 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61   First lock to a
135c0 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73  cquire or releas
135d0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20  e */.  int n,   
135e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
13600 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20  ocks to acquire 
13610 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  or release */.  
13620 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
13630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
13640 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
13650 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77  e lock */.){.  w
13660 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  inFile *pDbFd = 
13670 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20  (winFile*)fd;   
13680 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
13690 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  on holding share
136a0 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69  d memory */.  wi
136b0 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d  nShm *p = pDbFd-
136c0 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  >pShm;          
136d0 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
136e0 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c  d memory being l
136f0 6f 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68  ocked */.  winSh
13700 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  m *pX;          
13710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13720 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
13730 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67  over all sibling
13740 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  s */.  winShmNod
13750 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  e *pShmNode = p-
13760 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74  >pShmNode;.  int
13770 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13790 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
137a0 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b  e */.  u16 mask;
137b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
137d0 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  Mask of locks to
137e0 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65   take or release
137f0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f   */..  assert( o
13800 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e  fst>=0 && ofst+n
13810 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  <=SQLITE_SHM_NLO
13820 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
13830 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  n>=1 );.  assert
13840 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  ( flags==(SQLITE
13850 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
13860 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
13870 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
13880 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
13890 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
138a0 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20  CLUSIVE).       
138b0 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
138c0 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
138d0 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
138e0 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
138f0 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
13900 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
13910 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b  HM_EXCLUSIVE) );
13920 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
13930 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  || (flags & SQLI
13940 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
13950 29 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20  )!=0 );..  mask 
13960 3d 20 28 75 31 36 29 28 28 31 55 3c 3c 28 6f 66  = (u16)((1U<<(of
13970 73 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66  st+n)) - (1U<<of
13980 73 74 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  st));.  assert( 
13990 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c  n>1 || mask==(1<
139a0 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69  <ofst) );.  sqli
139b0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
139c0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
139d0 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
139e0 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
139f0 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  K ){.    u16 all
13a00 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73  Mask = 0; /* Mas
13a10 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  k of locks held 
13a20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a  by siblings */..
13a30 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e      /* See if an
13a40 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20  y siblings hold 
13a50 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a  this same lock *
13a60 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
13a70 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
13a80 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
13a90 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  {.      if( pX==
13aa0 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  p ) continue;.  
13ab0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d      assert( (pX-
13ac0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e  >exclMask & (p->
13ad0 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72  exclMask|p->shar
13ae0 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20  edMask))==0 );. 
13af0 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20       allMask |= 
13b00 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a  pX->sharedMask;.
13b10 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
13b20 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d  lock the system-
13b30 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  level locks */. 
13b40 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61     if( (mask & a
13b50 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  llMask)==0 ){.  
13b60 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53      rc = winShmS
13b70 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
13b80 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20  de, _SHM_UNLCK, 
13b90 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53  ofst+WIN_SHM_BAS
13ba0 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  E, n);.    }else
13bb0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
13bc0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20  ITE_OK;.    }.. 
13bd0 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c     /* Undo the l
13be0 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ocal locks */.  
13bf0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13c00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
13c10 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
13c20 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  k;.      p->shar
13c30 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
13c40 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20  .    } .  }else 
13c50 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
13c60 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b  TE_SHM_SHARED ){
13c70 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72  .    u16 allShar
13c80 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f  ed = 0;  /* Unio
13c90 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  n of locks held 
13ca0 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f  by connections o
13cb0 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f  ther than "p" */
13cc0 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75  ..    /* Find ou
13cd0 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c  t which shared l
13ce0 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79  ocks are already
13cf0 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
13d00 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20   connections..  
13d10 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c    ** If any sibl
13d20 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64  ing already hold
13d30 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
13d40 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  ock, go ahead an
13d50 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  d return.    ** 
13d60 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20  SQLITE_BUSY..   
13d70 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
13d80 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
13d90 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
13da0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
13db0 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
13dc0 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
13dd0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
13de0 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
13df0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
13e00 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58   allShared |= pX
13e10 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
13e20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
13e30 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20  shared locks at 
13e40 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
13e50 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  , if necessary *
13e60 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
13e70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13e80 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20   if( (allShared 
13e90 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
13ea0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
13eb0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
13ec0 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b  Node, _SHM_RDLCK
13ed0 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42  , ofst+WIN_SHM_B
13ee0 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  ASE, n);.      }
13ef0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
13f00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13f10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
13f20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61   /* Get the loca
13f30 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a  l shared locks *
13f40 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
13f50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13f60 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c   p->sharedMask |
13f70 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20  = mask;.    }.  
13f80 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61  }else{.    /* Ma
13f90 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69  ke sure no sibli
13fa0 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68  ng connections h
13fb0 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77  old locks that w
13fc0 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20  ill block this. 
13fd0 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20     ** lock.  If 
13fe0 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53  any do, return S
13ff0 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74  QLITE_BUSY right
14000 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20   away..    */.  
14010 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
14020 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
14030 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
14040 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
14050 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
14060 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d   || (pX->sharedM
14070 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29  ask & mask)!=0 )
14080 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
14090 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
140a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
140b0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
140c0 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75  /* Get the exclu
140d0 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68  sive locks at th
140e0 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20  e system level. 
140f0 20 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73   Then if success
14100 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20  ful.    ** also 
14110 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63  mark the local c
14120 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69  onnection as bei
14130 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a  ng locked..    *
14140 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
14150 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14160 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74   rc = winShmSyst
14170 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
14180 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73   _SHM_WRLCK, ofs
14190 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20  t+WIN_SHM_BASE, 
141a0 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
141b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
141c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
141d0 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  p->sharedMask & 
141e0 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20  mask)==0 );.    
141f0 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20      p->exclMask 
14200 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d  |= mask;.      }
14210 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
14220 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
14230 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
14240 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  );.  OSTRACE(("S
14250 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64  HM-LOCK shmid-%d
14260 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33  , pid-%d got %03
14270 78 2c 25 30 33 78 20 25 73 5c 6e 22 2c 0a 20 20  x,%03x %s\n",.  
14280 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20           p->id, 
14290 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e  (int)osGetCurren
142a0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 2d  tProcessId(), p-
142b0 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e  >sharedMask, p->
142c0 65 78 63 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20  exclMask,.      
142d0 20 20 20 20 20 72 63 20 3f 20 22 66 61 69 6c 65       rc ? "faile
142e0 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 20 20 72  d" : "ok"));.  r
142f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14300 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d  ** Implement a m
14310 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72  emory barrier or
14320 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e   memory fence on
14330 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20   shared memory. 
14340 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64   .**.** All load
14350 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67  s and stores beg
14360 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61  un before the ba
14370 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c  rrier must compl
14380 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ete before.** an
14390 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20  y load or store 
143a0 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20  begun after the 
143b0 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74  barrier..*/.stat
143c0 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 42 61  ic void winShmBa
143d0 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33  rrier(.  sqlite3
143e0 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20  _file *fd       
143f0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
14400 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
14410 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20  d memory */.){. 
14420 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
14430 52 28 66 64 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f  R(fd);.  /* Memo
14440 72 79 42 61 72 72 69 65 72 28 29 3b 20 2f 2f 20  ryBarrier(); // 
14450 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d  does not work --
14460 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 77 68 79   do not know why
14470 20 6e 6f 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d   not */.  winShm
14480 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
14490 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
144a0 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ();.}../*.** Thi
144b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
144c0 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61  lled to obtain a
144d0 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69   pointer to regi
144e0 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68  on iRegion of th
144f0 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d  e .** shared-mem
14500 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
14510 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
14520 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64   file fd. Shared
14530 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20  -memory regions 
14540 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64  .** are numbered
14550 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a   starting from z
14560 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64  ero. Each shared
14570 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69  -memory region i
14580 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62  s szRegion .** b
14590 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
145a0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
145b0 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
145c0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
145d0 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74  d and *pp is set
145e0 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
145f0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
14600 65 20 69 73 57 72 69 74 65 20 70 61 72 61 6d 65  e isWrite parame
14610 74 65 72 20 69 73 20 30 20 61 6e 64 20 74 68 65  ter is 0 and the
14620 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65   requested share
14630 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69  d-memory.** regi
14640 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  on has not been 
14650 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e  allocated (by an
14660 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64  y client, includ
14670 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20  ing one running 
14680 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65  in a.** separate
14690 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20   process), then 
146a0 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55  *pp is set to NU
146b0 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  LL and SQLITE_OK
146c0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a   returned. If .*
146d0 2a 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e  * isWrite is non
146e0 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65  -zero and the re
146f0 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
14700 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73  emory region has
14710 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65 65   not yet .** bee
14720 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
14730 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  is allocated by 
14740 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
14750 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72  *.** If the shar
14760 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
14770 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
14780 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69  n allocated or i
14790 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a  s allocated by.*
147a0 2a 20 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64  * this call as d
147b0 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20  escribed above, 
147c0 74 68 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65  then it is mappe
147d0 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  d into this proc
147e0 65 73 73 65 73 20 0a 2a 2a 20 61 64 64 72 65 73  esses .** addres
147f0 73 20 73 70 61 63 65 20 28 69 66 20 69 74 20 69  s space (if it i
14800 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20  s not already), 
14810 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f  *pp is set to po
14820 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65  int to the mappe
14830 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64  d .** memory and
14840 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
14850 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
14860 6e 74 20 77 69 6e 53 68 6d 4d 61 70 28 0a 20 20  nt winShmMap(.  
14870 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
14880 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14890 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f  /* Handle open o
148a0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
148b0 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e  */.  int iRegion
148c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
148d0 20 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74       /* Region t
148e0 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20  o retrieve */.  
148f0 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20  int szRegion,   
14900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14910 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f  /* Size of regio
14920 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 57 72  ns */.  int isWr
14930 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ite,            
14940 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
14950 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69  to extend file i
14960 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
14970 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a   void volatile *
14980 2a 70 70 20 20 20 20 20 20 20 20 20 20 20 20 20  *pp             
14990 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20   /* OUT: Mapped 
149a0 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 77  memory */.){.  w
149b0 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  inFile *pDbFd = 
149c0 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20  (winFile*)fd;.  
149d0 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46  winShm *p = pDbF
149e0 64 2d 3e 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68  d->pShm;.  winSh
149f0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
14a00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14a10 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70  TE_OK;..  if( !p
14a20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   ){.    rc = win
14a30 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79  OpenSharedMemory
14a40 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28  (pDbFd);.    if(
14a50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14a60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14a70 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
14a80 0a 20 20 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20  .  }.  pShmNode 
14a90 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a  = p->pShmNode;..
14aa0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
14ab0 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
14ac0 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
14ad0 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d  ( szRegion==pShm
14ae0 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c  Node->szRegion |
14af0 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  | pShmNode->nReg
14b00 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  ion==0 );..  if(
14b10 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
14b20 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20  on<=iRegion ){. 
14b30 20 20 20 73 74 72 75 63 74 20 53 68 6d 52 65 67     struct ShmReg
14b40 69 6f 6e 20 2a 61 70 4e 65 77 3b 20 20 20 20 20  ion *apNew;     
14b50 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 52 65        /* New aRe
14b60 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  gion[] array */.
14b70 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
14b80 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65  (iRegion+1)*szRe
14b90 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  gion;  /* Minimu
14ba0 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c 65 20  m required file 
14bb0 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  size */.    sqli
14bc0 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20  te3_int64 sz;   
14bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14be0 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  * Current size o
14bf0 66 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65  f wal-index file
14c00 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64   */..    pShmNod
14c10 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a  e->szRegion = sz
14c20 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20  Region;..    /* 
14c30 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  The requested re
14c40 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70  gion is not mapp
14c50 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
14c60 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
14c70 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65  pace..    ** Che
14c80 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ck to see if it 
14c90 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
14ca0 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20  ed (i.e. if the 
14cb0 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69  wal-index file i
14cc0 73 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65  s.    ** large e
14cd0 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e  nough to contain
14ce0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72   the requested r
14cf0 65 67 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20  egion)..    */. 
14d00 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53     rc = winFileS
14d10 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ize((sqlite3_fil
14d20 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  e *)&pShmNode->h
14d30 46 69 6c 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20  File, &sz);.    
14d40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14d50 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
14d60 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
14d70 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
14d80 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
14d90 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
14da0 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 31 22 2c     "winShmMap1",
14db0 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
14dc0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
14dd0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ge_out;.    }.. 
14de0 20 20 20 69 66 28 20 73 7a 3c 6e 42 79 74 65 20     if( sz<nByte 
14df0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
14e00 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
14e10 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74   region does not
14e20 20 65 78 69 73 74 2e 20 49 66 20 69 73 57 72 69   exist. If isWri
14e30 74 65 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20  te is set to.   
14e40 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74     ** zero, exit
14e50 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c   early. *pp will
14e60 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   be set to NULL 
14e70 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
14e80 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a  turned..      **
14e90 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e  .      ** Altern
14ea0 61 74 69 76 65 6c 79 2c 20 69 66 20 69 73 57 72  atively, if isWr
14eb0 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ite is non-zero,
14ec0 20 75 73 65 20 66 74 72 75 6e 63 61 74 65 28 29   use ftruncate()
14ed0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20   to allocate.   
14ee0 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73     ** the reques
14ef0 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
14f00 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
14f10 20 20 69 66 28 20 21 69 73 57 72 69 74 65 20 29    if( !isWrite )
14f20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
14f30 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  t;.      rc = wi
14f40 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69 74  nTruncate((sqlit
14f50 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e  e3_file *)&pShmN
14f60 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74  ode->hFile, nByt
14f70 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
14f80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14f90 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c         rc = winL
14fa0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
14fb0 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73  OERR_SHMSIZE, os
14fc0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
14fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fe0 20 22 77 69 6e 53 68 6d 4d 61 70 32 22 2c 20 70   "winShmMap2", p
14ff0 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
15000 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
15010 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ge_out;.      }.
15020 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
15030 70 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  p the requested 
15040 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e  memory region in
15050 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
15060 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
15070 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20   */.    apNew = 
15080 28 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f  (struct ShmRegio
15090 6e 20 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  n *)sqlite3_real
150a0 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53 68  loc(.        pSh
150b0 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20  mNode->aRegion, 
150c0 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65  (iRegion+1)*size
150d0 6f 66 28 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20  of(apNew[0]).   
150e0 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e   );.    if( !apN
150f0 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ew ){.      rc =
15100 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
15110 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
15120 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
15130 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d   }.    pShmNode-
15140 3e 61 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77  >aRegion = apNew
15150 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53  ;..    while( pS
15160 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
15170 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  =iRegion ){.    
15180 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20    HANDLE hMap;  
15190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
151a0 20 66 69 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61   file-mapping ha
151b0 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f  ndle */.      vo
151c0 69 64 20 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20  id *pMap = 0;   
151d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70            /* Map
151e0 70 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ped memory regio
151f0 6e 20 2a 2f 0a 20 20 20 20 20 0a 20 20 20 20 20  n */.     .     
15200 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65   hMap = osCreate
15210 46 69 6c 65 4d 61 70 70 69 6e 67 28 70 53 68 6d  FileMapping(pShm
15220 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a  Node->hFile.h, .
15230 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20            NULL, 
15240 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20  PAGE_READWRITE, 
15250 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20  0, nByte, NULL. 
15260 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 4f 53       );.      OS
15270 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 20  TRACE(("SHM-MAP 
15280 70 69 64 2d 25 64 20 63 72 65 61 74 65 20 72 65  pid-%d create re
15290 67 69 6f 6e 3d 25 64 20 6e 62 79 74 65 3d 25 64  gion=%d nbyte=%d
152a0 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
152b0 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73 47 65         (int)osGe
152c0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
152d0 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  d(), pShmNode->n
152e0 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20  Region, nByte,. 
152f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 4d                hM
15300 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  ap ? "ok" : "fai
15310 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 69 66  led"));.      if
15320 28 20 68 4d 61 70 20 29 7b 0a 20 20 20 20 20 20  ( hMap ){.      
15330 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20    int iOffset = 
15340 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
15350 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20  n*szRegion;.    
15360 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53      int iOffsetS
15370 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25  hift = iOffset %
15380 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c   winSysInfo.dwAl
15390 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72  locationGranular
153a0 69 74 79 3b 0a 20 20 20 20 20 20 20 20 70 4d 61  ity;.        pMa
153b0 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  p = osMapViewOfF
153c0 69 6c 65 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d  ile(hMap, FILE_M
153d0 41 50 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f  AP_WRITE | FILE_
153e0 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20 20 20 20  MAP_READ,.      
153f0 20 20 20 20 20 20 30 2c 20 69 4f 66 66 73 65 74        0, iOffset
15400 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c   - iOffsetShift,
15410 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66   szRegion + iOff
15420 73 65 74 53 68 69 66 74 0a 20 20 20 20 20 20 20  setShift.       
15430 20 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52   );.        OSTR
15440 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 20 70 69  ACE(("SHM-MAP pi
15450 64 2d 25 64 20 6d 61 70 20 72 65 67 69 6f 6e 3d  d-%d map region=
15460 25 64 20 6f 66 66 73 65 74 3d 25 64 20 73 69 7a  %d offset=%d siz
15470 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  e=%d %s\n",.    
15480 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
15490 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  t)osGetCurrentPr
154a0 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e  ocessId(), pShmN
154b0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f  ode->nRegion, iO
154c0 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20  ffset,.         
154d0 20 20 20 20 20 20 20 20 73 7a 52 65 67 69 6f 6e          szRegion
154e0 2c 20 70 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20  , pMap ? "ok" : 
154f0 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20  "failed"));.    
15500 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
15510 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Map ){.        p
15520 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72  ShmNode->lastErr
15530 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
15540 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 72  ror();.        r
15550 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
15560 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
15570 4d 41 50 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c  MAP, pShmNode->l
15580 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
15590 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
155a0 68 6d 4d 61 70 33 22 2c 20 70 44 62 46 64 2d 3e  hmMap3", pDbFd->
155b0 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  zPath);.        
155c0 69 66 28 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f  if( hMap ) osClo
155d0 73 65 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a  seHandle(hMap);.
155e0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
155f0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
15600 7d 0a 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  }..      pShmNod
15610 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e  e->aRegion[pShmN
15620 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d  ode->nRegion].pM
15630 61 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20  ap = pMap;.     
15640 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
15650 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  on[pShmNode->nRe
15660 67 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61  gion].hMap = hMa
15670 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  p;.      pShmNod
15680 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20  e->nRegion++;.  
15690 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65    }.  }..shmpage
156a0 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d  _out:.  if( pShm
156b0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52  Node->nRegion>iR
156c0 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74  egion ){.    int
156d0 20 69 4f 66 66 73 65 74 20 3d 20 69 52 65 67 69   iOffset = iRegi
156e0 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20  on*szRegion;.   
156f0 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66   int iOffsetShif
15700 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69  t = iOffset % wi
15710 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63  nSysInfo.dwAlloc
15720 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79  ationGranularity
15730 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20  ;.    char *p = 
15740 28 63 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65  (char *)pShmNode
15750 2d 3e 61 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f  ->aRegion[iRegio
15760 6e 5d 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70  n].pMap;.    *pp
15770 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f   = (void *)&p[iO
15780 66 66 73 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d  ffsetShift];.  }
15790 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20  else{.    *pp = 
157a0 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
157b0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
157c0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
157d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
157e0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69  else.# define wi
157f0 6e 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20  nShmMap     0.# 
15800 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63  define winShmLoc
15810 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20  k    0.# define 
15820 77 69 6e 53 68 6d 42 61 72 72 69 65 72 20 30 0a  winShmBarrier 0.
15830 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 55  # define winShmU
15840 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20  nmap   0.#endif 
15850 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
15860 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f  E_OMIT_WAL */../
15870 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74  *.** Here ends t
15880 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
15890 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33  n of all sqlite3
158a0 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a  _file methods..*
158b0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
158c0 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c  ******** End sql
158d0 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64  ite3_file Method
158e0 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
158f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15900 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
15910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15950 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65  /../*.** This ve
15960 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c  ctor defines all
15970 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61   the methods tha
15980 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e  t can operate on
15990 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66   an.** sqlite3_f
159a0 69 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a  ile for win32..*
159b0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
159c0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
159d0 73 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20  s winIoMethod = 
159e0 7b 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20 20  {.  2,          
159f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a00 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
15a10 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20  */.  winClose,  
15a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a30 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a       /* xClose *
15a40 2f 0a 20 20 77 69 6e 52 65 61 64 2c 20 20 20 20  /.  winRead,    
15a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a60 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a      /* xRead */.
15a70 20 20 77 69 6e 57 72 69 74 65 2c 20 20 20 20 20    winWrite,     
15a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a90 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20    /* xWrite */. 
15aa0 20 77 69 6e 54 72 75 6e 63 61 74 65 2c 20 20 20   winTruncate,   
15ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ac0 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f   /* xTruncate */
15ad0 0a 20 20 77 69 6e 53 79 6e 63 2c 20 20 20 20 20  .  winSync,     
15ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15af0 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20     /* xSync */. 
15b00 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20   winFileSize,   
15b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f   /* xFileSize */
15b30 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20 20 20 20 20  .  winLock,     
15b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b50 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20     /* xLock */. 
15b60 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20 20   winUnlock,     
15b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b80 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20   /* xUnlock */. 
15b90 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65   winCheckReserve
15ba0 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  dLock,          
15bb0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
15bc0 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46  edLock */.  winF
15bd0 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20  ileControl,     
15be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
15bf0 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20  FileControl */. 
15c00 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20   winSectorSize, 
15c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20   /* xSectorSize 
15c30 2a 2f 0a 20 20 77 69 6e 44 65 76 69 63 65 43 68  */.  winDeviceCh
15c40 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20  aracteristics,  
15c50 20 20 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43       /* xDeviceC
15c60 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a  haracteristics *
15c70 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20  /.  winShmMap,  
15c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c90 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a      /* xShmMap *
15ca0 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20  /.  winShmLock, 
15cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cc0 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20      /* xShmLock 
15cd0 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72 72 69  */.  winShmBarri
15ce0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
15cf0 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72       /* xShmBarr
15d00 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 55  ier */.  winShmU
15d10 6e 6d 61 70 20 20 20 20 20 20 20 20 20 20 20 20  nmap            
15d20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
15d30 55 6e 6d 61 70 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a  Unmap */.};../**
15d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
15d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15da0 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f  ******* sqlite3_
15db0 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  vfs methods ****
15dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15dd0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
15de0 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  his division con
15df0 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d  tains the implem
15e00 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68  entation of meth
15e10 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71  ods on the.** sq
15e20 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74  lite3_vfs object
15e30 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ..*/../*.** Conv
15e40 65 72 74 20 61 20 55 54 46 2d 38 20 66 69 6c 65  ert a UTF-8 file
15e50 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61 74 65 76  name into whatev
15e60 65 72 20 66 6f 72 6d 20 74 68 65 20 75 6e 64 65  er form the unde
15e70 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  rlying.** operat
15e80 69 6e 67 20 73 79 73 74 65 6d 20 77 61 6e 74 73  ing system wants
15e90 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20   filenames in.  
15ea0 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
15eb0 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f  e result.** is o
15ec0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
15ed0 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20  loc and must be 
15ee0 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
15ef0 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
15f00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15f10 20 2a 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c   *convertUtf8Fil
15f20 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72  ename(const char
15f30 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
15f40 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
15f50 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 73 4e 54   = 0;.  if( isNT
15f60 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65  () ){.    zConve
15f70 72 74 65 64 20 3d 20 75 74 66 38 54 6f 55 6e 69  rted = utf8ToUni
15f80 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  code(zFilename);
15f90 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20  ./* isNT() is 1 
15fa0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
15fb0 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65  CE==1, so this e
15fc0 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65  lse is never exe
15fd0 63 75 74 65 64 2e 20 0a 2a 2f 0a 23 69 66 20 53  cuted. .*/.#if S
15fe0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
15ff0 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  0.  }else{.    z
16000 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69  Converted = sqli
16010 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74  te3_win32_utf8_t
16020 6f 5f 6d 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65  o_mbcs(zFilename
16030 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
16040 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68  /* caller will h
16050 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d  andle out of mem
16060 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ory */.  return 
16070 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f  zConverted;.}../
16080 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65  *.** Create a te
16090 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
160a0 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66  e in zBuf.  zBuf
160b0 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f   must be big eno
160c0 75 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61  ugh to.** hold a
160d0 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  t pVfs->mxPathna
160e0 6d 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a  me characters..*
160f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
16100 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75  Tempname(int nBu
16110 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
16120 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 43    static char zC
16130 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62  hars[] =.    "ab
16140 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
16150 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41  stuvwxyz".    "A
16160 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
16170 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22  RSTUVWXYZ".    "
16180 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 73  0123456789";.  s
16190 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 63 68  ize_t i, j;.  ch
161a0 61 72 20 7a 54 65 6d 70 50 61 74 68 5b 4d 41 58  ar zTempPath[MAX
161b0 5f 50 41 54 48 2b 31 5d 3b 0a 0a 20 20 2f 2a 20  _PATH+1];..  /* 
161c0 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
161d0 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
161e0 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
161f0 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
16200 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
16210 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
16220 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
16230 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
16240 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
16250 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20  tion failing. . 
16260 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   */.  SimulateIO
16270 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
16280 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20  LITE_IOERR );.. 
16290 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 6d   if( sqlite3_tem
162a0 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20  p_directory ){. 
162b0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
162c0 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c  ntf(MAX_PATH-30,
162d0 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22   zTempPath, "%s"
162e0 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  , sqlite3_temp_d
162f0 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 7d 65 6c  irectory);.  }el
16300 73 65 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  se if( isNT() ){
16310 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74  .    char *zMult
16320 69 3b 0a 20 20 20 20 57 43 48 41 52 20 7a 57 69  i;.    WCHAR zWi
16330 64 65 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d  dePath[MAX_PATH]
16340 3b 0a 20 20 20 20 6f 73 47 65 74 54 65 6d 70 50  ;.    osGetTempP
16350 61 74 68 57 28 4d 41 58 5f 50 41 54 48 2d 33 30  athW(MAX_PATH-30
16360 2c 20 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20  , zWidePath);.  
16370 20 20 7a 4d 75 6c 74 69 20 3d 20 75 6e 69 63 6f    zMulti = unico
16380 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65 50 61  deToUtf8(zWidePa
16390 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75  th);.    if( zMu
163a0 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  lti ){.      sql
163b0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
163c0 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70  X_PATH-30, zTemp
163d0 50 61 74 68 2c 20 22 25 73 22 2c 20 7a 4d 75 6c  Path, "%s", zMul
163e0 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ti);.      sqlit
163f0 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b  e3_free(zMulti);
16400 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16410 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16420 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
16430 20 7d 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20   }./* isNT() is 
16440 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  1 if SQLITE_OS_W
16450 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73  INCE==1, so this
16460 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65   else is never e
16470 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e  xecuted. .** Sin
16480 63 65 20 74 68 65 20 41 4e 53 49 20 76 65 72 73  ce the ANSI vers
16490 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e  ion of these Win
164a0 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20  dows API do not 
164b0 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c  exist for WINCE,
164c0 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61  .** it's importa
164d0 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65  nt to not refere
164e0 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e  nce them for WIN
164f0 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69  CE builds..*/.#i
16500 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
16510 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E==0.  }else{.  
16520 20 20 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a 20    char *zUtf8;. 
16530 20 20 20 63 68 61 72 20 7a 4d 62 63 73 50 61 74     char zMbcsPat
16540 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20  h[MAX_PATH];.   
16550 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41 28   osGetTempPathA(
16560 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 4d 62  MAX_PATH-30, zMb
16570 63 73 50 61 74 68 29 3b 0a 20 20 20 20 7a 55 74  csPath);.    zUt
16580 66 38 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  f8 = sqlite3_win
16590 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
165a0 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20  zMbcsPath);.    
165b0 69 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20 20  if( zUtf8 ){.   
165c0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
165d0 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c  ntf(MAX_PATH-30,
165e0 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22   zTempPath, "%s"
165f0 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  , zUtf8);.      
16600 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74  sqlite3_free(zUt
16610 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  f8);.    }else{.
16620 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
16630 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
16640 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
16650 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  }..  /* Check th
16660 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  at the output bu
16670 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e  ffer is large en
16680 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d  ough for the tem
16690 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a  porary file .  *
166a0 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73  * name. If it is
166b0 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c   not, return SQL
166c0 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a  ITE_ERROR..  */.
166d0 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 53 74    if( (sqlite3St
166e0 72 6c 65 6e 33 30 28 7a 54 65 6d 70 50 61 74 68  rlen30(zTempPath
166f0 29 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65  ) + sqlite3Strle
16700 6e 33 30 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f  n30(SQLITE_TEMP_
16710 46 49 4c 45 5f 50 52 45 46 49 58 29 20 2b 20 31  FILE_PREFIX) + 1
16720 37 29 20 3e 3d 20 6e 42 75 66 20 29 7b 0a 20 20  7) >= nBuf ){.  
16730 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16740 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 66 6f  ERROR;.  }..  fo
16750 72 28 69 3d 73 71 6c 69 74 65 33 53 74 72 6c 65  r(i=sqlite3Strle
16760 6e 33 30 28 7a 54 65 6d 70 50 61 74 68 29 3b 20  n30(zTempPath); 
16770 69 3e 30 20 26 26 20 7a 54 65 6d 70 50 61 74 68  i>0 && zTempPath
16780 5b 69 2d 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d 2d  [i-1]=='\\'; i--
16790 29 7b 7d 0a 20 20 7a 54 65 6d 70 50 61 74 68 5b  ){}.  zTempPath[
167a0 69 5d 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74  i] = 0;..  sqlit
167b0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
167c0 2d 31 37 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20  -17, zBuf,.     
167d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25                "%
167e0 73 5c 5c 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f  s\\"SQLITE_TEMP_
167f0 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 54 65  FILE_PREFIX, zTe
16800 6d 70 50 61 74 68 29 3b 0a 20 20 6a 20 3d 20 73  mpPath);.  j = s
16810 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
16820 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Buf);.  sqlite3_
16830 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26  randomness(15, &
16840 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28  zBuf[j]);.  for(
16850 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20  i=0; i<15; i++, 
16860 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a  j++){.    zBuf[j
16870 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73  ] = (char)zChars
16880 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  [ ((unsigned cha
16890 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65  r)zBuf[j])%(size
168a0 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b  of(zChars)-1) ];
168b0 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d  .  }.  zBuf[j] =
168c0 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   0;..  OSTRACE((
168d0 22 54 45 4d 50 20 46 49 4c 45 4e 41 4d 45 3a 20  "TEMP FILENAME: 
168e0 25 73 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20  %s\n", zBuf));. 
168f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16900 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  K; .}../*.** Ope
16910 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  n a file..*/.sta
16920 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28  tic int winOpen(
16930 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
16940 70 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20  pVfs,        /* 
16950 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f  Not used */.  co
16960 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
16970 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
16980 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46  of the file (UTF
16990 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  -8) */.  sqlite3
169a0 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20  _file *id,      
169b0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
169c0 53 51 4c 69 74 65 20 66 69 6c 65 20 68 61 6e 64  SQLite file hand
169d0 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  le here */.  int
169e0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
169f0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d         /* Open m
16a00 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69  ode flags */.  i
16a10 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20  nt *pOutFlags   
16a20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
16a30 75 73 20 72 65 74 75 72 6e 20 66 6c 61 67 73 20  us return flags 
16a40 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68  */.){.  HANDLE h
16a50 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
16a60 72 6e 6f 3b 0a 20 20 44 57 4f 52 44 20 64 77 44  rno;.  DWORD dwD
16a70 65 73 69 72 65 64 41 63 63 65 73 73 3b 0a 20 20  esiredAccess;.  
16a80 44 57 4f 52 44 20 64 77 53 68 61 72 65 4d 6f 64  DWORD dwShareMod
16a90 65 3b 0a 20 20 44 57 4f 52 44 20 64 77 43 72 65  e;.  DWORD dwCre
16aa0 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
16ab0 3b 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67  ;.  DWORD dwFlag
16ac0 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
16ad0 20 30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   0;.#if SQLITE_O
16ae0 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 69 73  S_WINCE.  int is
16af0 54 65 6d 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66  Temp = 0;.#endif
16b00 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
16b10 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
16b20 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
16b30 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  rted;           
16b40 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69     /* Filename i
16b50 6e 20 4f 53 20 65 6e 63 6f 64 69 6e 67 20 2a 2f  n OS encoding */
16b60 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
16b70 55 74 66 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  Utf8Name = zName
16b80 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e  ; /* Filename in
16b90 20 55 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20   UTF-8 encoding 
16ba0 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  */.  int cnt = 0
16bb0 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d  ;..  /* If argum
16bc0 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e  ent zPath is a N
16bd0 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69  ULL pointer, thi
16be0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  s function is re
16bf0 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20  quired to open. 
16c00 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20   ** a temporary 
16c10 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62  file. Use this b
16c20 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74  uffer to store t
16c30 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e  he file name in.
16c40 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d  .  */.  char zTm
16c50 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 2b 31  pname[MAX_PATH+1
16c60 5d 3b 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72  ];     /* Buffer
16c70 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20   used to create 
16c80 74 65 6d 70 20 66 69 6c 65 6e 61 6d 65 20 2a 2f  temp filename */
16c90 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ..  int rc = SQL
16ca0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
16cb0 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52     /* Function R
16cc0 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69  eturn Code */.#i
16cd0 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
16ce0 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  G) || SQLITE_OS_
16cf0 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 54 79 70  WINCE.  int eTyp
16d00 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46  e = flags&0xFFFF
16d10 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f  FF00;  /* Type o
16d20 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  f file to open *
16d30 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20  /.#endif..  int 
16d40 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28  isExclusive  = (
16d50 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
16d60 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a  PEN_EXCLUSIVE);.
16d70 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20    int isDelete  
16d80 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
16d90 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
16da0 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20  ONCLOSE);.  int 
16db0 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28  isCreate     = (
16dc0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
16dd0 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 23 69 66  PEN_CREATE);.#if
16de0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e  ndef NDEBUG.  in
16df0 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d  t isReadonly   =
16e00 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
16e10 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
16e20 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 69 73  .#endif.  int is
16e30 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c  ReadWrite  = (fl
16e40 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
16e50 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 0a 23  N_READWRITE);..#
16e60 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
16e70 69 6e 74 20 69 73 4f 70 65 6e 4a 6f 75 72 6e 61  int isOpenJourna
16e80 6c 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26  l = (isCreate &&
16e90 20 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65   (.        eType
16ea0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
16eb0 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
16ec0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
16ed0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
16ee0 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65  URNAL .     || e
16ef0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
16f00 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 23 65 6e 64  N_WAL.  ));.#end
16f10 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  if..  /* Check t
16f20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61  he following sta
16f30 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65  tements are true
16f40 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28  : .  **.  **   (
16f50 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f  a) Exactly one o
16f60 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45 20  f the READWRITE 
16f70 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61  and READONLY fla
16f80 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20  gs must be set, 
16f90 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20  and .  **   (b) 
16fa0 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65 74  if CREATE is set
16fb0 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54 45  , then READWRITE
16fc0 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
16fd0 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63  t, and.  **   (c
16fe0 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20 69  ) if EXCLUSIVE i
16ff0 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41  s set, then CREA
17000 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
17010 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20  set..  **   (d) 
17020 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  if DELETEONCLOSE
17030 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
17040 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
17050 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e set..  */.  as
17060 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79  sert((isReadonly
17070 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
17080 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61  te==0) && (isRea
17090 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64  dWrite || isRead
170a0 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74  only));.  assert
170b0 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20  (isCreate==0 || 
170c0 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20  isReadWrite);.  
170d0 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73 69  assert(isExclusi
170e0 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74  ve==0 || isCreat
170f0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44  e);.  assert(isD
17100 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72  elete==0 || isCr
17110 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  eate);..  /* The
17120 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a   main DB, main j
17130 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65  ournal, WAL file
17140 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72   and master jour
17150 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20  nal are never . 
17160 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
17170 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61  y deleted. Nor a
17180 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d  re they ever tem
17190 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a  porary files.  *
171a0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  /.  assert( (!is
171b0 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
171c0 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
171d0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29  E_OPEN_MAIN_DB )
171e0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
171f0 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
17200 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
17210 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
17220 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
17230 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
17240 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
17250 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
17260 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  ER_JOURNAL );.  
17270 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
17280 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
17290 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
172a0 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20  EN_WAL );..  /* 
172b0 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
172c0 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20  upper layer has 
172d0 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22  set one of the "
172e0 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73  file-type" flags
172f0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65  . */.  assert( e
17300 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
17310 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c  N_MAIN_DB      |
17320 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
17330 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20  OPEN_TEMP_DB .  
17340 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
17350 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
17360 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65  JOURNAL || eType
17370 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
17380 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  MP_JOURNAL .    
17390 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
173a0 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
173b0 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  NAL   || eType==
173c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
173d0 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  ER_JOURNAL .    
173e0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
173f0 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
17400 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d  NT_DB || eType==
17410 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
17420 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20    );..  assert( 
17430 69 64 21 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45  id!=0 );.  UNUSE
17440 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
17450 29 3b 0a 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d  );..  pFile->h =
17460 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f   INVALID_HANDLE_
17470 56 41 4c 55 45 3b 0a 0a 20 20 2f 2a 20 49 66 20  VALUE;..  /* If 
17480 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
17490 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
174a0 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 65  tion is NULL, ge
174b0 6e 65 72 61 74 65 20 61 20 0a 20 20 2a 2a 20 74  nerate a .  ** t
174c0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61  emporary file na
174d0 6d 65 20 74 6f 20 75 73 65 20 0a 20 20 2a 2f 0a  me to use .  */.
174e0 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65    if( !zUtf8Name
174f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 69   ){.    assert(i
17500 73 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70  sDelete && !isOp
17510 65 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  enJournal);.    
17520 72 63 20 3d 20 67 65 74 54 65 6d 70 6e 61 6d 65  rc = getTempname
17530 28 4d 41 58 5f 50 41 54 48 2b 31 2c 20 7a 54 6d  (MAX_PATH+1, zTm
17540 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pname);.    if( 
17550 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17560 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
17570 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66  ;.    }.    zUtf
17580 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65  8Name = zTmpname
17590 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76  ;.  }..  /* Conv
175a0 65 72 74 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  ert the filename
175b0 20 74 6f 20 74 68 65 20 73 79 73 74 65 6d 20 65   to the system e
175c0 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43  ncoding. */.  zC
175d0 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65  onverted = conve
175e0 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  rtUtf8Filename(z
175f0 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66 28  Utf8Name);.  if(
17600 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
17610 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
17620 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
17630 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 65  .  }..  if( isRe
17640 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 64  adWrite ){.    d
17650 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20 3d  wDesiredAccess =
17660 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20   GENERIC_READ | 
17670 47 45 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a 20  GENERIC_WRITE;. 
17680 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 44 65   }else{.    dwDe
17690 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47 45  siredAccess = GE
176a0 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d 0a  NERIC_READ;.  }.
176b0 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50 45  .  /* SQLITE_OPE
176c0 4e 5f 45 58 43 4c 55 53 49 56 45 20 69 73 20 75  N_EXCLUSIVE is u
176d0 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  sed to make sure
176e0 20 74 68 61 74 20 61 20 6e 65 77 20 66 69 6c 65   that a new file
176f0 20 69 73 20 0a 20 20 2a 2a 20 63 72 65 61 74 65   is .  ** create
17700 64 2e 20 53 51 4c 69 74 65 20 64 6f 65 73 6e 27  d. SQLite doesn'
17710 74 20 75 73 65 20 69 74 20 74 6f 20 69 6e 64 69  t use it to indi
17720 63 61 74 65 20 22 65 78 63 6c 75 73 69 76 65 20  cate "exclusive 
17730 61 63 63 65 73 73 22 20 0a 20 20 2a 2a 20 61 73  access" .  ** as
17740 20 69 74 20 69 73 20 75 73 75 61 6c 6c 79 20 75   it is usually u
17750 6e 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a  nderstood..  */.
17760 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76    if( isExclusiv
17770 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61  e ){.    /* Crea
17780 74 65 73 20 61 20 6e 65 77 20 66 69 6c 65 2c 20  tes a new file, 
17790 6f 6e 6c 79 20 69 66 20 69 74 20 64 6f 65 73 20  only if it does 
177a0 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
177b0 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20  t. */.    /* If 
177c0 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c  the file exists,
177d0 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20   it fails. */.  
177e0 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
177f0 6f 73 69 74 69 6f 6e 20 3d 20 43 52 45 41 54 45  osition = CREATE
17800 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _NEW;.  }else if
17810 28 20 69 73 43 72 65 61 74 65 20 29 7b 0a 20 20  ( isCreate ){.  
17820 20 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74 69    /* Open existi
17830 6e 67 20 66 69 6c 65 2c 20 6f 72 20 63 72 65 61  ng file, or crea
17840 74 65 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74  te if it doesn't
17850 20 65 78 69 73 74 20 2a 2f 0a 20 20 20 20 64 77   exist */.    dw
17860 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
17870 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59  ion = OPEN_ALWAY
17880 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  S;.  }else{.    
17890 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c  /* Opens a file,
178a0 20 6f 6e 6c 79 20 69 66 20 69 74 20 65 78 69 73   only if it exis
178b0 74 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65  ts. */.    dwCre
178c0 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
178d0 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47   = OPEN_EXISTING
178e0 3b 0a 20 20 7d 0a 0a 20 20 64 77 53 68 61 72 65  ;.  }..  dwShare
178f0 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48 41 52  Mode = FILE_SHAR
17900 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48  E_READ | FILE_SH
17910 41 52 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69 66  ARE_WRITE;..  if
17920 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69  ( isDelete ){.#i
17930 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
17940 45 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64  E.    dwFlagsAnd
17950 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c  Attributes = FIL
17960 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44  E_ATTRIBUTE_HIDD
17970 45 4e 3b 0a 20 20 20 20 69 73 54 65 6d 70 20 3d  EN;.    isTemp =
17980 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 77   1;.#else.    dw
17990 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
179a0 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42  es = FILE_ATTRIB
179b0 55 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20  UTE_TEMPORARY.  
179c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46               | F
179e0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49  ILE_ATTRIBUTE_HI
179f0 44 44 45 4e 0a 20 20 20 20 20 20 20 20 20 20 20  DDEN.           
17a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a10 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f      | FILE_FLAG_
17a20 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b  DELETE_ON_CLOSE;
17a30 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
17a40 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41  .    dwFlagsAndA
17a50 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45  ttributes = FILE
17a60 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41  _ATTRIBUTE_NORMA
17a70 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70 6f  L;.  }.  /* Repo
17a80 72 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 74  rts from the int
17a90 65 72 6e 65 74 20 61 72 65 20 74 68 61 74 20 70  ernet are that p
17aa0 65 72 66 6f 72 6d 61 6e 63 65 20 69 73 20 61 6c  erformance is al
17ab0 77 61 79 73 0a 20 20 2a 2a 20 62 65 74 74 65 72  ways.  ** better
17ac0 20 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41   if FILE_FLAG_RA
17ad0 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69 73 20 75  NDOM_ACCESS is u
17ae0 73 65 64 2e 20 20 54 69 63 6b 65 74 20 23 32 36  sed.  Ticket #26
17af0 39 39 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  99. */.#if SQLIT
17b00 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77 46  E_OS_WINCE.  dwF
17b10 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
17b20 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52  s |= FILE_FLAG_R
17b30 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23 65  ANDOM_ACCESS;.#e
17b40 6e 64 69 66 0a 0a 20 20 69 66 28 20 69 73 4e 54  ndif..  if( isNT
17b50 28 29 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  () ){.    while(
17b60 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69   (h = osCreateFi
17b70 6c 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  leW((LPCWSTR)zCo
17b80 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
17b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ba0 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
17bb0 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
17bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bd0 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
17be0 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  e, NULL,.       
17bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c00 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f         dwCreatio
17c10 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20  nDisposition,.  
17c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c30 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c              dwFl
17c40 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
17c50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c70 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f  NULL))==INVALID_
17c80 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a  HANDLE_VALUE &&.
17c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
17cb0 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
17cc0 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 2f  lastErrno) ){}./
17cd0 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66  * isNT() is 1 if
17ce0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
17cf0 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73  ==1, so this els
17d00 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75  e is never execu
17d10 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74  ted. .** Since t
17d20 68 65 20 41 4e 53 49 20 76 65 72 73 69 6f 6e 20  he ANSI version 
17d30 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73  of these Windows
17d40 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73   API do not exis
17d50 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20  t for WINCE,.** 
17d60 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  it's important t
17d70 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20  o not reference 
17d80 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62  them for WINCE b
17d90 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51  uilds..*/.#if SQ
17da0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30  LITE_OS_WINCE==0
17db0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
17dc0 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61  ile( (h = osCrea
17dd0 74 65 46 69 6c 65 41 28 28 4c 50 43 53 54 52 29  teFileA((LPCSTR)
17de0 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
17df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e00 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69            dwDesi
17e10 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20  redAccess,.     
17e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e30 20 20 20 20 20 20 20 20 20 64 77 53 68 61 72 65           dwShare
17e40 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20  Mode, NULL,.    
17e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e60 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61            dwCrea
17e70 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c  tionDisposition,
17e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
17ea0 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
17eb0 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tes,.           
17ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ed0 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c     NULL))==INVAL
17ee0 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
17ef0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
17f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f10 20 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74   retryIoerr(&cnt
17f20 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
17f30 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
17f40 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 0a  logIoerr(cnt);..
17f50 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
17f60 20 25 64 20 25 73 20 30 78 25 6c 78 20 25 73 5c   %d %s 0x%lx %s\
17f70 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  n", .           
17f80 68 2c 20 7a 4e 61 6d 65 2c 20 64 77 44 65 73 69  h, zName, dwDesi
17f90 72 65 64 41 63 63 65 73 73 2c 20 0a 20 20 20 20  redAccess, .    
17fa0 20 20 20 20 20 20 20 68 3d 3d 49 4e 56 41 4c 49         h==INVALI
17fb0 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 3f  D_HANDLE_VALUE ?
17fc0 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22   "failed" : "ok"
17fd0 29 29 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e  ));..  if( h==IN
17fe0 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
17ff0 55 45 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  UE ){.    pFile-
18000 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
18010 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c  tErrno;.    winL
18020 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
18030 41 4e 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e  ANTOPEN, pFile->
18040 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f  lastErrno, "winO
18050 70 65 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29  pen", zUtf8Name)
18060 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
18070 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
18080 20 20 20 20 69 66 28 20 69 73 52 65 61 64 57 72      if( isReadWr
18090 69 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73  ite && !isExclus
180a0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ive ){.      ret
180b0 75 72 6e 20 77 69 6e 4f 70 65 6e 28 70 56 66 73  urn winOpen(pVfs
180c0 2c 20 7a 4e 61 6d 65 2c 20 69 64 2c 20 0a 20 20  , zName, id, .  
180d0 20 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61             ((fla
180e0 67 73 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  gs|SQLITE_OPEN_R
180f0 45 41 44 4f 4e 4c 59 29 26 7e 28 53 51 4c 49 54  EADONLY)&~(SQLIT
18100 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51  E_OPEN_CREATE|SQ
18110 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
18120 49 54 45 29 29 2c 20 70 4f 75 74 46 6c 61 67 73  ITE)), pOutFlags
18130 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
18140 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18150 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
18160 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
18170 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20  ( pOutFlags ){. 
18180 20 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69     if( isReadWri
18190 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 4f 75  te ){.      *pOu
181a0 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  tFlags = SQLITE_
181b0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a  OPEN_READWRITE;.
181c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
181d0 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51   *pOutFlags = SQ
181e0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
181f0 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  LY;.    }.  }.. 
18200 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30   memset(pFile, 0
18210 2c 20 73 69 7a 65 6f 66 28 2a 70 46 69 6c 65 29  , sizeof(*pFile)
18220 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74  );.  pFile->pMet
18230 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68  hod = &winIoMeth
18240 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d  od;.  pFile->h =
18250 20 68 3b 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73   h;.  pFile->las
18260 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f  tErrno = NO_ERRO
18270 52 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66 73  R;.  pFile->pVfs
18280 20 3d 20 70 56 66 73 3b 0a 20 20 70 46 69 6c 65   = pVfs;.  pFile
18290 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 70 46  ->pShm = 0;.  pF
182a0 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61  ile->zPath = zNa
182b0 6d 65 3b 0a 20 20 70 46 69 6c 65 2d 3e 73 65 63  me;.  pFile->sec
182c0 74 6f 72 53 69 7a 65 20 3d 20 67 65 74 53 65 63  torSize = getSec
182d0 74 6f 72 53 69 7a 65 28 70 56 66 73 2c 20 7a 55  torSize(pVfs, zU
182e0 74 66 38 4e 61 6d 65 29 3b 0a 0a 23 69 66 20 53  tf8Name);..#if S
182f0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
18300 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
18310 20 26 26 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   && eType==SQLIT
18320 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20  E_OPEN_MAIN_DB. 
18330 20 20 20 20 20 20 26 26 20 21 77 69 6e 63 65 43        && !winceC
18340 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c  reateLock(zName,
18350 20 70 46 69 6c 65 29 0a 20 20 29 7b 0a 20 20 20   pFile).  ){.   
18360 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68   osCloseHandle(h
18370 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
18380 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
18390 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
183a0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
183b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 54 65  ;.  }.  if( isTe
183c0 6d 70 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  mp ){.    pFile-
183d0 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20  >zDeleteOnClose 
183e0 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20  = zConverted;.  
183f0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b  }else.#endif.  {
18400 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
18410 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
18420 20 7d 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65   }..  OpenCounte
18430 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  r(+1);.  return 
18440 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  rc;.}../*.** Del
18450 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69  ete the named fi
18460 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  le..**.** Note t
18470 68 61 74 20 57 69 6e 64 6f 77 73 20 64 6f 65 73  hat Windows does
18480 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c   not allow a fil
18490 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  e to be deleted 
184a0 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  if some other.**
184b0 20 70 72 6f 63 65 73 73 20 68 61 73 20 69 74 20   process has it 
184c0 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73  open.  Sometimes
184d0 20 61 20 76 69 72 75 73 20 73 63 61 6e 6e 65 72   a virus scanner
184e0 20 6f 72 20 69 6e 64 65 78 69 6e 67 20 70 72 6f   or indexing pro
184f0 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65  gram.** will ope
18500 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  n a journal file
18510 20 73 68 6f 72 74 6c 79 20 61 66 74 65 72 20 69   shortly after i
18520 74 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20  t is created in 
18530 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77  order to do.** w
18540 68 61 74 65 76 65 72 20 69 74 20 64 6f 65 73 2e  hatever it does.
18550 20 20 57 68 69 6c 65 20 74 68 69 73 20 6f 74 68    While this oth
18560 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  er process is ho
18570 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c  lding the.** fil
18580 65 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20  e open, we will 
18590 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c  be unable to del
185a0 65 74 65 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b  ete it.  To work
185b0 20 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20   around this.** 
185c0 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61  problem, we dela
185d0 79 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e  y 100 millisecon
185e0 64 73 20 61 6e 64 20 74 72 79 20 74 6f 20 64 65  ds and try to de
185f0 6c 65 74 65 20 61 67 61 69 6e 2e 20 20 55 70 0a  lete again.  Up.
18600 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f  ** to MX_DELETIO
18610 4e 5f 41 54 54 45 4d 50 54 73 20 64 65 6c 65 74  N_ATTEMPTs delet
18620 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 61 72 65  ion attempts are
18630 20 72 75 6e 20 62 65 66 6f 72 65 20 67 69 76 69   run before givi
18640 6e 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65 74  ng.** up and ret
18650 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e  urning an error.
18660 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
18670 69 6e 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69  inDelete(.  sqli
18680 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
18690 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75          /* Not u
186a0 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a  sed on win32 */.
186b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
186c0 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a  ilename,      /*
186d0 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f   Name of file to
186e0 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74   delete */.  int
186f0 20 73 79 6e 63 44 69 72 20 20 20 20 20 20 20 20   syncDir        
18700 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
18710 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f  used on win32 */
18720 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  .){.  int cnt = 
18730 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  0;.  int rc;.  D
18740 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
18750 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
18760 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ed;.  UNUSED_PAR
18770 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
18780 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
18790 28 73 79 6e 63 44 69 72 29 3b 0a 0a 20 20 53 69  (syncDir);..  Si
187a0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
187b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
187c0 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 7a 43 6f  R_DELETE);.  zCo
187d0 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72  nverted = conver
187e0 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  tUtf8Filename(zF
187f0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
18800 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
18810 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
18820 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
18830 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29    }.  if( isNT()
18840 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a   ){.    rc = 1;.
18850 20 20 20 20 77 68 69 6c 65 28 20 6f 73 47 65 74      while( osGet
18860 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28  FileAttributesW(
18870 7a 43 6f 6e 76 65 72 74 65 64 29 21 3d 49 4e 56  zConverted)!=INV
18880 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
18890 55 54 45 53 20 26 26 0a 20 20 20 20 20 20 20 20  UTES &&.        
188a0 20 28 72 63 20 3d 20 6f 73 44 65 6c 65 74 65 46   (rc = osDeleteF
188b0 69 6c 65 57 28 7a 43 6f 6e 76 65 72 74 65 64 29  ileW(zConverted)
188c0 29 3d 3d 30 20 26 26 20 72 65 74 72 79 49 6f 65  )==0 && retryIoe
188d0 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
188e0 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 72 63 20  rno) ){}.    rc 
188f0 3d 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  = rc ? SQLITE_OK
18900 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
18910 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20  ./* isNT() is 1 
18920 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
18930 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65  CE==1, so this e
18940 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65  lse is never exe
18950 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65  cuted. .** Since
18960 20 74 68 65 20 41 4e 53 49 20 76 65 72 73 69 6f   the ANSI versio
18970 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f  n of these Windo
18980 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78  ws API do not ex
18990 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a  ist for WINCE,.*
189a0 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74  * it's important
189b0 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63   to not referenc
189c0 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45  e them for WINCE
189d0 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20   builds..*/.#if 
189e0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
189f0 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  =0.  }else{.    
18a00 72 63 20 3d 20 31 3b 0a 20 20 20 20 77 68 69 6c  rc = 1;.    whil
18a10 65 28 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72  e( osGetFileAttr
18a20 69 62 75 74 65 73 41 28 7a 43 6f 6e 76 65 72 74  ibutesA(zConvert
18a30 65 64 29 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ed)!=INVALID_FIL
18a40 45 5f 41 54 54 52 49 42 55 54 45 53 20 26 26 0a  E_ATTRIBUTES &&.
18a50 20 20 20 20 20 20 20 20 20 28 72 63 20 3d 20 6f           (rc = o
18a60 73 44 65 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f  sDeleteFileA(zCo
18a70 6e 76 65 72 74 65 64 29 29 3d 3d 30 20 26 26 20  nverted))==0 && 
18a80 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  retryIoerr(&cnt,
18a90 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d   &lastErrno) ){}
18aa0 0a 20 20 20 20 72 63 20 3d 20 72 63 20 3f 20 53  .    rc = rc ? S
18ab0 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54  QLITE_OK : SQLIT
18ac0 45 5f 45 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a  E_ERROR;.#endif.
18ad0 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a    }.  if( rc ){.
18ae0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
18af0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
18b00 52 5f 44 45 4c 45 54 45 2c 20 6c 61 73 74 45 72  R_DELETE, lastEr
18b10 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
18b20 20 20 22 77 69 6e 44 65 6c 65 74 65 22 2c 20 7a    "winDelete", z
18b30 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c  Filename);.  }el
18b40 73 65 7b 0a 20 20 20 20 6c 6f 67 49 6f 65 72 72  se{.    logIoerr
18b50 28 63 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  (cnt);.  }.  sql
18b60 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
18b70 72 74 65 64 29 3b 0a 20 20 4f 53 54 52 41 43 45  rted);.  OSTRACE
18b80 28 28 22 44 45 4c 45 54 45 20 5c 22 25 73 5c 22  (("DELETE \"%s\"
18b90 20 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d   %s\n", zFilenam
18ba0 65 2c 20 28 72 63 20 3f 20 22 66 61 69 6c 65 64  e, (rc ? "failed
18bb0 22 20 3a 20 22 6f 6b 22 20 29 29 29 3b 0a 20 20  " : "ok" )));.  
18bc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18bd0 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 65 78  .** Check the ex
18be0 69 73 74 61 6e 63 65 20 61 6e 64 20 73 74 61 74  istance and stat
18bf0 75 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f  us of a file..*/
18c00 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 41  .static int winA
18c10 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33  ccess(.  sqlite3
18c20 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
18c30 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20      /* Not used 
18c40 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f  on win32 */.  co
18c50 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
18c60 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame,     /* Name
18c70 20 6f 66 20 66 69 6c 65 20 74 6f 20 63 68 65 63   of file to chec
18c80 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  k */.  int flags
18c90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18ca0 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 73    /* Type of tes
18cb0 74 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69  t to make on thi
18cc0 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
18cd0 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20  *pResOut        
18ce0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
18cf0 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57  esult */.){.  DW
18d00 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20  ORD attr;.  int 
18d10 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20  rc = 0;.  DWORD 
18d20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 76 6f 69  lastErrno;.  voi
18d30 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
18d40 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
18d50 52 28 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75  R(pVfs);..  Simu
18d60 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
18d70 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
18d80 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 7a 43  _ACCESS; );.  zC
18d90 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65  onverted = conve
18da0 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  rtUtf8Filename(z
18db0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
18dc0 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
18dd0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
18de0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
18df0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28  .  }.  if( isNT(
18e00 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74  ) ){.    int cnt
18e10 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f   = 0;.    WIN32_
18e20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
18e30 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20  ATA sAttrData;. 
18e40 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72     memset(&sAttr
18e50 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Data, 0, sizeof(
18e60 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20  sAttrData));.   
18e70 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f   while( !(rc = o
18e80 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
18e90 65 73 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a  esExW((LPCWSTR)z
18ea0 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
18eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ec0 20 20 20 20 20 20 20 20 47 65 74 46 69 6c 65 45          GetFileE
18ed0 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 20 0a  xInfoStandard, .
18ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41               &sA
18f00 74 74 72 44 61 74 61 29 29 20 26 26 20 72 65 74  ttrData)) && ret
18f10 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
18f20 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20  astErrno) ){}.  
18f30 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
18f40 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49    /* For an SQLI
18f50 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
18f60 20 71 75 65 72 79 2c 20 74 72 65 61 74 20 61 20   query, treat a 
18f70 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65  zero-length file
18f80 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20  .      ** as if 
18f90 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
18fa0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
18fb0 20 20 69 66 28 20 20 20 20 66 6c 61 67 73 3d 3d    if(    flags==
18fc0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
18fd0 49 53 54 53 0a 20 20 20 20 20 20 20 20 20 20 26  ISTS.          &
18fe0 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c  & sAttrData.nFil
18ff0 65 53 69 7a 65 48 69 67 68 3d 3d 30 20 0a 20 20  eSizeHigh==0 .  
19000 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72          && sAttr
19010 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f  Data.nFileSizeLo
19020 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
19030 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46  attr = INVALID_F
19040 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a  ILE_ATTRIBUTES;.
19050 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19060 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74       attr = sAtt
19070 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72  rData.dwFileAttr
19080 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a  ibutes;.      }.
19090 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
190a0 20 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a   logIoerr(cnt);.
190b0 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72        if( lastEr
190c0 72 6e 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f  rno!=ERROR_FILE_
190d0 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20  NOT_FOUND ){.   
190e0 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72       winLogError
190f0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43  (SQLITE_IOERR_AC
19100 43 45 53 53 2c 20 6c 61 73 74 45 72 72 6e 6f 2c  CESS, lastErrno,
19110 20 22 77 69 6e 41 63 63 65 73 73 22 2c 20 7a 46   "winAccess", zF
19120 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
19130 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
19140 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
19150 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19160 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a  E_IOERR_ACCESS;.
19170 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19180 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41       attr = INVA
19190 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
191a0 54 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  TES;.      }.   
191b0 20 7d 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20   }./* isNT() is 
191c0 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  1 if SQLITE_OS_W
191d0 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73  INCE==1, so this
191e0 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65   else is never e
191f0 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e  xecuted. .** Sin
19200 63 65 20 74 68 65 20 41 4e 53 49 20 76 65 72 73  ce the ANSI vers
19210 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e  ion of these Win
19220 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20  dows API do not 
19230 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c  exist for WINCE,
19240 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61  .** it's importa
19250 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65  nt to not refere
19260 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e  nce them for WIN
19270 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69  CE builds..*/.#i
19280 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
19290 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E==0.  }else{.  
192a0 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69    attr = osGetFi
192b0 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 28 63  leAttributesA((c
192c0 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29  har*)zConverted)
192d0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73  ;.#endif.  }.  s
192e0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
192f0 76 65 72 74 65 64 29 3b 0a 20 20 73 77 69 74 63  verted);.  switc
19300 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  h( flags ){.    
19310 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
19320 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 63 61 73  SS_READ:.    cas
19330 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
19340 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 72 63  EXISTS:.      rc
19350 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44   = attr!=INVALID
19360 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
19370 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
19380 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
19390 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a  CCESS_READWRITE:
193a0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74 74 72  .      rc = attr
193b0 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  !=INVALID_FILE_A
193c0 54 54 52 49 42 55 54 45 53 20 26 26 0a 20 20 20  TTRIBUTES &&.   
193d0 20 20 20 20 20 20 20 20 20 20 28 61 74 74 72 20            (attr 
193e0 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  & FILE_ATTRIBUTE
193f0 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20  _READONLY)==0;. 
19400 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19410 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61  default:.      a
19420 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20  ssert(!"Invalid 
19430 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29  flags argument")
19440 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74  ;.  }.  *pResOut
19450 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20   = rc;.  return 
19460 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
19470 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61  *.** Turn a rela
19480 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e  tive pathname in
19490 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61  to a full pathna
194a0 6d 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 66  me.  Write the f
194b0 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20  ull.** pathname 
194c0 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f  into zOut[].  zO
194d0 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61 74 20  ut[] will be at 
194e0 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d 78 50 61  least pVfs->mxPa
194f0 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20  thname.** bytes 
19500 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  in size..*/.stat
19510 69 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61  ic int winFullPa
19520 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  thname(.  sqlite
19530 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
19540 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
19550 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
19560 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
19570 20 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20 20 20   *zRelative,    
19580 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
19590 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70  relative input p
195a0 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75  ath */.  int nFu
195b0 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
195c0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
195d0 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  f output buffer 
195e0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
195f0 61 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20  ar *zFull       
19600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
19610 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
19620 29 7b 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65  ){.  .#if define
19630 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
19640 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
19650 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
19660 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44  RROR );.  UNUSED
19670 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c  _PARAMETER(nFull
19680 29 3b 0a 20 20 63 79 67 77 69 6e 5f 63 6f 6e 76  );.  cygwin_conv
19690 5f 74 6f 5f 66 75 6c 6c 5f 77 69 6e 33 32 5f 70  _to_full_win32_p
196a0 61 74 68 28 7a 52 65 6c 61 74 69 76 65 2c 20 7a  ath(zRelative, z
196b0 46 75 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  Full);.  return 
196c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
196d0 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  f..#if SQLITE_OS
196e0 5f 57 49 4e 43 45 0a 20 20 53 69 6d 75 6c 61 74  _WINCE.  Simulat
196f0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
19700 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
19710 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
19720 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 2f 2a  TER(nFull);.  /*
19730 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20 63 6f   WinCE has no co
19740 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c 61 74  ncept of a relat
19750 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f 72  ive pathname, or
19760 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20 2a   so I am told. *
19770 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  /.  sqlite3_snpr
19780 69 6e 74 66 28 70 56 66 73 2d 3e 6d 78 50 61 74  intf(pVfs->mxPat
19790 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 2c 20 22 25  hname, zFull, "%
197a0 73 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  s", zRelative);.
197b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
197c0 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  OK;.#endif..#if 
197d0 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
197e0 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43   && !defined(__C
197f0 59 47 57 49 4e 5f 5f 29 0a 20 20 69 6e 74 20 6e  YGWIN__).  int n
19800 42 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43  Byte;.  void *zC
19810 6f 6e 76 65 72 74 65 64 3b 0a 20 20 63 68 61 72  onverted;.  char
19820 20 2a 7a 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66   *zOut;..  /* If
19830 20 74 68 69 73 20 70 61 74 68 20 6e 61 6d 65 20   this path name 
19840 62 65 67 69 6e 73 20 77 69 74 68 20 22 2f 58 3a  begins with "/X:
19850 22 2c 20 77 68 65 72 65 20 22 58 22 20 69 73 20  ", where "X" is 
19860 61 6e 79 20 61 6c 70 68 61 62 65 74 69 63 0a 20  any alphabetic. 
19870 20 2a 2a 20 63 68 61 72 61 63 74 65 72 2c 20 64   ** character, d
19880 69 73 63 61 72 64 20 74 68 65 20 69 6e 69 74 69  iscard the initi
19890 61 6c 20 22 2f 22 20 66 72 6f 6d 20 74 68 65 20  al "/" from the 
198a0 70 61 74 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  pathname..  */. 
198b0 20 69 66 28 20 7a 52 65 6c 61 74 69 76 65 5b 30   if( zRelative[0
198c0 5d 3d 3d 27 2f 27 20 26 26 20 73 71 6c 69 74 65  ]=='/' && sqlite
198d0 33 49 73 61 6c 70 68 61 28 7a 52 65 6c 61 74 69  3Isalpha(zRelati
198e0 76 65 5b 31 5d 29 20 26 26 20 7a 52 65 6c 61 74  ve[1]) && zRelat
198f0 69 76 65 5b 32 5d 3d 3d 27 3a 27 20 29 7b 0a 20  ive[2]==':' ){. 
19900 20 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b 0a     zRelative++;.
19910 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f    }..  /* It's o
19920 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
19930 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
19940 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
19950 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
19960 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
19970 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
19980 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
19990 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
199a0 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
199b0 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e  ailing. This fun
199c0 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c  ction could fail
199d0 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   if, for example
199e0 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  , the.  ** curre
199f0 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63  nt working direc
19a00 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e  tory has been un
19a10 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53  linked..  */.  S
19a20 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
19a30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
19a40 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ROR );.  UNUSED_
19a50 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29  PARAMETER(nFull)
19a60 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d  ;.  zConverted =
19a70 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65   convertUtf8File
19a80 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 3b  name(zRelative);
19a90 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
19aa0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d==0 ){.    retu
19ab0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
19ac0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
19ad0 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4c   isNT() ){.    L
19ae0 50 57 53 54 52 20 7a 54 65 6d 70 3b 0a 20 20 20  PWSTR zTemp;.   
19af0 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75   nByte = osGetFu
19b00 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43  llPathNameW((LPC
19b10 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
19b20 20 30 2c 20 30 2c 20 30 29 20 2b 20 33 3b 0a 20   0, 0, 0) + 3;. 
19b30 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74     zTemp = sqlit
19b40 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65  e3_malloc( nByte
19b50 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d  *sizeof(zTemp[0]
19b60 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65  ) );.    if( zTe
19b70 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  mp==0 ){.      s
19b80 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
19b90 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72  verted);.      r
19ba0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
19bb0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  RR_NOMEM;.    }.
19bc0 20 20 20 20 6f 73 47 65 74 46 75 6c 6c 50 61 74      osGetFullPat
19bd0 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29  hNameW((LPCWSTR)
19be0 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74  zConverted, nByt
19bf0 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20  e, zTemp, 0);.  
19c00 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
19c10 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
19c20 7a 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f  zOut = unicodeTo
19c30 55 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20  Utf8(zTemp);.   
19c40 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
19c50 65 6d 70 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20  emp);./* isNT() 
19c60 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f  is 1 if SQLITE_O
19c70 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74  S_WINCE==1, so t
19c80 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65  his else is neve
19c90 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20  r executed. .** 
19ca0 53 69 6e 63 65 20 74 68 65 20 41 4e 53 49 20 76  Since the ANSI v
19cb0 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20  ersion of these 
19cc0 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e  Windows API do n
19cd0 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e  ot exist for WIN
19ce0 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f  CE,.** it's impo
19cf0 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66  rtant to not ref
19d00 65 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20  erence them for 
19d10 57 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f  WINCE builds..*/
19d20 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
19d30 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b  INCE==0.  }else{
19d40 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70  .    char *zTemp
19d50 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73  ;.    nByte = os
19d60 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
19d70 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
19d80 65 64 2c 20 30 2c 20 30 2c 20 30 29 20 2b 20 33  ed, 0, 0, 0) + 3
19d90 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71  ;.    zTemp = sq
19da0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42  lite3_malloc( nB
19db0 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70  yte*sizeof(zTemp
19dc0 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
19dd0 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20  zTemp==0 ){.    
19de0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
19df0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
19e00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19e10 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
19e20 20 7d 0a 20 20 20 20 6f 73 47 65 74 46 75 6c 6c   }.    osGetFull
19e30 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a  PathNameA((char*
19e40 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79  )zConverted, nBy
19e50 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20  te, zTemp, 0);. 
19e60 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
19e70 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
19e80 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f   zOut = sqlite3_
19e90 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74  win32_mbcs_to_ut
19ea0 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73  f8(zTemp);.    s
19eb0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d  qlite3_free(zTem
19ec0 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  p);.#endif.  }. 
19ed0 20 69 66 28 20 7a 4f 75 74 20 29 7b 0a 20 20 20   if( zOut ){.   
19ee0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
19ef0 66 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  f(pVfs->mxPathna
19f00 6d 65 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c  me, zFull, "%s",
19f10 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69   zOut);.    sqli
19f20 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
19f30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19f40 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
19f50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19f60 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
19f70 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
19f80 2a 20 47 65 74 20 74 68 65 20 73 65 63 74 6f 72  * Get the sector
19f90 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 65 76   size of the dev
19fa0 69 63 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72  ice used to stor
19fb0 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  e.** file..*/.st
19fc0 61 74 69 63 20 69 6e 74 20 67 65 74 53 65 63 74  atic int getSect
19fd0 6f 72 53 69 7a 65 28 0a 20 20 20 20 73 71 6c 69  orSize(.    sqli
19fe0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20  te3_vfs *pVfs,. 
19ff0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1a000 52 65 6c 61 74 69 76 65 20 20 20 20 20 2f 2a 20  Relative     /* 
1a010 55 54 46 2d 38 20 66 69 6c 65 20 6e 61 6d 65 20  UTF-8 file name 
1a020 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20 62 79  */.){.  DWORD by
1a030 74 65 73 50 65 72 53 65 63 74 6f 72 20 3d 20 53  tesPerSector = S
1a040 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45  QLITE_DEFAULT_SE
1a050 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20  CTOR_SIZE;.  /* 
1a060 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
1a070 20 69 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65   is not supporte
1a080 64 20 75 6e 64 65 72 20 57 49 4e 43 45 20 2a 2f  d under WINCE */
1a090 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1a0a0 49 4e 43 45 0a 20 20 55 4e 55 53 45 44 5f 50 41  INCE.  UNUSED_PA
1a0b0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
1a0c0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1a0d0 52 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a 23 65  R(zRelative);.#e
1a0e0 6c 73 65 0a 20 20 63 68 61 72 20 7a 46 75 6c 6c  lse.  char zFull
1a0f0 70 61 74 68 5b 4d 41 58 5f 50 41 54 48 2b 31 5d  path[MAX_PATH+1]
1a100 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 57  ;.  int rc;.  DW
1a110 4f 52 44 20 64 77 52 65 74 20 3d 20 30 3b 0a 20  ORD dwRet = 0;. 
1a120 20 44 57 4f 52 44 20 64 77 44 75 6d 6d 79 3b 0a   DWORD dwDummy;.
1a130 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 6e 65  .  /*.  ** We ne
1a140 65 64 20 74 6f 20 67 65 74 20 74 68 65 20 66 75  ed to get the fu
1a150 6c 6c 20 70 61 74 68 20 6e 61 6d 65 20 6f 66 20  ll path name of 
1a160 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 6f  the file.  ** to
1a170 20 67 65 74 20 74 68 65 20 64 72 69 76 65 20 6c   get the drive l
1a180 65 74 74 65 72 20 74 6f 20 6c 6f 6f 6b 20 75 70  etter to look up
1a190 20 74 68 65 20 73 65 63 74 6f 72 0a 20 20 2a 2a   the sector.  **
1a1a0 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 53 69   size..  */.  Si
1a1b0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1a1c0 69 67 6e 28 31 29 3b 0a 20 20 73 71 6c 69 74 65  ign(1);.  sqlite
1a1d0 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
1a1e0 6f 63 28 29 3b 0a 20 20 72 63 20 3d 20 77 69 6e  oc();.  rc = win
1a1f0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
1a200 73 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 4d 41  s, zRelative, MA
1a210 58 5f 50 41 54 48 2c 20 7a 46 75 6c 6c 70 61 74  X_PATH, zFullpat
1a220 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64  h);.  sqlite3End
1a230 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
1a240 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1a250 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 69 66  rBenign(0);.  if
1a260 28 20 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f  ( rc == SQLITE_O
1a270 4b 20 29 0a 20 20 7b 0a 20 20 20 20 76 6f 69 64  K ).  {.    void
1a280 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20   *zConverted;.  
1a290 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1a2a0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
1a2b0 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63    zConverted = c
1a2c0 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61  onvertUtf8Filena
1a2d0 6d 65 28 7a 46 75 6c 6c 70 61 74 68 29 3b 0a 20  me(zFullpath);. 
1a2e0 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
1a2f0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
1a300 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 20   if( zConverted 
1a310 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 4e  ){.      if( isN
1a320 54 28 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  T() ){.        /
1a330 2a 20 74 72 69 6d 20 70 61 74 68 20 74 6f 20 6a  * trim path to j
1a340 75 73 74 20 64 72 69 76 65 20 72 65 66 65 72 65  ust drive refere
1a350 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c  nce */.        L
1a360 50 57 53 54 52 20 70 20 3d 20 7a 43 6f 6e 76 65  PWSTR p = zConve
1a370 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 66 6f  rted;.        fo
1a380 72 28 3b 2a 70 3b 70 2b 2b 29 7b 0a 20 20 20 20  r(;*p;p++){.    
1a390 20 20 20 20 20 20 69 66 28 20 2a 70 20 3d 3d 20        if( *p == 
1a3a0 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\\' ){.        
1a3b0 20 20 20 20 2a 70 20 3d 20 27 5c 30 27 3b 0a 20      *p = '\0';. 
1a3c0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1a3d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1a3e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a3f0 64 77 52 65 74 20 3d 20 6f 73 47 65 74 44 69 73  dwRet = osGetDis
1a400 6b 46 72 65 65 53 70 61 63 65 57 28 28 4c 50 43  kFreeSpaceW((LPC
1a410 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
1a420 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a440 20 20 20 20 20 26 64 77 44 75 6d 6d 79 2c 0a 20       &dwDummy,. 
1a450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a470 20 20 20 26 62 79 74 65 73 50 65 72 53 65 63 74     &bytesPerSect
1a480 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  or,.            
1a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4a0 20 20 20 20 20 20 20 20 26 64 77 44 75 6d 6d 79          &dwDummy
1a4b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4d0 20 20 20 20 20 20 26 64 77 44 75 6d 6d 79 29 3b        &dwDummy);
1a4e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1a4f0 20 20 20 20 20 20 2f 2a 20 74 72 69 6d 20 70 61        /* trim pa
1a500 74 68 20 74 6f 20 6a 75 73 74 20 64 72 69 76 65  th to just drive
1a510 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 20 20   reference */.  
1a520 20 20 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20        char *p = 
1a530 28 63 68 61 72 20 2a 29 7a 43 6f 6e 76 65 72 74  (char *)zConvert
1a540 65 64 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ed;.        for(
1a550 3b 2a 70 3b 70 2b 2b 29 7b 0a 20 20 20 20 20 20  ;*p;p++){.      
1a560 20 20 20 20 69 66 28 20 2a 70 20 3d 3d 20 27 5c      if( *p == '\
1a570 5c 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  \' ){.          
1a580 20 20 2a 70 20 3d 20 27 5c 30 27 3b 0a 20 20 20    *p = '\0';.   
1a590 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1a5a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1a5b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 77      }.        dw
1a5c0 52 65 74 20 3d 20 6f 73 47 65 74 44 69 73 6b 46  Ret = osGetDiskF
1a5d0 72 65 65 53 70 61 63 65 41 28 28 63 68 61 72 2a  reeSpaceA((char*
1a5e0 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
1a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a610 20 26 64 77 44 75 6d 6d 79 2c 0a 20 20 20 20 20   &dwDummy,.     
1a620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
1a640 62 79 74 65 73 50 65 72 53 65 63 74 6f 72 2c 0a  bytesPerSector,.
1a650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a670 20 20 20 20 26 64 77 44 75 6d 6d 79 2c 0a 20 20      &dwDummy,.  
1a680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6a0 20 20 26 64 77 44 75 6d 6d 79 29 3b 0a 20 20 20    &dwDummy);.   
1a6b0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1a6c0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
1a6d0 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ed);.    }.    i
1a6e0 66 28 20 21 64 77 52 65 74 20 29 7b 0a 20 20 20  f( !dwRet ){.   
1a6f0 20 20 20 62 79 74 65 73 50 65 72 53 65 63 74 6f     bytesPerSecto
1a700 72 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  r = SQLITE_DEFAU
1a710 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
1a720 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1a730 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 20  .  return (int) 
1a740 62 79 74 65 73 50 65 72 53 65 63 74 6f 72 3b 20  bytesPerSector; 
1a750 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1a760 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
1a770 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74  ENSION./*.** Int
1a780 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e  erfaces for open
1a790 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62  ing a shared lib
1a7a0 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e  rary, finding en
1a7b0 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69  try points.** wi
1a7c0 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  thin the shared 
1a7d0 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f  library, and clo
1a7e0 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  sing the shared 
1a7f0 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a  library..*/./*.*
1a800 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72  * Interfaces for
1a810 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65   opening a share
1a820 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69  d library, findi
1a830 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a  ng entry points.
1a840 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68  ** within the sh
1a850 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e  ared library, an
1a860 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68  d closing the sh
1a870 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f  ared library..*/
1a880 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
1a890 6e 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  nDlOpen(sqlite3_
1a8a0 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74  vfs *pVfs, const
1a8b0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1a8c0 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20  ){.  HANDLE h;. 
1a8d0 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
1a8e0 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46  d = convertUtf8F
1a8f0 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  ilename(zFilenam
1a900 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e);.  UNUSED_PAR
1a910 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
1a920 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
1a930 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1a940 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e  0;.  }.  if( isN
1a950 54 28 29 20 29 7b 0a 20 20 20 20 68 20 3d 20 6f  T() ){.    h = o
1a960 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 28 28 4c  sLoadLibraryW((L
1a970 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
1a980 64 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73  d);./* isNT() is
1a990 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f   1 if SQLITE_OS_
1a9a0 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69  WINCE==1, so thi
1a9b0 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20  s else is never 
1a9c0 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69  executed. .** Si
1a9d0 6e 63 65 20 74 68 65 20 41 4e 53 49 20 76 65 72  nce the ANSI ver
1a9e0 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69  sion of these Wi
1a9f0 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74  ndows API do not
1aa00 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45   exist for WINCE
1aa10 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74  ,.** it's import
1aa20 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72  ant to not refer
1aa30 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49  ence them for WI
1aa40 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23  NCE builds..*/.#
1aa50 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1aa60 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20  CE==0.  }else{. 
1aa70 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62     h = osLoadLib
1aa80 72 61 72 79 41 28 28 63 68 61 72 2a 29 7a 43 6f  raryA((char*)zCo
1aa90 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66  nverted);.#endif
1aaa0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
1aab0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
1aac0 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a  .  return (void*
1aad0 29 68 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  )h;.}.static voi
1aae0 64 20 77 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c  d winDlError(sql
1aaf0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
1ab00 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
1ab10 7a 42 75 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53  zBufOut){.  UNUS
1ab20 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
1ab30 73 29 3b 0a 20 20 67 65 74 4c 61 73 74 45 72 72  s);.  getLastErr
1ab40 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45  orMsg(osGetLastE
1ab50 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42  rror(), nBuf, zB
1ab60 75 66 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63  ufOut);.}.static
1ab70 20 76 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d   void (*winDlSym
1ab80 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
1ab90 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c  fs, void *pHandl
1aba0 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1abb0 53 79 6d 62 6f 6c 29 29 28 76 6f 69 64 29 7b 0a  Symbol))(void){.
1abc0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1abd0 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75  ER(pVfs);.  retu
1abe0 72 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64  rn (void(*)(void
1abf0 29 29 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65  ))osGetProcAddre
1ac00 73 73 41 28 28 48 41 4e 44 4c 45 29 70 48 61 6e  ssA((HANDLE)pHan
1ac10 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 7d  dle, zSymbol);.}
1ac20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
1ac30 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  DlClose(sqlite3_
1ac40 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20  vfs *pVfs, void 
1ac50 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55  *pHandle){.  UNU
1ac60 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
1ac70 66 73 29 3b 0a 20 20 6f 73 46 72 65 65 4c 69 62  fs);.  osFreeLib
1ac80 72 61 72 79 28 28 48 41 4e 44 4c 45 29 70 48 61  rary((HANDLE)pHa
1ac90 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f  ndle);.}.#else /
1aca0 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  * if SQLITE_OMIT
1acb0 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20  _LOAD_EXTENSION 
1acc0 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20  is defined: */. 
1acd0 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70   #define winDlOp
1ace0 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  en  0.  #define 
1acf0 77 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23  winDlError 0.  #
1ad00 64 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20  define winDlSym 
1ad10 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69    0.  #define wi
1ad20 6e 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69  nDlClose 0.#endi
1ad30 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  f.../*.** Write 
1ad40 75 70 20 74 6f 20 6e 42 75 66 20 62 79 74 65 73  up to nBuf bytes
1ad50 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69   of randomness i
1ad60 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61  nto zBuf..*/.sta
1ad70 74 69 63 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f  tic int winRando
1ad80 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
1ad90 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
1ada0 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
1adb0 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 55    int n = 0;.  U
1adc0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1add0 70 56 66 73 29 3b 0a 23 69 66 20 64 65 66 69 6e  pVfs);.#if defin
1ade0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
1adf0 20 20 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65    n = nBuf;.  me
1ae00 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42  mset(zBuf, 0, nB
1ae10 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  uf);.#else.  if(
1ae20 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54 49   sizeof(SYSTEMTI
1ae30 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20  ME)<=nBuf-n ){. 
1ae40 20 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78 3b     SYSTEMTIME x;
1ae50 0a 20 20 20 20 6f 73 47 65 74 53 79 73 74 65 6d  .    osGetSystem
1ae60 54 69 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d 65  Time(&x);.    me
1ae70 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26  mcpy(&zBuf[n], &
1ae80 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20  x, sizeof(x));. 
1ae90 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 78     n += sizeof(x
1aea0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a  );.  }.  if( siz
1aeb0 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66  eof(DWORD)<=nBuf
1aec0 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20  -n ){.    DWORD 
1aed0 70 69 64 20 3d 20 6f 73 47 65 74 43 75 72 72 65  pid = osGetCurre
1aee0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 3b 0a 20  ntProcessId();. 
1aef0 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
1af00 6e 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66  n], &pid, sizeof
1af10 28 70 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  (pid));.    n +=
1af20 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20   sizeof(pid);.  
1af30 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44  }.  if( sizeof(D
1af40 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b  WORD)<=nBuf-n ){
1af50 0a 20 20 20 20 44 57 4f 52 44 20 63 6e 74 20 3d  .    DWORD cnt =
1af60 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 28   osGetTickCount(
1af70 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
1af80 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69  Buf[n], &cnt, si
1af90 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20  zeof(cnt));.    
1afa0 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29  n += sizeof(cnt)
1afb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65  ;.  }.  if( size
1afc0 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52  of(LARGE_INTEGER
1afd0 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
1afe0 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69   LARGE_INTEGER i
1aff0 3b 0a 20 20 20 20 6f 73 51 75 65 72 79 50 65 72  ;.    osQueryPer
1b000 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28  formanceCounter(
1b010 26 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  &i);.    memcpy(
1b020 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69  &zBuf[n], &i, si
1b030 7a 65 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e 20  zeof(i));.    n 
1b040 2b 3d 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20  += sizeof(i);.  
1b050 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
1b060 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  n n;.}.../*.** S
1b070 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
1b080 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
1b090 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
1b0a0 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74  ime slept..*/.st
1b0b0 61 74 69 63 20 69 6e 74 20 77 69 6e 53 6c 65 65  atic int winSlee
1b0c0 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  p(sqlite3_vfs *p
1b0d0 56 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65  Vfs, int microse
1b0e0 63 29 7b 0a 20 20 6f 73 53 6c 65 65 70 28 28 6d  c){.  osSleep((m
1b0f0 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30  icrosec+999)/100
1b100 30 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  0);.  UNUSED_PAR
1b110 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
1b120 72 65 74 75 72 6e 20 28 28 6d 69 63 72 6f 73 65  return ((microse
1b130 63 2b 39 39 39 29 2f 31 30 30 30 29 2a 31 30 30  c+999)/1000)*100
1b140 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  0;.}../*.** The 
1b150 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
1b160 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20  le, if set to a 
1b170 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20  non-zero value, 
1b180 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
1b190 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  s.** the number 
1b1a0 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  of seconds since
1b1b0 20 31 39 37 30 20 61 6e 64 20 69 73 20 75 73 65   1970 and is use
1b1c0 64 20 74 6f 20 73 65 74 20 74 68 65 20 72 65 73  d to set the res
1b1d0 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  ult of.** sqlite
1b1e0 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29  3OsCurrentTime()
1b1f0 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e   during testing.
1b200 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1b210 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
1b220 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
1b230 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79  = 0;  /* Fake sy
1b240 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63  stem time in sec
1b250 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e  onds since 1970.
1b260 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   */.#endif../*.*
1b270 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
1b280 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
1b290 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
1b2a0 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
1b2b0 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74  into *piNow.** t
1b2c0 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
1b2d0 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75  and date as a Ju
1b2e0 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
1b2f0 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30  times 86_400_000
1b300 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77  .  In.** other w
1b310 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f  ords, write into
1b320 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62   *piNow the numb
1b330 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
1b340 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c  ds since the Jul
1b350 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20  ian.** epoch of 
1b360 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63  noon in Greenwic
1b370 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34  h on November 24
1b380 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72  , 4714 B.C accor
1b390 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70  ding to the.** p
1b3a0 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69  roleptic Gregori
1b3b0 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a  an calendar..**.
1b3c0 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72  ** On success, r
1b3d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
1b3e0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1b3f0 45 52 52 4f 52 20 69 66 20 74 68 65 20 74 69 6d  ERROR if the tim
1b400 65 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63  e and date .** c
1b410 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
1b420 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1b430 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  nCurrentTimeInt6
1b440 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  4(sqlite3_vfs *p
1b450 56 66 73 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  Vfs, sqlite3_int
1b460 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f 2a  64 *piNow){.  /*
1b470 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74   FILETIME struct
1b480 75 72 65 20 69 73 20 61 20 36 34 2d 62 69 74 20  ure is a 64-bit 
1b490 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74 69  value representi
1b4a0 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
1b4b0 20 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73   .     100-nanos
1b4c0 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 20  econd intervals 
1b4d0 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31 2c  since January 1,
1b4e0 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30 35   1601 (= JD 2305
1b4f0 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20 20  813.5). .  */.  
1b500 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 73  FILETIME ft;.  s
1b510 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
1b520 74 65 33 5f 69 6e 74 36 34 20 77 69 6e 46 69 6c  te3_int64 winFil
1b530 65 74 69 6d 65 45 70 6f 63 68 20 3d 20 32 33 30  etimeEpoch = 230
1b540 35 38 31 33 35 2a 28 73 71 6c 69 74 65 33 5f 69  58135*(sqlite3_i
1b550 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 69  nt64)8640000;.#i
1b560 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1b570 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
1b580 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e  sqlite3_int64 un
1b590 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38  ixEpoch = 244058
1b5a0 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  75*(sqlite3_int6
1b5b0 34 29 38 36 34 30 30 30 30 3b 0a 23 65 6e 64 69  4)8640000;.#endi
1b5c0 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74 6f  f.  /* 2^32 - to
1b5d0 20 61 76 6f 69 64 20 75 73 65 20 6f 66 20 4c 4c   avoid use of LL
1b5e0 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20 69 6e   and warnings in
1b5f0 20 67 63 63 20 2a 2f 0a 20 20 73 74 61 74 69 63   gcc */.  static
1b600 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
1b610 6e 74 36 34 20 6d 61 78 33 32 42 69 74 56 61 6c  nt64 max32BitVal
1b620 75 65 20 3d 20 0a 20 20 20 20 20 20 28 73 71 6c  ue = .      (sql
1b630 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30  ite3_int64)20000
1b640 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33  00000 + (sqlite3
1b650 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 30 30  _int64)200000000
1b660 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  0 + (sqlite3_int
1b670 36 34 29 32 39 34 39 36 37 32 39 36 3b 0a 0a 23  64)294967296;..#
1b680 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1b690 43 45 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20  CE.  SYSTEMTIME 
1b6a0 74 69 6d 65 3b 0a 20 20 6f 73 47 65 74 53 79 73  time;.  osGetSys
1b6b0 74 65 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a  temTime(&time);.
1b6c0 20 20 2f 2a 20 69 66 20 53 79 73 74 65 6d 54 69    /* if SystemTi
1b6d0 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 29 20 66  meToFileTime() f
1b6e0 61 69 6c 73 2c 20 69 74 20 72 65 74 75 72 6e 73  ails, it returns
1b6f0 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28   zero. */.  if (
1b700 21 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46  !osSystemTimeToF
1b710 69 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c 26 66  ileTime(&time,&f
1b720 74 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t)){.    return 
1b730 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1b740 7d 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53  }.#else.  osGetS
1b750 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
1b760 69 6d 65 28 20 26 66 74 20 29 3b 0a 23 65 6e 64  ime( &ft );.#end
1b770 69 66 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77  if..  *piNow = w
1b780 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20  inFiletimeEpoch 
1b790 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28  +.            ((
1b7a0 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  ((sqlite3_int64)
1b7b0 66 74 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d  ft.dwHighDateTim
1b7c0 65 29 2a 6d 61 78 33 32 42 69 74 56 61 6c 75 65  e)*max32BitValue
1b7d0 29 20 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20  ) + .           
1b7e0 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74      (sqlite3_int
1b7f0 36 34 29 66 74 2e 64 77 4c 6f 77 44 61 74 65 54  64)ft.dwLowDateT
1b800 69 6d 65 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e  ime)/(sqlite3_in
1b810 74 36 34 29 31 30 30 30 30 3b 0a 0a 23 69 66 64  t64)10000;..#ifd
1b820 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1b830 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72   if( sqlite3_cur
1b840 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20  rent_time ){.   
1b850 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28   *piNow = 1000*(
1b860 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71  sqlite3_int64)sq
1b870 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
1b880 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a  me + unixEpoch;.
1b890 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55    }.#endif.  UNU
1b8a0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
1b8b0 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  fs);.  return SQ
1b8c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1b8d0 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
1b8e0 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
1b8f0 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
1b900 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
1b910 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74  the.** current t
1b920 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
1b930 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
1b940 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20  ber into *prNow 
1b950 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e  and.** return 0.
1b960 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
1b970 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
1b980 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
1b990 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1b9a0 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71  inCurrentTime(sq
1b9b0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
1b9c0 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b   double *prNow){
1b9d0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
1b9e0 69 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20  ite3_int64 i;.  
1b9f0 72 63 20 3d 20 77 69 6e 43 75 72 72 65 6e 74 54  rc = winCurrentT
1ba00 69 6d 65 49 6e 74 36 34 28 70 56 66 73 2c 20 26  imeInt64(pVfs, &
1ba10 69 29 3b 0a 20 20 69 66 28 20 21 72 63 20 29 7b  i);.  if( !rc ){
1ba20 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f  .    *prNow = i/
1ba30 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a  86400000.0;.  }.
1ba40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ba50 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 69  /*.** The idea i
1ba60 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  s that this func
1ba70 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20  tion works like 
1ba80 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  a combination of
1ba90 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72  .** GetLastError
1baa0 28 29 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73  () and FormatMes
1bab0 73 61 67 65 28 29 20 6f 6e 20 57 69 6e 64 6f 77  sage() on Window
1bac0 73 20 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a  s (or errno and.
1bad0 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20  ** strerror_r() 
1bae0 6f 6e 20 55 6e 69 78 29 2e 20 41 66 74 65 72 20  on Unix). After 
1baf0 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
1bb00 72 6e 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a  rned by an OS.**
1bb10 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74   function, SQLit
1bb20 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e  e calls this fun
1bb30 63 74 69 6f 6e 20 77 69 74 68 20 7a 42 75 66 20  ction with zBuf 
1bb40 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61  pointing to.** a
1bb50 20 62 75 66 66 65 72 20 6f 66 20 6e 42 75 66 20   buffer of nBuf 
1bb60 62 79 74 65 73 2e 20 54 68 65 20 4f 53 20 6c 61  bytes. The OS la
1bb70 79 65 72 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c  yer should popul
1bb80 61 74 65 20 74 68 65 0a 2a 2a 20 62 75 66 66 65  ate the.** buffe
1bb90 72 20 77 69 74 68 20 61 20 6e 75 6c 2d 74 65 72  r with a nul-ter
1bba0 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 65 6e  minated UTF-8 en
1bbb0 63 6f 64 65 64 20 65 72 72 6f 72 20 6d 65 73 73  coded error mess
1bbc0 61 67 65 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e  age.** describin
1bbd0 67 20 74 68 65 20 6c 61 73 74 20 49 4f 20 65 72  g the last IO er
1bbe0 72 6f 72 20 74 6f 20 68 61 76 65 20 6f 63 63 75  ror to have occu
1bbf0 72 72 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  rred within the 
1bc00 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61  calling.** threa
1bc10 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
1bc20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
1bc30 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20 74   too large for t
1bc40 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66  he supplied buff
1bc50 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64  er,.** it should
1bc60 20 62 65 20 74 72 75 6e 63 61 74 65 64 2e 20 54   be truncated. T
1bc70 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
1bc80 6f 66 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  of xGetLastError
1bc90 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74  .** is zero if t
1bca0 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
1bcb0 20 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66   fits in the buf
1bcc0 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  fer, or non-zero
1bcd0 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69  .** otherwise (i
1bce0 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61  f the message wa
1bcf0 73 20 74 72 75 6e 63 61 74 65 64 29 2e 20 49 66  s truncated). If
1bd00 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74   non-zero is ret
1bd10 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69  urned,.** then i
1bd20 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
1bd30 72 79 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68  ry to include th
1bd40 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  e nul-terminator
1bd50 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e   character.** in
1bd60 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
1bd70 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75  er..**.** Not su
1bd80 70 70 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f 72  pplying an error
1bd90 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 68 61   message will ha
1bda0 76 65 20 6e 6f 20 61 64 76 65 72 73 65 20 65 66  ve no adverse ef
1bdb0 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74  fect.** on SQLit
1bdc0 65 2e 20 49 74 20 69 73 20 66 69 6e 65 20 74 6f  e. It is fine to
1bdd0 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65   have an impleme
1bde0 6e 74 61 74 69 6f 6e 20 74 68 61 74 20 6e 65 76  ntation that nev
1bdf0 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e  er.** returns an
1be00 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a   error message:.
1be10 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65 74  **.**   int xGet
1be20 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65  LastError(sqlite
1be30 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
1be40 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
1be50 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65 72  f){.**     asser
1be60 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29  t(zBuf[0]=='\0')
1be70 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20  ;.**     return 
1be80 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  0;.**   }.**.** 
1be90 48 6f 77 65 76 65 72 20 69 66 20 61 6e 20 65 72  However if an er
1bea0 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73  ror message is s
1beb0 75 70 70 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c  upplied, it will
1bec0 20 62 65 20 69 6e 63 6f 72 70 6f 72 61 74 65 64   be incorporated
1bed0 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 20 69 6e  .** by sqlite in
1bee0 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  to the error mes
1bef0 73 61 67 65 20 61 76 61 69 6c 61 62 6c 65 20 74  sage available t
1bf00 6f 20 74 68 65 20 75 73 65 72 20 75 73 69 6e 67  o the user using
1bf10 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  .** sqlite3_errm
1bf20 73 67 28 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d  sg(), possibly m
1bf30 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f 72 73 20  aking IO errors 
1bf40 65 61 73 69 65 72 20 74 6f 20 64 65 62 75 67 2e  easier to debug.
1bf50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1bf60 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73  inGetLastError(s
1bf70 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1bf80 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
1bf90 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45   *zBuf){.  UNUSE
1bfa0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
1bfb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 4c  );.  return getL
1bfc0 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65  astErrorMsg(osGe
1bfd0 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42  tLastError(), nB
1bfe0 75 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a  uf, zBuf);.}../*
1bff0 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
1c000 6e 64 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20  nd deinitialize 
1c010 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
1c020 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a  stem interface..
1c030 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
1c040 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20  s_init(void){.  
1c050 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76  static sqlite3_v
1c060 66 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20  fs winVfs = {.  
1c070 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20    3,            
1c080 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
1c090 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66  on */.    sizeof
1c0a0 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f  (winFile),     /
1c0b0 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20  * szOsFile */.  
1c0c0 20 20 4d 41 58 5f 50 41 54 48 2c 20 20 20 20 20    MAX_PATH,     
1c0d0 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68         /* mxPath
1c0e0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20  name */.    0,  
1c0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c100 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20   /* pNext */.   
1c110 20 22 77 69 6e 33 32 22 2c 20 20 20 20 20 20 20   "win32",       
1c120 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a        /* zName *
1c130 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
1c140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41             /* pA
1c150 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69  ppData */.    wi
1c160 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  nOpen,          
1c170 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20     /* xOpen */. 
1c180 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20     winDelete,   
1c190 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65          /* xDele
1c1a0 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63  te */.    winAcc
1c1b0 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ess,           /
1c1c0 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20  * xAccess */.   
1c1d0 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65   winFullPathname
1c1e0 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61  ,     /* xFullPa
1c1f0 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69  thname */.    wi
1c200 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  nDlOpen,        
1c210 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f     /* xDlOpen */
1c220 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c  .    winDlError,
1c230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
1c240 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e  Error */.    win
1c250 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20  DlSym,          
1c260 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20    /* xDlSym */. 
1c270 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20     winDlClose,  
1c280 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c          /* xDlCl
1c290 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61  ose */.    winRa
1c2a0 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20  ndomness,       
1c2b0 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a  /* xRandomness *
1c2c0 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20  /.    winSleep, 
1c2d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
1c2e0 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43  leep */.    winC
1c2f0 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20  urrentTime,     
1c300 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
1c310 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61   */.    winGetLa
1c320 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20  stError,     /* 
1c330 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f  xGetLastError */
1c340 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54  .    winCurrentT
1c350 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75  imeInt64, /* xCu
1c360 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a  rrentTimeInt64 *
1c370 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73 74  /.    winSetSyst
1c380 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53  emCall,    /* xS
1c390 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  etSystemCall */.
1c3a0 20 20 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d      winGetSystem
1c3b0 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74  Call,    /* xGet
1c3c0 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
1c3d0 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43    winNextSystemC
1c3e0 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53  all,   /* xNextS
1c3f0 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d  ystemCall */.  }
1c400 3b 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63  ;..  /* Double-c
1c410 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 53  heck that the aS
1c420 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68  yscall[] array h
1c430 61 73 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63  as been construc
1c440 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74  ted.  ** correct
1c450 6c 79 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20  ly.  See ticket 
1c460 5b 62 62 33 61 38 36 65 38 39 30 63 38 65 39 36  [bb3a86e890c8e96
1c470 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ab] */.  assert(
1c480 20 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63   ArraySize(aSysc
1c490 61 6c 6c 29 3d 3d 36 30 20 29 3b 0a 0a 23 69 66  all)==60 );..#if
1c4a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c4b0 5f 57 41 4c 0a 20 20 2f 2a 20 67 65 74 20 6d 65  _WAL.  /* get me
1c4c0 6d 6f 72 79 20 6d 61 70 20 61 6c 6c 6f 63 61 74  mory map allocat
1c4d0 69 6f 6e 20 67 72 61 6e 75 6c 61 72 69 74 79 20  ion granularity 
1c4e0 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 77 69 6e  */.  memset(&win
1c4f0 53 79 73 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  SysInfo, 0, size
1c500 6f 66 28 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29  of(SYSTEM_INFO))
1c510 3b 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 49  ;.  osGetSystemI
1c520 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29  nfo(&winSysInfo)
1c530 3b 0a 20 20 61 73 73 65 72 74 28 77 69 6e 53 79  ;.  assert(winSy
1c540 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69  sInfo.dwAllocati
1c550 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 20 3e 20  onGranularity > 
1c560 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71  0);.#endif..  sq
1c570 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
1c580 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29 3b 0a  er(&winVfs, 1);.
1c590 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c5a0 4f 4b 3b 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69  OK; .}..int sqli
1c5b0 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29  te3_os_end(void)
1c5c0 7b 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  { .  return SQLI
1c5d0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66  TE_OK;.}..#endif
1c5e0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   /* SQLITE_OS_WI
1c5f0 4e 20 2a 2f 0a                                   N */.