/ Hex Artifact Content
Login

Artifact ee8ba0846294f154e0822095512a665cdb197c8a:


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 35 0a 2a 2a 20 6f 72 20 57  is Win95.** 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 35 2e 0a 2a 2a  tem is Win95..**
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 61 6e 73 69 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 7a 4f 75 74  F8 */.      zOut
81f0: 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38   = unicodeToUtf8
8200: 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20  (zTempWide);.   
8210: 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73     /* free the s
8220: 79 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c  ystem buffer all
8230: 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74  ocated by Format
8240: 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20  Message */.     
8250: 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65   osLocalFree(zTe
8260: 6d 70 57 69 64 65 29 3b 0a 20 20 20 20 7d 0a 2f  mpWide);.    }./
8270: 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66  * isNT() is 1 if
8280: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
8290: 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73  ==1, so this els
82a0: 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75  e is never execu
82b0: 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74  ted. .** Since t
82c0: 68 65 20 41 53 43 49 49 20 76 65 72 73 69 6f 6e  he ASCII version
82d0: 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77   of these Window
82e0: 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69  s API do not exi
82f0: 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a  st for WINCE,.**
8300: 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20   it's important 
8310: 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65  to not reference
8320: 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20   them for WINCE 
8330: 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53  builds..*/.#if S
8340: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
8350: 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  0.  }else{.    c
8360: 68 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c  har *zTemp = NUL
8370: 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f  L;.    dwLen = o
8380: 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28  sFormatMessageA(
8390: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41  FORMAT_MESSAGE_A
83a0: 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c  LLOCATE_BUFFER |
83b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f                FO
83d0: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f  RMAT_MESSAGE_FRO
83e0: 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20  M_SYSTEM |.     
83f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8400: 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d          FORMAT_M
8410: 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e  ESSAGE_IGNORE_IN
8420: 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20  SERTS,.         
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8440: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
8450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8460: 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
8470: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
8490: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
84a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
84b0: 4c 50 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20  LPSTR) &zTemp,. 
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84d0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
84e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a              0);.
8500: 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20      if( dwLen > 
8510: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c  0 ){.      /* al
8520: 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20  locate a buffer 
8530: 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55  and convert to U
8540: 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 7a 4f 75  TF8 */.      zOu
8550: 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  t = sqlite3_win3
8560: 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a  2_mbcs_to_utf8(z
8570: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Temp);.      /* 
8580: 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d 20  free the system 
8590: 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
85a0: 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67   by FormatMessag
85b0: 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63  e */.      osLoc
85c0: 61 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  alFree(zTemp);. 
85d0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
85e0: 20 20 69 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e    if( 0 == dwLen
85f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
8600: 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
8610: 42 75 66 2c 20 22 4f 73 45 72 72 6f 72 20 30 78  Buf, "OsError 0x
8620: 25 78 20 28 25 75 29 22 2c 20 6c 61 73 74 45 72  %x (%u)", lastEr
8630: 72 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29 3b  rno, lastErrno);
8640: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
8650: 20 63 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d 20   copy a maximum 
8660: 6f 66 20 6e 42 75 66 20 63 68 61 72 73 20 74 6f  of nBuf chars to
8670: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   output buffer *
8680: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  /.    sqlite3_sn
8690: 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75  printf(nBuf, zBu
86a0: 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a  f, "%s", zOut);.
86b0: 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20      /* free the 
86c0: 55 54 46 38 20 62 75 66 66 65 72 20 2a 2f 0a 20  UTF8 buffer */. 
86d0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
86e0: 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  zOut);.  }.  ret
86f0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a  urn 0;.}../*.**.
8700: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
8710: 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74   - winLogErrorAt
8720: 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c 79  Line() - is only
8730: 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61   ever called via
8740: 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77 69   the macro.** wi
8750: 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a  nLogError()..**.
8760: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8770: 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72  is invoked after
8780: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
8790: 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69   in an OS functi
87a0: 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20 61  on..** It logs a
87b0: 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73   message using s
87c0: 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e  qlite3_log() con
87d0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72  taining the curr
87e0: 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  ent value of.** 
87f0: 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c 20  error code and, 
8800: 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65  if possible, the
8810: 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
8820: 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20  equivalent from 
8830: 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67  .** FormatMessag
8840: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
8850: 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  st argument pass
8860: 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20  ed to the macro 
8870: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72  should be the er
8880: 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a  ror code that.**
8890: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
88a0: 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67  d to SQLite (e.g
88b0: 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  . SQLITE_IOERR_D
88c0: 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41  ELETE, SQLITE_CA
88d0: 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65  NTOPEN). .** The
88e0: 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20   two subsequent 
88f0: 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64  arguments should
8900: 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   be the name of 
8910: 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20  the OS function 
8920: 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61  that.** failed a
8930: 6e 64 20 74 68 65 20 74 68 65 20 61 73 73 6f 63  nd the the assoc
8940: 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65  iated file-syste
8950: 6d 20 70 61 74 68 2c 20 69 66 20 61 6e 79 2e 0a  m path, if any..
8960: 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f  */.#define winLo
8970: 67 45 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20  gError(a,b,c,d) 
8980: 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c    winLogErrorAtL
8990: 69 6e 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49  ine(a,b,c,d,__LI
89a0: 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74  NE__).static int
89b0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69   winLogErrorAtLi
89c0: 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64  ne(.  int errcod
89d0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
89e0: 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20        /* SQLite 
89f0: 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
8a00: 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c  DWORD lastErrno,
8a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a20: 2f 2a 20 57 69 6e 33 32 20 6c 61 73 74 20 65 72  /* Win32 last er
8a30: 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ror */.  const c
8a40: 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20  har *zFunc,     
8a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
8a60: 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20   of OS function 
8a70: 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20  that failed */. 
8a80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
8a90: 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
8aa0: 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73   /* File path as
8ab0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 72  sociated with er
8ac0: 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69  ror */.  int iLi
8ad0: 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ne              
8ae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72           /* Sour
8af0: 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77  ce line number w
8b00: 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72  here error occur
8b10: 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  red */.){.  char
8b20: 20 7a 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20 20   zMsg[500];     
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
8b40: 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 65 72  uman readable er
8b50: 72 6f 72 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e  ror text */.  in
8b60: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
8b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8b80: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
8b90: 0a 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b  ..  zMsg[0] = 0;
8ba0: 0a 20 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d  .  getLastErrorM
8bb0: 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73 69  sg(lastErrno, si
8bc0: 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67  zeof(zMsg), zMsg
8bd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 72 72  );.  assert( err
8be0: 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  code!=SQLITE_OK 
8bf0: 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d  );.  if( zPath==
8c00: 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a  0 ) zPath = "";.
8c10: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67 5b    for(i=0; zMsg[
8c20: 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27  i] && zMsg[i]!='
8c30: 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d  \r' && zMsg[i]!=
8c40: 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7a  '\n'; i++){}.  z
8c50: 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71  Msg[i] = 0;.  sq
8c60: 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64  lite3_log(errcod
8c70: 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77 69 6e  e,.      "os_win
8c80: 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25  .c:%d: (%d) %s(%
8c90: 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20  s) - %s",.      
8ca0: 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e 6f  iLine, lastErrno
8cb0: 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20  , zFunc, zPath, 
8cc0: 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65 74  zMsg.  );..  ret
8cd0: 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a  urn errcode;.}..
8ce0: 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72  /*.** The number
8cf0: 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 61   of times that a
8d00: 20 52 65 61 64 46 69 6c 65 28 29 2c 20 57 72 69   ReadFile(), Wri
8d10: 74 65 46 69 6c 65 28 29 2c 20 61 6e 64 20 44 65  teFile(), and De
8d20: 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77 69  leteFile().** wi
8d30: 6c 6c 20 62 65 20 72 65 74 72 69 65 64 20 66 6f  ll be retried fo
8d40: 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69 6e  llowing a lockin
8d50: 67 20 65 72 72 6f 72 20 2d 20 70 72 6f 62 61 62  g error - probab
8d60: 6c 79 20 63 61 75 73 65 64 20 62 79 20 0a 2a 2a  ly caused by .**
8d70: 20 61 6e 74 69 76 69 72 75 73 20 73 6f 66 74 77   antivirus softw
8d80: 61 72 65 2e 20 20 41 6c 73 6f 20 74 68 65 20 69  are.  Also the i
8d90: 6e 69 74 69 61 6c 20 64 65 6c 61 79 20 62 65 66  nitial delay bef
8da0: 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 72 65  ore the first re
8db0: 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c 61  try..** The dela
8dc0: 79 20 69 6e 63 72 65 61 73 65 73 20 6c 69 6e 65  y increases line
8dd0: 61 72 6c 79 20 77 69 74 68 20 65 61 63 68 20 72  arly with each r
8de0: 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  etry..*/.#ifndef
8df0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
8e00: 45 52 52 5f 52 45 54 52 59 0a 23 20 64 65 66 69  ERR_RETRY.# defi
8e10: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
8e20: 49 4f 45 52 52 5f 52 45 54 52 59 20 31 30 0a 23  IOERR_RETRY 10.#
8e30: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
8e40: 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52  LITE_WIN32_IOERR
8e50: 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a 23 20 64  _RETRY_DELAY.# d
8e60: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
8e70: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44  32_IOERR_RETRY_D
8e80: 45 4c 41 59 20 32 35 0a 23 65 6e 64 69 66 0a 73  ELAY 25.#endif.s
8e90: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 49  tatic int win32I
8ea0: 6f 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c 49  oerrRetry = SQLI
8eb0: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
8ec0: 45 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e 74  ETRY;.static int
8ed0: 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79   win32IoerrRetry
8ee0: 44 65 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f 57  Delay = SQLITE_W
8ef0: 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59  IN32_IOERR_RETRY
8f00: 5f 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 49  _DELAY;../*.** I
8f10: 66 20 61 20 52 65 61 64 46 69 6c 65 28 29 20 6f  f a ReadFile() o
8f20: 72 20 57 72 69 74 65 46 69 6c 65 28 29 20 65 72  r WriteFile() er
8f30: 72 6f 72 20 6f 63 63 75 72 73 2c 20 69 6e 76 6f  ror occurs, invo
8f40: 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ke this routine.
8f50: 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ** to see if it 
8f60: 73 68 6f 75 6c 64 20 62 65 20 72 65 74 72 69 65  should be retrie
8f70: 64 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  d.  Return TRUE 
8f80: 74 6f 20 72 65 74 72 79 2e 20 20 52 65 74 75 72  to retry.  Retur
8f90: 6e 20 46 41 4c 53 45 0a 2a 2a 20 74 6f 20 67 69  n FALSE.** to gi
8fa0: 76 65 20 75 70 20 77 69 74 68 20 61 6e 20 65 72  ve up with an er
8fb0: 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ror..*/.static i
8fc0: 6e 74 20 72 65 74 72 79 49 6f 65 72 72 28 69 6e  nt retryIoerr(in
8fd0: 74 20 2a 70 6e 52 65 74 72 79 29 7b 0a 20 20 44  t *pnRetry){.  D
8fe0: 57 4f 52 44 20 65 3b 0a 20 20 69 66 28 20 2a 70  WORD e;.  if( *p
8ff0: 6e 52 65 74 72 79 3e 3d 77 69 6e 33 32 49 6f 65  nRetry>=win32Ioe
9000: 72 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20 72  rrRetry ){.    r
9010: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 65  eturn 0;.  }.  e
9020: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
9030: 72 28 29 3b 0a 20 20 69 66 28 20 65 3d 3d 45 52  r();.  if( e==ER
9040: 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e 49 45  ROR_ACCESS_DENIE
9050: 44 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45 52  D ||.      e==ER
9060: 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49  ROR_LOCK_VIOLATI
9070: 4f 4e 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45  ON ||.      e==E
9080: 52 52 4f 52 5f 53 48 41 52 49 4e 47 5f 56 49 4f  RROR_SHARING_VIO
9090: 4c 41 54 49 4f 4e 20 29 7b 0a 20 20 20 20 6f 73  LATION ){.    os
90a0: 53 6c 65 65 70 28 77 69 6e 33 32 49 6f 65 72 72  Sleep(win32Ioerr
90b0: 52 65 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70  RetryDelay*(1+*p
90c0: 6e 52 65 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b  nRetry));.    ++
90d0: 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20 20 72 65  *pnRetry;.    re
90e0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
90f0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
9100: 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72   Log a I/O error
9110: 20 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a   retry episode..
9120: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
9130: 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e 52 65 74  ogIoerr(int nRet
9140: 72 79 29 7b 0a 20 20 69 66 28 20 6e 52 65 74 72  ry){.  if( nRetr
9150: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
9160: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 49 4f 45 52  _log(SQLITE_IOER
9170: 52 2c 20 0a 20 20 20 20 20 20 22 64 65 6c 61 79  R, .      "delay
9180: 65 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b  ed %dms for lock
9190: 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63  /sharing conflic
91a0: 74 22 2c 0a 20 20 20 20 20 20 77 69 6e 33 32 49  t",.      win32I
91b0: 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 6e  oerrRetryDelay*n
91c0: 52 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31 29  Retry*(nRetry+1)
91d0: 2f 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a  /2.    );.  }.}.
91e0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
91f0: 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  INCE./**********
9200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
9240: 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
9250: 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66 6f  contains code fo
9260: 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f  r WinCE only..*/
9270: 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 43  ./*.** Windows C
9280: 45 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  E does not have 
9290: 61 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 66 75  a localtime() fu
92a0: 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 63 72 65 61  nction.  So crea
92b0: 74 65 20 61 0a 2a 2a 20 73 75 62 73 74 69 74 75  te a.** substitu
92c0: 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  te..*/.#include 
92d0: 3c 74 69 6d 65 2e 68 3e 0a 73 74 72 75 63 74 20  <time.h>.struct 
92e0: 74 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f 63 61  tm *__cdecl loca
92f0: 6c 74 69 6d 65 28 63 6f 6e 73 74 20 74 69 6d 65  ltime(const time
9300: 5f 74 20 2a 74 29 0a 7b 0a 20 20 73 74 61 74 69  _t *t).{.  stati
9310: 63 20 73 74 72 75 63 74 20 74 6d 20 79 3b 0a 20  c struct tm y;. 
9320: 20 46 49 4c 45 54 49 4d 45 20 75 54 6d 2c 20 6c   FILETIME uTm, l
9330: 54 6d 3b 0a 20 20 53 59 53 54 45 4d 54 49 4d 45  Tm;.  SYSTEMTIME
9340: 20 70 54 6d 3b 0a 20 20 73 71 6c 69 74 65 33 5f   pTm;.  sqlite3_
9350: 69 6e 74 36 34 20 74 36 34 3b 0a 20 20 74 36 34  int64 t64;.  t64
9360: 20 3d 20 2a 74 3b 0a 20 20 74 36 34 20 3d 20 28   = *t;.  t64 = (
9370: 74 36 34 20 2b 20 31 31 36 34 34 34 37 33 36 30  t64 + 1164447360
9380: 30 29 2a 31 30 30 30 30 30 30 30 3b 0a 20 20 75  0)*10000000;.  u
9390: 54 6d 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65  Tm.dwLowDateTime
93a0: 20 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20 26   = (DWORD)(t64 &
93b0: 20 30 78 46 46 46 46 46 46 46 46 29 3b 0a 20 20   0xFFFFFFFF);.  
93c0: 75 54 6d 2e 64 77 48 69 67 68 44 61 74 65 54 69  uTm.dwHighDateTi
93d0: 6d 65 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20  me= (DWORD)(t64 
93e0: 3e 3e 20 33 32 29 3b 0a 20 20 6f 73 46 69 6c 65  >> 32);.  osFile
93f0: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
9400: 69 6d 65 28 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a  ime(&uTm,&lTm);.
9410: 20 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53 79    osFileTimeToSy
9420: 73 74 65 6d 54 69 6d 65 28 26 6c 54 6d 2c 26 70  stemTime(&lTm,&p
9430: 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f 79 65 61 72  Tm);.  y.tm_year
9440: 20 3d 20 70 54 6d 2e 77 59 65 61 72 20 2d 20 31   = pTm.wYear - 1
9450: 39 30 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20  900;.  y.tm_mon 
9460: 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31  = pTm.wMonth - 1
9470: 3b 0a 20 20 79 2e 74 6d 5f 77 64 61 79 20 3d 20  ;.  y.tm_wday = 
9480: 70 54 6d 2e 77 44 61 79 4f 66 57 65 65 6b 3b 0a  pTm.wDayOfWeek;.
9490: 20 20 79 2e 74 6d 5f 6d 64 61 79 20 3d 20 70 54    y.tm_mday = pT
94a0: 6d 2e 77 44 61 79 3b 0a 20 20 79 2e 74 6d 5f 68  m.wDay;.  y.tm_h
94b0: 6f 75 72 20 3d 20 70 54 6d 2e 77 48 6f 75 72 3b  our = pTm.wHour;
94c0: 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54  .  y.tm_min = pT
94d0: 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20 20 79 2e 74  m.wMinute;.  y.t
94e0: 6d 5f 73 65 63 20 3d 20 70 54 6d 2e 77 53 65 63  m_sec = pTm.wSec
94f0: 6f 6e 64 3b 0a 20 20 72 65 74 75 72 6e 20 26 79  ond;.  return &y
9500: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e  ;.}..#define HAN
9510: 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61  DLE_TO_WINFILE(a
9520: 29 20 28 77 69 6e 46 69 6c 65 2a 29 26 28 28 63  ) (winFile*)&((c
9530: 68 61 72 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66  har*)a)[-(int)of
9540: 66 73 65 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68  fsetof(winFile,h
9550: 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  )]../*.** Acquir
9560: 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  e a lock on the 
9570: 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74  handle h.*/.stat
9580: 69 63 20 76 6f 69 64 20 77 69 6e 63 65 4d 75 74  ic void winceMut
9590: 65 78 41 63 71 75 69 72 65 28 48 41 4e 44 4c 45  exAcquire(HANDLE
95a0: 20 68 29 7b 0a 20 20 20 44 57 4f 52 44 20 64 77   h){.   DWORD dw
95b0: 45 72 72 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20  Err;.   do {.   
95c0: 20 20 64 77 45 72 72 20 3d 20 57 61 69 74 46 6f    dwErr = WaitFo
95d0: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c  rSingleObject(h,
95e0: 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d   INFINITE);.   }
95f0: 20 77 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d   while (dwErr !=
9600: 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26   WAIT_OBJECT_0 &
9610: 26 20 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f  & dwErr != WAIT_
9620: 41 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a  ABANDONED);.}./*
9630: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f  .** Release a lo
9640: 63 6b 20 61 63 71 75 69 72 65 64 20 62 79 20 77  ck acquired by w
9650: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
9660: 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69  ().*/.#define wi
9670: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
9680: 68 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28  h) ReleaseMutex(
9690: 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  h)../*.** Create
96a0: 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73   the mutex and s
96b0: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65  hared memory use
96c0: 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e  d for locking in
96d0: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73   the file.** des
96e0: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f  criptor pFile.*/
96f0: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
9700: 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e  ceCreateLock(con
9710: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
9720: 6d 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  me, winFile *pFi
9730: 6c 65 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54  le){.  LPWSTR zT
9740: 6f 6b 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61  ok;.  LPWSTR zNa
9750: 6d 65 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74  me;.  BOOL bInit
9760: 20 3d 20 54 52 55 45 3b 0a 0a 20 20 7a 4e 61 6d   = TRUE;..  zNam
9770: 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64  e = utf8ToUnicod
9780: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
9790: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  if( zName==0 ){.
97a0: 20 20 20 20 2f 2a 20 6f 75 74 20 6f 66 20 6d 65      /* out of me
97b0: 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 72 65 74 75  mory */.    retu
97c0: 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20  rn FALSE;.  }.. 
97d0: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
97e0: 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74  he local lockdat
97f0: 61 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70  a */.  memset(&p
9800: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2c 20 30 2c 20  File->local, 0, 
9810: 73 69 7a 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f  sizeof(pFile->lo
9820: 63 61 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70  cal));..  /* Rep
9830: 6c 61 63 65 20 74 68 65 20 62 61 63 6b 73 6c 61  lace the backsla
9840: 73 68 65 73 20 66 72 6f 6d 20 74 68 65 20 66 69  shes from the fi
9850: 6c 65 6e 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72  lename and lower
9860: 63 61 73 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20  case it.  ** to 
9870: 64 65 72 69 76 65 20 61 20 6d 75 74 65 78 20 6e  derive a mutex n
9880: 61 6d 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d  ame. */.  zTok =
9890: 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e   osCharLowerW(zN
98a0: 61 6d 65 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a  ame);.  for (;*z
98b0: 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20  Tok;zTok++){.   
98c0: 20 69 66 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c   if (*zTok == '\
98d0: 5c 27 29 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b  \') *zTok = '_';
98e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74  .  }..  /* Creat
98f0: 65 2f 6f 70 65 6e 20 74 68 65 20 6e 61 6d 65 64  e/open the named
9900: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c   mutex */.  pFil
9910: 65 2d 3e 68 4d 75 74 65 78 20 3d 20 6f 73 43 72  e->hMutex = osCr
9920: 65 61 74 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c  eateMutexW(NULL,
9930: 20 46 41 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a   FALSE, zName);.
9940: 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d    if (!pFile->hM
9950: 75 74 65 78 29 7b 0a 20 20 20 20 70 46 69 6c 65  utex){.    pFile
9960: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
9970: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
9980: 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
9990: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 70 46  SQLITE_ERROR, pF
99a0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20  ile->lastErrno, 
99b0: 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b  "winceCreateLock
99c0: 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  1", zFilename);.
99d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
99e0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  (zName);.    ret
99f0: 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a  urn FALSE;.  }..
9a00: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65    /* Acquire the
9a10: 20 6d 75 74 65 78 20 62 65 66 6f 72 65 20 63 6f   mutex before co
9a20: 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77 69  ntinuing */.  wi
9a30: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
9a40: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
9a50: 20 20 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74 68    .  /* Since th
9a60: 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64  e names of named
9a70: 20 6d 75 74 65 78 65 73 2c 20 73 65 6d 61 70 68   mutexes, semaph
9a80: 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61 70 70 69  ores, file mappi
9a90: 6e 67 73 20 65 74 63 20 61 72 65 20 0a 20 20 2a  ngs etc are .  *
9aa0: 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65  * case-sensitive
9ab0: 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65  , take advantage
9ac0: 20 6f 66 20 74 68 61 74 20 62 79 20 75 70 70 65   of that by uppe
9ad0: 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65  rcasing the mute
9ae0: 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20  x name.  ** and 
9af0: 75 73 69 6e 67 20 74 68 61 74 20 61 73 20 74 68  using that as th
9b00: 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d 61 70  e shared filemap
9b10: 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a  ping name..  */.
9b20: 20 20 6f 73 43 68 61 72 55 70 70 65 72 57 28 7a    osCharUpperW(z
9b30: 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e  Name);.  pFile->
9b40: 68 53 68 61 72 65 64 20 3d 20 6f 73 43 72 65 61  hShared = osCrea
9b50: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 49  teFileMappingW(I
9b60: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
9b70: 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20  LUE, NULL,.     
9b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ba0: 20 20 20 50 41 47 45 5f 52 45 41 44 57 52 49 54     PAGE_READWRIT
9bb0: 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e  E, 0, sizeof(win
9bc0: 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20  ceLock),.       
9bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bf0: 20 7a 4e 61 6d 65 29 3b 20 20 0a 0a 20 20 2f 2a   zName);  ..  /*
9c00: 20 53 65 74 20 61 20 66 6c 61 67 20 74 68 61 74   Set a flag that
9c10: 20 69 6e 64 69 63 61 74 65 73 20 77 65 27 72 65   indicates we're
9c20: 20 74 68 65 20 66 69 72 73 74 20 74 6f 20 63 72   the first to cr
9c30: 65 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  eate the memory 
9c40: 73 6f 20 69 74 20 0a 20 20 2a 2a 20 6d 75 73 74  so it .  ** must
9c50: 20 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c   be zero-initial
9c60: 69 7a 65 64 20 2a 2f 0a 20 20 69 66 20 28 6f 73  ized */.  if (os
9c70: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 3d  GetLastError() =
9c80: 3d 20 45 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f  = ERROR_ALREADY_
9c90: 45 58 49 53 54 53 29 7b 0a 20 20 20 20 62 49 6e  EXISTS){.    bIn
9ca0: 69 74 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a  it = FALSE;.  }.
9cb0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
9cc0: 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66  zName);..  /* If
9cd0: 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e   we succeeded in
9ce0: 20 6d 61 6b 69 6e 67 20 74 68 65 20 73 68 61 72   making the shar
9cf0: 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65  ed memory handle
9d00: 2c 20 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69  , map it. */.  i
9d10: 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  f (pFile->hShare
9d20: 64 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73  d){.    pFile->s
9d30: 68 61 72 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f  hared = (winceLo
9d40: 63 6b 2a 29 6f 73 4d 61 70 56 69 65 77 4f 66 46  ck*)osMapViewOfF
9d50: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72  ile(pFile->hShar
9d60: 65 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ed, .           
9d70: 20 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c    FILE_MAP_READ|
9d80: 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20  FILE_MAP_WRITE, 
9d90: 30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e  0, 0, sizeof(win
9da0: 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a  ceLock));.    /*
9db0: 20 49 66 20 6d 61 70 70 69 6e 67 20 66 61 69 6c   If mapping fail
9dc0: 65 64 2c 20 63 6c 6f 73 65 20 74 68 65 20 73 68  ed, close the sh
9dd0: 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64  ared memory hand
9de0: 6c 65 20 61 6e 64 20 65 72 61 73 65 20 69 74 20  le and erase it 
9df0: 2a 2f 0a 20 20 20 20 69 66 20 28 21 70 46 69 6c  */.    if (!pFil
9e00: 65 2d 3e 73 68 61 72 65 64 29 7b 0a 20 20 20 20  e->shared){.    
9e10: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
9e20: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
9e30: 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e  ror();.      win
9e40: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
9e50: 45 52 52 4f 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  ERROR, pFile->la
9e60: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
9e70: 20 20 20 20 20 20 20 20 22 77 69 6e 63 65 43 72          "winceCr
9e80: 65 61 74 65 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c  eateLock2", zFil
9e90: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6f 73  ename);.      os
9ea0: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
9eb0: 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20 20 20  e->hShared);.   
9ec0: 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65     pFile->hShare
9ed0: 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  d = NULL;.    }.
9ee0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61    }..  /* If sha
9ef0: 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64  red memory could
9f00: 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64 2c   not be created,
9f10: 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20   then close the 
9f20: 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c 20 2a  mutex and fail *
9f30: 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68  /.  if (pFile->h
9f40: 53 68 61 72 65 64 20 3d 3d 20 4e 55 4c 4c 29 7b  Shared == NULL){
9f50: 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52  .    winceMutexR
9f60: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
9f70: 75 74 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f  utex);.    osClo
9f80: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
9f90: 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69  hMutex);.    pFi
9fa0: 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c  le->hMutex = NUL
9fb0: 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41  L;.    return FA
9fc0: 4c 53 45 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  LSE;.  }.  .  /*
9fd0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
9fe0: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66  shared memory if
9ff0: 20 77 65 27 72 65 20 73 75 70 70 6f 73 65 64 20   we're supposed 
a000: 74 6f 20 2a 2f 0a 20 20 69 66 20 28 62 49 6e 69  to */.  if (bIni
a010: 74 29 20 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  t) {.    memset(
a020: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30  pFile->shared, 0
a030: 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f  , sizeof(winceLo
a040: 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e  ck));.  }..  win
a050: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
a060: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
a070: 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 7d 0a   return TRUE;.}.
a080: 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74  ./*.** Destroy t
a090: 68 65 20 70 61 72 74 20 6f 66 20 77 69 6e 46 69  he part of winFi
a0a0: 6c 65 20 74 68 61 74 20 64 65 61 6c 73 20 77 69  le that deals wi
a0b0: 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a  th wince locks.*
a0c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
a0d0: 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77  nceDestroyLock(w
a0e0: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
a0f0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75    if (pFile->hMu
a100: 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71  tex){.    /* Acq
a110: 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20 2a  uire the mutex *
a120: 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78  /.    winceMutex
a130: 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
a140: 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20  Mutex);..    /* 
a150: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
a160: 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f 62  ocks should prob
a170: 61 62 6c 79 20 61 73 73 65 72 74 20 69 6e 20 64  ably assert in d
a180: 65 62 75 67 20 6d 6f 64 65 2c 20 62 75 74 20 74  ebug mode, but t
a190: 68 65 79 0a 20 20 20 20 20 20 20 61 72 65 20 74  hey.       are t
a1a0: 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20 63 61 73  o cleanup in cas
a1b0: 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61  e any locks rema
a1c0: 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20  ined open */.   
a1d0: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
a1e0: 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20  l.nReaders){.   
a1f0: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
a200: 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20  ->nReaders --;. 
a210: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69     }.    if (pFi
a220: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
a230: 76 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ved){.      pFil
a240: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
a250: 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  rved = FALSE;.  
a260: 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c    }.    if (pFil
a270: 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e  e->local.bPendin
a280: 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  g){.      pFile-
a290: 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
a2a0: 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d  g = FALSE;.    }
a2b0: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
a2c0: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
a2d0: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
a2e0: 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
a2f0: 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ve = FALSE;.    
a300: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65 66  }..    /* De-ref
a310: 65 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65  erence and close
a320: 20 6f 75 72 20 63 6f 70 79 20 6f 66 20 74 68 65   our copy of the
a330: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68   shared memory h
a340: 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 6f 73 55  andle */.    osU
a350: 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  nmapViewOfFile(p
a360: 46 69 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20  File->shared);. 
a370: 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
a380: 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29  (pFile->hShared)
a390: 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77  ;..    /* Done w
a3a0: 69 74 68 20 74 68 65 20 6d 75 74 65 78 20 2a 2f  ith the mutex */
a3b0: 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52  .    winceMutexR
a3c0: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
a3d0: 75 74 65 78 29 3b 20 20 20 20 0a 20 20 20 20 6f  utex);    .    o
a3e0: 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
a3f0: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20  le->hMutex);.   
a400: 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d   pFile->hMutex =
a410: 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   NULL;.  }.}../*
a420: 20 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e   .** An implemen
a430: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f  tation of the Lo
a440: 63 6b 46 69 6c 65 28 29 20 41 50 49 20 6f 66 20  ckFile() API of 
a450: 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a  Windows for CE.*
a460: 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  /.static BOOL wi
a470: 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 48  nceLockFile(.  H
a480: 41 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a 20  ANDLE *phFile,. 
a490: 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66   DWORD dwFileOff
a4a0: 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
a4b0: 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
a4c0: 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
a4d0: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
a4e0: 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62  w,.  DWORD nNumb
a4f0: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48  erOfBytesToLockH
a500: 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65  igh.){.  winFile
a510: 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45   *pFile = HANDLE
a520: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69  _TO_WINFILE(phFi
a530: 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74  le);.  BOOL bRet
a540: 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20  urn = FALSE;..  
a550: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
a560: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67  (dwFileOffsetHig
a570: 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  h);.  UNUSED_PAR
a580: 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66  AMETER(nNumberOf
a590: 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29  BytesToLockHigh)
a5a0: 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d  ;..  if (!pFile-
a5b0: 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20  >hMutex) return 
a5c0: 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74  TRUE;.  winceMut
a5d0: 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
a5e0: 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  >hMutex);..  /* 
a5f0: 57 61 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75  Wanting an exclu
a600: 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  sive lock? */.  
a610: 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
a620: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
a630: 41 52 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20  ARED_FIRST.     
a640: 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79    && nNumberOfBy
a650: 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
a660: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49  (DWORD)SHARED_SI
a670: 5a 45 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69  ZE){.    if (pFi
a680: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61  le->shared->nRea
a690: 64 65 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69  ders == 0 && pFi
a6a0: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63  le->shared->bExc
a6b0: 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20  lusive == 0){.  
a6c0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
a6d0: 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
a6e0: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46   TRUE;.       pF
a6f0: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
a700: 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20  usive = TRUE;.  
a710: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
a720: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
a730: 20 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64    /* Want a read
a740: 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  -only lock? */. 
a750: 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
a760: 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
a770: 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54  ORD)SHARED_FIRST
a780: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e   &&.           n
a790: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
a7a0: 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
a7b0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61    if (pFile->sha
a7c0: 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
a7d0: 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69  == 0){.      pFi
a7e0: 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
a7f0: 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20  rs ++;.      if 
a800: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
a810: 65 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20  eaders == 1){.  
a820: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
a830: 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b  red->nReaders ++
a840: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a850: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
a860: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
a870: 57 61 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c  Want a pending l
a880: 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69  ock? */.  else i
a890: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
a8a0: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e  ow == (DWORD)PEN
a8b0: 44 49 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e 75  DING_BYTE && nNu
a8c0: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
a8d0: 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
a8e0: 2f 2a 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67  /* If no pending
a8f0: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61   lock has been a
a900: 63 71 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63  cquired, then ac
a910: 71 75 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20  quire it */.    
a920: 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
a930: 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30  d->bPending == 0
a940: 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
a950: 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
a960: 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  g = TRUE;.      
a970: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
a980: 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20  nding = TRUE;.  
a990: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
a9a0: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
a9b0: 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72   /* Want a reser
a9c0: 76 65 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65  ved lock? */.  e
a9d0: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
a9e0: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
a9f0: 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 20  D)RESERVED_BYTE 
aa00: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
aa10: 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  sToLockLow == 1)
aa20: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
aa30: 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
aa40: 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20  ed == 0) {.     
aa50: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
aa60: 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45  bReserved = TRUE
aa70: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
aa80: 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d  ocal.bReserved =
aa90: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65   TRUE;.      bRe
aaa0: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
aab0: 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d   }.  }..  winceM
aac0: 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
aad0: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65  e->hMutex);.  re
aae0: 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a  turn bReturn;.}.
aaf0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  ./*.** An implem
ab00: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
ab10: 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f  UnlockFile API o
ab20: 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45  f Windows for CE
ab30: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
ab40: 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28  winceUnlockFile(
ab50: 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69 6c  .  HANDLE *phFil
ab60: 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  e,.  DWORD dwFil
ab70: 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57  eOffsetLow,.  DW
ab80: 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
ab90: 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  High,.  DWORD nN
aba0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
abb0: 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  lockLow,.  DWORD
abc0: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
abd0: 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20  oUnlockHigh.){. 
abe0: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
abf0: 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46  = HANDLE_TO_WINF
ac00: 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42  ILE(phFile);.  B
ac10: 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41  OOL bReturn = FA
ac20: 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  LSE;..  UNUSED_P
ac30: 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65 4f  ARAMETER(dwFileO
ac40: 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55 4e  ffsetHigh);.  UN
ac50: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
ac60: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
ac70: 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69  nlockHigh);..  i
ac80: 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65  f (!pFile->hMute
ac90: 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a  x) return TRUE;.
aca0: 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
acb0: 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
acc0: 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73  x);..  /* Releas
acd0: 69 6e 67 20 61 20 72 65 61 64 65 72 20 6c 6f 63  ing a reader loc
ace0: 6b 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76  k or an exclusiv
acf0: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20 28  e lock */.  if (
ad00: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
ad10: 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
ad20: 5f 46 49 52 53 54 29 7b 0a 20 20 20 20 2f 2a 20  _FIRST){.    /* 
ad30: 44 69 64 20 77 65 20 68 61 76 65 20 61 6e 20 65  Did we have an e
ad40: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a  xclusive lock? *
ad50: 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  /.    if (pFile-
ad60: 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
ad70: 65 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e){.      assert
ad80: 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54  (nNumberOfBytesT
ad90: 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44  oUnlockLow == (D
ada0: 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45  WORD)SHARED_SIZE
adb0: 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
adc0: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
add0: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
ade0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
adf0: 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53  Exclusive = FALS
ae00: 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
ae10: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 0a   = TRUE;.    }..
ae20: 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 6a 75      /* Did we ju
ae30: 73 74 20 68 61 76 65 20 61 20 72 65 61 64 65 72  st have a reader
ae40: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c   lock? */.    el
ae50: 73 65 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f  se if (pFile->lo
ae60: 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20  cal.nReaders){. 
ae70: 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d       assert(nNum
ae80: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
ae90: 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  ckLow == (DWORD)
aea0: 53 48 41 52 45 44 5f 53 49 5a 45 20 7c 7c 20 6e  SHARED_SIZE || n
aeb0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
aec0: 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b 0a  nlockLow == 1);.
aed0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
aee0: 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a  al.nReaders --;.
aef0: 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d        if (pFile-
af00: 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
af10: 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 20 20  == 0).      {.  
af20: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
af30: 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d  red->nReaders --
af40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
af50: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
af60: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
af70: 52 65 6c 65 61 73 69 6e 67 20 61 20 70 65 6e 64  Releasing a pend
af80: 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c  ing lock */.  el
af90: 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
afa0: 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
afb0: 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 26 26  )PENDING_BYTE &&
afc0: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
afd0: 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  oUnlockLow == 1)
afe0: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
aff0: 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29  >local.bPending)
b000: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
b010: 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20  ocal.bPending = 
b020: 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69  FALSE;.      pFi
b030: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e  le->shared->bPen
b040: 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20  ding = FALSE;.  
b050: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
b060: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  UE;.    }.  }.  
b070: 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72  /* Releasing a r
b080: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a  eserved lock */.
b090: 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c    else if (dwFil
b0a0: 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44  eOffsetLow == (D
b0b0: 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f 42 59  WORD)RESERVED_BY
b0c0: 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42  TE && nNumberOfB
b0d0: 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
b0e0: 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
b0f0: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73  File->local.bRes
b100: 65 72 76 65 64 29 20 7b 0a 20 20 20 20 20 20 70  erved) {.      p
b110: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73  File->local.bRes
b120: 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  erved = FALSE;. 
b130: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
b140: 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20  ed->bReserved = 
b150: 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65  FALSE;.      bRe
b160: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
b170: 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d   }.  }..  winceM
b180: 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
b190: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65  e->hMutex);.  re
b1a0: 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a  turn bReturn;.}.
b1b0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  ./*.** An implem
b1c0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
b1d0: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49  LockFileEx() API
b1e0: 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20   of Windows for 
b1f0: 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  CE.*/.static BOO
b200: 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45  L winceLockFileE
b210: 78 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46  x(.  HANDLE *phF
b220: 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  ile,.  DWORD dwF
b230: 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 64 77  lags,.  DWORD dw
b240: 52 65 73 65 72 76 65 64 2c 0a 20 20 44 57 4f 52  Reserved,.  DWOR
b250: 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
b260: 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f  ToLockLow,.  DWO
b270: 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
b280: 73 54 6f 4c 6f 63 6b 48 69 67 68 2c 0a 20 20 4c  sToLockHigh,.  L
b290: 50 4f 56 45 52 4c 41 50 50 45 44 20 6c 70 4f 76  POVERLAPPED lpOv
b2a0: 65 72 6c 61 70 70 65 64 0a 29 7b 0a 20 20 55 4e  erlapped.){.  UN
b2b0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
b2c0: 77 52 65 73 65 72 76 65 64 29 3b 0a 20 20 55 4e  wReserved);.  UN
b2d0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
b2e0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
b2f0: 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 2f 2a 20  ockHigh);..  /* 
b300: 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 77 61  If the caller wa
b310: 6e 74 73 20 61 20 73 68 61 72 65 64 20 72 65 61  nts a shared rea
b320: 64 20 6c 6f 63 6b 2c 20 66 6f 72 77 61 72 64 20  d lock, forward 
b330: 74 68 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20 74  this call.  ** t
b340: 6f 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 20  o winceLockFile 
b350: 2a 2f 0a 20 20 69 66 20 28 6c 70 4f 76 65 72 6c  */.  if (lpOverl
b360: 61 70 70 65 64 2d 3e 4f 66 66 73 65 74 20 3d 3d  apped->Offset ==
b370: 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46   (DWORD)SHARED_F
b380: 49 52 53 54 20 26 26 0a 20 20 20 20 20 20 64 77  IRST &&.      dw
b390: 46 6c 61 67 73 20 3d 3d 20 31 20 26 26 0a 20 20  Flags == 1 &&.  
b3a0: 20 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74      nNumberOfByt
b3b0: 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  esToLockLow == (
b3c0: 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
b3d0: 45 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  E){.    return w
b3e0: 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70 68 46  inceLockFile(phF
b3f0: 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ile, SHARED_FIRS
b400: 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  T, 0, 1, 0);.  }
b410: 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b  .  return FALSE;
b420: 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20  .}./*.** End of 
b430: 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f 64 65  the special code
b440: 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a   for wince.*****
b450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b490: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66  ********/.#endif
b4a0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   /* SQLITE_OS_WI
b4b0: 4e 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  NCE */../*******
b4c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b4d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b4e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b4f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b500: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ******.** The ne
b510: 78 74 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  xt group of rout
b520: 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74  ines implement t
b530: 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 73  he I/O methods s
b540: 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 74  pecified.** by t
b550: 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
b560: 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a  thods object..**
b570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b590: 2a 2a 2a 2a 2a 2a 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 2f 0a 0a 2f  ************/../
b5c0: 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f 73  *.** Some Micros
b5d0: 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61  oft compilers la
b5e0: 63 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74 69  ck this definiti
b5f0: 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49  on..*/.#ifndef I
b600: 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
b610: 50 4f 49 4e 54 45 52 0a 23 20 64 65 66 69 6e 65  POINTER.# define
b620: 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c   INVALID_SET_FIL
b630: 45 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 4f 52  E_POINTER ((DWOR
b640: 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  D)-1).#endif../*
b650: 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
b660: 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66  rent position of
b670: 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65   the file handle
b680: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
b690: 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  irst .** argumen
b6a0: 74 20 74 6f 20 6f 66 66 73 65 74 20 69 4f 66 66  t to offset iOff
b6b0: 73 65 74 20 77 69 74 68 69 6e 20 74 68 65 20 66  set within the f
b6c0: 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66  ile. If successf
b6d0: 75 6c 2c 20 72 65 74 75 72 6e 20 30 2e 20 0a 2a  ul, return 0. .*
b6e0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74  * Otherwise, set
b6f0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
b700: 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e  o and return non
b710: 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  -zero..*/.static
b720: 20 69 6e 74 20 73 65 65 6b 57 69 6e 46 69 6c 65   int seekWinFile
b730: 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c  (winFile *pFile,
b740: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
b750: 4f 66 66 73 65 74 29 7b 0a 20 20 4c 4f 4e 47 20  Offset){.  LONG 
b760: 75 70 70 65 72 42 69 74 73 3b 20 20 20 20 20 20  upperBits;      
b770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f             /* Mo
b780: 73 74 20 73 69 67 2e 20 33 32 20 62 69 74 73 20  st sig. 32 bits 
b790: 6f 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f  of new offset */
b7a0: 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74  .  LONG lowerBit
b7b0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
b7c0: 20 20 20 2f 2a 20 4c 65 61 73 74 20 73 69 67 2e     /* Least sig.
b7d0: 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20   32 bits of new 
b7e0: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 44 57 4f 52  offset */.  DWOR
b7f0: 44 20 64 77 52 65 74 3b 20 20 20 20 20 20 20 20  D dwRet;        
b800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
b810: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
b820: 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28   SetFilePointer(
b830: 29 20 2a 2f 0a 0a 20 20 75 70 70 65 72 42 69 74  ) */..  upperBit
b840: 73 20 3d 20 28 4c 4f 4e 47 29 28 28 69 4f 66 66  s = (LONG)((iOff
b850: 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66  set>>32) & 0x7ff
b860: 66 66 66 66 66 29 3b 0a 20 20 6c 6f 77 65 72 42  fffff);.  lowerB
b870: 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 69 4f 66  its = (LONG)(iOf
b880: 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66  fset & 0xfffffff
b890: 66 29 3b 0a 0a 20 20 2f 2a 20 41 50 49 20 6f 64  f);..  /* API od
b8a0: 64 69 74 79 3a 20 49 66 20 73 75 63 63 65 73 73  dity: If success
b8b0: 66 75 6c 2c 20 53 65 74 46 69 6c 65 50 6f 69 6e  ful, SetFilePoin
b8c0: 74 65 72 28 29 20 72 65 74 75 72 6e 73 20 61 20  ter() returns a 
b8d0: 64 77 6f 72 64 20 0a 20 20 2a 2a 20 63 6f 6e 74  dword .  ** cont
b8e0: 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 77 65 72  aining the lower
b8f0: 20 33 32 2d 62 69 74 73 20 6f 66 20 74 68 65 20   32-bits of the 
b900: 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73 65 74 2e  new file-offset.
b910: 20 4f 72 2c 20 69 66 20 69 74 20 66 61 69 6c 73   Or, if it fails
b920: 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74 75 72 6e  ,.  ** it return
b930: 73 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  s INVALID_SET_FI
b940: 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48 6f 77 65  LE_POINTER. Howe
b950: 76 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ver according to
b960: 20 4d 53 44 4e 2c 20 0a 20 20 2a 2a 20 49 4e 56   MSDN, .  ** INV
b970: 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f  ALID_SET_FILE_PO
b980: 49 4e 54 45 52 20 6d 61 79 20 61 6c 73 6f 20 62  INTER may also b
b990: 65 20 61 20 76 61 6c 69 64 20 6e 65 77 20 6f 66  e a valid new of
b9a0: 66 73 65 74 2e 20 53 6f 20 74 6f 20 64 65 74 65  fset. So to dete
b9b0: 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74  rmine .  ** whet
b9c0: 68 65 72 20 61 6e 20 65 72 72 6f 72 20 68 61 73  her an error has
b9d0: 20 61 63 74 75 61 6c 6c 79 20 6f 63 63 75 72 65   actually occure
b9e0: 64 2c 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 65  d, it is also ne
b9f0: 63 65 73 73 61 72 79 20 74 6f 20 63 61 6c 6c 20  cessary to call 
ba00: 0a 20 20 2a 2a 20 47 65 74 4c 61 73 74 45 72 72  .  ** GetLastErr
ba10: 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77 52  or()..  */.  dwR
ba20: 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f  et = osSetFilePo
ba30: 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20  inter(pFile->h, 
ba40: 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70 70 65  lowerBits, &uppe
ba50: 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49  rBits, FILE_BEGI
ba60: 4e 29 3b 0a 20 20 69 66 28 20 28 64 77 52 65 74  N);.  if( (dwRet
ba70: 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  ==INVALID_SET_FI
ba80: 4c 45 5f 50 4f 49 4e 54 45 52 20 26 26 20 6f 73  LE_POINTER && os
ba90: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21 3d  GetLastError()!=
baa0: 4e 4f 5f 45 52 52 4f 52 29 20 29 7b 0a 20 20 20  NO_ERROR) ){.   
bab0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
bac0: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
bad0: 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  or();.    winLog
bae0: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
baf0: 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e  RR_SEEK, pFile->
bb00: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
bb10: 20 20 20 20 20 20 20 20 22 73 65 65 6b 57 69 6e          "seekWin
bb20: 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  File", pFile->zP
bb30: 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ath);.    return
bb40: 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   1;.  }..  retur
bb50: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  n 0;.}../*.** Cl
bb60: 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  ose a file..**.*
bb70: 2a 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64  * It is reported
bb80: 20 74 68 61 74 20 61 6e 20 61 74 74 65 6d 70 74   that an attempt
bb90: 20 74 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e 64   to close a hand
bba0: 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65 74 69 6d  le might sometim
bbb0: 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68 69  es.** fail.  Thi
bbc0: 73 20 69 73 20 61 20 76 65 72 79 20 75 6e 72 65  s is a very unre
bbd0: 61 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74 2c  asonable result,
bbe0: 20 62 75 74 20 57 69 6e 64 6f 77 73 20 69 73 20   but Windows is 
bbf0: 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f 72  notorious.** for
bc00: 20 62 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e 61   being unreasona
bc10: 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74 20  ble so I do not 
bc20: 64 6f 75 62 74 20 74 68 61 74 20 69 74 20 6d 69  doubt that it mi
bc30: 67 68 74 20 68 61 70 70 65 6e 2e 20 20 49 66 0a  ght happen.  If.
bc40: 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20 66 61 69  ** the close fai
bc50: 6c 73 2c 20 77 65 20 70 61 75 73 65 20 66 6f 72  ls, we pause for
bc60: 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64   100 millisecond
bc70: 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e  s and try again.
bc80: 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73 20    As.** many as 
bc90: 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54  MX_CLOSE_ATTEMPT
bca0: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c 6f   attempts to clo
bcb0: 73 65 20 74 68 65 20 68 61 6e 64 6c 65 20 61 72  se the handle ar
bcc0: 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a 2a  e made before.**
bcd0: 20 67 69 76 69 6e 67 20 75 70 20 61 6e 64 20 72   giving up and r
bce0: 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
bcf0: 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58  r..*/.#define MX
bd00: 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 33  _CLOSE_ATTEMPT 3
bd10: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43  .static int winC
bd20: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
bd30: 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63  e *id){.  int rc
bd40: 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69 6e  , cnt = 0;.  win
bd50: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
bd60: 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61  inFile*)id;..  a
bd70: 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
bd80: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
bd90: 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 20 20 4f 53  >pShm==0 );.  OS
bda0: 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64  TRACE(("CLOSE %d
bdb0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
bdc0: 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d 20  .  do{.    rc = 
bdd0: 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
bde0: 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a 20  ile->h);.    /* 
bdf0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
be00: 20 72 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c   rc=0; cnt=MX_CL
be10: 4f 53 45 5f 41 54 54 45 4d 50 54 3b 20 29 3b 20  OSE_ATTEMPT; ); 
be20: 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  */.  }while( rc=
be30: 3d 30 20 26 26 20 2b 2b 63 6e 74 20 3c 20 4d 58  =0 && ++cnt < MX
be40: 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 26  _CLOSE_ATTEMPT &
be50: 26 20 28 6f 73 53 6c 65 65 70 28 31 30 30 29 2c  & (osSleep(100),
be60: 20 31 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 54   1) );.#if SQLIT
be70: 45 5f 4f 53 5f 57 49 4e 43 45 0a 23 64 65 66 69  E_OS_WINCE.#defi
be80: 6e 65 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f  ne WINCE_DELETIO
be90: 4e 5f 41 54 54 45 4d 50 54 53 20 33 0a 20 20 77  N_ATTEMPTS 3.  w
bea0: 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28  inceDestroyLock(
beb0: 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 46  pFile);.  if( pF
bec0: 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
bed0: 6f 73 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  ose ){.    int c
bee0: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  nt = 0;.    whil
bef0: 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  e(.           os
bf00: 44 65 6c 65 74 65 46 69 6c 65 57 28 70 46 69 6c  DeleteFileW(pFil
bf10: 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
bf20: 65 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26  e)==0.        &&
bf30: 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
bf40: 75 74 65 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65  utesW(pFile->zDe
bf50: 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78  leteOnClose)!=0x
bf60: 66 66 66 66 66 66 66 66 20 0a 20 20 20 20 20 20  ffffffff .      
bf70: 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20 57 49 4e    && cnt++ < WIN
bf80: 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45  CE_DELETION_ATTE
bf90: 4d 50 54 53 0a 20 20 20 20 29 7b 0a 20 20 20 20  MPTS.    ){.    
bfa0: 20 20 20 6f 73 53 6c 65 65 70 28 31 30 30 29 3b     osSleep(100);
bfb0: 20 20 2f 2a 20 57 61 69 74 20 61 20 6c 69 74 74    /* Wait a litt
bfc0: 6c 65 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67  le before trying
bfd0: 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a   again */.    }.
bfe0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
bff0: 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f  (pFile->zDeleteO
c000: 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 23 65 6e  nClose);.  }.#en
c010: 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22  dif.  OSTRACE(("
c020: 43 4c 4f 53 45 20 25 64 20 25 73 5c 6e 22 2c 20  CLOSE %d %s\n", 
c030: 70 46 69 6c 65 2d 3e 68 2c 20 72 63 20 3f 20 22  pFile->h, rc ? "
c040: 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
c050: 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  ;.  OpenCounter(
c060: 2d 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  -1);.  return rc
c070: 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20   ? SQLITE_OK.   
c080: 20 20 20 20 20 20 20 20 20 3a 20 77 69 6e 4c 6f           : winLo
c090: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
c0a0: 45 52 52 5f 43 4c 4f 53 45 2c 20 6f 73 47 65 74  ERR_CLOSE, osGet
c0b0: 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
c0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0d0: 20 20 20 20 20 20 20 22 77 69 6e 43 6c 6f 73 65         "winClose
c0e0: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
c0f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
c100: 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65  data from a file
c110: 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20   into a buffer. 
c120: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
c130: 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65  K if all.** byte
c140: 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63  s were read succ
c150: 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c  essfully and SQL
c160: 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79  ITE_IOERR if any
c170: 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
c180: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
c190: 6e 74 20 77 69 6e 52 65 61 64 28 0a 20 20 73 71  nt winRead(.  sq
c1a0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
c1b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
c1c0: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
c1d0: 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c1f0: 20 57 72 69 74 65 20 63 6f 6e 74 65 6e 74 20 69   Write content i
c200: 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
c210: 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20  */.  int amt,   
c220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c230: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
c240: 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20  es to read */.  
c250: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
c260: 66 73 65 74 20 20 20 20 20 20 20 2f 2a 20 42 65  fset       /* Be
c270: 67 69 6e 20 72 65 61 64 69 6e 67 20 61 74 20 74  gin reading at t
c280: 68 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b  his offset */.){
c290: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
c2a0: 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
c2b0: 3b 20 20 2f 2a 20 66 69 6c 65 20 68 61 6e 64 6c  ;  /* file handl
c2c0: 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6e 52 65  e */.  DWORD nRe
c2d0: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ad;             
c2e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c2f0: 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
c300: 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 66 69 6c  ly read from fil
c310: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72  e */.  int nRetr
c320: 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  y = 0;          
c330: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c340: 20 6f 66 20 72 65 74 72 79 73 20 2a 2f 0a 0a 20   of retrys */.. 
c350: 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
c360: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
c370: 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
c380: 45 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b 0a 20  E_IOERR_READ);. 
c390: 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20   OSTRACE(("READ 
c3a0: 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70  %d lock=%d\n", p
c3b0: 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
c3c0: 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 69  locktype));..  i
c3d0: 66 28 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70  f( seekWinFile(p
c3e0: 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 20 29 7b  File, offset) ){
c3f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c400: 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77  TE_FULL;.  }.  w
c410: 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46 69 6c  hile( !osReadFil
c420: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66  e(pFile->h, pBuf
c430: 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20 30  , amt, &nRead, 0
c440: 29 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65 74  ) ){.    if( ret
c450: 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 29  ryIoerr(&nRetry)
c460: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
c470: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
c480: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
c490: 6f 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  or();.    return
c4a0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
c4b0: 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c 20  ITE_IOERR_READ, 
c4c0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
c4d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
c4e0: 77 69 6e 52 65 61 64 22 2c 20 70 46 69 6c 65 2d  winRead", pFile-
c4f0: 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 6c  >zPath);.  }.  l
c500: 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79 29 3b  ogIoerr(nRetry);
c510: 0a 20 20 69 66 28 20 6e 52 65 61 64 3c 28 44 57  .  if( nRead<(DW
c520: 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20 20 20 2f  ORD)amt ){.    /
c530: 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f  * Unread parts o
c540: 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75 73  f the buffer mus
c550: 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64  t be zero-filled
c560: 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
c570: 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 6e 52  ((char*)pBuf)[nR
c580: 65 61 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52 65  ead], 0, amt-nRe
c590: 61 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ad);.    return 
c5a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
c5b0: 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20  RT_READ;.  }..  
c5c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c5d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
c5e0: 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
c5f0: 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e  fer into a file.
c600: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
c610: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a  OK on success.**
c620: 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
c630: 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69  rror code on fai
c640: 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
c650: 69 6e 74 20 77 69 6e 57 72 69 74 65 28 0a 20 20  int winWrite(.  
c660: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
c670: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c680: 2f 2a 20 46 69 6c 65 20 74 6f 20 77 72 69 74 65  /* File to write
c690: 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74   into */.  const
c6a0: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
c6b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
c6c0: 65 20 62 79 74 65 73 20 74 6f 20 62 65 20 77 72  e bytes to be wr
c6d0: 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  itten */.  int a
c6e0: 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
c6f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c700: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
c710: 20 77 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69   write */.  sqli
c720: 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
c730: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
c740: 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66  ffset into the f
c750: 69 6c 65 20 74 6f 20 62 65 67 69 6e 20 77 72 69  ile to begin wri
c760: 74 69 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20  ting at */.){.  
c770: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
c780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c790: 2f 2a 20 54 72 75 65 20 69 66 20 65 72 72 6f 72  /* True if error
c7a0: 20 68 61 73 20 6f 63 63 75 72 65 64 2c 20 65 6c   has occured, el
c7b0: 73 65 20 66 61 6c 73 65 20 2a 2f 0a 20 20 77 69  se false */.  wi
c7c0: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
c7d0: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a  winFile*)id;  /*
c7e0: 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a   File handle */.
c7f0: 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30    int nRetry = 0
c800: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c810: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
c820: 65 74 72 69 65 73 20 2a 2f 0a 0a 20 20 61 73 73  etries */..  ass
c830: 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20  ert( amt>0 );.  
c840: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
c850: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
c860: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
c870: 5f 49 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a 20  _IOERR_WRITE);. 
c880: 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
c890: 6c 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  lError(return SQ
c8a0: 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f  LITE_FULL);..  O
c8b0: 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20 25  STRACE(("WRITE %
c8c0: 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46  d lock=%d\n", pF
c8d0: 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
c8e0: 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 72 63  ocktype));..  rc
c8f0: 20 3d 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70   = seekWinFile(p
c900: 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20  File, offset);. 
c910: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
c920: 20 20 75 38 20 2a 61 52 65 6d 20 3d 20 28 75 38    u8 *aRem = (u8
c930: 20 2a 29 70 42 75 66 3b 20 20 20 20 20 20 20 20   *)pBuf;        
c940: 2f 2a 20 44 61 74 61 20 79 65 74 20 74 6f 20 62  /* Data yet to b
c950: 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20  e written */.   
c960: 20 69 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b   int nRem = amt;
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c980: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
c990: 73 20 79 65 74 20 74 6f 20 62 65 20 77 72 69 74  s yet to be writ
c9a0: 74 65 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44  ten */.    DWORD
c9b0: 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
c9c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
c9d0: 73 20 77 72 69 74 74 65 6e 20 62 79 20 65 61 63  s written by eac
c9e0: 68 20 57 72 69 74 65 46 69 6c 65 28 29 20 63 61  h WriteFile() ca
c9f0: 6c 6c 20 2a 2f 0a 0a 20 20 20 20 77 68 69 6c 65  ll */..    while
ca00: 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20  ( nRem>0 ){.    
ca10: 20 20 69 66 28 20 21 6f 73 57 72 69 74 65 46 69    if( !osWriteFi
ca20: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65  le(pFile->h, aRe
ca30: 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65  m, nRem, &nWrite
ca40: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
ca50: 69 66 28 20 72 65 74 72 79 49 6f 65 72 72 28 26  if( retryIoerr(&
ca60: 6e 52 65 74 72 79 29 20 29 20 63 6f 6e 74 69 6e  nRetry) ) contin
ca70: 75 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ue;.        brea
ca80: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
ca90: 20 69 66 28 20 6e 57 72 69 74 65 3c 3d 30 20 29   if( nWrite<=0 )
caa0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 61 52   break;.      aR
cab0: 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20  em += nWrite;.  
cac0: 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 57 72 69      nRem -= nWri
cad0: 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  te;.    }.    if
cae0: 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20  ( nRem>0 ){.    
caf0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
cb00: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
cb10: 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20  ror();.      rc 
cb20: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
cb30: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
cb40: 69 66 28 20 20 20 28 20 70 46 69 6c 65 2d 3e 6c  if(   ( pFile->l
cb50: 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
cb60: 48 41 4e 44 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c  HANDLE_DISK_FULL
cb70: 20 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 70   ).       || ( p
cb80: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d  File->lastErrno=
cb90: 3d 45 52 52 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c  =ERROR_DISK_FULL
cba0: 20 29 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72   )){.      retur
cbb0: 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
cbc0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
cbd0: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
cbe0: 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 2c 20  TE_IOERR_WRITE, 
cbf0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
cc00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
cc10: 77 69 6e 57 72 69 74 65 22 2c 20 70 46 69 6c 65  winWrite", pFile
cc20: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73  ->zPath);.  }els
cc30: 65 7b 0a 20 20 20 20 6c 6f 67 49 6f 65 72 72 28  e{.    logIoerr(
cc40: 6e 52 65 74 72 79 29 3b 0a 20 20 7d 0a 20 20 72  nRetry);.  }.  r
cc50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cc60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
cc70: 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  te an open file 
cc80: 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73  to a specified s
cc90: 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ize.*/.static in
cca0: 74 20 77 69 6e 54 72 75 6e 63 61 74 65 28 73 71  t winTruncate(sq
ccb0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
ccc0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42  sqlite3_int64 nB
ccd0: 79 74 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  yte){.  winFile 
cce0: 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
ccf0: 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20  e*)id;  /* File 
cd00: 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 20 2a 2f  handle object */
cd10: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
cd20: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
cd30: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
cd40: 65 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74  e for this funct
cd50: 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ion */..  assert
cd60: 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 4f 53  ( pFile );..  OS
cd70: 54 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 45  TRACE(("TRUNCATE
cd80: 20 25 64 20 25 6c 6c 64 5c 6e 22 2c 20 70 46 69   %d %lld\n", pFi
cd90: 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 29 3b 0a  le->h, nByte));.
cda0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
cdb0: 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
cdc0: 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 29 3b  IOERR_TRUNCATE);
cdd0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73  ..  /* If the us
cde0: 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65  er has configure
cdf0: 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66  d a chunk-size f
ce00: 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72  or this file, tr
ce10: 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  uncate the.  ** 
ce20: 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20  file so that it 
ce30: 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69  consists of an i
ce40: 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66  nteger number of
ce50: 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68   chunks (i.e. th
ce60: 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69  e.  ** actual fi
ce70: 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68  le size after th
ce80: 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20  e operation may 
ce90: 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
cea0: 68 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a  he requested.  *
ceb0: 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20  * size)..  */.  
cec0: 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
ced0: 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74  nk>0 ){.    nByt
cee0: 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46  e = ((nByte + pF
cef0: 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31  ile->szChunk - 1
cf00: 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  )/pFile->szChunk
cf10: 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  ) * pFile->szChu
cf20: 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  nk;.  }..  /* Se
cf30: 74 45 6e 64 4f 66 46 69 6c 65 28 29 20 72 65 74  tEndOfFile() ret
cf40: 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68  urns non-zero wh
cf50: 65 6e 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  en successful, o
cf60: 72 20 7a 65 72 6f 20 77 68 65 6e 20 69 74 20 66  r zero when it f
cf70: 61 69 6c 73 2e 20 2a 2f 0a 20 20 69 66 28 20 73  ails. */.  if( s
cf80: 65 65 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c 65  eekWinFile(pFile
cf90: 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20  , nByte) ){.    
cfa0: 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
cfb0: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
cfc0: 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c  UNCATE, pFile->l
cfd0: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
cfe0: 20 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63         "winTrunc
cff0: 61 74 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  ate1", pFile->zP
d000: 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ath);.  }else if
d010: 28 20 30 3d 3d 6f 73 53 65 74 45 6e 64 4f 66 46  ( 0==osSetEndOfF
d020: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b  ile(pFile->h) ){
d030: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
d040: 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
d050: 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63  tError();.    rc
d060: 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
d070: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
d080: 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  CATE, pFile->las
d090: 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
d0a0: 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74       "winTruncat
d0b0: 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  e2", pFile->zPat
d0c0: 68 29 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41  h);.  }..  OSTRA
d0d0: 43 45 28 28 22 54 52 55 4e 43 41 54 45 20 25 64  CE(("TRUNCATE %d
d0e0: 20 25 6c 6c 64 20 25 73 5c 6e 22 2c 20 70 46 69   %lld %s\n", pFi
d0f0: 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 72 63  le->h, nByte, rc
d100: 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f   ? "failed" : "o
d110: 6b 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  k"));.  return r
d120: 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
d130: 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43  ITE_TEST./*.** C
d140: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
d150: 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64  of fullsyncs and
d160: 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20   normal syncs.  
d170: 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
d180: 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e  test.** that syn
d190: 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73  cs and fullsyncs
d1a0: 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20 61 74   are occuring at
d1b0: 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73   the right times
d1c0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d1d0: 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  _sync_count = 0;
d1e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c  .int sqlite3_ful
d1f0: 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  lsync_count = 0;
d200: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
d210: 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69  ake sure all wri
d220: 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75  tes to a particu
d230: 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d  lar file are com
d240: 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a  mitted to disk..
d250: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
d260: 6e 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69  nSync(sqlite3_fi
d270: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67  le *id, int flag
d280: 73 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s){.#ifndef SQLI
d290: 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a  TE_NO_SYNC.  /*.
d2a0: 20 20 2a 2a 20 55 73 65 64 20 6f 6e 6c 79 20 77    ** Used only w
d2b0: 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  hen SQLITE_NO_SY
d2c0: 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  NC is not define
d2d0: 64 2e 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20  d..   */.  BOOL 
d2e0: 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  rc;.#endif.#if !
d2f0: 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
d300: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
d310: 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c  TE_NO_SYNC) || \
d320: 0a 20 20 20 20 28 64 65 66 69 6e 65 64 28 53 51  .    (defined(SQ
d330: 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64 65  LITE_TEST) && de
d340: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
d350: 55 47 29 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55  UG)).  /*.  ** U
d360: 73 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  sed when SQLITE_
d370: 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64  NO_SYNC is not d
d380: 65 66 69 6e 65 64 20 61 6e 64 20 62 79 20 74 68  efined and by th
d390: 65 20 61 73 73 65 72 74 28 29 20 61 6e 64 2f 6f  e assert() and/o
d3a0: 72 0a 20 20 2a 2a 20 4f 53 54 52 41 43 45 28 29  r.  ** OSTRACE()
d3b0: 20 6d 61 63 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20   macros..   */. 
d3c0: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
d3d0: 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
d3e0: 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
d3f0: 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 23 65  ARAMETER(id);.#e
d400: 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
d410: 70 46 69 6c 65 20 29 3b 0a 20 20 2f 2a 20 43 68  pFile );.  /* Ch
d420: 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  eck that one of 
d430: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
d440: 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70  AL or FULL was p
d450: 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  assed */.  asser
d460: 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  t((flags&0x0F)==
d470: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
d480: 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61  AL.      || (fla
d490: 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
d4a0: 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a  _SYNC_FULL.  );.
d4b0: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e  .  OSTRACE(("SYN
d4c0: 43 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  C %d lock=%d\n",
d4d0: 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
d4e0: 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20  ->locktype));.. 
d4f0: 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c   /* Unix cannot,
d500: 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d   but some system
d510: 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  s may return SQL
d520: 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65  ITE_FULL from he
d530: 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69  re. This.  ** li
d540: 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20 74 68  ne is to test th
d550: 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73  at doing so does
d560: 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70   not cause any p
d570: 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20  roblems..  */.  
d580: 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
d590: 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
d5a0: 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 23 69  LITE_FULL );..#i
d5b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  fndef SQLITE_TES
d5c0: 54 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  T.  UNUSED_PARAM
d5d0: 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 23 65 6c  ETER(flags);.#el
d5e0: 73 65 0a 20 20 69 66 28 20 28 66 6c 61 67 73 26  se.  if( (flags&
d5f0: 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
d600: 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73  NC_FULL ){.    s
d610: 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f  qlite3_fullsync_
d620: 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73  count++;.  }.  s
d630: 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
d640: 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  t++;.#endif..  /
d650: 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64  * If we compiled
d660: 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
d670: 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74  _NO_SYNC flag, t
d680: 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61  hen syncing is a
d690: 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f  .  ** no-op.  */
d6a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e  .#ifdef SQLITE_N
d6b0: 4f 5f 53 59 4e 43 0a 20 20 72 65 74 75 72 6e 20  O_SYNC.  return 
d6c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65  SQLITE_OK;.#else
d6d0: 0a 20 20 72 63 20 3d 20 6f 73 46 6c 75 73 68 46  .  rc = osFlushF
d6e0: 69 6c 65 42 75 66 66 65 72 73 28 70 46 69 6c 65  ileBuffers(pFile
d6f0: 2d 3e 68 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  ->h);.  Simulate
d700: 49 4f 45 72 72 6f 72 28 20 72 63 3d 46 41 4c 53  IOError( rc=FALS
d710: 45 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  E );.  if( rc ){
d720: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d730: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
d740: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
d750: 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
d760: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 65 74  Error();.    ret
d770: 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
d780: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
d790: 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  NC, pFile->lastE
d7a0: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
d7b0: 20 20 20 22 77 69 6e 53 79 6e 63 22 2c 20 70 46     "winSync", pF
d7c0: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
d7d0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
d7e0: 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63   Determine the c
d7f0: 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61  urrent size of a
d800: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a   file in bytes.*
d810: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
d820: 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33  FileSize(sqlite3
d830: 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74  _file *id, sqlit
d840: 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29  e3_int64 *pSize)
d850: 7b 0a 20 20 44 57 4f 52 44 20 75 70 70 65 72 42  {.  DWORD upperB
d860: 69 74 73 3b 0a 20 20 44 57 4f 52 44 20 6c 6f 77  its;.  DWORD low
d870: 65 72 42 69 74 73 3b 0a 20 20 77 69 6e 46 69 6c  erBits;.  winFil
d880: 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
d890: 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44  ile*)id;.  DWORD
d8a0: 20 65 72 72 6f 72 3b 0a 0a 20 20 61 73 73 65 72   error;..  asser
d8b0: 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53 69  t( id!=0 );.  Si
d8c0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
d8d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
d8e0: 52 5f 46 53 54 41 54 29 3b 0a 20 20 6c 6f 77 65  R_FSTAT);.  lowe
d8f0: 72 42 69 74 73 20 3d 20 6f 73 47 65 74 46 69 6c  rBits = osGetFil
d900: 65 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20  eSize(pFile->h, 
d910: 26 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20 69  &upperBits);.  i
d920: 66 28 20 20 20 28 6c 6f 77 65 72 42 69 74 73 20  f(   (lowerBits 
d930: 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  == INVALID_FILE_
d940: 53 49 5a 45 29 0a 20 20 20 20 20 26 26 20 28 28  SIZE).     && ((
d950: 65 72 72 6f 72 20 3d 20 6f 73 47 65 74 4c 61 73  error = osGetLas
d960: 74 45 72 72 6f 72 28 29 29 20 21 3d 20 4e 4f 5f  tError()) != NO_
d970: 45 52 52 4f 52 29 20 29 0a 20 20 7b 0a 20 20 20  ERROR) ).  {.   
d980: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
d990: 6f 20 3d 20 65 72 72 6f 72 3b 0a 20 20 20 20 72  o = error;.    r
d9a0: 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
d9b0: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  r(SQLITE_IOERR_F
d9c0: 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  STAT, pFile->las
d9d0: 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
d9e0: 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a       "winFileSiz
d9f0: 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
da00: 29 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20  );.  }.  *pSize 
da10: 3d 20 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74  = (((sqlite3_int
da20: 36 34 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33  64)upperBits)<<3
da30: 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a  2) + lowerBits;.
da40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
da50: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43  OK;.}../*.** LOC
da60: 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
da70: 49 41 54 45 4c 59 20 69 73 20 75 6e 64 65 66 69  IATELY is undefi
da80: 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e 64  ned on some Wind
da90: 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a  ows systems..*/.
daa0: 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45  #ifndef LOCKFILE
dab0: 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
dac0: 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46  Y.# define LOCKF
dad0: 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
dae0: 54 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a 2f  TELY 1.#endif../
daf0: 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72  *.** Acquire a r
db00: 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44  eader lock..** D
db10: 69 66 66 65 72 65 6e 74 20 41 50 49 20 72 6f 75  ifferent API rou
db20: 74 69 6e 65 73 20 61 72 65 20 63 61 6c 6c 65 64  tines are called
db30: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
db40: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 69  ether or not thi
db50: 73 0a 2a 2a 20 69 73 20 57 69 6e 39 35 20 6f 72  s.** is Win95 or
db60: 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69   WinNT..*/.stati
db70: 63 20 69 6e 74 20 67 65 74 52 65 61 64 4c 6f 63  c int getReadLoc
db80: 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  k(winFile *pFile
db90: 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ){.  int res;.  
dba0: 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
dbb0: 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c    OVERLAPPED ovl
dbc0: 70 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73  p;.    ovlp.Offs
dbd0: 65 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  et = SHARED_FIRS
dbe0: 54 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73  T;.    ovlp.Offs
dbf0: 65 74 48 69 67 68 20 3d 20 30 3b 0a 20 20 20 20  etHigh = 0;.    
dc00: 6f 76 6c 70 2e 68 45 76 65 6e 74 20 3d 20 30 3b  ovlp.hEvent = 0;
dc10: 0a 20 20 20 20 72 65 73 20 3d 20 6f 73 4c 6f 63  .    res = osLoc
dc20: 6b 46 69 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68  kFileEx(pFile->h
dc30: 2c 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f  , LOCKFILE_FAIL_
dc40: 49 4d 4d 45 44 49 41 54 45 4c 59 2c 0a 20 20 20  IMMEDIATELY,.   
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc60: 20 20 20 20 30 2c 20 53 48 41 52 45 44 5f 53 49      0, SHARED_SI
dc70: 5a 45 2c 20 30 2c 20 26 6f 76 6c 70 29 3b 0a 2f  ZE, 0, &ovlp);./
dc80: 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66  * isNT() is 1 if
dc90: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
dca0: 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73  ==1, so this els
dcb0: 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75  e is never execu
dcc0: 74 65 64 2e 20 0a 2a 2f 0a 23 69 66 20 53 51 4c  ted. .*/.#if SQL
dcd0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a  ITE_OS_WINCE==0.
dce0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
dcf0: 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   lk;.    sqlite3
dd00: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
dd10: 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20  of(lk), &lk);.  
dd20: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c    pFile->sharedL
dd30: 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72 74  ockByte = (short
dd40: 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66  )((lk & 0x7fffff
dd50: 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45  ff)%(SHARED_SIZE
dd60: 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73 20   - 1));.    res 
dd70: 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 70 46 69  = osLockFile(pFi
dd80: 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
dd90: 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65  RST+pFile->share
dda0: 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c  dLockByte, 0, 1,
ddb0: 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a   0);.#endif.  }.
ddc0: 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29    if( res == 0 )
ddd0: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
dde0: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
ddf0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f  stError();.    /
de00: 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67  * No need to log
de10: 20 61 20 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f   a failure to lo
de20: 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  ck */.  }.  retu
de30: 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
de40: 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b   Undo a readlock
de50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
de60: 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77 69  nlockReadLock(wi
de70: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
de80: 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 66 28 20   int res;.  if( 
de90: 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65  isNT() ){.    re
dea0: 73 20 3d 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65  s = osUnlockFile
deb0: 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  (pFile->h, SHARE
dec0: 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52  D_FIRST, 0, SHAR
ded0: 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 2f 2a 20  ED_SIZE, 0);./* 
dee0: 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53  isNT() is 1 if S
def0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
df00: 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20  1, so this else 
df10: 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  is never execute
df20: 64 2e 20 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  d. .*/.#if SQLIT
df30: 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20  E_OS_WINCE==0.  
df40: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d  }else{.    res =
df50: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46   osUnlockFile(pF
df60: 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
df70: 49 52 53 54 20 2b 20 70 46 69 6c 65 2d 3e 73 68  IRST + pFile->sh
df80: 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c  aredLockByte, 0,
df90: 20 31 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20   1, 0);.#endif. 
dfa0: 20 7d 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20   }.  if( res==0 
dfb0: 26 26 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  && osGetLastErro
dfc0: 72 28 29 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c  r()!=ERROR_NOT_L
dfd0: 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 70 46 69  OCKED ){.    pFi
dfe0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
dff0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
e000: 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f  ;.    winLogErro
e010: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  r(SQLITE_IOERR_U
e020: 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61  NLOCK, pFile->la
e030: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
e040: 20 20 20 20 20 20 22 75 6e 6c 6f 63 6b 52 65 61        "unlockRea
e050: 64 4c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a  dLock", pFile->z
e060: 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Path);.  }.  ret
e070: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
e080: 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
e090: 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
e0a0: 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
e0b0: 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20  eter locktype - 
e0c0: 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
e0d0: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
e0e0: 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
e0f0: 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
e100: 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
e110: 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
e120: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
e130: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
e140: 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
e150: 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
e160: 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
e170: 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
e180: 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
e190: 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
e1a0: 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
e1b0: 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
e1c0: 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
e1d0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
e1e0: 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
e1f0: 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
e200: 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
e210: 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
e220: 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
e230: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
e240: 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
e250: 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
e260: 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
e270: 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
e280: 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
e290: 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
e2a0: 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
e2b0: 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
e2c0: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
e2d0: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
e2e0: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
e2f0: 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
e300: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
e310: 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
e320: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
e330: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
e340: 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
e350: 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54 68 65  ase a lock.  The
e360: 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72 6f 75   winUnlock() rou
e370: 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73 20 61  tine.** erases a
e380: 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e 63 65  ll locks at once
e390: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 75 73 20   and returns us 
e3a0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6c  immediately to l
e3b0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a  ocking level 0..
e3c0: 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  ** It is not pos
e3d0: 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72 20 74  sible to lower t
e3e0: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
e3f0: 20 6f 6e 65 20 73 74 65 70 20 61 74 20 61 20 74   one step at a t
e400: 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d 75 73  ime.  You.** mus
e410: 74 20 67 6f 20 73 74 72 61 69 67 68 74 20 74 6f  t go straight to
e420: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30   locking level 0
e430: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e440: 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  winLock(sqlite3_
e450: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
e460: 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72  cktype){.  int r
e470: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
e480: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
e490: 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65   from subroutine
e4a0: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d  s */.  int res =
e4b0: 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   1;           /*
e4c0: 20 52 65 73 75 6c 74 20 6f 66 20 61 20 57 69 6e   Result of a Win
e4d0: 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a  dows lock call *
e4e0: 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74  /.  int newLockt
e4f0: 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65  ype;       /* Se
e500: 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  t pFile->locktyp
e510: 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  e to this value 
e520: 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a  before exiting *
e530: 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e 64 69  /.  int gotPendi
e540: 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54 72  ngLock = 0;/* Tr
e550: 75 65 20 69 66 20 77 65 20 61 63 71 75 69 72 65  ue if we acquire
e560: 64 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  d a PENDING lock
e570: 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20   this time */.  
e580: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
e590: 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
e5a0: 20 44 57 4f 52 44 20 65 72 72 6f 72 20 3d 20 4e   DWORD error = N
e5b0: 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73 73 65  O_ERROR;..  asse
e5c0: 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f  rt( id!=0 );.  O
e5d0: 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 64  STRACE(("LOCK %d
e5e0: 20 25 64 20 77 61 73 20 25 64 28 25 64 29 5c 6e   %d was %d(%d)\n
e5f0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
e600: 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
e610: 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
e620: 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  e, pFile->shared
e630: 4c 6f 63 6b 42 79 74 65 29 29 3b 0a 0a 20 20 2f  LockByte));..  /
e640: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
e650: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
e660: 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
e670: 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
e680: 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65   the.  ** OsFile
e690: 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
e6a0: 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f  n't use the end_
e6b0: 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c  lock: exit path,
e6c0: 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   as.  ** sqlite3
e6d0: 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  OsEnterMutex() h
e6e0: 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
e6f0: 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
e700: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
e710: 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
e720: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e730: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
e740: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
e750: 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
e760: 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20   correct.  */.  
e770: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
e780: 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b  ocktype!=NO_LOCK
e790: 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   || locktype==SH
e7a0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
e7b0: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
e7c0: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
e7d0: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
e7e0: 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype!=RESERVED_LO
e7f0: 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK || pFile->loc
e800: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
e810: 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b  CK );..  /* Lock
e820: 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   the PENDING_LOC
e830: 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e 65 65  K byte if we nee
e840: 64 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 50  d to acquire a P
e850: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20  ENDING lock or. 
e860: 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63   ** a SHARED loc
e870: 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 63  k.  If we are ac
e880: 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
e890: 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69   lock, the acqui
e8a0: 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74  sition of.  ** t
e8b0: 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  he PENDING_LOCK 
e8c0: 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72  byte is temporar
e8d0: 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63  y..  */.  newLoc
e8e0: 6b 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c  ktype = pFile->l
e8f0: 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 20  ocktype;.  if(  
e900: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
e910: 65 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20  e==NO_LOCK).    
e920: 20 7c 7c 20 28 20 20 20 28 6c 6f 63 6b 74 79 70   || (   (locktyp
e930: 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
e940: 4b 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  K).         && (
e950: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
e960: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 29  =RESERVED_LOCK))
e970: 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e  .  ){.    int cn
e980: 74 20 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c 65  t = 3;.    while
e990: 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65  ( cnt-->0 && (re
e9a0: 73 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 70  s = osLockFile(p
e9b0: 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47  File->h, PENDING
e9c0: 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29  _BYTE, 0, 1, 0))
e9d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
e9e0: 54 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67  Try 3 times to g
e9f0: 65 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c  et the pending l
ea00: 6f 63 6b 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ock.  This is ne
ea10: 65 64 65 64 20 74 6f 20 77 6f 72 6b 0a 20 20 20  eded to work.   
ea20: 20 20 20 2a 2a 20 61 72 6f 75 6e 64 20 70 72 6f     ** around pro
ea30: 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79 20  blems caused by 
ea40: 69 6e 64 65 78 69 6e 67 20 61 6e 64 2f 6f 72 20  indexing and/or 
ea50: 61 6e 74 69 2d 76 69 72 75 73 20 73 6f 66 74 77  anti-virus softw
ea60: 61 72 65 20 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  are on.      ** 
ea70: 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e  Windows systems.
ea80: 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 79 6f 75  .      ** If you
ea90: 20 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20   are using this 
eaa0: 63 6f 64 65 20 61 73 20 61 20 6d 6f 64 65 6c 20  code as a model 
eab0: 66 6f 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20  for alternative 
eac0: 56 46 53 65 73 2c 20 64 6f 20 6e 6f 74 0a 20 20  VFSes, do not.  
ead0: 20 20 20 20 2a 2a 20 63 6f 70 79 20 74 68 69 73      ** copy this
eae0: 20 72 65 74 72 79 20 6c 6f 67 69 63 2e 20 20 49   retry logic.  I
eaf0: 74 20 69 73 20 61 20 68 61 63 6b 20 69 6e 74 65  t is a hack inte
eb00: 6e 64 65 64 20 66 6f 72 20 57 69 6e 64 6f 77 73  nded for Windows
eb10: 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a   only..      */.
eb20: 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
eb30: 63 6f 75 6c 64 20 6e 6f 74 20 67 65 74 20 61 20  could not get a 
eb40: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 20 63 6e  PENDING lock. cn
eb50: 74 3d 25 64 5c 6e 22 2c 20 63 6e 74 29 29 3b 0a  t=%d\n", cnt));.
eb60: 20 20 20 20 20 20 69 66 28 20 63 6e 74 20 29 20        if( cnt ) 
eb70: 6f 73 53 6c 65 65 70 28 31 29 3b 0a 20 20 20 20  osSleep(1);.    
eb80: 7d 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67  }.    gotPending
eb90: 4c 6f 63 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20  Lock = res;.    
eba0: 69 66 28 20 21 72 65 73 20 29 7b 0a 20 20 20 20  if( !res ){.    
ebb0: 20 20 65 72 72 6f 72 20 3d 20 6f 73 47 65 74 4c    error = osGetL
ebc0: 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
ebd0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75  }.  }..  /* Acqu
ebe0: 69 72 65 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ire a shared loc
ebf0: 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  k.  */.  if( loc
ec00: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
ec10: 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  CK && res ){.   
ec20: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
ec30: 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
ec40: 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 67  K );.    res = g
ec50: 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  etReadLock(pFile
ec60: 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29  );.    if( res )
ec70: 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74  {.      newLockt
ec80: 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ype = SHARED_LOC
ec90: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
eca0: 20 20 20 20 65 72 72 6f 72 20 3d 20 6f 73 47 65      error = osGe
ecb0: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
ecc0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63    }.  }..  /* Ac
ecd0: 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44  quire a RESERVED
ece0: 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28   lock.  */.  if(
ecf0: 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52   locktype==RESER
ed00: 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20  VED_LOCK && res 
ed10: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
ed20: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
ed30: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
ed40: 20 20 20 72 65 73 20 3d 20 6f 73 4c 6f 63 6b 46     res = osLockF
ed50: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45  ile(pFile->h, RE
ed60: 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
ed70: 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
ed80: 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
ed90: 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56  ocktype = RESERV
eda0: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
edb0: 73 65 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20  se{.      error 
edc0: 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
edd0: 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ();.    }.  }.. 
ede0: 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 50 45   /* Acquire a PE
edf0: 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  NDING lock.  */.
ee00: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
ee10: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
ee20: 26 20 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77  & res ){.    new
ee30: 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49  Locktype = PENDI
ee40: 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74  NG_LOCK;.    got
ee50: 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b  PendingLock = 0;
ee60: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
ee70: 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  re an EXCLUSIVE 
ee80: 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
ee90: 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
eea0: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20  IVE_LOCK && res 
eeb0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
eec0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
eed0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
eee0: 20 20 20 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52     res = unlockR
eef0: 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  eadLock(pFile);.
ef00: 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e      OSTRACE(("un
ef10: 72 65 61 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22  readlock = %d\n"
ef20: 2c 20 72 65 73 29 29 3b 0a 20 20 20 20 72 65 73  , res));.    res
ef30: 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 70 46   = osLockFile(pF
ef40: 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
ef50: 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f  IRST, 0, SHARED_
ef60: 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  SIZE, 0);.    if
ef70: 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e  ( res ){.      n
ef80: 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58 43  ewLocktype = EXC
ef90: 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20  LUSIVE_LOCK;.   
efa0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 72   }else{.      er
efb0: 72 6f 72 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  ror = osGetLastE
efc0: 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53  rror();.      OS
efd0: 54 52 41 43 45 28 28 22 65 72 72 6f 72 2d 63 6f  TRACE(("error-co
efe0: 64 65 20 3d 20 25 64 5c 6e 22 2c 20 65 72 72 6f  de = %d\n", erro
eff0: 72 29 29 3b 0a 20 20 20 20 20 20 67 65 74 52 65  r));.      getRe
f000: 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
f010: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
f020: 66 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67  f we are holding
f030: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
f040: 74 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62 65  that ought to be
f050: 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e 0a   released, then.
f060: 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74 20    ** release it 
f070: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
f080: 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 26  gotPendingLock &
f090: 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  & locktype==SHAR
f0a0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 6f  ED_LOCK ){.    o
f0b0: 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c  sUnlockFile(pFil
f0c0: 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59  e->h, PENDING_BY
f0d0: 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
f0e0: 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
f0f0: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
f100: 6c 6f 63 6b 20 68 61 73 20 68 65 6c 64 20 69 6e  lock has held in
f110: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
f120: 70 74 6f 72 20 74 68 65 6e 0a 20 20 2a 2a 20 72  ptor then.  ** r
f130: 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70  eturn the approp
f140: 72 69 61 74 65 20 72 65 73 75 6c 74 20 63 6f 64  riate result cod
f150: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  e..  */.  if( re
f160: 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  s ){.    rc = SQ
f170: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
f180: 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
f190: 4c 4f 43 4b 20 46 41 49 4c 45 44 20 25 64 20 74  LOCK FAILED %d t
f1a0: 72 79 69 6e 67 20 66 6f 72 20 25 64 20 62 75 74  rying for %d but
f1b0: 20 67 6f 74 20 25 64 5c 6e 22 2c 20 70 46 69 6c   got %d\n", pFil
f1c0: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
f1d0: 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f   locktype, newLo
f1e0: 63 6b 74 79 70 65 29 29 3b 0a 20 20 20 20 70 46  cktype));.    pF
f1f0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
f200: 20 65 72 72 6f 72 3b 0a 20 20 20 20 72 63 20 3d   error;.    rc =
f210: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
f220: 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  }.  pFile->lockt
f230: 79 70 65 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63  ype = (u8)newLoc
f240: 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20  ktype;.  return 
f250: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
f260: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
f270: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
f280: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
f290: 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
f2a0: 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
f2b0: 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
f2c0: 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
f2d0: 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
f2e0: 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
f2f0: 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 7a  ero, otherwise z
f300: 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
f310: 6e 74 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72  nt winCheckReser
f320: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
f330: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
f340: 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
f350: 63 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  c;.  winFile *pF
f360: 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
f370: 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
f380: 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
f390: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
f3a0: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
f3b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ;..  assert( id!
f3c0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  =0 );.  if( pFil
f3d0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53  e->locktype>=RES
f3e0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
f3f0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 4f 53    rc = 1;.    OS
f400: 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
f410: 4c 4f 43 4b 20 25 64 20 25 64 20 28 6c 6f 63 61  LOCK %d %d (loca
f420: 6c 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  l)\n", pFile->h,
f430: 20 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   rc));.  }else{.
f440: 20 20 20 20 72 63 20 3d 20 6f 73 4c 6f 63 6b 46      rc = osLockF
f450: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45  ile(pFile->h, RE
f460: 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
f470: 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
f480: 63 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c  c ){.      osUnl
f490: 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  ockFile(pFile->h
f4a0: 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
f4b0: 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 1, 0);.    }
f4c0: 0a 20 20 20 20 72 63 20 3d 20 21 72 63 3b 0a 20  .    rc = !rc;. 
f4d0: 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53     OSTRACE(("TES
f4e0: 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
f4f0: 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 70 46 69  (remote)\n", pFi
f500: 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d  le->h, rc));.  }
f510: 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63  .  *pResOut = rc
f520: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
f530: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  E_OK;.}../*.** L
f540: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
f550: 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
f560: 65 73 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20  escriptor id to 
f570: 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74  locktype.  lockt
f580: 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ype.** must be e
f590: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
f5a0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
f5b0: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
f5c0: 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
f5d0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
f5e0: 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
f5f0: 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
f600: 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
f610: 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
f620: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
f630: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20  **.** It is not 
f640: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69  possible for thi
f650: 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69  s routine to fai
f660: 6c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  l if the second 
f670: 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e  argument.** is N
f680: 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20  O_LOCK.  If the 
f690: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
f6a0: 69 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74  is SHARED_LOCK t
f6b0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
f6c0: 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e  .** might return
f6d0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a   SQLITE_IOERR;.*
f6e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
f6f0: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
f700: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
f710: 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 74 79  ktype){.  int ty
f720: 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  pe;.  winFile *p
f730: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
f740: 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  )id;.  int rc = 
f750: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
f760: 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b  ert( pFile!=0 );
f770: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
f780: 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype<=SHARED_LOCK
f790: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
f7a0: 55 4e 4c 4f 43 4b 20 25 64 20 74 6f 20 25 64 20  UNLOCK %d to %d 
f7b0: 77 61 73 20 25 64 28 25 64 29 5c 6e 22 2c 20 70  was %d(%d)\n", p
f7c0: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
f7d0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  e,.          pFi
f7e0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46  le->locktype, pF
f7f0: 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
f800: 79 74 65 29 29 3b 0a 20 20 74 79 70 65 20 3d 20  yte));.  type = 
f810: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b  pFile->locktype;
f820: 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 45 58 43  .  if( type>=EXC
f830: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
f840: 20 20 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28     osUnlockFile(
f850: 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
f860: 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45  _FIRST, 0, SHARE
f870: 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20  D_SIZE, 0);.    
f880: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
f890: 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21 67 65  ARED_LOCK && !ge
f8a0: 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  tReadLock(pFile)
f8b0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
f8c0: 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
f8d0: 61 70 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c  appen.  We shoul
f8e0: 64 20 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65  d always be able
f8f0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   to.      ** rea
f900: 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
f910: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63  lock */.      rc
f920: 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
f930: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
f940: 43 4b 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  CK, osGetLastErr
f950: 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
f960: 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22       "winUnlock"
f970: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
f980: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
f990: 20 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f   type>=RESERVED_
f9a0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 6f 73 55 6e  LOCK ){.    osUn
f9b0: 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e  lockFile(pFile->
f9c0: 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
f9d0: 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
f9e0: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
f9f0: 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e  NO_LOCK && type>
fa00: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
fa10: 20 20 20 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f      unlockReadLo
fa20: 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20  ck(pFile);.  }. 
fa30: 20 69 66 28 20 74 79 70 65 3e 3d 50 45 4e 44 49   if( type>=PENDI
fa40: 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 6f  NG_LOCK ){.    o
fa50: 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c  sUnlockFile(pFil
fa60: 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59  e->h, PENDING_BY
fa70: 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
fa80: 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  }.  pFile->lockt
fa90: 79 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79  ype = (u8)lockty
faa0: 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  pe;.  return rc;
fab0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f  .}../*.** Contro
fac0: 6c 20 61 6e 64 20 71 75 65 72 79 20 6f 66 20 74  l and query of t
fad0: 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e  he open file han
fae0: 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
faf0: 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f  nt winFileContro
fb00: 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
fb10: 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64  id, int op, void
fb20: 20 2a 70 41 72 67 29 7b 0a 20 20 77 69 6e 46 69   *pArg){.  winFi
fb30: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
fb40: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69 74  File*)id;.  swit
fb50: 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
fb60: 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
fb70: 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20  LOCKSTATE: {.   
fb80: 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
fb90: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
fba0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
fbb0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
fbc0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
fbd0: 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20  LAST_ERRNO: {.  
fbe0: 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
fbf0: 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e 6c 61  = (int)pFile->la
fc00: 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  stErrno;.      r
fc10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fc20: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
fc30: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55  SQLITE_FCNTL_CHU
fc40: 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  NK_SIZE: {.     
fc50: 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
fc60: 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a  = *(int *)pArg;.
fc70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
fc80: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
fc90: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
fca0: 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b  NTL_SIZE_HINT: {
fcb0: 0a 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65  .      if( pFile
fcc0: 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20  ->szChunk>0 ){. 
fcd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
fce0: 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a 20 20 20 20  nt64 oldSz;.    
fcf0: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e      int rc = win
fd00: 46 69 6c 65 53 69 7a 65 28 69 64 2c 20 26 6f 6c  FileSize(id, &ol
fd10: 64 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  dSz);.        if
fd20: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
fd30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
fd40: 69 74 65 33 5f 69 6e 74 36 34 20 6e 65 77 53 7a  ite3_int64 newSz
fd50: 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74   = *(sqlite3_int
fd60: 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  64*)pArg;.      
fd70: 20 20 20 20 69 66 28 20 6e 65 77 53 7a 3e 6f 6c      if( newSz>ol
fd80: 64 53 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  dSz ){.         
fd90: 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
fda0: 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
fdb0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69           rc = wi
fdc0: 6e 54 72 75 6e 63 61 74 65 28 69 64 2c 20 6e 65  nTruncate(id, ne
fdd0: 77 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wSz);.          
fde0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
fdf0: 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
fe00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
fe10: 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
fe20: 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
fe30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fe40: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
fe50: 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
fe60: 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a  _PERSIST_WAL: {.
fe70: 20 20 20 20 20 20 69 6e 74 20 62 50 65 72 73 69        int bPersi
fe80: 73 74 20 3d 20 2a 28 69 6e 74 2a 29 70 41 72 67  st = *(int*)pArg
fe90: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 50 65 72  ;.      if( bPer
fea0: 73 69 73 74 3c 30 20 29 7b 0a 20 20 20 20 20 20  sist<0 ){.      
feb0: 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
fec0: 70 46 69 6c 65 2d 3e 62 50 65 72 73 69 73 74 57  pFile->bPersistW
fed0: 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  al;.      }else{
fee0: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
fef0: 62 50 65 72 73 69 73 74 57 61 6c 20 3d 20 62 50  bPersistWal = bP
ff00: 65 72 73 69 73 74 21 3d 30 3b 0a 20 20 20 20 20  ersist!=0;.     
ff10: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
ff20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
ff30: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
ff40: 5f 46 43 4e 54 4c 5f 53 59 4e 43 5f 4f 4d 49 54  _FCNTL_SYNC_OMIT
ff50: 54 45 44 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  TED: {.      ret
ff60: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
ff70: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
ff80: 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32  LITE_FCNTL_WIN32
ff90: 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a 20 20 20  _AV_RETRY: {.   
ffa0: 20 20 20 69 6e 74 20 2a 61 20 3d 20 28 69 6e 74     int *a = (int
ffb0: 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69 66  *)pArg;.      if
ffc0: 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20 20 20 20  ( a[0]>0 ){.    
ffd0: 20 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52 65      win32IoerrRe
ffe0: 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20  try = a[0];.    
fff0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10000 20 61 5b 30 5d 20 3d 20 77 69 6e 33 32 49 6f 65   a[0] = win32Ioe
10010 72 72 52 65 74 72 79 3b 0a 20 20 20 20 20 20 7d  rrRetry;.      }
10020 0a 20 20 20 20 20 20 69 66 28 20 61 5b 31 5d 3e  .      if( a[1]>
10030 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e  0 ){.        win
10040 33 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  32IoerrRetryDela
10050 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20  y = a[1];.      
10060 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
10070 5b 31 5d 20 3d 20 77 69 6e 33 32 49 6f 65 72 72  [1] = win32Ioerr
10080 52 65 74 72 79 44 65 6c 61 79 3b 0a 20 20 20 20  RetryDelay;.    
10090 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
100a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
100b0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
100c0 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
100d0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
100e0 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
100f0 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  in bytes of the 
10100 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b  underlying block
10110 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74   device for.** t
10120 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
10130 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73  e. This is almos
10140 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  t always 512 byt
10150 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a  es, but may be.*
10160 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d  * larger for som
10170 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a  e devices..**.**
10180 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73   SQLite code ass
10190 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69  umes this functi
101a0 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20  on cannot fail. 
101b0 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20  It also assumes 
101c0 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66  that.** if two f
101d0 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64  iles are created
101e0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   in the same fil
101f0 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f  e-system directo
10200 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61  ry (i.e..** a da
10210 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a  tabase and its j
10220 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61  ournal file) tha
10230 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  t the sector siz
10240 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a  e will be the.**
10250 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a   same for both..
10260 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
10270 6e 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  nSectorSize(sqli
10280 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
10290 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
102a0 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  ;.  return (int)
102b0 28 28 28 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d  (((winFile*)id)-
102c0 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 7d 0a  >sectorSize);.}.
102d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
102e0 76 65 63 74 6f 72 20 6f 66 20 64 65 76 69 63 65  vector of device
102f0 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
10300 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10310 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63 74  winDeviceCharact
10320 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33  eristics(sqlite3
10330 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 55 4e  _file *id){.  UN
10340 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
10350 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  d);.  return SQL
10360 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45  ITE_IOCAP_UNDELE
10370 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 3b  TABLE_WHEN_OPEN;
10380 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
10390 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 20  TE_OMIT_WAL../* 
103a0 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77 69 6c 6c  .** Windows will
103b0 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75 20 63 72   only let you cr
103c0 65 61 74 65 20 66 69 6c 65 20 76 69 65 77 20 6d  eate file view m
103d0 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c  appings.** on al
103e0 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 67 72  location size gr
103f0 61 6e 75 6c 61 72 69 74 79 20 62 6f 75 6e 64 61  anularity bounda
10400 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69 6e 67 20  ries..** During 
10410 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28  sqlite3_os_init(
10420 29 20 77 65 20 64 6f 20 61 20 47 65 74 53 79 73  ) we do a GetSys
10430 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20  temInfo().** to 
10440 67 65 74 20 74 68 65 20 67 72 61 6e 75 6c 61 72  get the granular
10450 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a 53 59 53  ity size..*/.SYS
10460 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73 49  TEM_INFO winSysI
10470 6e 66 6f 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  nfo;../*.** Help
10480 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
10490 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e  obtain and relin
104a0 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c  quish the global
104b0 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67   mutex. The.** g
104c0 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75  lobal mutex is u
104d0 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74  sed to protect t
104e0 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20 6f  he winLockInfo o
104f0 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20 0a  bjects used by .
10500 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c  ** this file, al
10510 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62  l of which may b
10520 65 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74  e shared by mult
10530 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a  iple threads..**
10540 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77 69 6e  .** Function win
10550 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69  ShmMutexHeld() i
10560 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74  s used to assert
10570 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62  () that the glob
10580 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20  al mutex .** is 
10590 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72  held when requir
105a0 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
105b0 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
105c0 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74  s part of assert
105d0 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  () .** statement
105e0 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  s. e.g..**.**   
105f0 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
10600 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ().**     assert
10610 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  ( winShmMutexHel
10620 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69 6e 53  d() );.**   winS
10630 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 0a 2a  hmLeaveMutex().*
10640 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
10650 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 76  nShmEnterMutex(v
10660 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
10670 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69  mutex_enter(sqli
10680 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
10690 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
106a0 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74  C_MASTER));.}.st
106b0 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d  atic void winShm
106c0 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29  LeaveMutex(void)
106d0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
106e0 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d  x_leave(sqlite3M
106f0 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
10700 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
10710 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66  STER));.}.#ifdef
10720 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
10730 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d  atic int winShmM
10740 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b  utexHeld(void) {
10750 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
10760 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c  3_mutex_held(sql
10770 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
10780 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
10790 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23  IC_MASTER));.}.#
107a0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  endif../*.** Obj
107b0 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72  ect used to repr
107c0 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65 20 66  esent a single f
107d0 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64 20 6d  ile opened and m
107e0 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76 69 64  mapped to provid
107f0 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f  e.** shared memo
10800 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74 69 70  ry.  When multip
10810 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72  le threads all r
10820 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d  eference the sam
10830 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79  e.** log-summary
10840 2c 20 65 61 63 68 20 74 68 72 65 61 64 20 68 61  , each thread ha
10850 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46 69 6c  s its own winFil
10860 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68  e object, but th
10870 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20  ey all.** point 
10880 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74  to a single inst
10890 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
108a0 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ect.  In other w
108b0 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f  ords, each.** lo
108c0 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f 70 65  g-summary is ope
108d0 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65  ned only once pe
108e0 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  r process..**.**
108f0 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
10900 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20  () must be true 
10910 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72  when creating or
10920 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74   destroying.** t
10930 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68  his object or wh
10940 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77  ile reading or w
10950 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  riting the follo
10960 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a  wing fields:.**.
10970 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 20  **      nRef.** 
10980 20 20 20 20 20 70 4e 65 78 74 20 0a 2a 2a 0a 2a       pNext .**.*
10990 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
109a0 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d  fields are read-
109b0 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f  only after the o
109c0 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
109d0 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69  :.** .**      fi
109e0 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e  d.**      zFilen
109f0 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72  ame.**.** Either
10a00 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74 65   winShmNode.mute
10a10 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f  x must be held o
10a20 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65  r winShmNode.nRe
10a30 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e 53  f==0 and.** winS
10a40 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  hmMutexHeld() is
10a50 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64 69   true when readi
10a60 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e  ng or writing an
10a70 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a  y other field.**
10a80 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
10a90 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74  re..**.*/.struct
10aa0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20 20   winShmNode {.  
10ab0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
10ac0 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75  utex;      /* Mu
10ad0 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68  tex to access th
10ae0 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  is object */.  c
10af0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
10b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
10b10 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f  e of the file */
10b20 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69 6c 65  .  winFile hFile
10b30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
10b40 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f   File handle fro
10b50 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20  m winOpen */..  
10b60 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20  int szRegion;   
10b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
10b80 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d  ze of shared-mem
10b90 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20  ory regions */. 
10ba0 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20   int nRegion;   
10bb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
10bc0 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52  ize of array apR
10bd0 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63  egion */.  struc
10be0 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20 20  t ShmRegion {.  
10bf0 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20    HANDLE hMap;  
10c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
10c10 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 43  le handle from C
10c20 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
10c30 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4d   */.    void *pM
10c40 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f 6e  ap;.  } *aRegion
10c50 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
10c60 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rno;           /
10c70 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72  * The Windows er
10c80 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73  rno from the las
10c90 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a  t I/O error */..
10ca0 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10cc0 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53 68 6d  Number of winShm
10cd0 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
10ce0 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77  g to this */.  w
10cf0 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20  inShm *pFirst;  
10d00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
10d10 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20   winShm objects 
10d20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
10d30 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65   */.  winShmNode
10d40 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
10d50 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73 74   /* Next in list
10d60 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f   of all winShmNo
10d70 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69  de objects */.#i
10d80 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
10d90 47 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64  G.  u8 nextShmId
10da0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
10db0 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65  * Next available
10dc0 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75 65   winShm.id value
10dd0 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
10de0 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72  *.** A global ar
10df0 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68  ray of all winSh
10e00 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a 2a  mNode objects..*
10e10 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d 4d  *.** The winShmM
10e20 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20  utexHeld() must 
10e30 62 65 20 74 72 75 65 20 77 68 69 6c 65 20 72 65  be true while re
10e40 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
10e50 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73   this list..*/.s
10e60 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64 65  tatic winShmNode
10e70 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74   *winShmNodeList
10e80 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72   = 0;../*.** Str
10e90 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74 65  ucture used inte
10ea0 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56  rnally by this V
10eb0 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  FS to record the
10ec0 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20   state of an.** 
10ed0 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  open shared memo
10ee0 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ry connection..*
10ef0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
10f00 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e  ng fields are in
10f10 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74  itialized when t
10f20 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72  his object is cr
10f30 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65  eated and.** are
10f40 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65   read-only there
10f50 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  after:.**.**    
10f60 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a  winShm.pShmNode.
10f70 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69 64 0a  **    winShm.id.
10f80 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20  **.** All other 
10f90 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f  fields are read/
10fa0 77 72 69 74 65 2e 20 20 54 68 65 20 77 69 6e 53  write.  The winS
10fb0 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  hm.pShmNode->mut
10fc0 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  ex must be held.
10fd0 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69  ** while accessi
10fe0 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74  ng any read/writ
10ff0 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72  e fields..*/.str
11000 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77  uct winShm {.  w
11010 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
11020 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  ode;      /* The
11030 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e 53   underlying winS
11040 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f  hmNode object */
11050 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74  .  winShm *pNext
11060 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
11070 20 4e 65 78 74 20 77 69 6e 53 68 6d 20 77 69 74   Next winShm wit
11080 68 20 74 68 65 20 73 61 6d 65 20 77 69 6e 53 68  h the same winSh
11090 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61  mNode */.  u8 ha
110a0 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20  sMutex;         
110b0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
110c0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 77 69 6e   holding the win
110d0 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f  ShmNode mutex */
110e0 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73  .  u16 sharedMas
110f0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
11100 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
11110 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
11120 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20  u16 exclMask;   
11130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
11140 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
11150 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69  locks held */.#i
11160 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
11170 47 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 20  G.  u8 id;      
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11190 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e  * Id of this con
111a0 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 69 74 73  nection with its
111b0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23   winShmNode */.#
111c0 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
111d0 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66  Constants used f
111e0 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64  or locking.*/.#d
111f0 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 42 41  efine WIN_SHM_BA
11200 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45  SE   ((22+SQLITE
11210 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20  _SHM_NLOCK)*4)  
11220 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c        /* first l
11230 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66  ock byte */.#def
11240 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 20  ine WIN_SHM_DMS 
11250 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41 53 45     (WIN_SHM_BASE
11260 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
11270 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73  K)  /* deadman s
11280 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  witch */../*.** 
11290 41 70 70 6c 79 20 61 64 76 69 73 6f 72 79 20 6c  Apply advisory l
112a0 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e 20 62  ocks for all n b
112b0 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 61  ytes beginning a
112c0 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65 66 69  t ofst..*/.#defi
112d0 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20 31  ne _SHM_UNLCK  1
112e0 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 52 44  .#define _SHM_RD
112f0 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e 65 20 5f  LCK  2.#define _
11300 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a 73 74 61  SHM_WRLCK  3.sta
11310 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 53 79  tic int winShmSy
11320 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e 53  stemLock(.  winS
11330 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65 2c 20 20  hmNode *pFile,  
11340 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73    /* Apply locks
11350 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68   to this open sh
11360 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d  ared-memory segm
11370 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63  ent */.  int loc
11380 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 2f  kType,         /
11390 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 5f 53  * _SHM_UNLCK, _S
113a0 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f 53 48  HM_RDLCK, or _SH
113b0 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74  M_WRLCK */.  int
113c0 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20   ofst,          
113d0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
113e0 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65  first byte to be
113f0 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64   locked/unlocked
11400 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 20   */.  int nByte 
11410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
11420 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
11430 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b  o lock or unlock
11440 20 2a 2f 0a 29 7b 0a 20 20 4f 56 45 52 4c 41 50   */.){.  OVERLAP
11450 50 45 44 20 6f 76 6c 70 3b 0a 20 20 44 57 4f 52  PED ovlp;.  DWOR
11460 44 20 64 77 46 6c 61 67 73 3b 0a 20 20 69 6e 74  D dwFlags;.  int
11470 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
11480 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
11490 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f  e form Lock/Unlo
114a0 63 6b 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20  ckFileEx() */.. 
114b0 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68   /* Access to th
114c0 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a  e winShmNode obj
114d0 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65  ect is serialize
114e0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
114f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
11500 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
11510 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c  pFile->mutex) ||
11520 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20   pFile->nRef==0 
11530 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  );..  /* Initial
11540 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ize the locking 
11550 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
11560 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49  dwFlags = LOCKFI
11570 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
11580 45 4c 59 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 54  ELY;.  if( lockT
11590 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43  ype == _SHM_WRLC
115a0 4b 20 29 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c  K ) dwFlags |= L
115b0 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56  OCKFILE_EXCLUSIV
115c0 45 5f 4c 4f 43 4b 3b 0a 0a 20 20 6d 65 6d 73 65  E_LOCK;..  memse
115d0 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65  t(&ovlp, 0, size
115e0 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b  of(OVERLAPPED));
115f0 0a 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d  .  ovlp.Offset =
11600 20 6f 66 73 74 3b 0a 0a 20 20 2f 2a 20 52 65 6c   ofst;..  /* Rel
11610 65 61 73 65 2f 41 63 71 75 69 72 65 20 74 68 65  ease/Acquire the
11620 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f   system-level lo
11630 63 6b 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  ck */.  if( lock
11640 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b  Type==_SHM_UNLCK
11650 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 55   ){.    rc = osU
11660 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 70 46 69 6c  nlockFileEx(pFil
11670 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 30 2c 20 6e  e->hFile.h, 0, n
11680 42 79 74 65 2c 20 30 2c 20 26 6f 76 6c 70 29 3b  Byte, 0, &ovlp);
11690 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
116a0 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 28   = osLockFileEx(
116b0 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  pFile->hFile.h, 
116c0 64 77 46 6c 61 67 73 2c 20 30 2c 20 6e 42 79 74  dwFlags, 0, nByt
116d0 65 2c 20 30 2c 20 26 6f 76 6c 70 29 3b 0a 20 20  e, 0, &ovlp);.  
116e0 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 21 3d 20  }.  .  if( rc!= 
116f0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
11700 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
11710 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
11720 74 45 72 72 6e 6f 20 3d 20 20 6f 73 47 65 74 4c  tErrno =  osGetL
11730 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
11740 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
11750 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45  ;.  }..  OSTRACE
11760 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 25 64 20 25  (("SHM-LOCK %d %
11770 73 20 25 73 20 30 78 25 30 38 6c 78 5c 6e 22 2c  s %s 0x%08lx\n",
11780 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69   .           pFi
11790 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20  le->hFile.h,.   
117a0 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
117b0 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
117c0 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 20 20 20  failed",.       
117d0 20 20 20 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53      lockType==_S
117e0 48 4d 5f 55 4e 4c 43 4b 20 3f 20 22 55 6e 6c 6f  HM_UNLCK ? "Unlo
117f0 63 6b 46 69 6c 65 45 78 22 20 3a 20 22 4c 6f 63  ckFileEx" : "Loc
11800 6b 46 69 6c 65 45 78 22 2c 0a 20 20 20 20 20 20  kFileEx",.      
11810 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
11820 45 72 72 6e 6f 29 29 3b 0a 0a 20 20 72 65 74 75  Errno));..  retu
11830 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
11840 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
11850 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73 20 2a  to VFS methods *
11860 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
11870 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
11880 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71  *,const char*,sq
11890 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c  lite3_file*,int,
118a0 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  int*);.static in
118b0 74 20 77 69 6e 44 65 6c 65 74 65 28 73 71 6c 69  t winDelete(sqli
118c0 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20  te3_vfs *,const 
118d0 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a  char*,int);../*.
118e0 2a 2a 20 50 75 72 67 65 20 74 68 65 20 77 69 6e  ** Purge the win
118f0 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74  ShmNodeList list
11900 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   of all entries 
11910 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e  with winShmNode.
11920 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54  nRef==0..**.** T
11930 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53  his is not a VFS
11940 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d   shared-memory m
11950 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75  ethod; it is a u
11960 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20  tility function 
11970 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53  called.** by VFS
11980 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d   shared-memory m
11990 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  ethods..*/.stati
119a0 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 50 75 72  c void winShmPur
119b0 67 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ge(sqlite3_vfs *
119c0 70 56 66 73 2c 20 69 6e 74 20 64 65 6c 65 74 65  pVfs, int delete
119d0 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e  Flag){.  winShmN
119e0 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53  ode **pp;.  winS
119f0 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 42 4f 4f  hmNode *p;.  BOO
11a00 4c 20 62 52 63 3b 0a 20 20 61 73 73 65 72 74 28  L bRc;.  assert(
11a10 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
11a20 28 29 20 29 3b 0a 20 20 70 70 20 3d 20 26 77 69  () );.  pp = &wi
11a30 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20  nShmNodeList;.  
11a40 77 68 69 6c 65 28 20 28 70 20 3d 20 2a 70 70 29  while( (p = *pp)
11a50 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  !=0 ){.    if( p
11a60 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
11a70 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
11a80 69 66 28 20 70 2d 3e 6d 75 74 65 78 20 29 20 73  if( p->mutex ) s
11a90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
11aa0 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  e(p->mutex);.   
11ab0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
11ac0 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a  >nRegion; i++){.
11ad0 20 20 20 20 20 20 20 20 62 52 63 20 3d 20 6f 73          bRc = os
11ae0 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
11af0 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d  p->aRegion[i].pM
11b00 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54  ap);.        OST
11b10 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45  RACE(("SHM-PURGE
11b20 20 70 69 64 2d 25 64 20 75 6e 6d 61 70 20 72 65   pid-%d unmap re
11b30 67 69 6f 6e 3d 25 64 20 25 73 5c 6e 22 2c 0a 20  gion=%d %s\n",. 
11b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b50 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e  (int)osGetCurren
11b60 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c  tProcessId(), i,
11b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11b80 20 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22    bRc ? "ok" : "
11b90 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20  failed"));.     
11ba0 20 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f 73 65     bRc = osClose
11bb0 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67 69 6f  Handle(p->aRegio
11bc0 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20 20 20  n[i].hMap);.    
11bd0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48      OSTRACE(("SH
11be0 4d 2d 50 55 52 47 45 20 70 69 64 2d 25 64 20 63  M-PURGE pid-%d c
11bf0 6c 6f 73 65 20 72 65 67 69 6f 6e 3d 25 64 20 25  lose region=%d %
11c00 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
11c10 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73 47 65         (int)osGe
11c20 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
11c30 64 28 29 2c 20 69 2c 0a 20 20 20 20 20 20 20 20  d(), i,.        
11c40 20 20 20 20 20 20 20 20 20 62 52 63 20 3f 20 22           bRc ? "
11c50 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
11c60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11c70 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68 20 21  if( p->hFile.h !
11c80 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  = INVALID_HANDLE
11c90 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 20 20  _VALUE ){.      
11ca0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
11cb0 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
11cc0 20 20 20 20 77 69 6e 43 6c 6f 73 65 28 28 73 71      winClose((sq
11cd0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 2d  lite3_file *)&p-
11ce0 3e 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  >hFile);.       
11cf0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
11d00 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
11d10 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c   }.      if( del
11d20 65 74 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 20  eteFlag ){.     
11d30 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
11d40 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
11d50 20 20 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70       winDelete(p
11d60 56 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d  Vfs, p->zFilenam
11d70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 53  e, 0);.        S
11d80 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
11d90 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d  nign(0);.      }
11da0 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e  .      *pp = p->
11db0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c  pNext;.      sql
11dc0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52 65  ite3_free(p->aRe
11dd0 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  gion);.      sql
11de0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
11df0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
11e00 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20  p = &p->pNext;. 
11e10 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
11e20 2a 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72 65  * Open the share
11e30 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73  d-memory area as
11e40 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 61  sociated with da
11e50 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46  tabase file pDbF
11e60 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70  d..**.** When op
11e70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72  ening a new shar
11e80 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20  ed-memory file, 
11e90 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74  if no other inst
11ea0 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a  ances of that.**
11eb0 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e   file are curren
11ec0 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69  tly open, in thi
11ed0 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20  s process or in 
11ee0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c  other processes,
11ef0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c   then.** the fil
11f00 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61  e must be trunca
11f10 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ted to zero leng
11f20 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68  th or have its h
11f30 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a  eader cleared..*
11f40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
11f50 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79  OpenSharedMemory
11f60 28 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 29  (winFile *pDbFd)
11f70 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68  {.  struct winSh
11f80 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  m *p;           
11f90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
11fa0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f  nnection to be o
11fb0 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  pened */.  struc
11fc0 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53  t winShmNode *pS
11fd0 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a  hmNode = 0;   /*
11fe0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
11ff0 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a  mmapped file */.
12000 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
12010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12020 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
12030 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ode */.  struct 
12040 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77  winShmNode *pNew
12050 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
12060 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 77  ewly allocated w
12070 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69  inShmNode */.  i
12080 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
12090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120a0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61    /* Size of zNa
120b0 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a  me in bytes */..
120c0 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d    assert( pDbFd-
120d0 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f  >pShm==0 );    /
120e0 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79  * Not previously
120f0 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a   opened */..  /*
12100 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
12110 66 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c 69  for the new sqli
12120 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20  te3_shm object. 
12130 20 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69 76   Also speculativ
12140 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  ely.  ** allocat
12150 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65  e space for a ne
12160 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64  w winShmNode and
12170 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   filename..  */.
12180 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    p = sqlite3_ma
12190 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29  lloc( sizeof(*p)
121a0 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
121b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
121c0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  OERR_NOMEM;.  me
121d0 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
121e0 66 28 2a 70 29 29 3b 0a 20 20 6e 4e 61 6d 65 20  f(*p));.  nName 
121f0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
12200 30 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  0(pDbFd->zPath);
12210 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
12220 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
12230 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 4e  (*pShmNode) + nN
12240 61 6d 65 20 2b 20 31 35 20 29 3b 0a 20 20 69 66  ame + 15 );.  if
12250 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
12260 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
12270 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
12280 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
12290 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e  .  }.  memset(pN
122a0 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  ew, 0, sizeof(*p
122b0 4e 65 77 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a  New));.  pNew->z
122c0 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
122d0 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 71  *)&pNew[1];.  sq
122e0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
122f0 4e 61 6d 65 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a  Name+15, pNew->z
12300 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68  Filename, "%s-sh
12310 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  m", pDbFd->zPath
12320 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 6c 65  );.  sqlite3File
12330 53 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a  Suffix3(pDbFd->z
12340 50 61 74 68 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c  Path, pNew->zFil
12350 65 6e 61 6d 65 29 3b 20 0a 0a 20 20 2f 2a 20 4c  ename); ..  /* L
12360 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  ook to see if th
12370 65 72 65 20 69 73 20 61 6e 20 65 78 69 73 74 69  ere is an existi
12380 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 74 68  ng winShmNode th
12390 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a  at can be used..
123a0 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68    ** If no match
123b0 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 63  ing winShmNode c
123c0 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73 2c  urrently exists,
123d0 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   create a new on
123e0 65 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  e..  */.  winShm
123f0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
12400 66 6f 72 28 70 53 68 6d 4e 6f 64 65 20 3d 20 77  for(pShmNode = w
12410 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 20 70  inShmNodeList; p
12420 53 68 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f 64  ShmNode; pShmNod
12430 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78  e=pShmNode->pNex
12440 74 29 7b 0a 20 20 20 20 2f 2a 20 54 42 44 20 6e  t){.    /* TBD n
12450 65 65 64 20 74 6f 20 63 6f 6d 65 20 75 70 20 77  eed to come up w
12460 69 74 68 20 62 65 74 74 65 72 20 6d 61 74 63 68  ith better match
12470 20 68 65 72 65 2e 20 20 50 65 72 68 61 70 73 0a   here.  Perhaps.
12480 20 20 20 20 2a 2a 20 75 73 65 20 46 49 4c 45 5f      ** use FILE_
12490 49 44 5f 42 4f 54 48 5f 44 49 52 5f 49 4e 46 4f  ID_BOTH_DIR_INFO
124a0 20 53 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20   Structure..    
124b0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
124c0 65 33 53 74 72 49 43 6d 70 28 70 53 68 6d 4e 6f  e3StrICmp(pShmNo
124d0 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  de->zFilename, p
124e0 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d  New->zFilename)=
124f0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  =0 ) break;.  }.
12500 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 20 29    if( pShmNode )
12510 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
12520 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73  ee(pNew);.  }els
12530 65 7b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20  e{.    pShmNode 
12540 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77  = pNew;.    pNew
12550 20 3d 20 30 3b 0a 20 20 20 20 28 28 77 69 6e 46   = 0;.    ((winF
12560 69 6c 65 2a 29 28 26 70 53 68 6d 4e 6f 64 65 2d  ile*)(&pShmNode-
12570 3e 68 46 69 6c 65 29 29 2d 3e 68 20 3d 20 49 4e  >hFile))->h = IN
12580 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
12590 55 45 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  UE;.    pShmNode
125a0 2d 3e 70 4e 65 78 74 20 3d 20 77 69 6e 53 68 6d  ->pNext = winShm
125b0 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 69  NodeList;.    wi
125c0 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 70  nShmNodeList = p
125d0 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20 70 53  ShmNode;..    pS
125e0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20  hmNode->mutex = 
125f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
12600 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
12610 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66 28 20  _FAST);.    if( 
12620 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d  pShmNode->mutex=
12630 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
12640 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
12650 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
12660 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
12670 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 69    }..    rc = wi
12680 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e 70 56 66  nOpen(pDbFd->pVf
12690 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
126a0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46      pShmNode->zF
126b0 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20  ilename,        
126c0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
126d0 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29  the file (UTF-8)
126e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
126f0 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69       (sqlite3_fi
12700 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  le*)&pShmNode->h
12710 46 69 6c 65 2c 20 20 2f 2a 20 46 69 6c 65 20 68  File,  /* File h
12720 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20  andle here */.  
12730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
12740 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c  QLITE_OPEN_WAL |
12750 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
12760 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
12770 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 2f 2a 20  OPEN_CREATE, /* 
12780 4d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20  Mode flags */.  
12790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
127a0 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
127b0 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
127c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
127d0 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
127e0 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
127f0 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
12800 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
12810 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63   if another proc
12820 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ess is holding t
12830 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74  he dead-man swit
12840 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f  ch..    ** If no
12850 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  t, truncate the 
12860 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  file to zero len
12870 67 74 68 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  gth. .    */.   
12880 20 69 66 28 20 77 69 6e 53 68 6d 53 79 73 74 65   if( winShmSyste
12890 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
128a0 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f  _SHM_WRLCK, WIN_
128b0 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c  SHM_DMS, 1)==SQL
128c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
128d0 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65  rc = winTruncate
128e0 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
128f0 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
12900 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 0);.      if(
12910 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12920 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
12930 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
12940 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c  E_IOERR_SHMOPEN,
12950 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
12960 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
12970 20 20 20 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22      "winOpenShm"
12980 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
12990 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
129a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
129b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 69  E_OK ){.      wi
129c0 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
129d0 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e  ShmNode, _SHM_UN
129e0 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
129f0 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , 1);.      rc =
12a00 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
12a10 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
12a20 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f  _RDLCK, WIN_SHM_
12a30 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  DMS, 1);.    }. 
12a40 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
12a50 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
12a60 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68   }..  /* Make th
12a70 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e  e new connection
12a80 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20   a child of the 
12a90 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  winShmNode */.  
12aa0 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53  p->pShmNode = pS
12ab0 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53  hmNode;.#ifdef S
12ac0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d  QLITE_DEBUG.  p-
12ad0 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  >id = pShmNode->
12ae0 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e  nextShmId++;.#en
12af0 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  dif.  pShmNode->
12b00 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d  nRef++;.  pDbFd-
12b10 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e  >pShm = p;.  win
12b20 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
12b30 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72  ..  /* The refer
12b40 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53  ence count on pS
12b50 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61  hmNode has alrea
12b60 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e  dy been incremen
12b70 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74  ted under.  ** t
12b80 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20  he cover of the 
12b90 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
12ba0 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65  () mutex and the
12bb0 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68   pointer from th
12bc0 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75  e.  ** new (stru
12bd0 63 74 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63  ct winShm) objec
12be0 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64  t to the pShmNod
12bf0 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  e has been set. 
12c00 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  All that is.  **
12c10 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74   left to do is t
12c20 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f  o link the new o
12c30 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c  bject into the l
12c40 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74  inked list start
12c50 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d  ing.  ** at pShm
12c60 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68  Node->pFirst. Th
12c70 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20  is must be done 
12c80 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68  while holding th
12c90 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e pShmNode->mute
12ca0 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20  x .  ** mutex.. 
12cb0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
12cc0 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
12cd0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d  de->mutex);.  p-
12ce0 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64  >pNext = pShmNod
12cf0 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68  e->pFirst;.  pSh
12d00 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20  mNode->pFirst = 
12d10 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  p;.  sqlite3_mut
12d20 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
12d30 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  e->mutex);.  ret
12d40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
12d50 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f    /* Jump here o
12d60 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73  n any error */.s
12d70 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77  hm_open_err:.  w
12d80 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
12d90 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55  pShmNode, _SHM_U
12da0 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  NLCK, WIN_SHM_DM
12db0 53 2c 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50  S, 1);.  winShmP
12dc0 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73  urge(pDbFd->pVfs
12dd0 2c 20 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68  , 0);      /* Th
12de0 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53  is call frees pS
12df0 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72  hmNode if requir
12e00 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
12e10 66 72 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74  free(p);.  sqlit
12e20 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
12e30 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
12e40 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
12e50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
12e60 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
12e70 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20   shared-memory. 
12e80 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65   Delete the unde
12e90 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61  rlying .** stora
12ea0 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67  ge if deleteFlag
12eb0 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61   is true..*/.sta
12ec0 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e  tic int winShmUn
12ed0 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  map(.  sqlite3_f
12ee0 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
12ef0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f    /* Database ho
12f00 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d  lding shared mem
12f10 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c  ory */.  int del
12f20 65 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20  eteFlag         
12f30 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66      /* Delete af
12f40 74 65 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74  ter closing if t
12f50 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  rue */.){.  winF
12f60 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20  ile *pDbFd;     
12f70 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f    /* Database ho
12f80 6c 64 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lding shared-mem
12f90 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ory */.  winShm 
12fa0 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p;            /
12fb0 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
12fc0 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f   to be closed */
12fd0 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
12fe0 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20  ShmNode; /* The 
12ff0 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65  underlying share
13000 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  d-memory file */
13010 0a 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20  .  winShm **pp; 
13020 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
13030 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62  looping over sib
13040 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
13050 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28   */..  pDbFd = (
13060 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70  winFile*)fd;.  p
13070 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
13080 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
13090 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
130a0 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70   pShmNode = p->p
130b0 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52  ShmNode;..  /* R
130c0 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  emove connection
130d0 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20   p from the set 
130e0 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  of connections a
130f0 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77  ssociated.  ** w
13100 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a  ith pShmNode */.
13110 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
13120 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
13130 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70  mutex);.  for(pp
13140 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  =&pShmNode->pFir
13150 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70  st; (*pp)!=p; pp
13160 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74   = &(*pp)->pNext
13170 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70  ){}.  *pp = p->p
13180 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  Next;..  /* Free
13190 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
131a0 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  p */.  sqlite3_f
131b0 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d  ree(p);.  pDbFd-
131c0 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c  >pShm = 0;.  sql
131d0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
131e0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
131f0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d  );..  /* If pShm
13200 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72  Node->nRef has r
13210 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63  eached 0, then c
13220 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lose the underly
13230 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d  ing.  ** shared-
13240 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f  memory file, too
13250 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65   */.  winShmEnte
13260 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65  rMutex();.  asse
13270 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  rt( pShmNode->nR
13280 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f  ef>0 );.  pShmNo
13290 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  de->nRef--;.  if
132a0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
132b0 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68  ==0 ){.    winSh
132c0 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56  mPurge(pDbFd->pV
132d0 66 73 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b  fs, deleteFlag);
132e0 0a 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61  .  }.  winShmLea
132f0 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65  veMutex();..  re
13300 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13310 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
13320 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66  the lock state f
13330 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  or a shared-memo
13340 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73  ry segment..*/.s
13350 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
13360 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f  Lock(.  sqlite3_
13370 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
13380 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
13390 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
133a0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
133b0 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20  .  int ofst,    
133c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
133d0 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61   First lock to a
133e0 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73  cquire or releas
133f0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20  e */.  int n,   
13400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13410 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
13420 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20  ocks to acquire 
13430 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  or release */.  
13440 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
13450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
13460 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
13470 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77  e lock */.){.  w
13480 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  inFile *pDbFd = 
13490 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20  (winFile*)fd;   
134a0 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
134b0 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  on holding share
134c0 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69  d memory */.  wi
134d0 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d  nShm *p = pDbFd-
134e0 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  >pShm;          
134f0 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
13500 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c  d memory being l
13510 6f 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68  ocked */.  winSh
13520 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  m *pX;          
13530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13540 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
13550 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67  over all sibling
13560 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  s */.  winShmNod
13570 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  e *pShmNode = p-
13580 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74  >pShmNode;.  int
13590 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
135a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135b0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
135c0 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b  e */.  u16 mask;
135d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
135f0 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  Mask of locks to
13600 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65   take or release
13610 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f   */..  assert( o
13620 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e  fst>=0 && ofst+n
13630 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  <=SQLITE_SHM_NLO
13640 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
13650 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  n>=1 );.  assert
13660 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  ( flags==(SQLITE
13670 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
13680 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
13690 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
136a0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
136b0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
136c0 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20  CLUSIVE).       
136d0 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
136e0 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
136f0 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
13700 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
13710 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
13720 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
13730 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b  HM_EXCLUSIVE) );
13740 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
13750 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  || (flags & SQLI
13760 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
13770 29 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20  )!=0 );..  mask 
13780 3d 20 28 75 31 36 29 28 28 31 55 3c 3c 28 6f 66  = (u16)((1U<<(of
13790 73 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66  st+n)) - (1U<<of
137a0 73 74 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  st));.  assert( 
137b0 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c  n>1 || mask==(1<
137c0 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69  <ofst) );.  sqli
137d0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
137e0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
137f0 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
13800 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
13810 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  K ){.    u16 all
13820 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73  Mask = 0; /* Mas
13830 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  k of locks held 
13840 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a  by siblings */..
13850 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e      /* See if an
13860 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20  y siblings hold 
13870 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a  this same lock *
13880 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
13890 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
138a0 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
138b0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  {.      if( pX==
138c0 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  p ) continue;.  
138d0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d      assert( (pX-
138e0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e  >exclMask & (p->
138f0 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72  exclMask|p->shar
13900 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20  edMask))==0 );. 
13910 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20       allMask |= 
13920 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a  pX->sharedMask;.
13930 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
13940 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d  lock the system-
13950 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  level locks */. 
13960 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61     if( (mask & a
13970 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  llMask)==0 ){.  
13980 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53      rc = winShmS
13990 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
139a0 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20  de, _SHM_UNLCK, 
139b0 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53  ofst+WIN_SHM_BAS
139c0 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  E, n);.    }else
139d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
139e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20  ITE_OK;.    }.. 
139f0 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c     /* Undo the l
13a00 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ocal locks */.  
13a10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13a20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
13a30 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
13a40 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  k;.      p->shar
13a50 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
13a60 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20  .    } .  }else 
13a70 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
13a80 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b  TE_SHM_SHARED ){
13a90 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72  .    u16 allShar
13aa0 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f  ed = 0;  /* Unio
13ab0 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  n of locks held 
13ac0 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f  by connections o
13ad0 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f  ther than "p" */
13ae0 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75  ..    /* Find ou
13af0 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c  t which shared l
13b00 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79  ocks are already
13b10 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
13b20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20   connections..  
13b30 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c    ** If any sibl
13b40 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64  ing already hold
13b50 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
13b60 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  ock, go ahead an
13b70 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  d return.    ** 
13b80 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20  SQLITE_BUSY..   
13b90 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
13ba0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
13bb0 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
13bc0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
13bd0 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
13be0 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
13bf0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
13c00 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
13c10 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
13c20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58   allShared |= pX
13c30 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
13c40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
13c50 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20  shared locks at 
13c60 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
13c70 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  , if necessary *
13c80 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
13c90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13ca0 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20   if( (allShared 
13cb0 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
13cc0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
13cd0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
13ce0 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b  Node, _SHM_RDLCK
13cf0 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42  , ofst+WIN_SHM_B
13d00 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  ASE, n);.      }
13d10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
13d20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13d30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
13d40 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61   /* Get the loca
13d50 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a  l shared locks *
13d60 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
13d70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13d80 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c   p->sharedMask |
13d90 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20  = mask;.    }.  
13da0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61  }else{.    /* Ma
13db0 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69  ke sure no sibli
13dc0 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68  ng connections h
13dd0 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77  old locks that w
13de0 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20  ill block this. 
13df0 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20     ** lock.  If 
13e00 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53  any do, return S
13e10 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74  QLITE_BUSY right
13e20 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20   away..    */.  
13e30 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
13e40 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
13e50 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
13e60 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
13e70 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
13e80 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d   || (pX->sharedM
13e90 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29  ask & mask)!=0 )
13ea0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
13eb0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
13ec0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
13ed0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
13ee0 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75  /* Get the exclu
13ef0 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68  sive locks at th
13f00 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20  e system level. 
13f10 20 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73   Then if success
13f20 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20  ful.    ** also 
13f30 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63  mark the local c
13f40 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69  onnection as bei
13f50 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a  ng locked..    *
13f60 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
13f70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13f80 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74   rc = winShmSyst
13f90 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
13fa0 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73   _SHM_WRLCK, ofs
13fb0 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20  t+WIN_SHM_BASE, 
13fc0 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
13fd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13fe0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
13ff0 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  p->sharedMask & 
14000 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20  mask)==0 );.    
14010 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20      p->exclMask 
14020 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d  |= mask;.      }
14030 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
14040 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
14050 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
14060 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  );.  OSTRACE(("S
14070 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64  HM-LOCK shmid-%d
14080 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33  , pid-%d got %03
14090 78 2c 25 30 33 78 20 25 73 5c 6e 22 2c 0a 20 20  x,%03x %s\n",.  
140a0 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20           p->id, 
140b0 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e  (int)osGetCurren
140c0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 2d  tProcessId(), p-
140d0 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e  >sharedMask, p->
140e0 65 78 63 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20  exclMask,.      
140f0 20 20 20 20 20 72 63 20 3f 20 22 66 61 69 6c 65       rc ? "faile
14100 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 20 20 72  d" : "ok"));.  r
14110 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14120 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d  ** Implement a m
14130 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72  emory barrier or
14140 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e   memory fence on
14150 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20   shared memory. 
14160 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64   .**.** All load
14170 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67  s and stores beg
14180 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61  un before the ba
14190 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c  rrier must compl
141a0 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ete before.** an
141b0 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20  y load or store 
141c0 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20  begun after the 
141d0 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74  barrier..*/.stat
141e0 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 42 61  ic void winShmBa
141f0 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33  rrier(.  sqlite3
14200 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20  _file *fd       
14210 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
14220 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
14230 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20  d memory */.){. 
14240 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
14250 52 28 66 64 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f  R(fd);.  /* Memo
14260 72 79 42 61 72 72 69 65 72 28 29 3b 20 2f 2f 20  ryBarrier(); // 
14270 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d  does not work --
14280 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 77 68 79   do not know why
14290 20 6e 6f 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d   not */.  winShm
142a0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
142b0 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
142c0 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ();.}../*.** Thi
142d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
142e0 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61  lled to obtain a
142f0 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69   pointer to regi
14300 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68  on iRegion of th
14310 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d  e .** shared-mem
14320 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
14330 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
14340 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64   file fd. Shared
14350 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20  -memory regions 
14360 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64  .** are numbered
14370 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a   starting from z
14380 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64  ero. Each shared
14390 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69  -memory region i
143a0 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62  s szRegion .** b
143b0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
143c0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
143d0 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
143e0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
143f0 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74  d and *pp is set
14400 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
14410 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
14420 65 20 69 73 57 72 69 74 65 20 70 61 72 61 6d 65  e isWrite parame
14430 74 65 72 20 69 73 20 30 20 61 6e 64 20 74 68 65  ter is 0 and the
14440 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65   requested share
14450 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69  d-memory.** regi
14460 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  on has not been 
14470 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e  allocated (by an
14480 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64  y client, includ
14490 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20  ing one running 
144a0 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65  in a.** separate
144b0 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20   process), then 
144c0 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55  *pp is set to NU
144d0 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  LL and SQLITE_OK
144e0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a   returned. If .*
144f0 2a 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e  * isWrite is non
14500 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65  -zero and the re
14510 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
14520 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73  emory region has
14530 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65 65   not yet .** bee
14540 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
14550 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  is allocated by 
14560 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
14570 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72  *.** If the shar
14580 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
14590 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
145a0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69  n allocated or i
145b0 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a  s allocated by.*
145c0 2a 20 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64  * this call as d
145d0 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20  escribed above, 
145e0 74 68 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65  then it is mappe
145f0 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  d into this proc
14600 65 73 73 65 73 20 0a 2a 2a 20 61 64 64 72 65 73  esses .** addres
14610 73 20 73 70 61 63 65 20 28 69 66 20 69 74 20 69  s space (if it i
14620 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20  s not already), 
14630 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f  *pp is set to po
14640 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65  int to the mappe
14650 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64  d .** memory and
14660 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
14670 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
14680 6e 74 20 77 69 6e 53 68 6d 4d 61 70 28 0a 20 20  nt winShmMap(.  
14690 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
146a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
146b0 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f  /* Handle open o
146c0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
146d0 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e  */.  int iRegion
146e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
146f0 20 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74       /* Region t
14700 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20  o retrieve */.  
14710 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20  int szRegion,   
14720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14730 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f  /* Size of regio
14740 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 57 72  ns */.  int isWr
14750 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ite,            
14760 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
14770 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69  to extend file i
14780 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
14790 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a   void volatile *
147a0 2a 70 70 20 20 20 20 20 20 20 20 20 20 20 20 20  *pp             
147b0 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20   /* OUT: Mapped 
147c0 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 77  memory */.){.  w
147d0 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  inFile *pDbFd = 
147e0 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20  (winFile*)fd;.  
147f0 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46  winShm *p = pDbF
14800 64 2d 3e 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68  d->pShm;.  winSh
14810 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
14820 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14830 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70  TE_OK;..  if( !p
14840 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   ){.    rc = win
14850 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79  OpenSharedMemory
14860 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28  (pDbFd);.    if(
14870 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14880 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14890 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
148a0 0a 20 20 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20  .  }.  pShmNode 
148b0 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a  = p->pShmNode;..
148c0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
148d0 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
148e0 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
148f0 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d  ( szRegion==pShm
14900 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c  Node->szRegion |
14910 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  | pShmNode->nReg
14920 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  ion==0 );..  if(
14930 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
14940 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20  on<=iRegion ){. 
14950 20 20 20 73 74 72 75 63 74 20 53 68 6d 52 65 67     struct ShmReg
14960 69 6f 6e 20 2a 61 70 4e 65 77 3b 20 20 20 20 20  ion *apNew;     
14970 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 52 65        /* New aRe
14980 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  gion[] array */.
14990 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
149a0 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65  (iRegion+1)*szRe
149b0 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  gion;  /* Minimu
149c0 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c 65 20  m required file 
149d0 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  size */.    sqli
149e0 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20  te3_int64 sz;   
149f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14a00 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  * Current size o
14a10 66 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65  f wal-index file
14a20 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64   */..    pShmNod
14a30 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a  e->szRegion = sz
14a40 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20  Region;..    /* 
14a50 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  The requested re
14a60 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70  gion is not mapp
14a70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
14a80 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
14a90 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65  pace..    ** Che
14aa0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ck to see if it 
14ab0 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
14ac0 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20  ed (i.e. if the 
14ad0 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69  wal-index file i
14ae0 73 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65  s.    ** large e
14af0 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e  nough to contain
14b00 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72   the requested r
14b10 65 67 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20  egion)..    */. 
14b20 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53     rc = winFileS
14b30 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ize((sqlite3_fil
14b40 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  e *)&pShmNode->h
14b50 46 69 6c 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20  File, &sz);.    
14b60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14b70 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
14b80 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
14b90 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
14ba0 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
14bb0 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
14bc0 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 31 22 2c     "winShmMap1",
14bd0 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
14be0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
14bf0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ge_out;.    }.. 
14c00 20 20 20 69 66 28 20 73 7a 3c 6e 42 79 74 65 20     if( sz<nByte 
14c10 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
14c20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
14c30 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74   region does not
14c40 20 65 78 69 73 74 2e 20 49 66 20 69 73 57 72 69   exist. If isWri
14c50 74 65 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20  te is set to.   
14c60 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74     ** zero, exit
14c70 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c   early. *pp will
14c80 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   be set to NULL 
14c90 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
14ca0 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a  turned..      **
14cb0 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e  .      ** Altern
14cc0 61 74 69 76 65 6c 79 2c 20 69 66 20 69 73 57 72  atively, if isWr
14cd0 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ite is non-zero,
14ce0 20 75 73 65 20 66 74 72 75 6e 63 61 74 65 28 29   use ftruncate()
14cf0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20   to allocate.   
14d00 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73     ** the reques
14d10 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
14d20 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
14d30 20 20 69 66 28 20 21 69 73 57 72 69 74 65 20 29    if( !isWrite )
14d40 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
14d50 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  t;.      rc = wi
14d60 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69 74  nTruncate((sqlit
14d70 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e  e3_file *)&pShmN
14d80 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74  ode->hFile, nByt
14d90 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
14da0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14db0 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c         rc = winL
14dc0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
14dd0 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73  OERR_SHMSIZE, os
14de0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
14df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e00 20 22 77 69 6e 53 68 6d 4d 61 70 32 22 2c 20 70   "winShmMap2", p
14e10 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
14e20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
14e30 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ge_out;.      }.
14e40 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
14e50 70 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  p the requested 
14e60 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e  memory region in
14e70 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
14e80 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
14e90 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20   */.    apNew = 
14ea0 28 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f  (struct ShmRegio
14eb0 6e 20 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  n *)sqlite3_real
14ec0 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53 68  loc(.        pSh
14ed0 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20  mNode->aRegion, 
14ee0 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65  (iRegion+1)*size
14ef0 6f 66 28 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20  of(apNew[0]).   
14f00 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e   );.    if( !apN
14f10 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ew ){.      rc =
14f20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
14f30 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
14f40 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
14f50 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d   }.    pShmNode-
14f60 3e 61 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77  >aRegion = apNew
14f70 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53  ;..    while( pS
14f80 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
14f90 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  =iRegion ){.    
14fa0 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20    HANDLE hMap;  
14fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14fc0 20 66 69 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61   file-mapping ha
14fd0 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f  ndle */.      vo
14fe0 69 64 20 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20  id *pMap = 0;   
14ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70            /* Map
15000 70 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ped memory regio
15010 6e 20 2a 2f 0a 20 20 20 20 20 0a 20 20 20 20 20  n */.     .     
15020 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65   hMap = osCreate
15030 46 69 6c 65 4d 61 70 70 69 6e 67 28 70 53 68 6d  FileMapping(pShm
15040 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a  Node->hFile.h, .
15050 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20            NULL, 
15060 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20  PAGE_READWRITE, 
15070 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20  0, nByte, NULL. 
15080 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 4f 53       );.      OS
15090 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 20  TRACE(("SHM-MAP 
150a0 70 69 64 2d 25 64 20 63 72 65 61 74 65 20 72 65  pid-%d create re
150b0 67 69 6f 6e 3d 25 64 20 6e 62 79 74 65 3d 25 64  gion=%d nbyte=%d
150c0 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
150d0 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73 47 65         (int)osGe
150e0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
150f0 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  d(), pShmNode->n
15100 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20  Region, nByte,. 
15110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 4d                hM
15120 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  ap ? "ok" : "fai
15130 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 69 66  led"));.      if
15140 28 20 68 4d 61 70 20 29 7b 0a 20 20 20 20 20 20  ( hMap ){.      
15150 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20    int iOffset = 
15160 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
15170 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20  n*szRegion;.    
15180 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53      int iOffsetS
15190 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25  hift = iOffset %
151a0 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c   winSysInfo.dwAl
151b0 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72  locationGranular
151c0 69 74 79 3b 0a 20 20 20 20 20 20 20 20 70 4d 61  ity;.        pMa
151d0 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  p = osMapViewOfF
151e0 69 6c 65 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d  ile(hMap, FILE_M
151f0 41 50 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f  AP_WRITE | FILE_
15200 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20 20 20 20  MAP_READ,.      
15210 20 20 20 20 20 20 30 2c 20 69 4f 66 66 73 65 74        0, iOffset
15220 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c   - iOffsetShift,
15230 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66   szRegion + iOff
15240 73 65 74 53 68 69 66 74 0a 20 20 20 20 20 20 20  setShift.       
15250 20 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52   );.        OSTR
15260 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 20 70 69  ACE(("SHM-MAP pi
15270 64 2d 25 64 20 6d 61 70 20 72 65 67 69 6f 6e 3d  d-%d map region=
15280 25 64 20 6f 66 66 73 65 74 3d 25 64 20 73 69 7a  %d offset=%d siz
15290 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  e=%d %s\n",.    
152a0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
152b0 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  t)osGetCurrentPr
152c0 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e  ocessId(), pShmN
152d0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f  ode->nRegion, iO
152e0 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20  ffset,.         
152f0 20 20 20 20 20 20 20 20 73 7a 52 65 67 69 6f 6e          szRegion
15300 2c 20 70 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20  , pMap ? "ok" : 
15310 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20  "failed"));.    
15320 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
15330 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Map ){.        p
15340 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72  ShmNode->lastErr
15350 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
15360 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 72  ror();.        r
15370 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
15380 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
15390 4d 41 50 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c  MAP, pShmNode->l
153a0 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
153b0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
153c0 68 6d 4d 61 70 33 22 2c 20 70 44 62 46 64 2d 3e  hmMap3", pDbFd->
153d0 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  zPath);.        
153e0 69 66 28 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f  if( hMap ) osClo
153f0 73 65 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a  seHandle(hMap);.
15400 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
15410 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
15420 7d 0a 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  }..      pShmNod
15430 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e  e->aRegion[pShmN
15440 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d  ode->nRegion].pM
15450 61 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20  ap = pMap;.     
15460 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
15470 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  on[pShmNode->nRe
15480 67 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61  gion].hMap = hMa
15490 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  p;.      pShmNod
154a0 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20  e->nRegion++;.  
154b0 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65    }.  }..shmpage
154c0 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d  _out:.  if( pShm
154d0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52  Node->nRegion>iR
154e0 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74  egion ){.    int
154f0 20 69 4f 66 66 73 65 74 20 3d 20 69 52 65 67 69   iOffset = iRegi
15500 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20  on*szRegion;.   
15510 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66   int iOffsetShif
15520 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69  t = iOffset % wi
15530 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63  nSysInfo.dwAlloc
15540 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79  ationGranularity
15550 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20  ;.    char *p = 
15560 28 63 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65  (char *)pShmNode
15570 2d 3e 61 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f  ->aRegion[iRegio
15580 6e 5d 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70  n].pMap;.    *pp
15590 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f   = (void *)&p[iO
155a0 66 66 73 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d  ffsetShift];.  }
155b0 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20  else{.    *pp = 
155c0 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
155d0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
155e0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
155f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
15600 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69  else.# define wi
15610 6e 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20  nShmMap     0.# 
15620 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63  define winShmLoc
15630 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20  k    0.# define 
15640 77 69 6e 53 68 6d 42 61 72 72 69 65 72 20 30 0a  winShmBarrier 0.
15650 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 55  # define winShmU
15660 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20  nmap   0.#endif 
15670 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
15680 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f  E_OMIT_WAL */../
15690 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74  *.** Here ends t
156a0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
156b0 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33  n of all sqlite3
156c0 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a  _file methods..*
156d0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
156e0 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c  ******** End sql
156f0 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64  ite3_file Method
15700 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
15710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15720 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
15730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15770 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65  /../*.** This ve
15780 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c  ctor defines all
15790 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61   the methods tha
157a0 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e  t can operate on
157b0 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66   an.** sqlite3_f
157c0 69 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a  ile for win32..*
157d0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
157e0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
157f0 73 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20  s winIoMethod = 
15800 7b 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20 20  {.  2,          
15810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15820 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
15830 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20  */.  winClose,  
15840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15850 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a       /* xClose *
15860 2f 0a 20 20 77 69 6e 52 65 61 64 2c 20 20 20 20  /.  winRead,    
15870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15880 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a      /* xRead */.
15890 20 20 77 69 6e 57 72 69 74 65 2c 20 20 20 20 20    winWrite,     
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158b0 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20    /* xWrite */. 
158c0 20 77 69 6e 54 72 75 6e 63 61 74 65 2c 20 20 20   winTruncate,   
158d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158e0 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f   /* xTruncate */
158f0 0a 20 20 77 69 6e 53 79 6e 63 2c 20 20 20 20 20  .  winSync,     
15900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15910 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20     /* xSync */. 
15920 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20   winFileSize,   
15930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15940 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f   /* xFileSize */
15950 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20 20 20 20 20  .  winLock,     
15960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15970 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20     /* xLock */. 
15980 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20 20   winUnlock,     
15990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159a0 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20   /* xUnlock */. 
159b0 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65   winCheckReserve
159c0 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  dLock,          
159d0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
159e0 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46  edLock */.  winF
159f0 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20  ileControl,     
15a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
15a10 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20  FileControl */. 
15a20 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20   winSectorSize, 
15a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a40 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20   /* xSectorSize 
15a50 2a 2f 0a 20 20 77 69 6e 44 65 76 69 63 65 43 68  */.  winDeviceCh
15a60 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20  aracteristics,  
15a70 20 20 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43       /* xDeviceC
15a80 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a  haracteristics *
15a90 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20  /.  winShmMap,  
15aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ab0 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a      /* xShmMap *
15ac0 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20  /.  winShmLock, 
15ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ae0 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20      /* xShmLock 
15af0 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72 72 69  */.  winShmBarri
15b00 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
15b10 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72       /* xShmBarr
15b20 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 55  ier */.  winShmU
15b30 6e 6d 61 70 20 20 20 20 20 20 20 20 20 20 20 20  nmap            
15b40 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
15b50 55 6e 6d 61 70 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a  Unmap */.};../**
15b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
15bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15bc0 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f  ******* sqlite3_
15bd0 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  vfs methods ****
15be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15bf0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
15c00 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  his division con
15c10 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d  tains the implem
15c20 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68  entation of meth
15c30 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71  ods on the.** sq
15c40 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74  lite3_vfs object
15c50 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ..*/../*.** Conv
15c60 65 72 74 20 61 20 55 54 46 2d 38 20 66 69 6c 65  ert a UTF-8 file
15c70 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61 74 65 76  name into whatev
15c80 65 72 20 66 6f 72 6d 20 74 68 65 20 75 6e 64 65  er form the unde
15c90 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  rlying.** operat
15ca0 69 6e 67 20 73 79 73 74 65 6d 20 77 61 6e 74 73  ing system wants
15cb0 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20   filenames in.  
15cc0 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
15cd0 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f  e result.** is o
15ce0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
15cf0 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20  loc and must be 
15d00 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
15d10 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
15d20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15d30 20 2a 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c   *convertUtf8Fil
15d40 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72  ename(const char
15d50 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
15d60 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
15d70 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 73 4e 54   = 0;.  if( isNT
15d80 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65  () ){.    zConve
15d90 72 74 65 64 20 3d 20 75 74 66 38 54 6f 55 6e 69  rted = utf8ToUni
15da0 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  code(zFilename);
15db0 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20  ./* isNT() is 1 
15dc0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
15dd0 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65  CE==1, so this e
15de0 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65  lse is never exe
15df0 63 75 74 65 64 2e 20 0a 2a 2f 0a 23 69 66 20 53  cuted. .*/.#if S
15e00 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
15e10 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  0.  }else{.    z
15e20 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69  Converted = sqli
15e30 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74  te3_win32_utf8_t
15e40 6f 5f 6d 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65  o_mbcs(zFilename
15e50 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
15e60 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68  /* caller will h
15e70 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d  andle out of mem
15e80 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ory */.  return 
15e90 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f  zConverted;.}../
15ea0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65  *.** Create a te
15eb0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
15ec0 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66  e in zBuf.  zBuf
15ed0 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f   must be big eno
15ee0 75 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61  ugh to.** hold a
15ef0 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  t pVfs->mxPathna
15f00 6d 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a  me characters..*
15f10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
15f20 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75  Tempname(int nBu
15f30 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
15f40 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 43    static char zC
15f50 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62  hars[] =.    "ab
15f60 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
15f70 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41  stuvwxyz".    "A
15f80 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
15f90 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22  RSTUVWXYZ".    "
15fa0 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 73  0123456789";.  s
15fb0 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 63 68  ize_t i, j;.  ch
15fc0 61 72 20 7a 54 65 6d 70 50 61 74 68 5b 4d 41 58  ar zTempPath[MAX
15fd0 5f 50 41 54 48 2b 31 5d 3b 0a 0a 20 20 2f 2a 20  _PATH+1];..  /* 
15fe0 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
15ff0 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
16000 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
16010 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
16020 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
16030 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
16040 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
16050 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
16060 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
16070 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20  tion failing. . 
16080 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   */.  SimulateIO
16090 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
160a0 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20  LITE_IOERR );.. 
160b0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 6d   if( sqlite3_tem
160c0 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20  p_directory ){. 
160d0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
160e0 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c  ntf(MAX_PATH-30,
160f0 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22   zTempPath, "%s"
16100 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  , sqlite3_temp_d
16110 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 7d 65 6c  irectory);.  }el
16120 73 65 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  se if( isNT() ){
16130 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74  .    char *zMult
16140 69 3b 0a 20 20 20 20 57 43 48 41 52 20 7a 57 69  i;.    WCHAR zWi
16150 64 65 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d  dePath[MAX_PATH]
16160 3b 0a 20 20 20 20 6f 73 47 65 74 54 65 6d 70 50  ;.    osGetTempP
16170 61 74 68 57 28 4d 41 58 5f 50 41 54 48 2d 33 30  athW(MAX_PATH-30
16180 2c 20 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20  , zWidePath);.  
16190 20 20 7a 4d 75 6c 74 69 20 3d 20 75 6e 69 63 6f    zMulti = unico
161a0 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65 50 61  deToUtf8(zWidePa
161b0 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75  th);.    if( zMu
161c0 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  lti ){.      sql
161d0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
161e0 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70  X_PATH-30, zTemp
161f0 50 61 74 68 2c 20 22 25 73 22 2c 20 7a 4d 75 6c  Path, "%s", zMul
16200 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ti);.      sqlit
16210 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b  e3_free(zMulti);
16220 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16230 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16240 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
16250 20 7d 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20   }./* isNT() is 
16260 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  1 if SQLITE_OS_W
16270 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73  INCE==1, so this
16280 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65   else is never e
16290 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e  xecuted. .** Sin
162a0 63 65 20 74 68 65 20 41 53 43 49 49 20 76 65 72  ce the ASCII ver
162b0 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69  sion of these Wi
162c0 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74  ndows API do not
162d0 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45   exist for WINCE
162e0 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74  ,.** it's import
162f0 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72  ant to not refer
16300 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49  ence them for WI
16310 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23  NCE builds..*/.#
16320 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
16330 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20  CE==0.  }else{. 
16340 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a     char *zUtf8;.
16350 20 20 20 20 63 68 61 72 20 7a 4d 62 63 73 50 61      char zMbcsPa
16360 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20  th[MAX_PATH];.  
16370 20 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41    osGetTempPathA
16380 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 4d  (MAX_PATH-30, zM
16390 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20 7a 55  bcsPath);.    zU
163a0 74 66 38 20 3d 20 73 71 6c 69 74 65 33 5f 77 69  tf8 = sqlite3_wi
163b0 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
163c0 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20  (zMbcsPath);.   
163d0 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20   if( zUtf8 ){.  
163e0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
163f0 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30  intf(MAX_PATH-30
16400 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73  , zTempPath, "%s
16410 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ", zUtf8);.     
16420 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55   sqlite3_free(zU
16430 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tf8);.    }else{
16440 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
16450 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
16460 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
16470 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
16480 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62  hat the output b
16490 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65  uffer is large e
164a0 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65  nough for the te
164b0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20  mporary file .  
164c0 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69  ** name. If it i
164d0 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51  s not, return SQ
164e0 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f  LITE_ERROR..  */
164f0 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 53  .  if( (sqlite3S
16500 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 50 61 74  trlen30(zTempPat
16510 68 29 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c  h) + sqlite3Strl
16520 65 6e 33 30 28 53 51 4c 49 54 45 5f 54 45 4d 50  en30(SQLITE_TEMP
16530 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20 2b 20  _FILE_PREFIX) + 
16540 31 37 29 20 3e 3d 20 6e 42 75 66 20 29 7b 0a 20  17) >= nBuf ){. 
16550 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16560 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 66  _ERROR;.  }..  f
16570 6f 72 28 69 3d 73 71 6c 69 74 65 33 53 74 72 6c  or(i=sqlite3Strl
16580 65 6e 33 30 28 7a 54 65 6d 70 50 61 74 68 29 3b  en30(zTempPath);
16590 20 69 3e 30 20 26 26 20 7a 54 65 6d 70 50 61 74   i>0 && zTempPat
165a0 68 5b 69 2d 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d  h[i-1]=='\\'; i-
165b0 2d 29 7b 7d 0a 20 20 7a 54 65 6d 70 50 61 74 68  -){}.  zTempPath
165c0 5b 69 5d 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69  [i] = 0;..  sqli
165d0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
165e0 66 2d 31 37 2c 20 7a 42 75 66 2c 0a 20 20 20 20  f-17, zBuf,.    
165f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
16600 25 73 5c 5c 22 53 51 4c 49 54 45 5f 54 45 4d 50  %s\\"SQLITE_TEMP
16610 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 54  _FILE_PREFIX, zT
16620 65 6d 70 50 61 74 68 29 3b 0a 20 20 6a 20 3d 20  empPath);.  j = 
16630 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
16640 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  zBuf);.  sqlite3
16650 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20  _randomness(15, 
16660 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72  &zBuf[j]);.  for
16670 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c  (i=0; i<15; i++,
16680 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b   j++){.    zBuf[
16690 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72  j] = (char)zChar
166a0 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68  s[ ((unsigned ch
166b0 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a  ar)zBuf[j])%(siz
166c0 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d  eof(zChars)-1) ]
166d0 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20  ;.  }.  zBuf[j] 
166e0 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  = 0;..  OSTRACE(
166f0 28 22 54 45 4d 50 20 46 49 4c 45 4e 41 4d 45 3a  ("TEMP FILENAME:
16700 20 25 73 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a   %s\n", zBuf));.
16710 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16720 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  OK; .}../*.** Op
16730 65 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  en a file..*/.st
16740 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e  atic int winOpen
16750 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
16760 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a  *pVfs,        /*
16770 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63   Not used */.  c
16780 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
16790 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ,        /* Name
167a0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55 54   of the file (UT
167b0 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  F-8) */.  sqlite
167c0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20  3_file *id,     
167d0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
167e0 20 53 51 4c 69 74 65 20 66 69 6c 65 20 68 61 6e   SQLite file han
167f0 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  dle here */.  in
16800 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
16810 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
16820 6d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20  mode flags */.  
16830 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20  int *pOutFlags  
16840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
16850 74 75 73 20 72 65 74 75 72 6e 20 66 6c 61 67 73  tus return flags
16860 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20   */.){.  HANDLE 
16870 68 3b 0a 20 20 44 57 4f 52 44 20 64 77 44 65 73  h;.  DWORD dwDes
16880 69 72 65 64 41 63 63 65 73 73 3b 0a 20 20 44 57  iredAccess;.  DW
16890 4f 52 44 20 64 77 53 68 61 72 65 4d 6f 64 65 3b  ORD dwShareMode;
168a0 0a 20 20 44 57 4f 52 44 20 64 77 43 72 65 61 74  .  DWORD dwCreat
168b0 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a  ionDisposition;.
168c0 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 41    DWORD dwFlagsA
168d0 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 30  ndAttributes = 0
168e0 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
168f0 57 49 4e 43 45 0a 20 20 69 6e 74 20 69 73 54 65  WINCE.  int isTe
16900 6d 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  mp = 0;.#endif. 
16910 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
16920 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
16930 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
16940 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
16950 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20   /* Filename in 
16960 4f 53 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20  OS encoding */. 
16970 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 74   const char *zUt
16980 66 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20  f8Name = zName; 
16990 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55  /* Filename in U
169a0 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f  TF-8 encoding */
169b0 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
169c0 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e  .  /* If argumen
169d0 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c  t zPath is a NUL
169e0 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20  L pointer, this 
169f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75  function is requ
16a00 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a  ired to open.  *
16a10 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  * a temporary fi
16a20 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62 75 66  le. Use this buf
16a30 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65  fer to store the
16a40 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20   file name in.. 
16a50 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e   */.  char zTmpn
16a60 61 6d 65 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b  ame[MAX_PATH+1];
16a70 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75       /* Buffer u
16a80 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 74 65  sed to create te
16a90 6d 70 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 0a  mp filename */..
16aa0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
16ab0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
16ac0 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74   /* Function Ret
16ad0 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69 66 20  urn Code */.#if 
16ae0 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
16af0 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   || SQLITE_OS_WI
16b00 4e 43 45 0a 20 20 69 6e 74 20 65 54 79 70 65 20  NCE.  int eType 
16b10 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46  = flags&0xFFFFFF
16b20 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20  00;  /* Type of 
16b30 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
16b40 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20 69 73  #endif..  int is
16b50 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c  Exclusive  = (fl
16b60 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
16b70 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20  N_EXCLUSIVE);.  
16b80 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20  int isDelete    
16b90 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
16ba0 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
16bb0 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73  CLOSE);.  int is
16bc0 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c  Create     = (fl
16bd0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
16be0 4e 5f 43 52 45 41 54 45 29 3b 0a 23 69 66 6e 64  N_CREATE);.#ifnd
16bf0 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20  ef NDEBUG.  int 
16c00 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28  isReadonly   = (
16c10 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
16c20 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 23  PEN_READONLY);.#
16c30 65 6e 64 69 66 0a 20 20 69 6e 74 20 69 73 52 65  endif.  int isRe
16c40 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67  adWrite  = (flag
16c50 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
16c60 52 45 41 44 57 52 49 54 45 29 3b 0a 0a 23 69 66  READWRITE);..#if
16c70 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e  ndef NDEBUG.  in
16c80 74 20 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20  t isOpenJournal 
16c90 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28  = (isCreate && (
16ca0 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d  .        eType==
16cb0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
16cc0 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  ER_JOURNAL .    
16cd0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
16ce0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
16cf0 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79  NAL .     || eTy
16d00 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
16d10 57 41 4c 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66  WAL.  ));.#endif
16d20 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65  ..  /* Check the
16d30 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65   following state
16d40 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20  ments are true: 
16d50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29  .  **.  **   (a)
16d60 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20   Exactly one of 
16d70 74 68 65 20 52 45 41 44 57 52 49 54 45 20 61 6e  the READWRITE an
16d80 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73  d READONLY flags
16d90 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e   must be set, an
16da0 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66  d .  **   (b) if
16db0 20 43 52 45 41 54 45 20 69 73 20 73 65 74 2c 20   CREATE is set, 
16dc0 74 68 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d  then READWRITE m
16dd0 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c  ust also be set,
16de0 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20   and.  **   (c) 
16df0 69 66 20 45 58 43 4c 55 53 49 56 45 20 69 73 20  if EXCLUSIVE is 
16e00 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45  set, then CREATE
16e10 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
16e20 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66  t..  **   (d) if
16e30 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69   DELETEONCLOSE i
16e40 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41  s set, then CREA
16e50 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
16e60 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  set..  */.  asse
16e70 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d  rt((isReadonly==
16e80 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65  0 || isReadWrite
16e90 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61 64 57  ==0) && (isReadW
16ea0 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e  rite || isReadon
16eb0 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ly));.  assert(i
16ec0 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73  sCreate==0 || is
16ed0 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73  ReadWrite);.  as
16ee0 73 65 72 74 28 69 73 45 78 63 6c 75 73 69 76 65  sert(isExclusive
16ef0 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29  ==0 || isCreate)
16f00 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44 65 6c  ;.  assert(isDel
16f10 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ete==0 || isCrea
16f20 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d  te);..  /* The m
16f30 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75  ain DB, main jou
16f40 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61  rnal, WAL file a
16f50 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  nd master journa
16f60 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20 20 2a  l are never .  *
16f70 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
16f80 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65  deleted. Nor are
16f90 20 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f   they ever tempo
16fa0 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a  rary files.  */.
16fb0 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
16fc0 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
16fd0 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
16fe0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a  OPEN_MAIN_DB );.
16ff0 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
17000 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
17010 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
17020 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
17030 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  L );.  assert( (
17040 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
17050 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
17060 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
17070 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73  _JOURNAL );.  as
17080 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
17090 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
170a0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
170b0 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  _WAL );..  /* As
170c0 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70  sert that the up
170d0 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65  per layer has se
170e0 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69  t one of the "fi
170f0 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20  le-type" flags. 
17100 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  */.  assert( eTy
17110 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
17120 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20  MAIN_DB      || 
17130 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
17140 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20  EN_TEMP_DB .    
17150 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
17160 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
17170 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d  URNAL || eType==
17180 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
17190 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20  _JOURNAL .      
171a0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
171b0 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
171c0 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  L   || eType==SQ
171d0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
171e0 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20  _JOURNAL .      
171f0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
17200 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54  E_OPEN_TRANSIENT
17210 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  _DB || eType==SQ
17220 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20  LITE_OPEN_WAL.  
17230 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  );..  assert( id
17240 21 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  !=0 );.  UNUSED_
17250 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
17260 0a 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 49  ..  pFile->h = I
17270 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
17280 4c 55 45 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  LUE;..  /* If th
17290 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
172a0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
172b0 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 65 6e 65  on is NULL, gene
172c0 72 61 74 65 20 61 20 0a 20 20 2a 2a 20 74 65 6d  rate a .  ** tem
172d0 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
172e0 20 74 6f 20 75 73 65 20 0a 20 20 2a 2f 0a 20 20   to use .  */.  
172f0 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 29  if( !zUtf8Name )
17300 7b 0a 20 20 20 20 61 73 73 65 72 74 28 69 73 44  {.    assert(isD
17310 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65 6e  elete && !isOpen
17320 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 72 63  Journal);.    rc
17330 20 3d 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 4d   = getTempname(M
17340 41 58 5f 50 41 54 48 2b 31 2c 20 7a 54 6d 70 6e  AX_PATH+1, zTmpn
17350 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
17360 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17370 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
17380 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e      }.    zUtf8N
17390 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a  ame = zTmpname;.
173a0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72    }..  /* Conver
173b0 74 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 74  t the filename t
173c0 6f 20 74 68 65 20 73 79 73 74 65 6d 20 65 6e 63  o the system enc
173d0 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e  oding. */.  zCon
173e0 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74  verted = convert
173f0 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74  Utf8Filename(zUt
17400 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  f8Name);.  if( z
17410 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
17420 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17430 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
17440 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 65 61 64   }..  if( isRead
17450 57 72 69 74 65 20 29 7b 0a 20 20 20 20 64 77 44  Write ){.    dwD
17460 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47  esiredAccess = G
17470 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45  ENERIC_READ | GE
17480 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d  NERIC_WRITE;.  }
17490 65 6c 73 65 7b 0a 20 20 20 20 64 77 44 65 73 69  else{.    dwDesi
174a0 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45  redAccess = GENE
174b0 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  RIC_READ;.  }.. 
174c0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   /* SQLITE_OPEN_
174d0 45 58 43 4c 55 53 49 56 45 20 69 73 20 75 73 65  EXCLUSIVE is use
174e0 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
174f0 68 61 74 20 61 20 6e 65 77 20 66 69 6c 65 20 69  hat a new file i
17500 73 20 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 2e  s .  ** created.
17510 20 53 51 4c 69 74 65 20 64 6f 65 73 6e 27 74 20   SQLite doesn't 
17520 75 73 65 20 69 74 20 74 6f 20 69 6e 64 69 63 61  use it to indica
17530 74 65 20 22 65 78 63 6c 75 73 69 76 65 20 61 63  te "exclusive ac
17540 63 65 73 73 22 20 0a 20 20 2a 2a 20 61 73 20 69  cess" .  ** as i
17550 74 20 69 73 20 75 73 75 61 6c 6c 79 20 75 6e 64  t is usually und
17560 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20  erstood..  */.  
17570 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65 20  if( isExclusive 
17580 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ){.    /* Create
17590 73 20 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f 6e  s a new file, on
175a0 6c 79 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  ly if it does no
175b0 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e  t already exist.
175c0 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   */.    /* If th
175d0 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 69  e file exists, i
175e0 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20  t fails. */.    
175f0 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
17600 69 74 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f 4e  ition = CREATE_N
17610 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EW;.  }else if( 
17620 69 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20  isCreate ){.    
17630 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74 69 6e 67  /* Open existing
17640 20 66 69 6c 65 2c 20 6f 72 20 63 72 65 61 74 65   file, or create
17650 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 65   if it doesn't e
17660 78 69 73 74 20 2a 2f 0a 20 20 20 20 64 77 43 72  xist */.    dwCr
17670 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
17680 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b  n = OPEN_ALWAYS;
17690 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
176a0 20 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f   Opens a file, o
176b0 6e 6c 79 20 69 66 20 69 74 20 65 78 69 73 74 73  nly if it exists
176c0 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74  . */.    dwCreat
176d0 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d  ionDisposition =
176e0 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a   OPEN_EXISTING;.
176f0 20 20 7d 0a 0a 20 20 64 77 53 68 61 72 65 4d 6f    }..  dwShareMo
17700 64 65 20 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f  de = FILE_SHARE_
17710 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48 41 52  READ | FILE_SHAR
17720 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69 66 28 20  E_WRITE;..  if( 
17730 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20  isDelete ){.#if 
17740 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
17750 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
17760 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f  tributes = FILE_
17770 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e  ATTRIBUTE_HIDDEN
17780 3b 0a 20 20 20 20 69 73 54 65 6d 70 20 3d 20 31  ;.    isTemp = 1
17790 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 77 46 6c  ;.#else.    dwFl
177a0 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
177b0 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   = FILE_ATTRIBUT
177c0 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20 20 20  E_TEMPORARY.    
177d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177e0 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c             | FIL
177f0 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44  E_ATTRIBUTE_HIDD
17800 45 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  EN.             
17810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17820 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45    | FILE_FLAG_DE
17830 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23  LETE_ON_CLOSE;.#
17840 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
17850 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
17860 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41  ributes = FILE_A
17870 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b  TTRIBUTE_NORMAL;
17880 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70 6f 72 74  .  }.  /* Report
17890 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72  s from the inter
178a0 6e 65 74 20 61 72 65 20 74 68 61 74 20 70 65 72  net are that per
178b0 66 6f 72 6d 61 6e 63 65 20 69 73 20 61 6c 77 61  formance is alwa
178c0 79 73 0a 20 20 2a 2a 20 62 65 74 74 65 72 20 69  ys.  ** better i
178d0 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44  f FILE_FLAG_RAND
178e0 4f 4d 5f 41 43 43 45 53 53 20 69 73 20 75 73 65  OM_ACCESS is use
178f0 64 2e 20 20 54 69 63 6b 65 74 20 23 32 36 39 39  d.  Ticket #2699
17900 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  . */.#if SQLITE_
17910 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77 46 6c 61  OS_WINCE.  dwFla
17920 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
17930 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e  |= FILE_FLAG_RAN
17940 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23 65 6e 64  DOM_ACCESS;.#end
17950 69 66 0a 0a 20 20 69 66 28 20 69 73 4e 54 28 29  if..  if( isNT()
17960 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   ){.    while( (
17970 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  h = osCreateFile
17980 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
17990 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
179a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179b0 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63       dwDesiredAc
179c0 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cess,.          
179d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179e0 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c      dwShareMode,
179f0 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
17a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a10 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44       dwCreationD
17a20 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20  isposition,.    
17a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a40 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67            dwFlag
17a50 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a  sAndAttributes,.
17a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
17a80 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  LL))==INVALID_HA
17a90 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20  NDLE_VALUE &&.  
17aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ab0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 72              retr
17ac0 79 49 6f 65 72 72 28 26 63 6e 74 29 20 29 7b 7d  yIoerr(&cnt) ){}
17ad0 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20  ./* isNT() is 1 
17ae0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
17af0 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65  CE==1, so this e
17b00 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65  lse is never exe
17b10 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65  cuted. .** Since
17b20 20 74 68 65 20 41 53 43 49 49 20 76 65 72 73 69   the ASCII versi
17b30 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64  on of these Wind
17b40 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65  ows API do not e
17b50 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a  xist for WINCE,.
17b60 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e  ** it's importan
17b70 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e  t to not referen
17b80 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43  ce them for WINC
17b90 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66  E builds..*/.#if
17ba0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
17bb0 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ==0.  }else{.   
17bc0 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43   while( (h = osC
17bd0 72 65 61 74 65 46 69 6c 65 41 28 28 4c 50 43 53  reateFileA((LPCS
17be0 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
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 20 20 20 20 20 20 64 77 44               dwD
17c10 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20  esiredAccess,.  
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 53 68              dwSh
17c40 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20  areMode, NULL,. 
17c50 20 20 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 64 77 43               dwC
17c70 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
17c80 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  on,.            
17c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ca0 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
17cb0 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20  ibutes,.        
17cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cd0 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e        NULL))==IN
17ce0 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
17cf0 55 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  UE &&.          
17d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d10 20 20 20 20 72 65 74 72 79 49 6f 65 72 72 28 26      retryIoerr(&
17d20 63 6e 74 29 20 29 7b 7d 0a 23 65 6e 64 69 66 0a  cnt) ){}.#endif.
17d30 20 20 7d 0a 0a 20 20 6c 6f 67 49 6f 65 72 72 28    }..  logIoerr(
17d40 63 6e 74 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  cnt);..  OSTRACE
17d50 28 28 22 4f 50 45 4e 20 25 64 20 25 73 20 30 78  (("OPEN %d %s 0x
17d60 25 6c 78 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20  %lx %s\n", .    
17d70 20 20 20 20 20 20 20 68 2c 20 7a 4e 61 6d 65 2c         h, zName,
17d80 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
17d90 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 68 3d  , .           h=
17da0 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
17db0 56 41 4c 55 45 20 3f 20 22 66 61 69 6c 65 64 22  VALUE ? "failed"
17dc0 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20 20 69 66   : "ok"));..  if
17dd0 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  ( h==INVALID_HAN
17de0 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20  DLE_VALUE ){.   
17df0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
17e00 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
17e10 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  or();.    winLog
17e20 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
17e30 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61  TOPEN, pFile->la
17e40 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 65  stErrno, "winOpe
17e50 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a  n", zUtf8Name);.
17e60 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
17e70 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
17e80 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
17e90 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76  e && !isExclusiv
17ea0 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
17eb0 6e 20 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20  n winOpen(pVfs, 
17ec0 7a 4e 61 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20  zName, id, .    
17ed0 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73           ((flags
17ee0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  |SQLITE_OPEN_REA
17ef0 44 4f 4e 4c 59 29 26 7e 28 53 51 4c 49 54 45 5f  DONLY)&~(SQLITE_
17f00 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49  OPEN_CREATE|SQLI
17f10 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
17f20 45 29 29 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b  E)), pOutFlags);
17f30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17f40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17f50 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
17f60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
17f70 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20  pOutFlags ){.   
17f80 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
17f90 20 29 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46   ){.      *pOutF
17fa0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
17fb0 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20  EN_READWRITE;.  
17fc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
17fd0 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49  pOutFlags = SQLI
17fe0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
17ff0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6d  ;.    }.  }..  m
18000 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20  emset(pFile, 0, 
18010 73 69 7a 65 6f 66 28 2a 70 46 69 6c 65 29 29 3b  sizeof(*pFile));
18020 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  .  pFile->pMetho
18030 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64  d = &winIoMethod
18040 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68  ;.  pFile->h = h
18050 3b 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  ;.  pFile->lastE
18060 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b  rrno = NO_ERROR;
18070 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66 73 20 3d  .  pFile->pVfs =
18080 20 70 56 66 73 3b 0a 20 20 70 46 69 6c 65 2d 3e   pVfs;.  pFile->
18090 70 53 68 6d 20 3d 20 30 3b 0a 20 20 70 46 69 6c  pShm = 0;.  pFil
180a0 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65  e->zPath = zName
180b0 3b 0a 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f  ;.  pFile->secto
180c0 72 53 69 7a 65 20 3d 20 67 65 74 53 65 63 74 6f  rSize = getSecto
180d0 72 53 69 7a 65 28 70 56 66 73 2c 20 7a 55 74 66  rSize(pVfs, zUtf
180e0 38 4e 61 6d 65 29 3b 0a 0a 23 69 66 20 53 51 4c  8Name);..#if SQL
180f0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69  ITE_OS_WINCE.  i
18100 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 26  f( isReadWrite &
18110 26 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  & eType==SQLITE_
18120 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20 20  OPEN_MAIN_DB.   
18130 20 20 20 20 26 26 20 21 77 69 6e 63 65 43 72 65      && !winceCre
18140 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70  ateLock(zName, p
18150 46 69 6c 65 29 0a 20 20 29 7b 0a 20 20 20 20 6f  File).  ){.    o
18160 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29 3b  sCloseHandle(h);
18170 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
18180 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
18190 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
181a0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
181b0 20 20 7d 0a 20 20 69 66 28 20 69 73 54 65 6d 70    }.  if( isTemp
181c0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a   ){.    pFile->z
181d0 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20  DeleteOnClose = 
181e0 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 7d 65  zConverted;.  }e
181f0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20  lse.#endif.  {. 
18200 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
18210 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d  zConverted);.  }
18220 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  ..  OpenCounter(
18230 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  +1);.  return rc
18240 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
18250 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65  e the named file
18260 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
18270 74 20 57 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e  t Windows does n
18280 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c 65 20  ot allow a file 
18290 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 66  to be deleted if
182a0 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70   some other.** p
182b0 72 6f 63 65 73 73 20 68 61 73 20 69 74 20 6f 70  rocess has it op
182c0 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20 61  en.  Sometimes a
182d0 20 76 69 72 75 73 20 73 63 61 6e 6e 65 72 20 6f   virus scanner o
182e0 72 20 69 6e 64 65 78 69 6e 67 20 70 72 6f 67 72  r indexing progr
182f0 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e 20  am.** will open 
18300 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  a journal file s
18310 68 6f 72 74 6c 79 20 61 66 74 65 72 20 69 74 20  hortly after it 
18320 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 6f 72  is created in or
18330 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77 68 61  der to do.** wha
18340 74 65 76 65 72 20 69 74 20 64 6f 65 73 2e 20 20  tever it does.  
18350 57 68 69 6c 65 20 74 68 69 73 20 6f 74 68 65 72  While this other
18360 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
18370 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  ing the.** file 
18380 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20 62 65  open, we will be
18390 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74   unable to delet
183a0 65 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b 20 61  e it.  To work a
183b0 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20 70 72  round this.** pr
183c0 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61 79 20  oblem, we delay 
183d0 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  100 milliseconds
183e0 20 61 6e 64 20 74 72 79 20 74 6f 20 64 65 6c 65   and try to dele
183f0 74 65 20 61 67 61 69 6e 2e 20 20 55 70 0a 2a 2a  te again.  Up.**
18400 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f   to MX_DELETION_
18410 41 54 54 45 4d 50 54 73 20 64 65 6c 65 74 69 6f  ATTEMPTs deletio
18420 6e 20 61 74 74 65 6d 70 74 73 20 61 72 65 20 72  n attempts are r
18430 75 6e 20 62 65 66 6f 72 65 20 67 69 76 69 6e 67  un before giving
18440 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65 74 75 72  .** up and retur
18450 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  ning an error..*
18460 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
18470 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65  Delete(.  sqlite
18480 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
18490 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65        /* Not use
184a0 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20  d on win32 */.  
184b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
184c0 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e  ename,      /* N
184d0 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 64  ame of file to d
184e0 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 73  elete */.  int s
184f0 79 6e 63 44 69 72 20 20 20 20 20 20 20 20 20 20  yncDir          
18500 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73         /* Not us
18510 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 29  ed on win32 */.)
18520 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  {.  int cnt = 0;
18530 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 6f 69  .  int rc;.  voi
18540 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
18550 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
18560 52 28 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45  R(pVfs);.  UNUSE
18570 44 5f 50 41 52 41 4d 45 54 45 52 28 73 79 6e 63  D_PARAMETER(sync
18580 44 69 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  Dir);..  Simulat
18590 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
185a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
185b0 45 54 45 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74  ETE);.  zConvert
185c0 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38  ed = convertUtf8
185d0 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Filename(zFilena
185e0 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  me);.  if( zConv
185f0 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
18600 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
18610 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ERR_NOMEM;.  }. 
18620 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20   if( isNT() ){. 
18630 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 77     rc = 1;.    w
18640 68 69 6c 65 28 20 6f 73 47 65 74 46 69 6c 65 41  hile( osGetFileA
18650 74 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e 76  ttributesW(zConv
18660 65 72 74 65 64 29 21 3d 49 4e 56 41 4c 49 44 5f  erted)!=INVALID_
18670 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20  FILE_ATTRIBUTES 
18680 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 28 72  &&.           (r
18690 63 20 3d 20 6f 73 44 65 6c 65 74 65 46 69 6c 65  c = osDeleteFile
186a0 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 29 3d 3d  W(zConverted))==
186b0 30 20 26 26 20 72 65 74 72 79 49 6f 65 72 72 28  0 && retryIoerr(
186c0 26 63 6e 74 29 20 29 7b 7d 0a 20 20 20 20 72 63  &cnt) ){}.    rc
186d0 20 3d 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f   = rc ? SQLITE_O
186e0 4b 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  K : SQLITE_ERROR
186f0 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31  ;./* isNT() is 1
18700 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   if SQLITE_OS_WI
18710 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20  NCE==1, so this 
18720 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78  else is never ex
18730 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63  ecuted. .** Sinc
18740 65 20 74 68 65 20 41 53 43 49 49 20 76 65 72 73  e the ASCII vers
18750 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e  ion of these Win
18760 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20  dows API do not 
18770 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c  exist for WINCE,
18780 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61  .** it's importa
18790 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65  nt to not refere
187a0 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e  nce them for WIN
187b0 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69  CE builds..*/.#i
187c0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
187d0 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E==0.  }else{.  
187e0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 77 68    rc = 1;.    wh
187f0 69 6c 65 28 20 6f 73 47 65 74 46 69 6c 65 41 74  ile( osGetFileAt
18800 74 72 69 62 75 74 65 73 41 28 7a 43 6f 6e 76 65  tributesA(zConve
18810 72 74 65 64 29 21 3d 49 4e 56 41 4c 49 44 5f 46  rted)!=INVALID_F
18820 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 26  ILE_ATTRIBUTES &
18830 26 0a 20 20 20 20 20 20 20 20 20 20 20 28 72 63  &.           (rc
18840 20 3d 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41   = osDeleteFileA
18850 28 7a 43 6f 6e 76 65 72 74 65 64 29 29 3d 3d 30  (zConverted))==0
18860 20 26 26 20 72 65 74 72 79 49 6f 65 72 72 28 26   && retryIoerr(&
18870 63 6e 74 29 20 29 7b 7d 0a 20 20 20 20 72 63 20  cnt) ){}.    rc 
18880 3d 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  = rc ? SQLITE_OK
18890 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
188a0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66  .#endif.  }.  if
188b0 28 20 72 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  ( rc ){.    rc =
188c0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
188d0 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
188e0 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
188f0 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
18900 20 22 77 69 6e 44 65 6c 65 74 65 22 2c 20 7a 46   "winDelete", zF
18910 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73  ilename);.  }els
18920 65 7b 0a 20 20 20 20 6c 6f 67 49 6f 65 72 72 28  e{.    logIoerr(
18930 63 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  cnt);.  }.  sqli
18940 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
18950 74 65 64 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ted);.  OSTRACE(
18960 28 22 44 45 4c 45 54 45 20 5c 22 25 73 5c 22 20  ("DELETE \"%s\" 
18970 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %s\n", zFilename
18980 2c 20 28 72 63 20 3f 20 22 66 61 69 6c 65 64 22  , (rc ? "failed"
18990 20 3a 20 22 6f 6b 22 20 29 29 29 3b 0a 20 20 72   : "ok" )));.  r
189a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
189b0 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 65 78 69  ** Check the exi
189c0 73 74 61 6e 63 65 20 61 6e 64 20 73 74 61 74 75  stance and statu
189d0 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  s of a file..*/.
189e0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 41 63  static int winAc
189f0 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f  cess(.  sqlite3_
18a00 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
18a10 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f     /* Not used o
18a20 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e  n win32 */.  con
18a30 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
18a40 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me,     /* Name 
18a50 6f 66 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b  of file to check
18a60 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
18a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a80 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 73 74   /* Type of test
18a90 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73   to make on this
18aa0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   file */.  int *
18ab0 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20  pResOut         
18ac0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
18ad0 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f  sult */.){.  DWO
18ae0 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72  RD attr;.  int r
18af0 63 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a  c = 0;.  void *z
18b00 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55  Converted;.  UNU
18b10 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
18b20 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  fs);..  Simulate
18b30 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
18b40 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
18b50 45 53 53 3b 20 29 3b 0a 20 20 7a 43 6f 6e 76 65  ESS; );.  zConve
18b60 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74  rted = convertUt
18b70 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65  f8Filename(zFile
18b80 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  name);.  if( zCo
18b90 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
18ba0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18bb0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
18bc0 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
18bd0 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  .    int cnt = 0
18be0 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45  ;.    WIN32_FILE
18bf0 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20  _ATTRIBUTE_DATA 
18c00 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d  sAttrData;.    m
18c10 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61  emset(&sAttrData
18c20 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74  , 0, sizeof(sAtt
18c30 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69  rData));.    whi
18c40 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74  le( !(rc = osGet
18c50 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
18c60 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
18c70 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
18c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c90 20 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66      GetFileExInf
18ca0 6f 53 74 61 6e 64 61 72 64 2c 20 0a 20 20 20 20  oStandard, .    
18cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cc0 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72 44           &sAttrD
18cd0 61 74 61 29 29 20 26 26 20 72 65 74 72 79 49 6f  ata)) && retryIo
18ce0 65 72 72 28 26 63 6e 74 29 20 29 7b 7d 0a 20 20  err(&cnt) ){}.  
18cf0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
18d00 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49    /* For an SQLI
18d10 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
18d20 20 71 75 65 72 79 2c 20 74 72 65 61 74 20 61 20   query, treat a 
18d30 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65  zero-length file
18d40 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20  .      ** as if 
18d50 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
18d60 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
18d70 20 20 69 66 28 20 20 20 20 66 6c 61 67 73 3d 3d    if(    flags==
18d80 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
18d90 49 53 54 53 0a 20 20 20 20 20 20 20 20 20 20 26  ISTS.          &
18da0 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c  & sAttrData.nFil
18db0 65 53 69 7a 65 48 69 67 68 3d 3d 30 20 0a 20 20  eSizeHigh==0 .  
18dc0 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72          && sAttr
18dd0 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f  Data.nFileSizeLo
18de0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
18df0 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46  attr = INVALID_F
18e00 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a  ILE_ATTRIBUTES;.
18e10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18e20 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74       attr = sAtt
18e30 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72  rData.dwFileAttr
18e40 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a  ibutes;.      }.
18e50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18e60 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
18e70 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
18e80 72 28 29 3b 0a 20 20 20 20 20 20 6c 6f 67 49 6f  r();.      logIo
18e90 65 72 72 28 63 6e 74 29 3b 0a 20 20 20 20 20 20  err(cnt);.      
18ea0 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45  if( lastErrno!=E
18eb0 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f  RROR_FILE_NOT_FO
18ec0 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 77  UND ){.        w
18ed0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
18ee0 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 2c 20  E_IOERR_ACCESS, 
18ef0 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 41  lastErrno, "winA
18f00 63 63 65 73 73 22 2c 20 7a 46 69 6c 65 6e 61 6d  ccess", zFilenam
18f10 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
18f20 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
18f30 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ted);.        re
18f40 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
18f50 52 5f 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20  R_ACCESS;.      
18f60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
18f70 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49  ttr = INVALID_FI
18f80 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20  LE_ATTRIBUTES;. 
18f90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 2f 2a 20       }.    }./* 
18fa0 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53  isNT() is 1 if S
18fb0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
18fc0 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20  1, so this else 
18fd0 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  is never execute
18fe0 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65  d. .** Since the
18ff0 20 41 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f   ASCII version o
19000 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20  f these Windows 
19010 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  API do not exist
19020 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69   for WINCE,.** i
19030 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f  t's important to
19040 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74   not reference t
19050 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75  hem for WINCE bu
19060 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  ilds..*/.#if SQL
19070 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a  ITE_OS_WINCE==0.
19080 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 74 74    }else{.    att
19090 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74  r = osGetFileAtt
190a0 72 69 62 75 74 65 73 41 28 28 63 68 61 72 2a 29  ributesA((char*)
190b0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e  zConverted);.#en
190c0 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  dif.  }.  sqlite
190d0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
190e0 64 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c  d);.  switch( fl
190f0 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ags ){.    case 
19100 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
19110 41 44 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  AD:.    case SQL
19120 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
19130 53 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74  S:.      rc = at
19140 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr!=INVALID_FILE
19150 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20  _ATTRIBUTES;.   
19160 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
19170 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
19180 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20  _READWRITE:.    
19190 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56    rc = attr!=INV
191a0 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
191b0 55 54 45 53 20 26 26 0a 20 20 20 20 20 20 20 20  UTES &&.        
191c0 20 20 20 20 20 28 61 74 74 72 20 26 20 46 49 4c       (attr & FIL
191d0 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45 41 44  E_ATTRIBUTE_READ
191e0 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ONLY)==0;.      
191f0 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
19200 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  lt:.      assert
19210 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73  (!"Invalid flags
19220 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d   argument");.  }
19230 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63  .  *pResOut = rc
19240 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
19250 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
19260 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20  Turn a relative 
19270 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20  pathname into a 
19280 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20  full pathname.  
19290 57 72 69 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a  Write the full.*
192a0 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  * pathname into 
192b0 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20  zOut[].  zOut[] 
192c0 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61 73 74  will be at least
192d0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
192e0 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69  e.** bytes in si
192f0 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
19300 74 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  t winFullPathnam
19310 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
19320 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
19330 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
19340 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
19350 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65   const char *zRe
19360 6c 61 74 69 76 65 2c 20 20 20 20 20 20 20 20 2f  lative,        /
19370 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74  * Possibly relat
19380 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a  ive input path *
19390 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20  /.  int nFull,  
193a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193b0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74    /* Size of out
193c0 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
193d0 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  tes */.  char *z
193e0 46 75 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20  Full            
193f0 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
19400 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20   buffer */.){.  
19410 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43  .#if defined(__C
19420 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c  YGWIN__).  Simul
19430 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
19440 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
19450 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
19460 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20  METER(nFull);.  
19470 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 66  cygwin_conv_to_f
19480 75 6c 6c 5f 77 69 6e 33 32 5f 70 61 74 68 28 7a  ull_win32_path(z
19490 52 65 6c 61 74 69 76 65 2c 20 7a 46 75 6c 6c 29  Relative, zFull)
194a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
194b0 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  E_OK;.#endif..#i
194c0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
194d0 45 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  E.  SimulateIOEr
194e0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
194f0 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e  TE_ERROR );.  UN
19500 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
19510 46 75 6c 6c 29 3b 0a 20 20 2f 2a 20 57 69 6e 43  Full);.  /* WinC
19520 45 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74  E has no concept
19530 20 6f 66 20 61 20 72 65 6c 61 74 69 76 65 20 70   of a relative p
19540 61 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49  athname, or so I
19550 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 73   am told. */.  s
19560 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
19570 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
19580 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a  , zFull, "%s", z
19590 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 72 65 74  Relative);.  ret
195a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
195b0 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49  endif..#if !SQLI
195c0 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
195d0 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
195e0 5f 5f 29 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  __).  int nByte;
195f0 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
19600 74 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75  ted;.  char *zOu
19610 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  t;..  /* If this
19620 20 70 61 74 68 20 6e 61 6d 65 20 62 65 67 69 6e   path name begin
19630 73 20 77 69 74 68 20 22 2f 58 3a 22 2c 20 77 68  s with "/X:", wh
19640 65 72 65 20 22 58 22 20 69 73 20 61 6e 79 20 61  ere "X" is any a
19650 6c 70 68 61 62 65 74 69 63 0a 20 20 2a 2a 20 63  lphabetic.  ** c
19660 68 61 72 61 63 74 65 72 2c 20 64 69 73 63 61 72  haracter, discar
19670 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 22 2f  d the initial "/
19680 22 20 66 72 6f 6d 20 74 68 65 20 70 61 74 68 6e  " from the pathn
19690 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ame..  */.  if( 
196a0 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f  zRelative[0]=='/
196b0 27 20 26 26 20 73 71 6c 69 74 65 33 49 73 61 6c  ' && sqlite3Isal
196c0 70 68 61 28 7a 52 65 6c 61 74 69 76 65 5b 31 5d  pha(zRelative[1]
196d0 29 20 26 26 20 7a 52 65 6c 61 74 69 76 65 5b 32  ) && zRelative[2
196e0 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20 7a 52  ]==':' ){.    zR
196f0 65 6c 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a  elative++;.  }..
19700 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
19710 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
19720 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
19730 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
19740 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
19750 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
19760 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
19770 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
19780 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
19790 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
197a0 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  g. This function
197b0 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20   could fail if, 
197c0 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  for example, the
197d0 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f  .  ** current wo
197e0 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20  rking directory 
197f0 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65  has been unlinke
19800 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  d..  */.  Simula
19810 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
19820 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
19830 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
19840 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 7a  ETER(nFull);.  z
19850 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
19860 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
19870 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 69 66  zRelative);.  if
19880 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
19890 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
198a0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
198b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54  ;.  }.  if( isNT
198c0 28 29 20 29 7b 0a 20 20 20 20 4c 50 57 53 54 52  () ){.    LPWSTR
198d0 20 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74   zTemp;.    nByt
198e0 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  e = osGetFullPat
198f0 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29  hNameW((LPCWSTR)
19900 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30  zConverted, 0, 0
19910 2c 20 30 29 20 2b 20 33 3b 0a 20 20 20 20 7a 54  , 0) + 3;.    zT
19920 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  emp = sqlite3_ma
19930 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a 65  lloc( nByte*size
19940 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a  of(zTemp[0]) );.
19950 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30      if( zTemp==0
19960 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
19970 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
19980 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
19990 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
199a0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  MEM;.    }.    o
199b0 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
199c0 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
199d0 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54  erted, nByte, zT
199e0 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  emp, 0);.    sql
199f0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
19a00 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20  rted);.    zOut 
19a10 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  = unicodeToUtf8(
19a20 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69  zTemp);.    sqli
19a30 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b  te3_free(zTemp);
19a40 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20  ./* isNT() is 1 
19a50 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
19a60 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65  CE==1, so this e
19a70 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65  lse is never exe
19a80 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65  cuted. .** Since
19a90 20 74 68 65 20 41 53 43 49 49 20 76 65 72 73 69   the ASCII versi
19aa0 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64  on of these Wind
19ab0 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65  ows API do not e
19ac0 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a  xist for WINCE,.
19ad0 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e  ** it's importan
19ae0 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e  t to not referen
19af0 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43  ce them for WINC
19b00 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66  E builds..*/.#if
19b10 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
19b20 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ==0.  }else{.   
19b30 20 63 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20   char *zTemp;.  
19b40 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46    nByte = osGetF
19b50 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68  ullPathNameA((ch
19b60 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  ar*)zConverted, 
19b70 30 2c 20 30 2c 20 30 29 20 2b 20 33 3b 0a 20 20  0, 0, 0) + 3;.  
19b80 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65    zTemp = sqlite
19b90 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a  3_malloc( nByte*
19ba0 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29  sizeof(zTemp[0])
19bb0 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d   );.    if( zTem
19bc0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
19bd0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
19be0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65  erted);.      re
19bf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
19c00 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
19c10 20 20 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68     osGetFullPath
19c20 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f  NameA((char*)zCo
19c30 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20  nverted, nByte, 
19c40 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 73  zTemp, 0);.    s
19c50 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
19c60 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75  verted);.    zOu
19c70 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  t = sqlite3_win3
19c80 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a  2_mbcs_to_utf8(z
19c90 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  Temp);.    sqlit
19ca0 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a  e3_free(zTemp);.
19cb0 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28  #endif.  }.  if(
19cc0 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c   zOut ){.    sql
19cd0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 70 56  ite3_snprintf(pV
19ce0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20  fs->mxPathname, 
19cf0 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75  zFull, "%s", zOu
19d00 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
19d10 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  free(zOut);.    
19d20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19d30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
19d40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
19d50 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65  RR_NOMEM;.  }.#e
19d60 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ndif.}../*.** Ge
19d70 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  t the sector siz
19d80 65 20 6f 66 20 74 68 65 20 64 65 76 69 63 65 20  e of the device 
19d90 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a  used to store.**
19da0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
19db0 20 69 6e 74 20 67 65 74 53 65 63 74 6f 72 53 69   int getSectorSi
19dc0 7a 65 28 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ze(.    sqlite3_
19dd0 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 20 20 63  vfs *pVfs,.    c
19de0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61  onst char *zRela
19df0 74 69 76 65 20 20 20 20 20 2f 2a 20 55 54 46 2d  tive     /* UTF-
19e00 38 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 29  8 file name */.)
19e10 7b 0a 20 20 44 57 4f 52 44 20 62 79 74 65 73 50  {.  DWORD bytesP
19e20 65 72 53 65 63 74 6f 72 20 3d 20 53 51 4c 49 54  erSector = SQLIT
19e30 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52  E_DEFAULT_SECTOR
19e40 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 47 65 74 44  _SIZE;.  /* GetD
19e50 69 73 6b 46 72 65 65 53 70 61 63 65 20 69 73 20  iskFreeSpace is 
19e60 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 75 6e  not supported un
19e70 64 65 72 20 57 49 4e 43 45 20 2a 2f 0a 23 69 66  der WINCE */.#if
19e80 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
19e90 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
19ea0 54 45 52 28 70 56 66 73 29 3b 0a 20 20 55 4e 55  TER(pVfs);.  UNU
19eb0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 52  SED_PARAMETER(zR
19ec0 65 6c 61 74 69 76 65 29 3b 0a 23 65 6c 73 65 0a  elative);.#else.
19ed0 20 20 63 68 61 72 20 7a 46 75 6c 6c 70 61 74 68    char zFullpath
19ee0 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 0a 20 20  [MAX_PATH+1];.  
19ef0 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52 44 20  int rc;.  DWORD 
19f00 64 77 52 65 74 20 3d 20 30 3b 0a 20 20 44 57 4f  dwRet = 0;.  DWO
19f10 52 44 20 64 77 44 75 6d 6d 79 3b 0a 0a 20 20 2f  RD dwDummy;..  /
19f20 2a 0a 20 20 2a 2a 20 57 65 20 6e 65 65 64 20 74  *.  ** We need t
19f30 6f 20 67 65 74 20 74 68 65 20 66 75 6c 6c 20 70  o get the full p
19f40 61 74 68 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ath name of the 
19f50 66 69 6c 65 0a 20 20 2a 2a 20 74 6f 20 67 65 74  file.  ** to get
19f60 20 74 68 65 20 64 72 69 76 65 20 6c 65 74 74 65   the drive lette
19f70 72 20 74 6f 20 6c 6f 6f 6b 20 75 70 20 74 68 65  r to look up the
19f80 20 73 65 63 74 6f 72 0a 20 20 2a 2a 20 73 69 7a   sector.  ** siz
19f90 65 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  e..  */.  Simula
19fa0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
19fb0 31 29 3b 0a 20 20 72 63 20 3d 20 77 69 6e 46 75  1);.  rc = winFu
19fc0 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
19fd0 20 7a 52 65 6c 61 74 69 76 65 2c 20 4d 41 58 5f   zRelative, MAX_
19fe0 50 41 54 48 2c 20 7a 46 75 6c 6c 70 61 74 68 29  PATH, zFullpath)
19ff0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
1a000 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
1a010 69 66 28 20 72 63 20 3d 3d 20 53 51 4c 49 54 45  if( rc == SQLITE
1a020 5f 4f 4b 20 29 0a 20 20 7b 0a 20 20 20 20 76 6f  _OK ).  {.    vo
1a030 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d  id *zConverted =
1a040 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65   convertUtf8File
1a050 6e 61 6d 65 28 7a 46 75 6c 6c 70 61 74 68 29 3b  name(zFullpath);
1a060 0a 20 20 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  .    if( zConver
1a070 74 65 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ted ){.      if(
1a080 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 20   isNT() ){.     
1a090 20 20 20 2f 2a 20 74 72 69 6d 20 70 61 74 68 20     /* trim path 
1a0a0 74 6f 20 6a 75 73 74 20 64 72 69 76 65 20 72 65  to just drive re
1a0b0 66 65 72 65 6e 63 65 20 2a 2f 0a 20 20 20 20 20  ference */.     
1a0c0 20 20 20 4c 50 57 53 54 52 20 70 20 3d 20 7a 43     LPWSTR p = zC
1a0d0 6f 6e 76 65 72 74 65 64 3b 0a 20 20 20 20 20 20  onverted;.      
1a0e0 20 20 66 6f 72 28 3b 2a 70 3b 70 2b 2b 29 7b 0a    for(;*p;p++){.
1a0f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 70            if( *p
1a100 20 3d 3d 20 27 5c 5c 27 20 29 7b 0a 20 20 20 20   == '\\' ){.    
1a110 20 20 20 20 20 20 20 20 2a 70 20 3d 20 27 5c 30          *p = '\0
1a120 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ';.            b
1a130 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1a140 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1a150 20 20 20 20 64 77 52 65 74 20 3d 20 6f 73 47 65      dwRet = osGe
1a160 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 28  tDiskFreeSpaceW(
1a170 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
1a180 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
1a190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1a0 20 20 20 20 20 20 20 20 20 26 64 77 44 75 6d 6d           &dwDumm
1a1b0 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
1a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1d0 20 20 20 20 20 20 20 26 62 79 74 65 73 50 65 72         &bytesPer
1a1e0 53 65 63 74 6f 72 2c 0a 20 20 20 20 20 20 20 20  Sector,.        
1a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a200 20 20 20 20 20 20 20 20 20 20 20 20 26 64 77 44              &dwD
1a210 75 6d 6d 79 2c 0a 20 20 20 20 20 20 20 20 20 20  ummy,.          
1a220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a230 20 20 20 20 20 20 20 20 20 20 26 64 77 44 75 6d            &dwDum
1a240 6d 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  my);.      }else
1a250 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 74 72 69  {.        /* tri
1a260 6d 20 70 61 74 68 20 74 6f 20 6a 75 73 74 20 64  m path to just d
1a270 72 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 2a  rive reference *
1a280 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  /.        char *
1a290 70 20 3d 20 28 63 68 61 72 20 2a 29 7a 43 6f 6e  p = (char *)zCon
1a2a0 76 65 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20  verted;.        
1a2b0 66 6f 72 28 3b 2a 70 3b 70 2b 2b 29 7b 0a 20 20  for(;*p;p++){.  
1a2c0 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 20 3d          if( *p =
1a2d0 3d 20 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20  = '\\' ){.      
1a2e0 20 20 20 20 20 20 2a 70 20 3d 20 27 5c 30 27 3b        *p = '\0';
1a2f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
1a300 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
1a310 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a320 20 20 64 77 52 65 74 20 3d 20 6f 73 47 65 74 44    dwRet = osGetD
1a330 69 73 6b 46 72 65 65 53 70 61 63 65 41 28 28 63  iskFreeSpaceA((c
1a340 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c  har*)zConverted,
1a350 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a370 20 20 20 20 20 26 64 77 44 75 6d 6d 79 2c 0a 20       &dwDummy,. 
1a380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3a0 20 20 20 26 62 79 74 65 73 50 65 72 53 65 63 74     &bytesPerSect
1a3b0 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  or,.            
1a3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3d0 20 20 20 20 20 20 20 20 26 64 77 44 75 6d 6d 79          &dwDummy
1a3e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a400 20 20 20 20 20 20 26 64 77 44 75 6d 6d 79 29 3b        &dwDummy);
1a410 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1a420 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
1a430 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7d 0a 20  verted);.    }. 
1a440 20 20 20 69 66 28 20 21 64 77 52 65 74 20 29 7b     if( !dwRet ){
1a450 0a 20 20 20 20 20 20 62 79 74 65 73 50 65 72 53  .      bytesPerS
1a460 65 63 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f 44  ector = SQLITE_D
1a470 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
1a480 5a 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ZE;.    }.  }.#e
1a490 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 28 69  ndif.  return (i
1a4a0 6e 74 29 20 62 79 74 65 73 50 65 72 53 65 63 74  nt) bytesPerSect
1a4b0 6f 72 3b 20 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  or; .}..#ifndef 
1a4c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
1a4d0 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a  _EXTENSION./*.**
1a4e0 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20   Interfaces for 
1a4f0 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64  opening a shared
1a500 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e   library, findin
1a510 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a  g entry points.*
1a520 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61  * within the sha
1a530 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64  red library, and
1a540 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61   closing the sha
1a550 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a  red library..*/.
1a560 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73  /*.** Interfaces
1a570 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73   for opening a s
1a580 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66  hared library, f
1a590 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69  inding entry poi
1a5a0 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  nts.** within th
1a5b0 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
1a5c0 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68  , and closing th
1a5d0 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
1a5e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1a5f0 20 2a 77 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69   *winDlOpen(sqli
1a600 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63  te3_vfs *pVfs, c
1a610 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1a620 6e 61 6d 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20  name){.  HANDLE 
1a630 68 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  h;.  void *zConv
1a640 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55  erted = convertU
1a650 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c  tf8Filename(zFil
1a660 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44  ename);.  UNUSED
1a670 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
1a680 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
1a690 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ed==0 ){.    ret
1a6a0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
1a6b0 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 68   isNT() ){.    h
1a6c0 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79   = osLoadLibrary
1a6d0 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
1a6e0 65 72 74 65 64 29 3b 0a 2f 2a 20 69 73 4e 54 28  erted);./* isNT(
1a6f0 29 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 45  ) is 1 if SQLITE
1a700 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f  _OS_WINCE==1, so
1a710 20 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65   this else is ne
1a720 76 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a  ver executed. .*
1a730 2a 20 53 69 6e 63 65 20 74 68 65 20 41 53 43 49  * Since the ASCI
1a740 49 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  I version of the
1a750 73 65 20 57 69 6e 64 6f 77 73 20 41 50 49 20 64  se Windows API d
1a760 6f 20 6e 6f 74 20 65 78 69 73 74 20 66 6f 72 20  o not exist for 
1a770 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69  WINCE,.** it's i
1a780 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20  mportant to not 
1a790 72 65 66 65 72 65 6e 63 65 20 74 68 65 6d 20 66  reference them f
1a7a0 6f 72 20 57 49 4e 43 45 20 62 75 69 6c 64 73 2e  or WINCE builds.
1a7b0 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
1a7c0 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c  S_WINCE==0.  }el
1a7d0 73 65 7b 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f  se{.    h = osLo
1a7e0 61 64 4c 69 62 72 61 72 79 41 28 28 63 68 61 72  adLibraryA((char
1a7f0 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23  *)zConverted);.#
1a800 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69  endif.  }.  sqli
1a810 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
1a820 74 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  ted);.  return (
1a830 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74 61 74 69  void*)h;.}.stati
1a840 63 20 76 6f 69 64 20 77 69 6e 44 6c 45 72 72 6f  c void winDlErro
1a850 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
1a860 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
1a870 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20  har *zBufOut){. 
1a880 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1a890 52 28 70 56 66 73 29 3b 0a 20 20 67 65 74 4c 61  R(pVfs);.  getLa
1a8a0 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74  stErrorMsg(osGet
1a8b0 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75  LastError(), nBu
1a8c0 66 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 73  f, zBufOut);.}.s
1a8d0 74 61 74 69 63 20 76 6f 69 64 20 28 2a 77 69 6e  tatic void (*win
1a8e0 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66  DlSym(sqlite3_vf
1a8f0 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70  s *pVfs, void *p
1a900 48 61 6e 64 6c 65 2c 20 63 6f 6e 73 74 20 63 68  Handle, const ch
1a910 61 72 20 2a 7a 53 79 6d 62 6f 6c 29 29 28 76 6f  ar *zSymbol))(vo
1a920 69 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  id){.  UNUSED_PA
1a930 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
1a940 20 72 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29   return (void(*)
1a950 28 76 6f 69 64 29 29 6f 73 47 65 74 50 72 6f 63  (void))osGetProc
1a960 41 64 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45  AddressA((HANDLE
1a970 29 70 48 61 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f  )pHandle, zSymbo
1a980 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  l);.}.static voi
1a990 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28 73 71 6c  d winDlClose(sql
1a9a0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
1a9b0 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a  void *pHandle){.
1a9c0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1a9d0 45 52 28 70 56 66 73 29 3b 0a 20 20 6f 73 46 72  ER(pVfs);.  osFr
1a9e0 65 65 4c 69 62 72 61 72 79 28 28 48 41 4e 44 4c  eeLibrary((HANDL
1a9f0 45 29 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65  E)pHandle);.}.#e
1aa00 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45  lse /* if SQLITE
1aa10 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
1aa20 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a  SION is defined:
1aa30 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 77 69   */.  #define wi
1aa40 6e 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65  nDlOpen  0.  #de
1aa50 66 69 6e 65 20 77 69 6e 44 6c 45 72 72 6f 72 20  fine winDlError 
1aa60 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44  0.  #define winD
1aa70 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69  lSym   0.  #defi
1aa80 6e 65 20 77 69 6e 44 6c 43 6c 6f 73 65 20 30 0a  ne winDlClose 0.
1aa90 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57  #endif.../*.** W
1aaa0 72 69 74 65 20 75 70 20 74 6f 20 6e 42 75 66 20  rite up to nBuf 
1aab0 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 6e  bytes of randomn
1aac0 65 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a  ess into zBuf..*
1aad0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1aae0 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74  Randomness(sqlit
1aaf0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
1ab00 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
1ab10 75 66 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  uf){.  int n = 0
1ab20 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1ab30 45 54 45 52 28 70 56 66 73 29 3b 0a 23 69 66 20  ETER(pVfs);.#if 
1ab40 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1ab50 45 53 54 29 0a 20 20 6e 20 3d 20 6e 42 75 66 3b  EST).  n = nBuf;
1ab60 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20  .  memset(zBuf, 
1ab70 30 2c 20 6e 42 75 66 29 3b 0a 23 65 6c 73 65 0a  0, nBuf);.#else.
1ab80 20 20 69 66 28 20 73 69 7a 65 6f 66 28 53 59 53    if( sizeof(SYS
1ab90 54 45 4d 54 49 4d 45 29 3c 3d 6e 42 75 66 2d 6e  TEMTIME)<=nBuf-n
1aba0 20 29 7b 0a 20 20 20 20 53 59 53 54 45 4d 54 49   ){.    SYSTEMTI
1abb0 4d 45 20 78 3b 0a 20 20 20 20 6f 73 47 65 74 53  ME x;.    osGetS
1abc0 79 73 74 65 6d 54 69 6d 65 28 26 78 29 3b 0a 20  ystemTime(&x);. 
1abd0 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
1abe0 6e 5d 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78  n], &x, sizeof(x
1abf0 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ));.    n += siz
1ac00 65 6f 66 28 78 29 3b 0a 20 20 7d 0a 20 20 69 66  eof(x);.  }.  if
1ac10 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c  ( sizeof(DWORD)<
1ac20 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44  =nBuf-n ){.    D
1ac30 57 4f 52 44 20 70 69 64 20 3d 20 6f 73 47 65 74  WORD pid = osGet
1ac40 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1ac50 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ();.    memcpy(&
1ac60 7a 42 75 66 5b 6e 5d 2c 20 26 70 69 64 2c 20 73  zBuf[n], &pid, s
1ac70 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20  izeof(pid));.   
1ac80 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 70 69 64   n += sizeof(pid
1ac90 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a  );.  }.  if( siz
1aca0 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66  eof(DWORD)<=nBuf
1acb0 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20  -n ){.    DWORD 
1acc0 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43  cnt = osGetTickC
1acd0 6f 75 6e 74 28 29 3b 0a 20 20 20 20 6d 65 6d 63  ount();.    memc
1ace0 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e  py(&zBuf[n], &cn
1acf0 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b  t, sizeof(cnt));
1ad00 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66  .    n += sizeof
1ad10 28 63 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  (cnt);.  }.  if(
1ad20 20 73 69 7a 65 6f 66 28 4c 41 52 47 45 5f 49 4e   sizeof(LARGE_IN
1ad30 54 45 47 45 52 29 3c 3d 6e 42 75 66 2d 6e 20 29  TEGER)<=nBuf-n )
1ad40 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45  {.    LARGE_INTE
1ad50 47 45 52 20 69 3b 0a 20 20 20 20 6f 73 51 75 65  GER i;.    osQue
1ad60 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75  ryPerformanceCou
1ad70 6e 74 65 72 28 26 69 29 3b 0a 20 20 20 20 6d 65  nter(&i);.    me
1ad80 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26  mcpy(&zBuf[n], &
1ad90 69 2c 20 73 69 7a 65 6f 66 28 69 29 29 3b 0a 20  i, sizeof(i));. 
1ada0 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 69     n += sizeof(i
1adb0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
1adc0 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a  return n;.}.../*
1add0 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20  .** Sleep for a 
1ade0 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52  little while.  R
1adf0 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74  eturn the amount
1ae00 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a   of time slept..
1ae10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1ae20 6e 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76  nSleep(sqlite3_v
1ae30 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6d 69  fs *pVfs, int mi
1ae40 63 72 6f 73 65 63 29 7b 0a 20 20 6f 73 53 6c 65  crosec){.  osSle
1ae50 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39  ep((microsec+999
1ae60 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55 53 45  )/1000);.  UNUSE
1ae70 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
1ae80 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6d 69  );.  return ((mi
1ae90 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30  crosec+999)/1000
1aea0 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )*1000;.}../*.**
1aeb0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
1aec0 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20  ariable, if set 
1aed0 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
1aee0 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65  lue, is interpre
1aef0 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75  ted as.** the nu
1af00 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20  mber of seconds 
1af10 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69  since 1970 and i
1af20 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68  s used to set th
1af30 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73  e result of.** s
1af40 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
1af50 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73  ime() during tes
1af60 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ting..*/.#ifdef 
1af70 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
1af80 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
1af90 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61  time = 0;  /* Fa
1afa0 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69  ke system time i
1afb0 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  n seconds since 
1afc0 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  1970. */.#endif.
1afd0 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
1afe0 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
1aff0 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
1b000 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
1b010 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
1b020 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
1b030 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
1b040 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
1b050 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30  mber times 86_40
1b060 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74  0_000.  In.** ot
1b070 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65  her words, write
1b080 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65   into *piNow the
1b090 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
1b0a0 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68  seconds since th
1b0b0 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63  e Julian.** epoc
1b0c0 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65  h of noon in Gre
1b0d0 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62  enwich on Novemb
1b0e0 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20  er 24, 4714 B.C 
1b0f0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
1b100 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72  .** proleptic Gr
1b110 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72  egorian calendar
1b120 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
1b130 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ss, return SQLIT
1b140 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51  E_OK.  Return SQ
1b150 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68  LITE_ERROR if th
1b160 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
1b170 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  .** cannot be fo
1b180 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  und..*/.static i
1b190 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d  nt winCurrentTim
1b1a0 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76  eInt64(sqlite3_v
1b1b0 66 73 20 2a 70 56 66 73 2c 20 73 71 6c 69 74 65  fs *pVfs, sqlite
1b1c0 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b  3_int64 *piNow){
1b1d0 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73  .  /* FILETIME s
1b1e0 74 72 75 63 74 75 72 65 20 69 73 20 61 20 36 34  tructure is a 64
1b1f0 2d 62 69 74 20 76 61 6c 75 65 20 72 65 70 72 65  -bit value repre
1b200 73 65 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d 62  senting the numb
1b210 65 72 20 6f 66 20 0a 20 20 20 20 20 31 30 30 2d  er of .     100-
1b220 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72  nanosecond inter
1b230 76 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75 61  vals since Janua
1b240 72 79 20 31 2c 20 31 36 30 31 20 28 3d 20 4a 44  ry 1, 1601 (= JD
1b250 20 32 33 30 35 38 31 33 2e 35 29 2e 20 0a 20 20   2305813.5). .  
1b260 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45 20 66 74  */.  FILETIME ft
1b270 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
1b280 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 77   sqlite3_int64 w
1b290 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20  inFiletimeEpoch 
1b2a0 3d 20 32 33 30 35 38 31 33 35 2a 28 73 71 6c 69  = 23058135*(sqli
1b2b0 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
1b2c0 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
1b2d0 5f 54 45 53 54 0a 20 20 73 74 61 74 69 63 20 63  _TEST.  static c
1b2e0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
1b2f0 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32  64 unixEpoch = 2
1b300 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33  4405875*(sqlite3
1b310 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a  _int64)8640000;.
1b320 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32 5e 33 32  #endif.  /* 2^32
1b330 20 2d 20 74 6f 20 61 76 6f 69 64 20 75 73 65 20   - to avoid use 
1b340 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72 6e 69 6e  of LL and warnin
1b350 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a 20 20 73  gs in gcc */.  s
1b360 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
1b370 74 65 33 5f 69 6e 74 36 34 20 6d 61 78 33 32 42  te3_int64 max32B
1b380 69 74 56 61 6c 75 65 20 3d 20 0a 20 20 20 20 20  itValue = .     
1b390 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
1b3a0 32 30 30 30 30 30 30 30 30 30 20 2b 20 28 73 71  2000000000 + (sq
1b3b0 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30  lite3_int64)2000
1b3c0 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65  000000 + (sqlite
1b3d0 33 5f 69 6e 74 36 34 29 32 39 34 39 36 37 32 39  3_int64)29496729
1b3e0 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  6;..#if SQLITE_O
1b3f0 53 5f 57 49 4e 43 45 0a 20 20 53 59 53 54 45 4d  S_WINCE.  SYSTEM
1b400 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20 6f 73 47  TIME time;.  osG
1b410 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26 74 69  etSystemTime(&ti
1b420 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53 79 73  me);.  /* if Sys
1b430 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
1b440 65 28 29 20 66 61 69 6c 73 2c 20 69 74 20 72 65  e() fails, it re
1b450 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20  turns zero. */. 
1b460 20 69 66 20 28 21 6f 73 53 79 73 74 65 6d 54 69   if (!osSystemTi
1b470 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 26 74 69  meToFileTime(&ti
1b480 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20 20 72 65  me,&ft)){.    re
1b490 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1b4a0 52 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 6f  R;.  }.#else.  o
1b4b0 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73  sGetSystemTimeAs
1b4c0 46 69 6c 65 54 69 6d 65 28 20 26 66 74 20 29 3b  FileTime( &ft );
1b4d0 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69 4e 6f  .#endif..  *piNo
1b4e0 77 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d 65 45  w = winFiletimeE
1b4f0 70 6f 63 68 20 2b 0a 20 20 20 20 20 20 20 20 20  poch +.         
1b500 20 20 20 28 28 28 28 73 71 6c 69 74 65 33 5f 69     ((((sqlite3_i
1b510 6e 74 36 34 29 66 74 2e 64 77 48 69 67 68 44 61  nt64)ft.dwHighDa
1b520 74 65 54 69 6d 65 29 2a 6d 61 78 33 32 42 69 74  teTime)*max32Bit
1b530 56 61 6c 75 65 29 20 2b 20 0a 20 20 20 20 20 20  Value) + .      
1b540 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
1b550 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 4c 6f 77  3_int64)ft.dwLow
1b560 44 61 74 65 54 69 6d 65 29 2f 28 73 71 6c 69 74  DateTime)/(sqlit
1b570 65 33 5f 69 6e 74 36 34 29 31 30 30 30 30 3b 0a  e3_int64)10000;.
1b580 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1b590 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  EST.  if( sqlite
1b5a0 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29  3_current_time )
1b5b0 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31  {.    *piNow = 1
1b5c0 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
1b5d0 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65  64)sqlite3_curre
1b5e0 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70  nt_time + unixEp
1b5f0 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  och;.  }.#endif.
1b600 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1b610 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75  ER(pVfs);.  retu
1b620 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1b630 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
1b640 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
1b650 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
1b660 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
1b670 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72  rite the.** curr
1b680 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
1b690 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
1b6a0 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  y number into *p
1b6b0 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75  rNow and.** retu
1b6c0 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20  rn 0.  Return 1 
1b6d0 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
1b6e0 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66  date cannot be f
1b6f0 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
1b700 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69  int winCurrentTi
1b710 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  me(sqlite3_vfs *
1b720 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72  pVfs, double *pr
1b730 4e 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Now){.  int rc;.
1b740 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1b750 69 3b 0a 20 20 72 63 20 3d 20 77 69 6e 43 75 72  i;.  rc = winCur
1b760 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56  rentTimeInt64(pV
1b770 66 73 2c 20 26 69 29 3b 0a 20 20 69 66 28 20 21  fs, &i);.  if( !
1b780 72 63 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77  rc ){.    *prNow
1b790 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b   = i/86400000.0;
1b7a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1b7b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  ;.}../*.** The i
1b7c0 64 65 61 20 69 73 20 74 68 61 74 20 74 68 69 73  dea is that this
1b7d0 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20   function works 
1b7e0 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74 69  like a combinati
1b7f0 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74  on of.** GetLast
1b800 45 72 72 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d  Error() and Form
1b810 61 74 4d 65 73 73 61 67 65 28 29 20 6f 6e 20 57  atMessage() on W
1b820 69 6e 64 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f  indows (or errno
1b830 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72   and.** strerror
1b840 5f 72 28 29 20 6f 6e 20 55 6e 69 78 29 2e 20 41  _r() on Unix). A
1b850 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 69 73  fter an error is
1b860 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20   returned by an 
1b870 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20  OS.** function, 
1b880 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69  SQLite calls thi
1b890 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  s function with 
1b8a0 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f  zBuf pointing to
1b8b0 0a 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 66 20  .** a buffer of 
1b8c0 6e 42 75 66 20 62 79 74 65 73 2e 20 54 68 65 20  nBuf bytes. The 
1b8d0 4f 53 20 6c 61 79 65 72 20 73 68 6f 75 6c 64 20  OS layer should 
1b8e0 70 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20  populate the.** 
1b8f0 62 75 66 66 65 72 20 77 69 74 68 20 61 20 6e 75  buffer with a nu
1b900 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46  l-terminated UTF
1b910 2d 38 20 65 6e 63 6f 64 65 64 20 65 72 72 6f 72  -8 encoded error
1b920 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64 65 73 63   message.** desc
1b930 72 69 62 69 6e 67 20 74 68 65 20 6c 61 73 74 20  ribing the last 
1b940 49 4f 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65  IO error to have
1b950 20 6f 63 63 75 72 72 65 64 20 77 69 74 68 69 6e   occurred within
1b960 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
1b970 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  thread..**.** If
1b980 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
1b990 67 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  ge is too large 
1b9a0 66 6f 72 20 74 68 65 20 73 75 70 70 6c 69 65 64  for the supplied
1b9b0 20 62 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73   buffer,.** it s
1b9c0 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74  hould be truncat
1b9d0 65 64 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76  ed. The return v
1b9e0 61 6c 75 65 20 6f 66 20 78 47 65 74 4c 61 73 74  alue of xGetLast
1b9f0 45 72 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f  Error.** is zero
1ba00 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   if the error me
1ba10 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74 68  ssage fits in th
1ba20 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e  e buffer, or non
1ba30 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69  -zero.** otherwi
1ba40 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73 61  se (if the messa
1ba50 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  ge was truncated
1ba60 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69  ). If non-zero i
1ba70 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74  s returned,.** t
1ba80 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  hen it is not ne
1ba90 63 65 73 73 61 72 79 20 74 6f 20 69 6e 63 6c 75  cessary to inclu
1baa0 64 65 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69  de the nul-termi
1bab0 6e 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a  nator character.
1bac0 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ** in the output
1bad0 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e   buffer..**.** N
1bae0 6f 74 20 73 75 70 70 6c 79 69 6e 67 20 61 6e 20  ot supplying an 
1baf0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69  error message wi
1bb00 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64 76 65 72  ll have no adver
1bb10 73 65 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20  se effect.** on 
1bb20 53 51 4c 69 74 65 2e 20 49 74 20 69 73 20 66 69  SQLite. It is fi
1bb30 6e 65 20 74 6f 20 68 61 76 65 20 61 6e 20 69 6d  ne to have an im
1bb40 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61  plementation tha
1bb50 74 20 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75 72  t never.** retur
1bb60 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ns an error mess
1bb70 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74  age:.**.**   int
1bb80 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73   xGetLastError(s
1bb90 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1bba0 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
1bbb0 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20   *zBuf){.**     
1bbc0 61 73 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d  assert(zBuf[0]==
1bbd0 27 5c 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65  '\0');.**     re
1bbe0 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a  turn 0;.**   }.*
1bbf0 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 20 69 66 20  *.** However if 
1bc00 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
1bc10 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 69 74   is supplied, it
1bc20 20 77 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f   will be incorpo
1bc30 72 61 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69  rated.** by sqli
1bc40 74 65 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f  te into the erro
1bc50 72 20 6d 65 73 73 61 67 65 20 61 76 61 69 6c 61  r message availa
1bc60 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 20  ble to the user 
1bc70 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  using.** sqlite3
1bc80 5f 65 72 72 6d 73 67 28 29 2c 20 70 6f 73 73 69  _errmsg(), possi
1bc90 62 6c 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72  bly making IO er
1bca0 72 6f 72 73 20 65 61 73 69 65 72 20 74 6f 20 64  rors easier to d
1bcb0 65 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ebug..*/.static 
1bcc0 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72  int winGetLastEr
1bcd0 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
1bce0 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
1bcf0 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
1bd00 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1bd10 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e  (pVfs);.  return
1bd20 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67   getLastErrorMsg
1bd30 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28  (osGetLastError(
1bd40 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 29 3b 0a  ), nBuf, zBuf);.
1bd50 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  }..../*.** Initi
1bd60 61 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e 69 74  alize and deinit
1bd70 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61  ialize the opera
1bd80 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65  ting system inte
1bd90 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rface..*/.int sq
1bda0 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f  lite3_os_init(vo
1bdb0 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71  id){.  static sq
1bdc0 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 56 66 73  lite3_vfs winVfs
1bdd0 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20   = {.    3,     
1bde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bdf0 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20   iVersion */.   
1be00 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29   sizeof(winFile)
1be10 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c  ,     /* szOsFil
1be20 65 20 2a 2f 0a 20 20 20 20 4d 41 58 5f 50 41 54  e */.    MAX_PAT
1be30 48 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  H,            /*
1be40 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20   mxPathname */. 
1be50 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
1be60 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74          /* pNext
1be70 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22 2c   */.    "win32",
1be80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1be90 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20  zName */.    0, 
1bea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1beb0 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f    /* pAppData */
1bec0 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20  .    winOpen,   
1bed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70            /* xOp
1bee0 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c  en */.    winDel
1bef0 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ete,           /
1bf00 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20  * xDelete */.   
1bf10 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20   winAccess,     
1bf20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73        /* xAccess
1bf30 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50   */.    winFullP
1bf40 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20  athname,     /* 
1bf50 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f  xFullPathname */
1bf60 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20  .    winDlOpen, 
1bf70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
1bf80 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44  Open */.    winD
1bf90 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20  lError,         
1bfa0 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a   /* xDlError */.
1bfb0 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20      winDlSym,   
1bfc0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53           /* xDlS
1bfd0 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43  ym */.    winDlC
1bfe0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  lose,          /
1bff0 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20  * xDlClose */.  
1c000 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c    winRandomness,
1c010 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f         /* xRando
1c020 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e  mness */.    win
1c030 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20  Sleep,          
1c040 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20    /* xSleep */. 
1c050 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d     winCurrentTim
1c060 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72  e,      /* xCurr
1c070 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77  entTime */.    w
1c080 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20  inGetLastError, 
1c090 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45      /* xGetLastE
1c0a0 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43  rror */.    winC
1c0b0 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c  urrentTimeInt64,
1c0c0 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
1c0d0 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e  Int64 */.    win
1c0e0 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  SetSystemCall,  
1c0f0 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43    /* xSetSystemC
1c100 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  all */.    winGe
1c110 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
1c120 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c  /* xGetSystemCal
1c130 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74  l */.    winNext
1c140 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a  SystemCall,   /*
1c150 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c   xNextSystemCall
1c160 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 2f 2a 20 44   */.  };..  /* D
1c170 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 68 61 74  ouble-check that
1c180 20 74 68 65 20 61 53 79 73 63 61 6c 6c 5b 5d 20   the aSyscall[] 
1c190 61 72 72 61 79 20 68 61 73 20 62 65 65 6e 20 63  array has been c
1c1a0 6f 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20  onstructed.  ** 
1c1b0 63 6f 72 72 65 63 74 6c 79 2e 20 20 53 65 65 20  correctly.  See 
1c1c0 74 69 63 6b 65 74 20 5b 62 62 33 61 38 36 65 38  ticket [bb3a86e8
1c1d0 39 30 63 38 65 39 36 61 62 5d 20 2a 2f 0a 20 20  90c8e96ab] */.  
1c1e0 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a  assert( ArraySiz
1c1f0 65 28 61 53 79 73 63 61 6c 6c 29 3d 3d 36 30 20  e(aSyscall)==60 
1c200 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1c210 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 2f 2a  TE_OMIT_WAL.  /*
1c220 20 67 65 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20   get memory map 
1c230 61 6c 6c 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75  allocation granu
1c240 6c 61 72 69 74 79 20 2a 2f 0a 20 20 6d 65 6d 73  larity */.  mems
1c250 65 74 28 26 77 69 6e 53 79 73 49 6e 66 6f 2c 20  et(&winSysInfo, 
1c260 30 2c 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d  0, sizeof(SYSTEM
1c270 5f 49 4e 46 4f 29 29 3b 0a 20 20 6f 73 47 65 74  _INFO));.  osGet
1c280 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53  SystemInfo(&winS
1c290 79 73 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72  ysInfo);.  asser
1c2a0 74 28 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41  t(winSysInfo.dwA
1c2b0 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61  llocationGranula
1c2c0 72 69 74 79 20 3e 20 30 29 3b 0a 23 65 6e 64 69  rity > 0);.#endi
1c2d0 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  f..  sqlite3_vfs
1c2e0 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e 56 66  _register(&winVf
1c2f0 73 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  s, 1);.  return 
1c300 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 69 6e  SQLITE_OK; .}.in
1c310 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64  t sqlite3_os_end
1c320 28 76 6f 69 64 29 7b 20 0a 20 20 72 65 74 75 72  (void){ .  retur
1c330 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1c340 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1c350 5f 4f 53 5f 57 49 4e 20 2a 2f 0a                 _OS_WIN */.