/ Hex Artifact Content
Login

Artifact 197d23ce8a0dff748e766e034bf95ff756dd3884:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59   */..#ifdef __CY
0220: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0230: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0240: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
0250: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
0260: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
0270: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
0280: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
0290: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 53  mmon.h"../*.** S
02a0: 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f  ome Microsoft co
02b0: 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69  mpilers lack thi
02c0: 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f  s definition..*/
02d0: 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44  .#ifndef INVALID
02e0: 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
02f0: 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49  .# define INVALI
0300: 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
0310: 53 20 28 28 44 57 4f 52 44 29 2d 31 29 20 0a 23  S ((DWORD)-1) .#
0320: 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72  endif../* Forwar
0330: 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a  d references */.
0340: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
0350: 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20 20 20  inShm winShm;   
0360: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6e          /* A con
0370: 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65  nection to share
0380: 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65  d-memory */.type
0390: 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 53 68  def struct winSh
03a0: 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f 64 65  mNode winShmNode
03b0: 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f 6e 20  ;   /* A region 
03c0: 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
03d0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 43 45   */../*.** WinCE
03e0: 20 6c 61 63 6b 73 20 6e 61 74 69 76 65 20 73 75   lacks native su
03f0: 70 70 6f 72 74 20 66 6f 72 20 66 69 6c 65 20 6c  pport for file l
0400: 6f 63 6b 69 6e 67 20 73 6f 20 77 65 20 68 61 76  ocking so we hav
0410: 65 20 74 6f 20 66 61 6b 65 20 69 74 0a 2a 2a 20  e to fake it.** 
0420: 77 69 74 68 20 73 6f 6d 65 20 63 6f 64 65 20 6f  with some code o
0430: 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a 23 69  f our own..*/.#i
0440: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
0450: 45 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  E.typedef struct
0460: 20 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20 20 69   winceLock {.  i
0470: 6e 74 20 6e 52 65 61 64 65 72 73 3b 20 20 20 20  nt nReaders;    
0480: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0490: 72 65 61 64 65 72 20 6c 6f 63 6b 73 20 6f 62 74  reader locks obt
04a0: 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ained */.  BOOL 
04b0: 62 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 2f  bPending;      /
04c0: 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20 70 65  * Indicates a pe
04d0: 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62  nding lock has b
04e0: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a  een obtained */.
04f0: 20 20 42 4f 4f 4c 20 62 52 65 73 65 72 76 65 64    BOOL bReserved
0500: 3b 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74  ;     /* Indicat
0510: 65 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  es a reserved lo
0520: 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61  ck has been obta
0530: 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  ined */.  BOOL b
0540: 45 78 63 6c 75 73 69 76 65 3b 20 20 20 20 2f 2a  Exclusive;    /*
0550: 20 49 6e 64 69 63 61 74 65 73 20 61 6e 20 65 78   Indicates an ex
0560: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 68 61 73  clusive lock has
0570: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a   been obtained *
0580: 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b 0a 23  /.} winceLock;.#
0590: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
05a0: 20 77 69 6e 46 69 6c 65 20 73 74 72 75 63 74 75   winFile structu
05b0: 72 65 20 69 73 20 61 20 73 75 62 63 6c 61 73 73  re is a subclass
05c0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   of sqlite3_file
05d0: 2a 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68  * specific to th
05e0: 65 20 77 69 6e 33 32 0a 2a 2a 20 70 6f 72 74 61  e win32.** porta
05f0: 62 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a 2f  bility layer..*/
0600: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0610: 77 69 6e 46 69 6c 65 20 77 69 6e 46 69 6c 65 3b  winFile winFile;
0620: 0a 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20  .struct winFile 
0630: 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  {.  const sqlite
0640: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d  3_io_methods *pM
0650: 65 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75 73 74  ethod; /*** Must
0660: 20 62 65 20 66 69 72 73 74 20 2a 2a 2a 2f 0a 20   be first ***/. 
0670: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
0680: 66 73 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  fs;      /* The 
0690: 56 46 53 20 75 73 65 64 20 74 6f 20 6f 70 65 6e  VFS used to open
06a0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
06b0: 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20 20  HANDLE h;       
06c0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
06d0: 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20  e for accessing 
06e0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  the file */.  u8
06f0: 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20   locktype;      
0700: 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
0710: 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79 20   lock currently 
0720: 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 69 6c  held on this fil
0730: 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73 68 61  e */.  short sha
0740: 72 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20 20 2f  redLockByte;   /
0750: 2a 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f 73 65  * Randomly chose
0760: 6e 20 62 79 74 65 20 75 73 65 64 20 61 73 20 61  n byte used as a
0770: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a   shared lock */.
0780: 20 20 75 38 20 62 50 65 72 73 69 73 74 57 61 6c    u8 bPersistWal
0790: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
07a0: 65 20 74 6f 20 70 65 72 73 69 73 74 20 57 41 4c  e to persist WAL
07b0: 20 66 69 6c 65 73 20 2a 2f 0a 20 20 44 57 4f 52   files */.  DWOR
07c0: 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20  D lastErrno;    
07d0: 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f      /* The Windo
07e0: 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68  ws errno from th
07f0: 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72  e last I/O error
0800: 20 2a 2f 0a 20 20 44 57 4f 52 44 20 73 65 63 74   */.  DWORD sect
0810: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a  orSize;       /*
0820: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   Sector size of 
0830: 74 68 65 20 64 65 76 69 63 65 20 66 69 6c 65 20  the device file 
0840: 69 73 20 6f 6e 20 2a 2f 0a 20 20 77 69 6e 53 68  is on */.  winSh
0850: 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20  m *pShm;        
0860: 20 20 20 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f     /* Instance o
0870: 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  f shared memory 
0880: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
0890: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
08a0: 61 74 68 3b 20 20 20 20 20 20 2f 2a 20 46 75 6c  ath;      /* Ful
08b0: 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
08c0: 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  is file */.  int
08d0: 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20   szChunk;       
08e0: 20 20 20 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69       /* Chunk si
08f0: 7a 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79  ze configured by
0900: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
0910: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
0920: 4f 53 5f 57 49 4e 43 45 0a 20 20 4c 50 57 53 54  OS_WINCE.  LPWST
0930: 52 20 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  R zDeleteOnClose
0940: 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69  ;  /* Name of fi
0950: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 77 68 65  le to delete whe
0960: 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 48  n closing */.  H
0970: 41 4e 44 4c 45 20 68 4d 75 74 65 78 3b 20 20 20  ANDLE hMutex;   
0980: 20 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20         /* Mutex 
0990: 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  used to control 
09a0: 61 63 63 65 73 73 20 74 6f 20 73 68 61 72 65 64  access to shared
09b0: 20 6c 6f 63 6b 20 2a 2f 20 20 0a 20 20 48 41 4e   lock */  .  HAN
09c0: 44 4c 45 20 68 53 68 61 72 65 64 3b 20 20 20 20  DLE hShared;    
09d0: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d       /* Shared m
09e0: 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 75 73  emory segment us
09f0: 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a  ed for locking *
0a00: 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f  /.  winceLock lo
0a10: 63 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  cal;        /* L
0a20: 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 62 79  ocks obtained by
0a30: 20 74 68 69 73 20 69 6e 73 74 61 6e 63 65 20 6f   this instance o
0a40: 66 20 77 69 6e 46 69 6c 65 20 2a 2f 0a 20 20 77  f winFile */.  w
0a50: 69 6e 63 65 4c 6f 63 6b 20 2a 73 68 61 72 65 64  inceLock *shared
0a60: 3b 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c  ;      /* Global
0a70: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6d 65 6d   shared lock mem
0a80: 6f 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ory for the file
0a90: 20 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a    */.#endif.};..
0aa0: 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65  /*. * If compile
0ab0: 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 57 49  d with SQLITE_WI
0ac0: 4e 33 32 5f 4d 41 4c 4c 4f 43 20 6f 6e 20 57 69  N32_MALLOC on Wi
0ad0: 6e 64 6f 77 73 2c 20 77 65 20 77 69 6c 6c 20 75  ndows, we will u
0ae0: 73 65 20 74 68 65 0a 20 2a 20 76 61 72 69 6f 75  se the. * variou
0af0: 73 20 57 69 6e 33 32 20 41 50 49 20 68 65 61 70  s Win32 API heap
0b00: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 73 74 65   functions inste
0b10: 61 64 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 20  ad of our own.. 
0b20: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0b30: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a  _WIN32_MALLOC./*
0b40: 0a 20 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20  . * The initial 
0b50: 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33  size of the Win3
0b60: 32 2d 73 70 65 63 69 66 69 63 20 68 65 61 70 2e  2-specific heap.
0b70: 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79    This value may
0b80: 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69   be zero.. */.#i
0b90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
0ba0: 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a  32_HEAP_INIT_SIZ
0bb0: 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  E.#  define SQLI
0bc0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e  TE_WIN32_HEAP_IN
0bd0: 49 54 5f 53 49 5a 45 20 28 28 53 51 4c 49 54 45  IT_SIZE ((SQLITE
0be0: 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53  _DEFAULT_CACHE_S
0bf0: 49 5a 45 29 20 2a 20 5c 0a 20 20 20 20 20 20 20  IZE) * \.       
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
0c30: 50 41 47 45 5f 53 49 5a 45 29 20 2b 20 34 31 39  PAGE_SIZE) + 419
0c40: 34 33 30 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  4304).#endif../*
0c50: 0a 20 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  . * The maximum 
0c60: 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33  size of the Win3
0c70: 32 2d 73 70 65 63 69 66 69 63 20 68 65 61 70 2e  2-specific heap.
0c80: 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79    This value may
0c90: 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69   be zero.. */.#i
0ca0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
0cb0: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45  32_HEAP_MAX_SIZE
0cc0: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
0cd0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58  E_WIN32_HEAP_MAX
0ce0: 5f 53 49 5a 45 20 20 28 30 29 0a 23 65 6e 64 69  _SIZE  (0).#endi
0cf0: 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 65 78 74  f../*. * The ext
0d00: 72 61 20 66 6c 61 67 73 20 74 6f 20 75 73 65 20  ra flags to use 
0d10: 69 6e 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20  in calls to the 
0d20: 57 69 6e 33 32 20 68 65 61 70 20 41 50 49 73 2e  Win32 heap APIs.
0d30: 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79    This value may
0d40: 20 62 65 0a 20 2a 20 7a 65 72 6f 20 66 6f 72 20   be. * zero for 
0d50: 74 68 65 20 64 65 66 61 75 6c 74 20 62 65 68 61  the default beha
0d60: 76 69 6f 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65  vior.. */.#ifnde
0d70: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
0d80: 45 41 50 5f 46 4c 41 47 53 0a 23 20 20 64 65 66  EAP_FLAGS.#  def
0d90: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
0da0: 5f 48 45 41 50 5f 46 4c 41 47 53 20 20 20 20 20  _HEAP_FLAGS     
0db0: 28 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (0).#endif../*.*
0dc0: 2a 20 54 68 65 20 77 69 6e 4d 65 6d 44 61 74 61  * The winMemData
0dd0: 20 73 74 72 75 63 74 75 72 65 20 73 74 6f 72 65   structure store
0de0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65  s information re
0df0: 71 75 69 72 65 64 20 62 79 20 74 68 65 20 57 69  quired by the Wi
0e00: 6e 33 32 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20  n32-specific.** 
0e10: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
0e20: 6f 64 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ods implementati
0e30: 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  on..*/.typedef s
0e40: 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61  truct winMemData
0e50: 20 77 69 6e 4d 65 6d 44 61 74 61 3b 0a 73 74 72   winMemData;.str
0e60: 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 7b  uct winMemData {
0e70: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
0e80: 20 20 75 33 32 20 6d 61 67 69 63 3b 20 20 20 20    u32 magic;    
0e90: 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20  /* Magic number 
0ea0: 74 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74  to detect struct
0eb0: 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ure corruption. 
0ec0: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 48 41 4e 44  */.#endif.  HAND
0ed0: 4c 45 20 68 48 65 61 70 3b 20 2f 2a 20 54 68 65  LE hHeap; /* The
0ee0: 20 68 61 6e 64 6c 65 20 74 6f 20 6f 75 72 20 68   handle to our h
0ef0: 65 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  eap. */.  BOOL b
0f00: 4f 77 6e 65 64 3b 20 20 2f 2a 20 44 6f 20 77 65  Owned;  /* Do we
0f10: 20 6f 77 6e 20 74 68 65 20 68 65 61 70 20 28 69   own the heap (i
0f20: 2e 65 2e 20 64 65 73 74 72 6f 79 20 69 74 20 6f  .e. destroy it o
0f30: 6e 20 73 68 75 74 64 6f 77 6e 29 3f 20 2a 2f 0a  n shutdown)? */.
0f40: 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  };..#ifndef NDEB
0f50: 55 47 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45  UG.#define WINME
0f60: 4d 5f 4d 41 47 49 43 20 20 20 20 20 30 78 34 32  M_MAGIC     0x42
0f70: 62 32 38 33 30 62 0a 23 65 6e 64 69 66 0a 0a 73  b2830b.#endif..s
0f80: 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e  tatic struct win
0f90: 4d 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65 6d 5f  MemData win_mem_
0fa0: 64 61 74 61 20 3d 20 7b 0a 23 69 66 6e 64 65 66  data = {.#ifndef
0fb0: 20 4e 44 45 42 55 47 0a 20 20 57 49 4e 4d 45 4d   NDEBUG.  WINMEM
0fc0: 5f 4d 41 47 49 43 2c 0a 23 65 6e 64 69 66 0a 20  _MAGIC,.#endif. 
0fd0: 20 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a 7d 3b 0a   NULL, FALSE.};.
0fe0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
0ff0: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73  #define winMemAs
1000: 73 65 72 74 4d 61 67 69 63 28 29 20 61 73 73 65  sertMagic() asse
1010: 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61  rt( win_mem_data
1020: 2e 6d 61 67 69 63 3d 3d 57 49 4e 4d 45 4d 5f 4d  .magic==WINMEM_M
1030: 41 47 49 43 20 29 0a 23 65 6c 73 65 0a 23 64 65  AGIC ).#else.#de
1040: 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72  fine winMemAsser
1050: 74 4d 61 67 69 63 28 29 0a 23 65 6e 64 69 66 0a  tMagic().#endif.
1060: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47  .#define winMemG
1070: 65 74 48 65 61 70 28 29 20 77 69 6e 5f 6d 65 6d  etHeap() win_mem
1080: 5f 64 61 74 61 2e 68 48 65 61 70 0a 0a 73 74 61  _data.hHeap..sta
1090: 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d  tic void *winMem
10a0: 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65  Malloc(int nByte
10b0: 73 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  s);.static void 
10c0: 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20  winMemFree(void 
10d0: 2a 70 50 72 69 6f 72 29 3b 0a 73 74 61 74 69 63  *pPrior);.static
10e0: 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61   void *winMemRea
10f0: 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f  lloc(void *pPrio
1100: 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a  r, int nBytes);.
1110: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
1120: 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 3b 0a  mSize(void *p);.
1130: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
1140: 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 3b  mRoundup(int n);
1150: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
1160: 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70  emInit(void *pAp
1170: 70 44 61 74 61 29 3b 0a 73 74 61 74 69 63 20 76  pData);.static v
1180: 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f  oid winMemShutdo
1190: 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74  wn(void *pAppDat
11a0: 61 29 3b 0a 0a 63 6f 6e 73 74 20 73 71 6c 69 74  a);..const sqlit
11b0: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a  e3_mem_methods *
11c0: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e  sqlite3MemGetWin
11d0: 33 32 28 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66  32(void);.#endif
11e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   /* SQLITE_WIN32
11f0: 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a  _MALLOC */../*.*
1200: 2a 20 46 6f 72 77 61 72 64 20 70 72 6f 74 6f 74  * Forward protot
1210: 79 70 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ypes..*/.static 
1220: 69 6e 74 20 67 65 74 53 65 63 74 6f 72 53 69 7a  int getSectorSiz
1230: 65 28 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  e(.    sqlite3_v
1240: 66 73 20 2a 70 56 66 73 2c 0a 20 20 20 20 63 6f  fs *pVfs,.    co
1250: 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74  nst char *zRelat
1260: 69 76 65 20 20 20 20 20 2f 2a 20 55 54 46 2d 38  ive     /* UTF-8
1270: 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 29 3b   file name */.);
1280: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
1290: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69  owing variable i
12a0: 73 20 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65 74  s (normally) set
12b0: 20 6f 6e 63 65 20 61 6e 64 20 6e 65 76 65 72 20   once and never 
12c0: 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72 65  changes.** there
12d0: 61 66 74 65 72 2e 20 20 49 74 20 72 65 63 6f 72  after.  It recor
12e0: 64 73 20 77 68 65 74 68 65 72 20 74 68 65 20 6f  ds whether the o
12f0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
1300: 69 73 20 57 69 6e 39 78 0a 2a 2a 20 6f 72 20 57  is Win9x.** or W
1310: 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20  inNT..**.** 0:  
1320: 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   Operating syste
1330: 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a  m unknown..** 1:
1340: 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73     Operating sys
1350: 74 65 6d 20 69 73 20 57 69 6e 39 78 2e 0a 2a 2a  tem is Win9x..**
1360: 20 32 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20   2:   Operating 
1370: 73 79 73 74 65 6d 20 69 73 20 57 69 6e 4e 54 2e  system is WinNT.
1380: 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20  .**.** In order 
1390: 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 65  to facilitate te
13a0: 73 74 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e 54  sting on a WinNT
13b0: 20 73 79 73 74 65 6d 2c 20 74 68 65 20 74 65 73   system, the tes
13c0: 74 20 66 69 78 74 75 72 65 0a 2a 2a 20 63 61 6e  t fixture.** can
13d0: 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20 74 68   manually set th
13e0: 69 73 20 76 61 6c 75 65 20 74 6f 20 31 20 74 6f  is value to 1 to
13f0: 20 65 6d 75 6c 61 74 65 20 57 69 6e 39 38 20 62   emulate Win98 b
1400: 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66 64  ehavior..*/.#ifd
1410: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
1420: 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  nt sqlite3_os_ty
1430: 70 65 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  pe = 0;.#else.st
1440: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
1450: 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65  _os_type = 0;.#e
1460: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79  ndif../*.** Many
1470: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72   system calls ar
1480: 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f 75  e accessed throu
1490: 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75  gh pointer-to-fu
14a0: 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a  nctions so that.
14b0: 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f  ** they may be o
14c0: 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e  verridden at run
14d0: 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61  time to facilita
14e0: 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69  te fault injecti
14f0: 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73  on during.** tes
1500: 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78  ting and sandbox
1510: 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ing.  The follow
1520: 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20  ing array holds 
1530: 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f  the names and po
1540: 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c  inters.** to all
1550: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
1560: 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 23  stem calls..*/.#
1570: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
1580: 4e 43 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  NCE.#  define SQ
1590: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
15a0: 4e 53 49 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  NSI.#endif..#if 
15b0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
15c0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  || SQLITE_OS_WIN
15d0: 4e 54 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  NT.#  define SQL
15e0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
15f0: 44 45 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  DE.#endif..#ifnd
1600: 65 66 20 53 59 53 43 41 4c 4c 0a 23 20 20 64 65  ef SYSCALL.#  de
1610: 66 69 6e 65 20 53 59 53 43 41 4c 4c 20 73 71 6c  fine SYSCALL sql
1620: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
1630: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
1640: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 2f 2a 0a  ITE_OS_WINCE./*.
1650: 2a 2a 20 54 68 65 73 65 20 6d 61 63 72 6f 73 20  ** These macros 
1660: 61 72 65 20 6e 65 63 65 73 73 61 72 79 20 62 65  are necessary be
1670: 63 61 75 73 65 20 57 69 6e 64 6f 77 73 20 43 45  cause Windows CE
1680: 20 64 6f 65 73 20 6e 6f 74 20 6e 61 74 69 76 65   does not native
1690: 6c 79 20 73 75 70 70 6f 72 74 20 74 68 65 0a 2a  ly support the.*
16a0: 2a 20 57 69 6e 33 32 20 41 50 49 73 20 4c 6f 63  * Win32 APIs Loc
16b0: 6b 46 69 6c 65 2c 20 55 6e 6c 6f 63 6b 46 69 6c  kFile, UnlockFil
16c0: 65 2c 20 61 6e 64 20 4c 6f 63 6b 46 69 6c 65 45  e, and LockFileE
16d0: 78 2e 0a 20 2a 2f 0a 0a 23 20 20 64 65 66 69 6e  x.. */..#  defin
16e0: 65 20 4c 6f 63 6b 46 69 6c 65 28 61 2c 62 2c 63  e LockFile(a,b,c
16f0: 2c 64 2c 65 29 20 20 20 20 20 20 20 77 69 6e 63  ,d,e)       winc
1700: 65 4c 6f 63 6b 46 69 6c 65 28 26 61 2c 20 62 2c  eLockFile(&a, b,
1710: 20 63 2c 20 64 2c 20 65 29 0a 23 20 20 64 65 66   c, d, e).#  def
1720: 69 6e 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 61  ine UnlockFile(a
1730: 2c 62 2c 63 2c 64 2c 65 29 20 20 20 20 20 77 69  ,b,c,d,e)     wi
1740: 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 61  nceUnlockFile(&a
1750: 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23 20  , b, c, d, e).# 
1760: 20 64 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65   define LockFile
1770: 45 78 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20  Ex(a,b,c,d,e,f) 
1780: 20 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45    winceLockFileE
1790: 78 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65  x(&a, b, c, d, e
17a0: 2c 20 66 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  , f)../*.** Thes
17b0: 65 20 61 72 65 20 74 68 65 20 73 70 65 63 69 61  e are the specia
17c0: 6c 20 73 79 73 63 61 6c 6c 20 68 61 63 6b 73 20  l syscall hacks 
17d0: 66 6f 72 20 57 69 6e 64 6f 77 73 20 43 45 2e 20  for Windows CE. 
17e0: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c   The locking rel
17f0: 61 74 65 64 0a 2a 2a 20 64 65 66 69 6e 65 73 20  ated.** defines 
1800: 68 65 72 65 20 72 65 66 65 72 20 74 6f 20 74 68  here refer to th
1810: 65 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 64  e macros defined
1820: 20 6a 75 73 74 20 61 62 6f 76 65 2e 0a 20 2a 2f   just above.. */
1830: 0a 0a 23 20 20 64 65 66 69 6e 65 20 6f 73 41 72  ..#  define osAr
1840: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20  eFileApisANSI() 
1850: 20 20 20 20 20 20 31 0a 23 20 20 64 65 66 69 6e        1.#  defin
1860: 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 20 20 20 20  e osLockFile    
1870: 20 20 20 20 20 20 20 20 20 20 20 20 4c 6f 63 6b              Lock
1880: 46 69 6c 65 0a 23 20 20 64 65 66 69 6e 65 20 6f  File.#  define o
1890: 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 20 20 20 20  sUnlockFile     
18a0: 20 20 20 20 20 20 20 20 20 55 6e 6c 6f 63 6b 46           UnlockF
18b0: 69 6c 65 0a 23 20 20 64 65 66 69 6e 65 20 6f 73  ile.#  define os
18c0: 4c 6f 63 6b 46 69 6c 65 45 78 20 20 20 20 20 20  LockFileEx      
18d0: 20 20 20 20 20 20 20 20 4c 6f 63 6b 46 69 6c 65          LockFile
18e0: 45 78 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69  Ex.#endif..stati
18f0: 63 20 73 74 72 75 63 74 20 77 69 6e 5f 73 79 73  c struct win_sys
1900: 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63  call {.  const c
1910: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
1920: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1930: 66 20 74 68 65 20 73 79 74 65 6d 20 63 61 6c 6c  f the sytem call
1940: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
1950: 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65  scall_ptr pCurre
1960: 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76  nt; /* Current v
1970: 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73 74  alue of the syst
1980: 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c  em call */.  sql
1990: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
19a0: 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65   pDefault; /* De
19b0: 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d  fault value */.}
19c0: 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a   aSyscall[] = {.
19d0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
19e0: 49 4e 43 45 0a 20 20 7b 20 22 41 72 65 46 69 6c  INCE.  { "AreFil
19f0: 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20  eApisANSI",     
1a00: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 41 72 65      (SYSCALL)Are
1a10: 46 69 6c 65 41 70 69 73 41 4e 53 49 2c 20 20 20  FileApisANSI,   
1a20: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
1a30: 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69  ine osAreFileApi
1a40: 73 41 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e  sANSI ((BOOL(WIN
1a50: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
1a60: 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74  call[0].pCurrent
1a70: 29 0a 23 65 6c 73 65 0a 20 20 7b 20 22 41 72 65  ).#else.  { "Are
1a80: 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20  FileApisANSI",  
1a90: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
1aa0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
1ab0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
1ac0: 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
1ad0: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66  _OS_WINCE && def
1ae0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
1af0: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
1b00: 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20 20  "CharLowerW",   
1b10: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
1b20: 41 4c 4c 29 43 68 61 72 4c 6f 77 65 72 57 2c 20  ALL)CharLowerW, 
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
1b40: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 68 61  ,.#else.  { "Cha
1b50: 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20 20  rLowerW",       
1b60: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
1b70: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
1b80: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
1b90: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
1ba0: 43 68 61 72 4c 6f 77 65 72 57 20 28 28 4c 50 57  CharLowerW ((LPW
1bb0: 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c 50 57  STR(WINAPI*)(LPW
1bc0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d  STR))aSyscall[1]
1bd0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
1be0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
1bf0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
1c00: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
1c10: 29 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65 72  ).  { "CharUpper
1c20: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
1c30: 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72 55 70   (SYSCALL)CharUp
1c40: 70 65 72 57 2c 20 20 20 20 20 20 20 20 20 20 20  perW,           
1c50: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
1c60: 7b 20 22 43 68 61 72 55 70 70 65 72 57 22 2c 20  { "CharUpperW", 
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
1c80: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
1ca0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
1cb0: 69 6e 65 20 6f 73 43 68 61 72 55 70 70 65 72 57  ine osCharUpperW
1cc0: 20 28 28 4c 50 57 53 54 52 28 57 49 4e 41 50 49   ((LPWSTR(WINAPI
1cd0: 2a 29 28 4c 50 57 53 54 52 29 29 61 53 79 73 63  *)(LPWSTR))aSysc
1ce0: 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29  all[2].pCurrent)
1cf0: 0a 0a 20 20 7b 20 22 43 6c 6f 73 65 48 61 6e 64  ..  { "CloseHand
1d00: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
1d10: 20 28 53 59 53 43 41 4c 4c 29 43 6c 6f 73 65 48   (SYSCALL)CloseH
1d20: 61 6e 64 6c 65 2c 20 20 20 20 20 20 20 20 20 20  andle,          
1d30: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
1d40: 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 20 28   osCloseHandle (
1d50: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
1d60: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
1d70: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
1d80: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1d90: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
1da0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
1db0: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  A",             
1dc0: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46  (SYSCALL)CreateF
1dd0: 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20 20  ileA,           
1de0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
1df0: 20 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c 20   "CreateFileA", 
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
1e10: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
1e30: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
1e40: 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 41  ne osCreateFileA
1e50: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
1e60: 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c  *)(LPCSTR,DWORD,
1e70: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
1e80: 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52   LPSECURITY_ATTR
1e90: 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f  IBUTES,DWORD,DWO
1ea0: 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73 63  RD,HANDLE))aSysc
1eb0: 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29  all[4].pCurrent)
1ec0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
1ed0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
1ee0: 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65  IDE).  { "Create
1ef0: 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20  FileW",         
1f00: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
1f10: 61 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20  ateFileW,       
1f20: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
1f30: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
1f40: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
1f50: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f70: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
1f80: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
1f90: 69 6c 65 57 20 28 28 48 41 4e 44 4c 45 28 57 49  ileW ((HANDLE(WI
1fa0: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44  NAPI*)(LPCWSTR,D
1fb0: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
1fc0: 20 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59        LPSECURITY
1fd0: 5f 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52  _ATTRIBUTES,DWOR
1fe0: 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29  D,DWORD,HANDLE))
1ff0: 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72  aSyscall[5].pCur
2000: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 43 72 65 61  rent)..  { "Crea
2010: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 22 2c 20  teFileMapping", 
2020: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
2030: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
2040: 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64  ,       0 },..#d
2050: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
2060: 6c 65 4d 61 70 70 69 6e 67 20 28 28 48 41 4e 44  leMapping ((HAND
2070: 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  LE(WINAPI*)(HAND
2080: 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f 41 54  LE,LPSECURITY_AT
2090: 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20  TRIBUTES, \.    
20a0: 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c      DWORD,DWORD,
20b0: 44 57 4f 52 44 2c 4c 50 43 54 53 54 52 29 29 61  DWORD,LPCTSTR))a
20c0: 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72  Syscall[6].pCurr
20d0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
20e0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
20f0: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 72  AS_WIDE).  { "Cr
2100: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
2110: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
2120: 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  )CreateFileMappi
2130: 6e 67 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  ngW,      0 },.#
2140: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
2150: 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20  FileMappingW",  
2160: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2180: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
2190: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
21a0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 20  ateFileMappingW 
21b0: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
21c0: 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52  )(HANDLE,LPSECUR
21d0: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20  ITY_ATTRIBUTES, 
21e0: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
21f0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 57  DWORD,DWORD,LPCW
2200: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d  STR))aSyscall[7]
2210: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
2220: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
2230: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
2240: 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78 57   { "CreateMutexW
2250: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
2260: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 4d 75 74  YSCALL)CreateMut
2270: 65 78 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  exW,            
2280: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
2290: 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20 20  CreateMutexW",  
22a0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
22b0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
22d0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
22e0: 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57 20   osCreateMutexW 
22f0: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
2300: 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54  )(LPSECURITY_ATT
2310: 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c 20 5c 0a  RIBUTES,BOOL, \.
2320: 20 20 20 20 20 20 20 20 4c 50 43 57 53 54 52 29          LPCWSTR)
2330: 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75  )aSyscall[8].pCu
2340: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
2350: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
2360: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
2370: 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20  DeleteFileA",   
2380: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
2390: 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 41 2c 20  LL)DeleteFileA, 
23a0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
23b0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65  .#else.  { "Dele
23c0: 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20  teFileA",       
23d0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
23e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
2400: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44  dif..#define osD
2410: 65 6c 65 74 65 46 69 6c 65 41 20 28 28 42 4f 4f  eleteFileA ((BOO
2420: 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  L(WINAPI*)(LPCST
2430: 52 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70  R))aSyscall[9].p
2440: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
2450: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
2460: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
2470: 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20   "DeleteFileW", 
2480: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
2490: 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 57  CALL)DeleteFileW
24a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
24b0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65  },.#else.  { "De
24c0: 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20  leteFileW",     
24d0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
24e0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
24f0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
2500: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
2510: 73 44 65 6c 65 74 65 46 69 6c 65 57 20 28 28 42  sDeleteFileW ((B
2520: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
2530: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 31  WSTR))aSyscall[1
2540: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
2550: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
2560: 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54  E.  { "FileTimeT
2570: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c  oLocalFileTime",
2580: 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69   (SYSCALL)FileTi
2590: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
25a0: 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  e, 0 },.#else.  
25b0: 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63  { "FileTimeToLoc
25c0: 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  alFileTime", (SY
25d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
25f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
2600: 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f  ine osFileTimeTo
2610: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 20 28 28  LocalFileTime ((
2620: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f  BOOL(WINAPI*)(CO
2630: 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c  NST FILETIME*, \
2640: 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54  .        LPFILET
2650: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 31  IME))aSyscall[11
2660: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
2670: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
2680: 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f  .  { "FileTimeTo
2690: 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20  SystemTime",    
26a0: 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69 6d  (SYSCALL)FileTim
26b0: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 2c 20 20  eToSystemTime,  
26c0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
26d0: 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74   "FileTimeToSyst
26e0: 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53  emTime",    (SYS
26f0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
2710: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
2720: 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53  ne osFileTimeToS
2730: 79 73 74 65 6d 54 69 6d 65 20 28 28 42 4f 4f 4c  ystemTime ((BOOL
2740: 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20  (WINAPI*)(CONST 
2750: 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20  FILETIME*, \.   
2760: 20 20 20 20 20 4c 50 53 59 53 54 45 4d 54 49 4d       LPSYSTEMTIM
2770: 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e  E))aSyscall[12].
2780: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
2790: 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73  FlushFileBuffers
27a0: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
27b0: 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42 75 66 66  LL)FlushFileBuff
27c0: 65 72 73 2c 20 20 20 20 20 20 20 20 30 20 7d 2c  ers,        0 },
27d0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c 75 73  ..#define osFlus
27e0: 68 46 69 6c 65 42 75 66 66 65 72 73 20 28 28 42  hFileBuffers ((B
27f0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
2800: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 33  DLE))aSyscall[13
2810: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
2820: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2830: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
2840: 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61    { "FormatMessa
2850: 67 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 28  geA",          (
2860: 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65  SYSCALL)FormatMe
2870: 73 73 61 67 65 41 2c 20 20 20 20 20 20 20 20 20  ssageA,         
2880: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
2890: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22  "FormatMessageA"
28a0: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
28b0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
28d0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
28e0: 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  e osFormatMessag
28f0: 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eA ((DWORD(WINAP
2900: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49  I*)(DWORD,LPCVOI
2910: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
2920: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
2930: 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61  WORD,va_list*))a
2940: 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72  Syscall[14].pCur
2950: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
2960: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
2970: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 46  HAS_WIDE).  { "F
2980: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20  ormatMessageW", 
2990: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
29a0: 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57  L)FormatMessageW
29b0: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
29c0: 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61  #else.  { "Forma
29d0: 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20 20  tMessageW",     
29e0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
2a10: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f  if..#define osFo
2a20: 72 6d 61 74 4d 65 73 73 61 67 65 57 20 28 28 44  rmatMessageW ((D
2a30: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57  WORD(WINAPI*)(DW
2a40: 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52  ORD,LPCVOID,DWOR
2a50: 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20  D,DWORD,LPWSTR, 
2a60: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
2a70: 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63 61  va_list*))aSysca
2a80: 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[15].pCurrent)
2a90: 0a 0a 20 20 7b 20 22 46 72 65 65 4c 69 62 72 61  ..  { "FreeLibra
2aa0: 72 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ry",            
2ab0: 20 28 53 59 53 43 41 4c 4c 29 46 72 65 65 4c 69   (SYSCALL)FreeLi
2ac0: 62 72 61 72 79 2c 20 20 20 20 20 20 20 20 20 20  brary,          
2ad0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
2ae0: 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79 20 28   osFreeLibrary (
2af0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
2b00: 4d 4f 44 55 4c 45 29 29 61 53 79 73 63 61 6c 6c  MODULE))aSyscall
2b10: 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [16].pCurrent)..
2b20: 20 20 7b 20 22 47 65 74 43 75 72 72 65 6e 74 50    { "GetCurrentP
2b30: 72 6f 63 65 73 73 49 64 22 2c 20 20 20 20 20 28  rocessId",     (
2b40: 53 59 53 43 41 4c 4c 29 47 65 74 43 75 72 72 65  SYSCALL)GetCurre
2b50: 6e 74 50 72 6f 63 65 73 73 49 64 2c 20 20 20 20  ntProcessId,    
2b60: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
2b70: 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
2b80: 73 73 49 64 20 28 28 44 57 4f 52 44 28 57 49 4e  ssId ((DWORD(WIN
2b90: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
2ba0: 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e  call[17].pCurren
2bb0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
2bc0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69  OS_WINCE && defi
2bd0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
2be0: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
2bf0: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
2c00: 41 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41  A",       (SYSCA
2c10: 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53 70  LL)GetDiskFreeSp
2c20: 61 63 65 41 2c 20 20 20 20 20 20 20 30 20 7d 2c  aceA,       0 },
2c30: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44  .#else.  { "GetD
2c40: 69 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20  iskFreeSpaceA", 
2c50: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
2c60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2c70: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
2c80: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
2c90: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
2ca0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
2cb0: 28 4c 50 43 53 54 52 2c 4c 50 44 57 4f 52 44 2c  (LPCSTR,LPDWORD,
2cc0: 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  LPDWORD,LPDWORD,
2cd0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f   \.        LPDWO
2ce0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d  RD))aSyscall[18]
2cf0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
2d00: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
2d10: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
2d20: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
2d30: 45 29 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  E).  { "GetDiskF
2d40: 72 65 65 53 70 61 63 65 57 22 2c 20 20 20 20 20  reeSpaceW",     
2d50: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 44 69    (SYSCALL)GetDi
2d60: 73 6b 46 72 65 65 53 70 61 63 65 57 2c 20 20 20  skFreeSpaceW,   
2d70: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
2d80: 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53   { "GetDiskFreeS
2d90: 70 61 63 65 57 22 2c 20 20 20 20 20 20 20 28 53  paceW",       (S
2da0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
2db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
2dd0: 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b 46 72  fine osGetDiskFr
2de0: 65 65 53 70 61 63 65 57 20 28 28 42 4f 4f 4c 28  eeSpaceW ((BOOL(
2df0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
2e00: 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44  ,LPDWORD,LPDWORD
2e10: 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  ,LPDWORD, \.    
2e20: 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61 53 79      LPDWORD))aSy
2e30: 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65  scall[19].pCurre
2e40: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
2e50: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
2e60: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74  S_ANSI).  { "Get
2e70: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 22  FileAttributesA"
2e80: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
2e90: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
2ea0: 73 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  sA,      0 },.#e
2eb0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  lse.  { "GetFile
2ec0: 41 74 74 72 69 62 75 74 65 73 41 22 2c 20 20 20  AttributesA",   
2ed0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
2f00: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46  ..#define osGetF
2f10: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 20 28  ileAttributesA (
2f20: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
2f30: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
2f40: 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [20].pCurrent)..
2f50: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
2f60: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
2f70: 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  E).  { "GetFileA
2f80: 74 74 72 69 62 75 74 65 73 57 22 2c 20 20 20 20  ttributesW",    
2f90: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69    (SYSCALL)GetFi
2fa0: 6c 65 41 74 74 72 69 62 75 74 65 73 57 2c 20 20  leAttributesW,  
2fb0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
2fc0: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
2fd0: 62 75 74 65 73 57 22 2c 20 20 20 20 20 20 28 53  butesW",      (S
2fe0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
3010: 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74  fine osGetFileAt
3020: 74 72 69 62 75 74 65 73 57 20 28 28 44 57 4f 52  tributesW ((DWOR
3030: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  D(WINAPI*)(LPCWS
3040: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d  TR))aSyscall[21]
3050: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3060: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
3070: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
3080: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
3090: 62 75 74 65 73 45 78 57 22 2c 20 20 20 20 28 53  butesExW",    (S
30a0: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74  YSCALL)GetFileAt
30b0: 74 72 69 62 75 74 65 73 45 78 57 2c 20 20 20 20  tributesExW,    
30c0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
30d0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
30e0: 73 45 78 57 22 2c 20 20 20 20 28 53 59 53 43 41  sExW",    (SYSCA
30f0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3100: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3110: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3120: 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
3130: 75 74 65 73 45 78 57 20 28 28 42 4f 4f 4c 28 57  utesExW ((BOOL(W
3140: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c  INAPI*)(LPCWSTR,
3150: 47 45 54 5f 46 49 4c 45 45 58 5f 49 4e 46 4f 5f  GET_FILEEX_INFO_
3160: 4c 45 56 45 4c 53 2c 20 5c 0a 20 20 20 20 20 20  LEVELS, \.      
3170: 20 20 4c 50 56 4f 49 44 29 29 61 53 79 73 63 61    LPVOID))aSysca
3180: 6c 6c 5b 32 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[22].pCurrent)
3190: 0a 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69  ..  { "GetFileSi
31a0: 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ze",            
31b0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c   (SYSCALL)GetFil
31c0: 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
31d0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
31e0: 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 20 28   osGetFileSize (
31f0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
3200: 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52 44 29 29  HANDLE,LPDWORD))
3210: 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75  aSyscall[23].pCu
3220: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
3230: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
3240: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
3250: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
3260: 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e   { "GetFullPathN
3270: 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53  ameA",        (S
3280: 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61  YSCALL)GetFullPa
3290: 74 68 4e 61 6d 65 41 2c 20 20 20 20 20 20 20 20  thNameA,        
32a0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
32b0: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
32c0: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
32d0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
32e0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
32f0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3300: 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
3310: 6d 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41  meA ((DWORD(WINA
3320: 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52  PI*)(LPCSTR,DWOR
3330: 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20  D,LPSTR, \.     
3340: 20 20 20 4c 50 53 54 52 2a 29 29 61 53 79 73 63     LPSTR*))aSysc
3350: 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74  all[24].pCurrent
3360: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
3370: 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e  S_WINCE && defin
3380: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3390: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
33a0: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22  etFullPathNameW"
33b0: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
33c0: 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  L)GetFullPathNam
33d0: 65 57 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  eW,        0 },.
33e0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 75  #else.  { "GetFu
33f0: 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20 20 20  llPathNameW",   
3400: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
3410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3420: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3430: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
3440: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 20 28  tFullPathNameW (
3450: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
3460: 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 4c 50  LPCWSTR,DWORD,LP
3470: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
3480: 4c 50 57 53 54 52 2a 29 29 61 53 79 73 63 61 6c  LPWSTR*))aSyscal
3490: 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[25].pCurrent).
34a0: 0a 20 20 7b 20 22 47 65 74 4c 61 73 74 45 72 72  .  { "GetLastErr
34b0: 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  or",            
34c0: 28 53 59 53 43 41 4c 4c 29 47 65 74 4c 61 73 74  (SYSCALL)GetLast
34d0: 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20  Error,          
34e0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
34f0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 20 28  osGetLastError (
3500: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
3510: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32  VOID))aSyscall[2
3520: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
3530: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
3540: 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74 50 72  E.  /* The GetPr
3550: 6f 63 41 64 64 72 65 73 73 41 28 29 20 72 6f 75  ocAddressA() rou
3560: 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76 61  tine is only ava
3570: 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77  ilable on Window
3580: 73 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 22 47 65  s CE. */.  { "Ge
3590: 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20  tProcAddressA", 
35a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
35b0: 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  )GetProcAddressA
35c0: 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  ,         0 },.#
35d0: 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74  else.  /* All ot
35e0: 68 65 72 20 57 69 6e 64 6f 77 73 20 70 6c 61 74  her Windows plat
35f0: 66 6f 72 6d 73 20 65 78 70 65 63 74 20 47 65 74  forms expect Get
3600: 50 72 6f 63 41 64 64 72 65 73 73 28 29 20 74 6f  ProcAddress() to
3610: 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 4e   take.  ** an AN
3620: 53 49 20 73 74 72 69 6e 67 20 72 65 67 61 72 64  SI string regard
3630: 6c 65 73 73 20 6f 66 20 74 68 65 20 5f 55 4e 49  less of the _UNI
3640: 43 4f 44 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a  CODE setting */.
3650: 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72    { "GetProcAddr
3660: 65 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28  essA",         (
3670: 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41  SYSCALL)GetProcA
3680: 64 64 72 65 73 73 2c 20 20 20 20 20 20 20 20 20  ddress,         
3690: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
36a0: 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 41  efine osGetProcA
36b0: 64 64 72 65 73 73 41 20 28 28 46 41 52 50 52 4f  ddressA ((FARPRO
36c0: 43 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55  C(WINAPI*)(HMODU
36d0: 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  LE, \.        LP
36e0: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32  CSTR))aSyscall[2
36f0: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  7].pCurrent)..  
3700: 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66 6f  { "GetSystemInfo
3710: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
3720: 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 49  SCALL)GetSystemI
3730: 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 30  nfo,           0
3740: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47   },..#define osG
3750: 65 74 53 79 73 74 65 6d 49 6e 66 6f 20 28 28 56  etSystemInfo ((V
3760: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 53  OID(WINAPI*)(LPS
3770: 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73  YSTEM_INFO))aSys
3780: 63 61 6c 6c 5b 32 38 5d 2e 70 43 75 72 72 65 6e  call[28].pCurren
3790: 74 29 0a 0a 20 20 7b 20 22 47 65 74 53 79 73 74  t)..  { "GetSyst
37a0: 65 6d 54 69 6d 65 22 2c 20 20 20 20 20 20 20 20  emTime",        
37b0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53     (SYSCALL)GetS
37c0: 79 73 74 65 6d 54 69 6d 65 2c 20 20 20 20 20 20  ystemTime,      
37d0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
37e0: 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69  ne osGetSystemTi
37f0: 6d 65 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  me ((VOID(WINAPI
3800: 2a 29 28 4c 50 53 59 53 54 45 4d 54 49 4d 45 29  *)(LPSYSTEMTIME)
3810: 29 61 53 79 73 63 61 6c 6c 5b 32 39 5d 2e 70 43  )aSyscall[29].pC
3820: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
3830: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
3840: 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65  { "GetSystemTime
3850: 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  AsFileTime", (SY
3860: 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 54  SCALL)GetSystemT
3870: 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 2c 20 30  imeAsFileTime, 0
3880: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
3890: 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69  etSystemTimeAsFi
38a0: 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c  leTime", (SYSCAL
38b0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
38c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
38d0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
38e0: 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41  osGetSystemTimeA
38f0: 73 46 69 6c 65 54 69 6d 65 20 28 28 56 4f 49 44  sFileTime ((VOID
3900: 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20  (WINAPI*)( \.   
3910: 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29       LPFILETIME)
3920: 29 61 53 79 73 63 61 6c 6c 5b 33 30 5d 2e 70 43  )aSyscall[30].pC
3930: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
3940: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
3950: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
3960: 22 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c 20  "GetTempPathA", 
3970: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
3980: 41 4c 4c 29 47 65 74 54 65 6d 70 50 61 74 68 41  ALL)GetTempPathA
3990: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
39a0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
39b0: 54 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20 20  TempPathA",     
39c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
39d0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
39e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
39f0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
3a00: 47 65 74 54 65 6d 70 50 61 74 68 41 20 28 28 44  GetTempPathA ((D
3a10: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57  WORD(WINAPI*)(DW
3a20: 4f 52 44 2c 4c 50 53 54 52 29 29 61 53 79 73 63  ORD,LPSTR))aSysc
3a30: 61 6c 6c 5b 33 31 5d 2e 70 43 75 72 72 65 6e 74  all[31].pCurrent
3a40: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
3a50: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
3a60: 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 54 65  WIDE).  { "GetTe
3a70: 6d 70 50 61 74 68 57 22 2c 20 20 20 20 20 20 20  mpPathW",       
3a80: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
3a90: 74 54 65 6d 70 50 61 74 68 57 2c 20 20 20 20 20  tTempPathW,     
3aa0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
3ab0: 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61  e.  { "GetTempPa
3ac0: 74 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  thW",           
3ad0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3af0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
3b00: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d  #define osGetTem
3b10: 70 50 61 74 68 57 20 28 28 44 57 4f 52 44 28 57  pPathW ((DWORD(W
3b20: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50  INAPI*)(DWORD,LP
3b30: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33  WSTR))aSyscall[3
3b40: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
3b50: 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22  { "GetTickCount"
3b60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
3b70: 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75  SCALL)GetTickCou
3b80: 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  nt,            0
3b90: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47   },..#define osG
3ba0: 65 74 54 69 63 6b 43 6f 75 6e 74 20 28 28 44 57  etTickCount ((DW
3bb0: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49  ORD(WINAPI*)(VOI
3bc0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 33 5d 2e  D))aSyscall[33].
3bd0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3be0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
3bf0: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
3c00: 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41  { "GetVersionExA
3c10: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
3c20: 53 43 41 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e  SCALL)GetVersion
3c30: 45 78 41 2c 20 20 20 20 20 20 20 20 20 20 20 30  ExA,           0
3c40: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
3c50: 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20 20  etVersionExA",  
3c60: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3c70: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
3c80: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3c90: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
3ca0: 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41 20  osGetVersionExA 
3cb0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
3cc0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 53 56   \.        LPOSV
3cd0: 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29 61 53 79  ERSIONINFOA))aSy
3ce0: 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75 72 72 65  scall[34].pCurre
3cf0: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 41 6c  nt)..  { "HeapAl
3d00: 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 20  loc",           
3d10: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
3d20: 70 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 20  pAlloc,         
3d30: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
3d40: 69 6e 65 20 6f 73 48 65 61 70 41 6c 6c 6f 63 20  ine osHeapAlloc 
3d50: 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a  ((LPVOID(WINAPI*
3d60: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20  )(HANDLE,DWORD, 
3d70: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
3d80: 29 29 61 53 79 73 63 61 6c 6c 5b 33 35 5d 2e 70  ))aSyscall[35].p
3d90: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48  Current)..  { "H
3da0: 65 61 70 43 72 65 61 74 65 22 2c 20 20 20 20 20  eapCreate",     
3db0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3dc0: 4c 29 48 65 61 70 43 72 65 61 74 65 2c 20 20 20  L)HeapCreate,   
3dd0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3de0: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 43  .#define osHeapC
3df0: 72 65 61 74 65 20 28 28 48 41 4e 44 4c 45 28 57  reate ((HANDLE(W
3e00: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 53 49  INAPI*)(DWORD,SI
3e10: 5a 45 5f 54 2c 20 5c 0a 20 20 20 20 20 20 20 20  ZE_T, \.        
3e20: 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c  SIZE_T))aSyscall
3e30: 5b 33 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [36].pCurrent)..
3e40: 20 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f 79    { "HeapDestroy
3e50: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
3e60: 53 59 53 43 41 4c 4c 29 48 65 61 70 44 65 73 74  SYSCALL)HeapDest
3e70: 72 6f 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  roy,            
3e80: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
3e90: 73 48 65 61 70 44 65 73 74 72 6f 79 20 28 28 42  sHeapDestroy ((B
3ea0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
3eb0: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 37  DLE))aSyscall[37
3ec0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3ed0: 20 22 48 65 61 70 46 72 65 65 22 2c 20 20 20 20   "HeapFree",    
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3ef0: 43 41 4c 4c 29 48 65 61 70 46 72 65 65 2c 20 20  CALL)HeapFree,  
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3f10: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
3f20: 61 70 46 72 65 65 20 28 28 42 4f 4f 4c 28 57 49  apFree ((BOOL(WI
3f30: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
3f40: 4f 52 44 2c 4c 50 56 4f 49 44 29 29 61 53 79 73  ORD,LPVOID))aSys
3f50: 63 61 6c 6c 5b 33 38 5d 2e 70 43 75 72 72 65 6e  call[38].pCurren
3f60: 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 52 65 41  t)..  { "HeapReA
3f70: 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20  lloc",          
3f80: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
3f90: 52 65 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20  ReAlloc,        
3fa0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
3fb0: 6e 65 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63  ne osHeapReAlloc
3fc0: 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49   ((LPVOID(WINAPI
3fd0: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
3fe0: 4c 50 56 4f 49 44 2c 20 5c 0a 20 20 20 20 20 20  LPVOID, \.      
3ff0: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61    SIZE_T))aSysca
4000: 6c 6c 5b 33 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[39].pCurrent)
4010: 0a 0a 20 20 7b 20 22 48 65 61 70 53 69 7a 65 22  ..  { "HeapSize"
4020: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4030: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 53 69   (SYSCALL)HeapSi
4040: 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
4050: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
4060: 20 6f 73 48 65 61 70 53 69 7a 65 20 28 28 53 49   osHeapSize ((SI
4070: 5a 45 5f 54 28 57 49 4e 41 50 49 2a 29 28 48 41  ZE_T(WINAPI*)(HA
4080: 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  NDLE,DWORD, \.  
4090: 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29 61        LPCVOID))a
40a0: 53 79 73 63 61 6c 6c 5b 34 30 5d 2e 70 43 75 72  Syscall[40].pCur
40b0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70  rent)..  { "Heap
40c0: 56 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20  Validate",      
40d0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
40e0: 65 61 70 56 61 6c 69 64 61 74 65 2c 20 20 20 20  eapValidate,    
40f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
4100: 65 66 69 6e 65 20 6f 73 48 65 61 70 56 61 6c 69  efine osHeapVali
4110: 64 61 74 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  date ((BOOL(WINA
4120: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
4130: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  D, \.        LPC
4140: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  VOID))aSyscall[4
4150: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
4160: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
4170: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
4180: 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72  .  { "LoadLibrar
4190: 79 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  yA",            
41a0: 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62  (SYSCALL)LoadLib
41b0: 72 61 72 79 41 2c 20 20 20 20 20 20 20 20 20 20  raryA,          
41c0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
41d0: 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c   "LoadLibraryA",
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
41f0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4210: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4220: 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79  ne osLoadLibrary
4230: 41 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41  A ((HMODULE(WINA
4240: 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79  PI*)(LPCSTR))aSy
4250: 73 63 61 6c 6c 5b 34 32 5d 2e 70 43 75 72 72 65  scall[42].pCurre
4260: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
4270: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
4280: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 4c 6f 61  S_WIDE).  { "Loa
4290: 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20  dLibraryW",     
42a0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
42b0: 4c 6f 61 64 4c 69 62 72 61 72 79 57 2c 20 20 20  LoadLibraryW,   
42c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
42d0: 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62  lse.  { "LoadLib
42e0: 72 61 72 79 57 22 2c 20 20 20 20 20 20 20 20 20  raryW",         
42f0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4310: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4320: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64  ..#define osLoad
4330: 4c 69 62 72 61 72 79 57 20 28 28 48 4d 4f 44 55  LibraryW ((HMODU
4340: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  LE(WINAPI*)(LPCW
4350: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 33  STR))aSyscall[43
4360: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
4370: 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20   "LocalFree",   
4380: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4390: 43 41 4c 4c 29 4c 6f 63 61 6c 46 72 65 65 2c 20  CALL)LocalFree, 
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
43b0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f  },..#define osLo
43c0: 63 61 6c 46 72 65 65 20 28 28 48 4c 4f 43 41 4c  calFree ((HLOCAL
43d0: 28 57 49 4e 41 50 49 2a 29 28 48 4c 4f 43 41 4c  (WINAPI*)(HLOCAL
43e0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 34 5d 2e 70  ))aSyscall[44].p
43f0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
4400: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
4410: 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20   { "LockFile",  
4420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
4430: 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c  YSCALL)LockFile,
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4450: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
4460: 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28  LockFile ((BOOL(
4470: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
4480: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
4490: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  D, \.        DWO
44a0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 35 5d  RD))aSyscall[45]
44b0: 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6c 73 65  .pCurrent).#else
44c0: 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c  .  { "LockFile",
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4500: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4510: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4520: 4e 43 45 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c  NCE.  { "LockFil
4530: 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20  eEx",           
4540: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b     (SYSCALL)Lock
4550: 46 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20  FileEx,         
4560: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
4570: 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20  ne osLockFileEx 
4580: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4590: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f  HANDLE,DWORD,DWO
45a0: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  RD,DWORD,DWORD, 
45b0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52  \.        LPOVER
45c0: 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c  LAPPED))aSyscall
45d0: 5b 34 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23  [46].pCurrent).#
45e0: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69  else.  { "LockFi
45f0: 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20  leEx",          
4600: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4620: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4630: 66 0a 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f  f..  { "MapViewO
4640: 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  fFile",         
4650: 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69    (SYSCALL)MapVi
4660: 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20  ewOfFile,       
4670: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
4680: 65 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  e osMapViewOfFil
4690: 65 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50  e ((LPVOID(WINAP
46a0: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
46b0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
46c0: 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29          SIZE_T))
46d0: 61 53 79 73 63 61 6c 6c 5b 34 37 5d 2e 70 43 75  aSyscall[47].pCu
46e0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 4d 75 6c  rrent)..  { "Mul
46f0: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
4700: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
4710: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
4720: 68 61 72 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23  har,     0 },..#
4730: 64 65 66 69 6e 65 20 6f 73 4d 75 6c 74 69 42 79  define osMultiBy
4740: 74 65 54 6f 57 69 64 65 43 68 61 72 20 28 28 69  teToWideChar ((i
4750: 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54  nt(WINAPI*)(UINT
4760: 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 2c 69 6e  ,DWORD,LPCSTR,in
4770: 74 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20  t,LPWSTR, \.    
4780: 20 20 20 20 69 6e 74 29 29 61 53 79 73 63 61 6c      int))aSyscal
4790: 6c 5b 34 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[48].pCurrent).
47a0: 0a 20 20 7b 20 22 51 75 65 72 79 50 65 72 66 6f  .  { "QueryPerfo
47b0: 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 22 2c 20  rmanceCounter", 
47c0: 28 53 59 53 43 41 4c 4c 29 51 75 65 72 79 50 65  (SYSCALL)QueryPe
47d0: 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72  rformanceCounter
47e0: 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20  , 0 },..#define 
47f0: 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e  osQueryPerforman
4800: 63 65 43 6f 75 6e 74 65 72 20 28 28 42 4f 4f 4c  ceCounter ((BOOL
4810: 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20  (WINAPI*)( \.   
4820: 20 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47       LARGE_INTEG
4830: 45 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34 39  ER*))aSyscall[49
4840: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
4850: 20 22 52 65 61 64 46 69 6c 65 22 2c 20 20 20 20   "ReadFile",    
4860: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4870: 43 41 4c 4c 29 52 65 61 64 46 69 6c 65 2c 20 20  CALL)ReadFile,  
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4890: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 52 65  },..#define osRe
48a0: 61 64 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  adFile ((BOOL(WI
48b0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
48c0: 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f  VOID,DWORD,LPDWO
48d0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
48e0: 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73  OVERLAPPED))aSys
48f0: 63 61 6c 6c 5b 35 30 5d 2e 70 43 75 72 72 65 6e  call[50].pCurren
4900: 74 29 0a 0a 20 20 7b 20 22 53 65 74 45 6e 64 4f  t)..  { "SetEndO
4910: 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  fFile",         
4920: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 45     (SYSCALL)SetE
4930: 6e 64 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20  ndOfFile,       
4940: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
4950: 6e 65 20 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c  ne osSetEndOfFil
4960: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
4970: 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61  )(HANDLE))aSysca
4980: 6c 6c 5b 35 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[51].pCurrent)
4990: 0a 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f  ..  { "SetFilePo
49a0: 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20  inter",         
49b0: 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c   (SYSCALL)SetFil
49c0: 65 50 6f 69 6e 74 65 72 2c 20 20 20 20 20 20 20  ePointer,       
49d0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
49e0: 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65   osSetFilePointe
49f0: 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  r ((DWORD(WINAPI
4a00: 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f 4e 47 2c 50  *)(HANDLE,LONG,P
4a10: 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20 20 20 20 20  LONG, \.        
4a20: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
4a30: 35 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  52].pCurrent).. 
4a40: 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20   { "Sleep",     
4a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
4a60: 59 53 43 41 4c 4c 29 53 6c 65 65 70 2c 20 20 20  YSCALL)Sleep,   
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a80: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
4a90: 53 6c 65 65 70 20 28 28 56 4f 49 44 28 57 49 4e  Sleep ((VOID(WIN
4aa0: 41 50 49 2a 29 28 44 57 4f 52 44 29 29 61 53 79  API*)(DWORD))aSy
4ab0: 73 63 61 6c 6c 5b 35 33 5d 2e 70 43 75 72 72 65  scall[53].pCurre
4ac0: 6e 74 29 0a 0a 20 20 7b 20 22 53 79 73 74 65 6d  nt)..  { "System
4ad0: 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 22 2c  TimeToFileTime",
4ae0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 79 73      (SYSCALL)Sys
4af0: 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
4b00: 65 2c 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  e,    0 },..#def
4b10: 69 6e 65 20 6f 73 53 79 73 74 65 6d 54 69 6d 65  ine osSystemTime
4b20: 54 6f 46 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f  ToFileTime ((BOO
4b30: 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54  L(WINAPI*)(CONST
4b40: 20 53 59 53 54 45 4d 54 49 4d 45 2a 2c 20 5c 0a   SYSTEMTIME*, \.
4b50: 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49          LPFILETI
4b60: 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 34 5d  ME))aSyscall[54]
4b70: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4b80: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
4b90: 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65  .  { "UnlockFile
4ba0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
4bb0: 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46  (SYSCALL)UnlockF
4bc0: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
4bd0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
4be0: 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 28 28 42  osUnlockFile ((B
4bf0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
4c00: 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  DLE,DWORD,DWORD,
4c10: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
4c20: 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c   DWORD))aSyscall
4c30: 5b 35 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23  [55].pCurrent).#
4c40: 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b  else.  { "Unlock
4c50: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
4c60: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c80: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4c90: 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  f..#if !SQLITE_O
4ca0: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55 6e 6c  S_WINCE.  { "Unl
4cb0: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
4cc0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4cd0: 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20  UnlockFileEx,   
4ce0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
4cf0: 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46  define osUnlockF
4d00: 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e  ileEx ((BOOL(WIN
4d10: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
4d20: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  RD,DWORD,DWORD, 
4d30: 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52  \.        LPOVER
4d40: 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c  LAPPED))aSyscall
4d50: 5b 35 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23  [56].pCurrent).#
4d60: 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b  else.  { "Unlock
4d70: 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20  FileEx",        
4d80: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4da0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4db0: 66 0a 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69 65  f..  { "UnmapVie
4dc0: 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  wOfFile",       
4dd0: 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6d 61 70    (SYSCALL)Unmap
4de0: 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20  ViewOfFile,     
4df0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
4e00: 65 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46  e osUnmapViewOfF
4e10: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
4e20: 49 2a 29 28 4c 50 43 56 4f 49 44 29 29 61 53 79  I*)(LPCVOID))aSy
4e30: 73 63 61 6c 6c 5b 35 37 5d 2e 70 43 75 72 72 65  scall[57].pCurre
4e40: 6e 74 29 0a 0a 20 20 7b 20 22 57 69 64 65 43 68  nt)..  { "WideCh
4e50: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20  arToMultiByte", 
4e60: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 69 64      (SYSCALL)Wid
4e70: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
4e80: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
4e90: 69 6e 65 20 6f 73 57 69 64 65 43 68 61 72 54 6f  ine osWideCharTo
4ea0: 4d 75 6c 74 69 42 79 74 65 20 28 28 69 6e 74 28  MultiByte ((int(
4eb0: 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57  WINAPI*)(UINT,DW
4ec0: 4f 52 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c  ORD,LPCWSTR,int,
4ed0: 4c 50 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20  LPSTR,int, \.   
4ee0: 20 20 20 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f       LPCSTR,LPBO
4ef0: 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 35 38 5d  OL))aSyscall[58]
4f00: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
4f10: 22 57 72 69 74 65 46 69 6c 65 22 2c 20 20 20 20  "WriteFile",    
4f20: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4f30: 41 4c 4c 29 57 72 69 74 65 46 69 6c 65 2c 20 20  ALL)WriteFile,  
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4f50: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69  ,..#define osWri
4f60: 74 65 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  teFile ((BOOL(WI
4f70: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
4f80: 43 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57  CVOID,DWORD,LPDW
4f90: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
4fa0: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
4fb0: 73 63 61 6c 6c 5b 35 39 5d 2e 70 43 75 72 72 65  scall[59].pCurre
4fc0: 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f  nt)..}; /* End o
4fd0: 66 20 74 68 65 20 6f 76 65 72 72 69 64 65 61 62  f the overrideab
4fe0: 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  le system calls 
4ff0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  */../*.** This i
5000: 73 20 74 68 65 20 78 53 65 74 53 79 73 74 65 6d  s the xSetSystem
5010: 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66  Call() method of
5020: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f 72   sqlite3_vfs for
5030: 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22   all of the.** "
5040: 77 69 6e 33 32 22 20 56 46 53 65 73 2e 20 20 52  win32" VFSes.  R
5050: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
5060: 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  opon successfull
5070: 79 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a  y updating the.*
5080: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f  * system call po
5090: 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45  inter, or SQLITE
50a0: 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65  _NOTFOUND if the
50b0: 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75  re is no configu
50c0: 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20  rable.** system 
50d0: 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65  call named zName
50e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
50f0: 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  winSetSystemCall
5100: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
5110: 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20  *pNotUsed,      
5120: 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f 69    /* The VFS poi
5130: 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64 20  nter.  Not used 
5140: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
5150: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *zName,         
5160: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79     /* Name of sy
5170: 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65  stem call to ove
5180: 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74  rride */.  sqlit
5190: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70  e3_syscall_ptr p
51a0: 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e  NewFunc  /* Poin
51b0: 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74 65  ter to new syste
51c0: 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a  m call value */.
51d0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ){.  unsigned in
51e0: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t i;.  int rc = 
51f0: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
5200: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
5210: 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a  ETER(pNotUsed);.
5220: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
5230: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a  {.    /* If no z
5240: 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20 72  Name is given, r
5250: 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74 65  estore all syste
5260: 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69 72  m calls to their
5270: 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20   default.    ** 
5280: 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65 74  settings and ret
5290: 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a  urn NULL.    */.
52a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
52b0: 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  OK;.    for(i=0;
52c0: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
52d0: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
52e0: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
52f0: 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c       if( aSyscal
5300: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b  l[i].pDefault ){
5310: 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c  .        aSyscal
5320: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20  l[i].pCurrent = 
5330: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
5340: 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ault;.      }.  
5350: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
5360: 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20   /* If zName is 
5370: 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72 61  specified, opera
5380: 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f  te on only the o
5390: 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20  ne system call. 
53a0: 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 2e     ** specified.
53b0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
53c0: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
53d0: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
53e0: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
53f0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
5400: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
5410: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
5420: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
5430: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
5440: 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ault==0 ){.     
5450: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d       aSyscall[i]
5460: 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79 73  .pDefault = aSys
5470: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
5480: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5490: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
54a0: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  OK;.        if( 
54b0: 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e  pNewFunc==0 ) pN
54c0: 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61 6c  ewFunc = aSyscal
54d0: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20  l[i].pDefault;. 
54e0: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
54f0: 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70 4e  i].pCurrent = pN
5500: 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20  ewFunc;.        
5510: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
5520: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5530: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
5540: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
5550: 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c  of a system call
5560: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
5570: 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61  f zName is not a
5580: 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 73  .** recognized s
5590: 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e  ystem call name.
55a0: 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72    NULL is also r
55b0: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 73  eturned if the s
55c0: 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73  ystem call.** is
55d0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 66   currently undef
55e0: 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
55f0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5600: 70 74 72 20 77 69 6e 47 65 74 53 79 73 74 65 6d  ptr winGetSystem
5610: 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f  Call(.  sqlite3_
5620: 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20  vfs *pNotUsed,. 
5630: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
5640: 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  me.){.  unsigned
5650: 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45   int i;..  UNUSE
5660: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74  D_PARAMETER(pNot
5670: 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Used);.  for(i=0
5680: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63  ; i<sizeof(aSysc
5690: 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73  all)/sizeof(aSys
56a0: 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  call[0]); i++){.
56b0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
56c0: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69  Name, aSyscall[i
56d0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65  ].zName)==0 ) re
56e0: 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d  turn aSyscall[i]
56f0: 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20  .pCurrent;.  }. 
5700: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
5710: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
5720: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
5730: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 66 74   system call aft
5740: 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e  er zName.  If zN
5750: 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65  ame==NULL.** the
5760: 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  n return the nam
5770: 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73  e of the first s
5780: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74  ystem call.  Ret
5790: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d  urn NULL if zNam
57a0: 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74  e.** is the last
57b0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20   system call or 
57c0: 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20  if zName is not 
57d0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61  the name of a va
57e0: 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61  lid.** system ca
57f0: 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ll..*/.static co
5800: 6e 73 74 20 63 68 61 72 20 2a 77 69 6e 4e 65 78  nst char *winNex
5810: 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69  tSystemCall(sqli
5820: 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73  te3_vfs *p, cons
5830: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
5840: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20    int i = -1;.. 
5850: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
5860: 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  R(p);.  if( zNam
5870: 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e ){.    for(i=0
5880: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53  ; i<ArraySize(aS
5890: 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b  yscall)-1; i++){
58a0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
58b0: 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c  p(zName, aSyscal
58c0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
58d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
58e0: 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41  }.  for(i++; i<A
58f0: 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c  rraySize(aSyscal
5900: 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  l); i++){.    if
5910: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43  ( aSyscall[i].pC
5920: 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65 74 75  urrent!=0 ) retu
5930: 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  rn aSyscall[i].z
5940: 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Name;.  }.  retu
5950: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
5960: 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d  eturn true (non-
5970: 7a 65 72 6f 29 20 69 66 20 77 65 20 61 72 65 20  zero) if we are 
5980: 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 69  running under Wi
5990: 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58  nNT, Win2K, WinX
59a0: 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20  P,.** or WinCE. 
59b0: 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 28 7a   Return false (z
59c0: 65 72 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c 20  ero) for Win95, 
59d0: 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e  Win98, or WinME.
59e0: 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 61  .**.** Here is a
59f0: 6e 20 69 6e 74 65 72 65 73 74 69 6e 67 20 6f 62  n interesting ob
5a00: 73 65 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39  servation:  Win9
5a10: 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20 57 69  5, Win98, and Wi
5a20: 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20  nME lack.** the 
5a30: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49  LockFileEx() API
5a40: 2e 20 20 42 75 74 20 77 65 20 63 61 6e 20 73 74  .  But we can st
5a50: 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79 20 6c  ill statically l
5a60: 69 6e 6b 20 61 67 61 69 6e 73 74 20 74 68 61 74  ink against that
5a70: 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67 20  .** API as long 
5a80: 61 73 20 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c  as we don't call
5a90: 20 69 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67   it when running
5aa0: 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41   Win95/98/ME.  A
5ab0: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73   call to.** this
5ac0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
5ad0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
5ae0: 20 74 68 65 20 68 6f 73 74 20 69 73 20 57 69 6e   the host is Win
5af0: 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57  95/98/ME or.** W
5b00: 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68  inNT/2K/XP so th
5b10: 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20  at we will know 
5b20: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 77  whether or not w
5b30: 65 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c  e can safely cal
5b40: 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c  l.** the LockFil
5b50: 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 23 69  eEx() API..*/.#i
5b60: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
5b70: 45 0a 23 20 64 65 66 69 6e 65 20 69 73 4e 54 28  E.# define isNT(
5b80: 29 20 20 28 31 29 0a 23 65 6c 73 65 0a 20 20 73  )  (1).#else.  s
5b90: 74 61 74 69 63 20 69 6e 74 20 69 73 4e 54 28 76  tatic int isNT(v
5ba0: 6f 69 64 29 7b 0a 20 20 20 20 69 66 28 20 73 71  oid){.    if( sq
5bb0: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 30  lite3_os_type==0
5bc0: 20 29 7b 0a 20 20 20 20 20 20 4f 53 56 45 52 53   ){.      OSVERS
5bd0: 49 4f 4e 49 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a  IONINFOA sInfo;.
5be0: 20 20 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53        sInfo.dwOS
5bf0: 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20  VersionInfoSize 
5c00: 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b  = sizeof(sInfo);
5c10: 0a 20 20 20 20 20 20 6f 73 47 65 74 56 65 72 73  .      osGetVers
5c20: 69 6f 6e 45 78 41 28 26 73 49 6e 66 6f 29 3b 0a  ionExA(&sInfo);.
5c30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73        sqlite3_os
5c40: 5f 74 79 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77  _type = sInfo.dw
5c50: 50 6c 61 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f  PlatformId==VER_
5c60: 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e  PLATFORM_WIN32_N
5c70: 54 20 3f 20 32 20 3a 20 31 3b 0a 20 20 20 20 7d  T ? 2 : 1;.    }
5c80: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
5c90: 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 3b 0a  te3_os_type==2;.
5ca0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
5cb0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f  LITE_OS_WINCE */
5cc0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5cd0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a  WIN32_MALLOC./*.
5ce0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
5cf0: 65 73 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  es of memory..*/
5d00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
5d10: 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e  nMemMalloc(int n
5d20: 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45  Bytes){.  HANDLE
5d30: 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a   hHeap;.  void *
5d40: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
5d50: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
5d60: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
5d70: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
5d80: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
5d90: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
5da0: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
5db0: 45 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  E );.#ifdef SQLI
5dc0: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
5dd0: 56 41 4c 49 44 41 54 45 0a 20 20 61 73 73 65 72  VALIDATE.  asser
5de0: 74 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  t ( osHeapValida
5df0: 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  te(hHeap, SQLITE
5e00: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
5e10: 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64  S, NULL) );.#end
5e20: 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  if.  assert( nBy
5e30: 74 65 73 3e 3d 30 20 29 3b 0a 20 20 70 20 3d 20  tes>=0 );.  p = 
5e40: 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61  osHeapAlloc(hHea
5e50: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
5e60: 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a  HEAP_FLAGS, (SIZ
5e70: 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 69  E_T)nBytes);.  i
5e80: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c  f( !p ){.    sql
5e90: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
5ea0: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
5eb0: 6f 20 48 65 61 70 41 6c 6c 6f 63 20 25 75 20 62  o HeapAlloc %u b
5ec0: 79 74 65 73 20 28 25 64 29 2c 20 68 65 61 70 3d  ytes (%d), heap=
5ed0: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
5ee0: 20 20 20 20 20 6e 42 79 74 65 73 2c 20 6f 73 47       nBytes, osG
5ef0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
5f00: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
5f10: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
5f20: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f  ./*.** Free memo
5f30: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
5f40: 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f  id winMemFree(vo
5f50: 69 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20 48  id *pPrior){.  H
5f60: 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20  ANDLE hHeap;..  
5f70: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
5f80: 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77  c();.  hHeap = w
5f90: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a  inMemGetHeap();.
5fa0: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
5fb0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
5fc0: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
5fd0: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
5fe0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
5ff0: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
6000: 54 45 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73  TE.  assert ( os
6010: 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65  HeapValidate(hHe
6020: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
6030: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72  _HEAP_FLAGS, pPr
6040: 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ior) );.#endif. 
6050: 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 20 72   if( !pPrior ) r
6060: 65 74 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69 6e  eturn; /* Passin
6070: 67 20 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46 72  g NULL to HeapFr
6080: 65 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ee is undefined.
6090: 20 2a 2f 0a 20 20 69 66 28 20 21 6f 73 48 65 61   */.  if( !osHea
60a0: 70 46 72 65 65 28 68 48 65 61 70 2c 20 53 51 4c  pFree(hHeap, SQL
60b0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
60c0: 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 7b  LAGS, pPrior) ){
60d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
60e0: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22  (SQLITE_NOMEM, "
60f0: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 46 72  failed to HeapFr
6100: 65 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 64 29  ee block %p (%d)
6110: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
6120: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69              pPri
6130: 6f 72 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  or, osGetLastErr
6140: 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65  or(), (void*)hHe
6150: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ap);.  }.}../*.*
6160: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a  * Change the siz
6170: 65 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e of an existing
6180: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
6190: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on.*/.static voi
61a0: 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63  d *winMemRealloc
61b0: 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69  (void *pPrior, i
61c0: 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41  nt nBytes){.  HA
61d0: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f  NDLE hHeap;.  vo
61e0: 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d  id *p;..  winMem
61f0: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
6200: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47   hHeap = winMemG
6210: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65  etHeap();.  asse
6220: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a  rt( hHeap!=0 );.
6230: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
6240: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
6250: 56 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66 20  VALUE );.#ifdef 
6260: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
6270: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20 61  LOC_VALIDATE.  a
6280: 73 73 65 72 74 20 28 20 6f 73 48 65 61 70 56 61  ssert ( osHeapVa
6290: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
62a0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
62b0: 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29  FLAGS, pPrior) )
62c0: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
62d0: 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a  t( nBytes>=0 );.
62e0: 20 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 7b    if( !pPrior ){
62f0: 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 41  .    p = osHeapA
6300: 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49  lloc(hHeap, SQLI
6310: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
6320: 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79  AGS, (SIZE_T)nBy
6330: 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tes);.  }else{. 
6340: 20 20 20 70 20 3d 20 6f 73 48 65 61 70 52 65 41     p = osHeapReA
6350: 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49  lloc(hHeap, SQLI
6360: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
6370: 41 47 53 2c 20 70 50 72 69 6f 72 2c 20 28 53 49  AGS, pPrior, (SI
6380: 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20  ZE_T)nBytes);.  
6390: 7d 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  }.  if( !p ){.  
63a0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
63b0: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
63c0: 6c 65 64 20 74 6f 20 25 73 20 25 75 20 62 79 74  led to %s %u byt
63d0: 65 73 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70  es (%d), heap=%p
63e0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
63f0: 20 20 20 70 50 72 69 6f 72 20 3f 20 22 48 65 61     pPrior ? "Hea
6400: 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48 65 61  pReAlloc" : "Hea
6410: 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65 73 2c  pAlloc", nBytes,
6420: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
6430: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
6440: 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29     (void*)hHeap)
6450: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
6460: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6470: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e  n the size of an
6480: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c   outstanding all
6490: 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79 74 65  ocation, in byte
64a0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
64b0: 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64   winMemSize(void
64c0: 20 2a 70 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68   *p){.  HANDLE h
64d0: 48 65 61 70 3b 0a 20 20 53 49 5a 45 5f 54 20 6e  Heap;.  SIZE_T n
64e0: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
64f0: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
6500: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
6510: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
6520: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
6530: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
6540: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
6550: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
6560: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
6570: 41 4c 49 44 41 54 45 0a 20 20 61 73 73 65 72 74  ALIDATE.  assert
6580: 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74   ( osHeapValidat
6590: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
65a0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
65b0: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
65c0: 66 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  f.  if( !p ) ret
65d0: 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f 73 48  urn 0;.  n = osH
65e0: 65 61 70 53 69 7a 65 28 68 48 65 61 70 2c 20 53  eapSize(hHeap, S
65f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
6600: 5f 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20 69 66  _FLAGS, p);.  if
6610: 28 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d 31 20  ( n==(SIZE_T)-1 
6620: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
6630: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
6640: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
6650: 53 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20 28 25  Size block %p (%
6660: 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  d), heap=%p",.  
6670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c                p,
6680: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
6690: 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29  ), (void*)hHeap)
66a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
66b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e    }.  return (in
66c0: 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  t)n;.}../*.** Ro
66d0: 75 6e 64 20 75 70 20 61 20 72 65 71 75 65 73 74  und up a request
66e0: 20 73 69 7a 65 20 74 6f 20 74 68 65 20 6e 65 78   size to the nex
66f0: 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69  t valid allocati
6700: 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  on size..*/.stat
6710: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75  ic int winMemRou
6720: 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72  ndup(int n){.  r
6730: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
6740: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69  * Initialize thi
6750: 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61  s module..*/.sta
6760: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e  tic int winMemIn
6770: 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74  it(void *pAppDat
6780: 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61  a){.  winMemData
6790: 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20   *pWinMemData = 
67a0: 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41  (winMemData *)pA
67b0: 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21  ppData;..  if( !
67c0: 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65  pWinMemData ) re
67d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
67e0: 52 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69  R;.  assert( pWi
67f0: 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 3d  nMemData->magic=
6800: 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 29 3b  =WINMEM_MAGIC );
6810: 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44  .  if( !pWinMemD
6820: 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20  ata->hHeap ){.  
6830: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68    pWinMemData->h
6840: 48 65 61 70 20 3d 20 6f 73 48 65 61 70 43 72 65  Heap = osHeapCre
6850: 61 74 65 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ate(SQLITE_WIN32
6860: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20  _HEAP_FLAGS,.   
6870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6890: 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f     SQLITE_WIN32_
68a0: 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 0a  HEAP_INIT_SIZE,.
68b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68d0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e        SQLITE_WIN
68e0: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45  32_HEAP_MAX_SIZE
68f0: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 57 69 6e  );.    if( !pWin
6900: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29  MemData->hHeap )
6910: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
6920: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
6930: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 66 61 69  ,.          "fai
6940: 6c 65 64 20 74 6f 20 48 65 61 70 43 72 65 61 74  led to HeapCreat
6950: 65 20 28 25 64 29 2c 20 66 6c 61 67 73 3d 25 75  e (%d), flags=%u
6960: 2c 20 69 6e 69 74 53 69 7a 65 3d 25 75 2c 20 6d  , initSize=%u, m
6970: 61 78 53 69 7a 65 3d 25 75 22 2c 0a 20 20 20 20  axSize=%u",.    
6980: 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
6990: 72 72 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f 57  rror(), SQLITE_W
69a0: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
69b0: 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
69c0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49  E_WIN32_HEAP_INI
69d0: 54 5f 53 49 5a 45 2c 20 53 51 4c 49 54 45 5f 57  T_SIZE, SQLITE_W
69e0: 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49  IN32_HEAP_MAX_SI
69f0: 5a 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ZE);.      retur
6a00: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
6a10: 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65      }.    pWinMe
6a20: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20  mData->bOwned = 
6a30: 54 52 55 45 3b 0a 20 20 7d 0a 20 20 61 73 73 65  TRUE;.  }.  asse
6a40: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
6a50: 3e 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61  >hHeap!=0 );.  a
6a60: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
6a70: 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c  ta->hHeap!=INVAL
6a80: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
6a90: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
6aa0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
6ab0: 4c 49 44 41 54 45 0a 20 20 61 73 73 65 72 74 28  LIDATE.  assert(
6ac0: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
6ad0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
6ae0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
6af0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c  _HEAP_FLAGS, NUL
6b00: 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  L) );.#endif.  r
6b10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6b20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74  .}../*.** Deinit
6b30: 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75  ialize this modu
6b40: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
6b50: 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77  id winMemShutdow
6b60: 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  n(void *pAppData
6b70: 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20  ){.  winMemData 
6b80: 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28  *pWinMemData = (
6b90: 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70  winMemData *)pAp
6ba0: 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70  pData;..  if( !p
6bb0: 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74  WinMemData ) ret
6bc0: 75 72 6e 3b 0a 20 20 69 66 28 20 70 57 69 6e 4d  urn;.  if( pWinM
6bd0: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b  emData->hHeap ){
6be0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69  .    assert( pWi
6bf0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21  nMemData->hHeap!
6c00: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
6c10: 56 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66 20  VALUE );.#ifdef 
6c20: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
6c30: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20 20  LOC_VALIDATE.   
6c40: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56   assert( osHeapV
6c50: 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44  alidate(pWinMemD
6c60: 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49  ata->hHeap, SQLI
6c70: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
6c80: 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65  AGS, NULL) );.#e
6c90: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 57 69  ndif.    if( pWi
6ca0: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64  nMemData->bOwned
6cb0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6f   ){.      if( !o
6cc0: 73 48 65 61 70 44 65 73 74 72 6f 79 28 70 57 69  sHeapDestroy(pWi
6cd0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29  nMemData->hHeap)
6ce0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6cf0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
6d00: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
6d10: 20 48 65 61 70 44 65 73 74 72 6f 79 20 28 25 64   HeapDestroy (%d
6d20: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d40: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
6d50: 29 2c 20 28 76 6f 69 64 2a 29 70 57 69 6e 4d 65  ), (void*)pWinMe
6d60: 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 3b 0a 20  mData->hHeap);. 
6d70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57 69       }.      pWi
6d80: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64  nMemData->bOwned
6d90: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a   = FALSE;.    }.
6da0: 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d      pWinMemData-
6db0: 3e 68 48 65 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20  >hHeap = NULL;. 
6dc0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75   }.}../*.** Popu
6dd0: 6c 61 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76  late the low-lev
6de0: 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  el memory alloca
6df0: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f  tion function po
6e00: 69 6e 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c  inters in.** sql
6e10: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
6e20: 2e 6d 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73  .m with pointers
6e30: 20 74 6f 20 74 68 65 20 72 6f 75 74 69 6e 65 73   to the routines
6e40: 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 54   in this file. T
6e50: 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20  he.** arguments 
6e60: 73 70 65 63 69 66 79 20 74 68 65 20 62 6c 6f 63  specify the bloc
6e70: 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6d  k of memory to m
6e80: 61 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  anage..**.** Thi
6e90: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
6ea0: 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69  y called by sqli
6eb0: 74 65 33 5f 63 6f 6e 66 69 67 28 29 2c 20 61 6e  te3_config(), an
6ec0: 64 20 74 68 65 72 65 66 6f 72 65 0a 2a 2a 20 69  d therefore.** i
6ed0: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74  s not required t
6ee0: 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65 20  o be threadsafe 
6ef0: 28 69 74 20 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a  (it is not)..*/.
6f00: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65  const sqlite3_me
6f10: 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74  m_methods *sqlit
6f20: 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f  e3MemGetWin32(vo
6f30: 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  id){.  static co
6f40: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  nst sqlite3_mem_
6f50: 6d 65 74 68 6f 64 73 20 77 69 6e 4d 65 6d 4d 65  methods winMemMe
6f60: 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20 20 77 69  thods = {.    wi
6f70: 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20  nMemMalloc,.    
6f80: 77 69 6e 4d 65 6d 46 72 65 65 2c 0a 20 20 20 20  winMemFree,.    
6f90: 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20  winMemRealloc,. 
6fa0: 20 20 20 77 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20     winMemSize,. 
6fb0: 20 20 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70     winMemRoundup
6fc0: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 49 6e 69 74  ,.    winMemInit
6fd0: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74  ,.    winMemShut
6fe0: 64 6f 77 6e 2c 0a 20 20 20 20 26 77 69 6e 5f 6d  down,.    &win_m
6ff0: 65 6d 5f 64 61 74 61 0a 20 20 7d 3b 0a 20 20 72  em_data.  };.  r
7000: 65 74 75 72 6e 20 26 77 69 6e 4d 65 6d 4d 65 74  eturn &winMemMet
7010: 68 6f 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71  hods;.}..void sq
7020: 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75  lite3MemSetDefau
7030: 6c 74 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  lt(void){.  sqli
7040: 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54  te3_config(SQLIT
7050: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c  E_CONFIG_MALLOC,
7060: 20 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69   sqlite3MemGetWi
7070: 6e 33 32 28 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  n32());.}.#endif
7080: 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   /* SQLITE_WIN32
7090: 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a  _MALLOC */../*.*
70a0: 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d  * Convert a UTF-
70b0: 38 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72  8 string to Micr
70c0: 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 28 55  osoft Unicode (U
70d0: 54 46 2d 31 36 3f 29 2e 20 0a 2a 2a 0a 2a 2a 20  TF-16?). .**.** 
70e0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
70f0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
7100: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
7110: 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74  om malloc..*/.st
7120: 61 74 69 63 20 4c 50 57 53 54 52 20 75 74 66 38  atic LPWSTR utf8
7130: 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20  ToUnicode(const 
7140: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
7150: 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20  {.  int nChar;. 
7160: 20 4c 50 57 53 54 52 20 7a 57 69 64 65 46 69 6c   LPWSTR zWideFil
7170: 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20  ename;..  nChar 
7180: 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  = osMultiByteToW
7190: 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c  ideChar(CP_UTF8,
71a0: 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d   0, zFilename, -
71b0: 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 69  1, NULL, 0);.  i
71c0: 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20  f( nChar==0 ){. 
71d0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
71e0: 0a 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  .  zWideFilename
71f0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
7200: 63 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28  c( nChar*sizeof(
7210: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d  zWideFilename[0]
7220: 29 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65  ) );.  if( zWide
7230: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
7240: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7250: 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c  .  nChar = osMul
7260: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
7270: 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69  (CP_UTF8, 0, zFi
7280: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64  lename, -1, zWid
7290: 65 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  eFilename,.     
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72b0: 20 20 20 20 20 20 20 20 20 20 20 6e 43 68 61 72             nChar
72c0: 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d  );.  if( nChar==
72d0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
72e0: 5f 66 72 65 65 28 7a 57 69 64 65 46 69 6c 65 6e  _free(zWideFilen
72f0: 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69 64 65 46  ame);.    zWideF
7300: 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ilename = 0;.  }
7310: 0a 20 20 72 65 74 75 72 6e 20 7a 57 69 64 65 46  .  return zWideF
7320: 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
7330: 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73  * Convert Micros
7340: 6f 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 55  oft Unicode to U
7350: 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20  TF-8.  Space to 
7360: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
7370: 64 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f  d string is.** o
7380: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
7390: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
73a0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75  /.static char *u
73b0: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 4c 50 43  nicodeToUtf8(LPC
73c0: 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61  WSTR zWideFilena
73d0: 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  me){.  int nByte
73e0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  ;.  char *zFilen
73f0: 61 6d 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20  ame;..  nByte = 
7400: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
7410: 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30  iByte(CP_UTF8, 0
7420: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
7430: 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29   -1, 0, 0, 0, 0)
7440: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
7450: 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e   0 ){.    return
7460: 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e   0;.  }.  zFilen
7470: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ame = sqlite3_ma
7480: 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20  lloc( nByte );. 
7490: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d   if( zFilename==
74a0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
74b0: 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  0;.  }.  nByte =
74c0: 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   osWideCharToMul
74d0: 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20  tiByte(CP_UTF8, 
74e0: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
74f0: 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  , -1, zFilename,
7500: 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20   nByte,.        
7510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7520: 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20          0, 0);. 
7530: 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20   if( nByte == 0 
7540: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
7550: 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ree(zFilename);.
7560: 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20      zFilename = 
7570: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
7580: 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
7590: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 41  .** Convert an A
75a0: 4e 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d 69  NSI string to Mi
75b0: 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c  crosoft Unicode,
75c0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a   based on the.**
75d0: 20 63 75 72 72 65 6e 74 20 63 6f 64 65 70 61 67   current codepag
75e0: 65 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20 66  e settings for f
75f0: 69 6c 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a  ile apis..** .**
7600: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
7610: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
7620: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  ng is obtained.*
7630: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  * from sqlite3_m
7640: 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  alloc..*/.static
7650: 20 4c 50 57 53 54 52 20 6d 62 63 73 54 6f 55 6e   LPWSTR mbcsToUn
7660: 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72  icode(const char
7670: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
7680: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 4c 50 57  int nByte;.  LPW
7690: 53 54 52 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  STR zMbcsFilenam
76a0: 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67  e;.  int codepag
76b0: 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69  e = osAreFileApi
76c0: 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50  sANSI() ? CP_ACP
76d0: 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20   : CP_OEMCP;..  
76e0: 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42  nByte = osMultiB
76f0: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f  yteToWideChar(co
7700: 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65  depage, 0, zFile
7710: 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 0a  name, -1, NULL,.
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29  0)*sizeof(WCHAR)
7750: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30  ;.  if( nByte==0
7760: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
7770: 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 46 69 6c  ;.  }.  zMbcsFil
7780: 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f  ename = sqlite3_
7790: 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69  malloc( nByte*si
77a0: 7a 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61  zeof(zMbcsFilena
77b0: 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  me[0]) );.  if( 
77c0: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30  zMbcsFilename==0
77d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
77e0: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
77f0: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  osMultiByteToWid
7800: 65 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20  eChar(codepage, 
7810: 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  0, zFilename, -1
7820: 2c 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c  , zMbcsFilename,
7830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7850: 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e   nByte);.  if( n
7860: 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Byte==0 ){.    s
7870: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 62 63  qlite3_free(zMbc
7880: 73 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  sFilename);.    
7890: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20  zMbcsFilename = 
78a0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
78b0: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d  zMbcsFilename;.}
78c0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
78d0: 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64  Microsoft Unicod
78e0: 65 20 74 6f 20 6d 75 6c 74 69 2d 62 79 74 65 20  e to multi-byte 
78f0: 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67  character string
7900: 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a  , based on the.*
7910: 2a 20 75 73 65 72 27 73 20 41 4e 53 49 20 63 6f  * user's ANSI co
7920: 64 65 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70  depage..**.** Sp
7930: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
7940: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
7950: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
7960: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  .** sqlite3_mall
7970: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
7980: 63 68 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 4d  char *unicodeToM
7990: 62 63 73 28 4c 50 43 57 53 54 52 20 7a 57 69 64  bcs(LPCWSTR zWid
79a0: 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e  eFilename){.  in
79b0: 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20  t nByte;.  char 
79c0: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e  *zFilename;.  in
79d0: 74 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73 41  t codepage = osA
79e0: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
79f0: 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f   ? CP_ACP : CP_O
7a00: 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d  EMCP;..  nByte =
7a10: 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   osWideCharToMul
7a20: 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c  tiByte(codepage,
7a30: 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d   0, zWideFilenam
7a40: 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20  e, -1, 0, 0, 0, 
7a50: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
7a60: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75  == 0 ){.    retu
7a70: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c  rn 0;.  }.  zFil
7a80: 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f  ename = sqlite3_
7a90: 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b  malloc( nByte );
7aa0: 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
7ab0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
7ac0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  n 0;.  }.  nByte
7ad0: 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d   = osWideCharToM
7ae0: 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67  ultiByte(codepag
7af0: 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e  e, 0, zWideFilen
7b00: 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61  ame, -1, zFilena
7b10: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
7b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b30: 20 20 20 20 6e 42 79 74 65 2c 20 30 2c 20 30 29      nByte, 0, 0)
7b40: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
7b50: 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   0 ){.    sqlite
7b60: 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65  3_free(zFilename
7b70: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
7b80: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
7b90: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  rn zFilename;.}.
7ba0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 6d  ./*.** Convert m
7bb0: 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74  ultibyte charact
7bc0: 65 72 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46  er string to UTF
7bd0: 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  -8.  Space to ho
7be0: 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e  ld the.** return
7bf0: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
7c00: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
7c10: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  e3_malloc()..*/.
7c20: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
7c30: 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
7c40: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
7c50: 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  lename){.  char 
7c60: 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a  *zFilenameUtf8;.
7c70: 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64    LPWSTR zTmpWid
7c80: 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d  e;..  zTmpWide =
7c90: 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a   mbcsToUnicode(z
7ca0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
7cb0: 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a   zTmpWide==0 ){.
7cc0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7cd0: 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66  }.  zFilenameUtf
7ce0: 38 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66  8 = unicodeToUtf
7cf0: 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73  8(zTmpWide);.  s
7d00: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70  qlite3_free(zTmp
7d10: 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Wide);.  return 
7d20: 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 7d  zFilenameUtf8;.}
7d30: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
7d40: 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69 62 79  UTF-8 to multiby
7d50: 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72  te character str
7d60: 69 6e 67 2e 20 20 53 70 61 63 65 20 74 6f 20 68  ing.  Space to h
7d70: 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72 65 74 75  old the .** retu
7d80: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
7d90: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
7da0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
7db0: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
7dc0: 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62  win32_utf8_to_mb
7dd0: 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  cs(const char *z
7de0: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61  Filename){.  cha
7df0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73  r *zFilenameMbcs
7e00: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57  ;.  LPWSTR zTmpW
7e10: 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65  ide;..  zTmpWide
7e20: 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65   = utf8ToUnicode
7e30: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
7e40: 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29  f( zTmpWide==0 )
7e50: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
7e60: 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 4d    }.  zFilenameM
7e70: 62 63 73 20 3d 20 75 6e 69 63 6f 64 65 54 6f 4d  bcs = unicodeToM
7e80: 62 63 73 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20  bcs(zTmpWide);. 
7e90: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
7ea0: 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72  mpWide);.  retur
7eb0: 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b  n zFilenameMbcs;
7ec0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72  .}.../*.** The r
7ed0: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 67  eturn value of g
7ee0: 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a 2a  etLastErrorMsg.*
7ef0: 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65  * is zero if the
7f00: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
7f10: 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65  its in the buffe
7f20: 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a  r, or non-zero.*
7f30: 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20  * otherwise (if 
7f40: 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20  the message was 
7f50: 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a 73  truncated)..*/.s
7f60: 74 61 74 69 63 20 69 6e 74 20 67 65 74 4c 61 73  tatic int getLas
7f70: 74 45 72 72 6f 72 4d 73 67 28 44 57 4f 52 44 20  tErrorMsg(DWORD 
7f80: 6c 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20 6e  lastErrno, int n
7f90: 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
7fa0: 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73  {.  /* FormatMes
7fb0: 73 61 67 65 20 72 65 74 75 72 6e 73 20 30 20 6f  sage returns 0 o
7fc0: 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68 65  n failure.  Othe
7fd0: 72 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72 65  rwise it.  ** re
7fe0: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
7ff0: 20 6f 66 20 54 43 48 41 52 73 20 77 72 69 74 74   of TCHARs writt
8000: 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  en to the output
8010: 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65 78  .  ** buffer, ex
8020: 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72 6d  cluding the term
8030: 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61  inating null cha
8040: 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44 20  r..  */.  DWORD 
8050: 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61  dwLen = 0;.  cha
8060: 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20 20  r *zOut = 0;..  
8070: 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
8080: 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 57 69    LPWSTR zTempWi
8090: 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64  de = NULL;.    d
80a0: 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d  wLen = osFormatM
80b0: 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d  essageW(FORMAT_M
80c0: 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f  ESSAGE_ALLOCATE_
80d0: 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20  BUFFER |.       
80e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80f0: 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53        FORMAT_MES
8100: 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d  SAGE_FROM_SYSTEM
8110: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
8120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8130: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49  FORMAT_MESSAGE_I
8140: 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20  GNORE_INSERTS,. 
8150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8160: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
8170: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
8190: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81b0: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81d0: 20 20 20 20 20 20 20 28 4c 50 57 53 54 52 29 20         (LPWSTR) 
81e0: 26 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20  &zTempWide,.    
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8200: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8220: 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20           0);.   
8230: 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29   if( dwLen > 0 )
8240: 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63  {.      /* alloc
8250: 61 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64  ate a buffer and
8260: 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38   convert to UTF8
8270: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
8280: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
8290: 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74  oc();.      zOut
82a0: 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38   = unicodeToUtf8
82b0: 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20  (zTempWide);.   
82c0: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
82d0: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
82e0: 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73     /* free the s
82f0: 79 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c  ystem buffer all
8300: 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74  ocated by Format
8310: 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20  Message */.     
8320: 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65   osLocalFree(zTe
8330: 6d 70 57 69 64 65 29 3b 0a 20 20 20 20 7d 0a 2f  mpWide);.    }./
8340: 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66  * isNT() is 1 if
8350: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
8360: 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73  ==1, so this els
8370: 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75  e is never execu
8380: 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74  ted. .** Since t
8390: 68 65 20 41 4e 53 49 20 76 65 72 73 69 6f 6e 20  he ANSI version 
83a0: 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73  of these Windows
83b0: 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73   API do not exis
83c0: 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20  t for WINCE,.** 
83d0: 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  it's important t
83e0: 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20  o not reference 
83f0: 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62  them for WINCE b
8400: 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51  uilds..*/.#if SQ
8410: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30  LITE_OS_WINCE==0
8420: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
8430: 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c  ar *zTemp = NULL
8440: 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73  ;.    dwLen = os
8450: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28 46  FormatMessageA(F
8460: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c  ORMAT_MESSAGE_AL
8470: 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a  LOCATE_BUFFER |.
8480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8490: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
84a0: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d  MAT_MESSAGE_FROM
84b0: 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20  _SYSTEM |.      
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 46 4f 52 4d 41 54 5f 4d 45         FORMAT_ME
84e0: 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53  SSAGE_IGNORE_INS
84f0: 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20  ERTS,.          
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8510: 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20     NULL,.       
8520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8530: 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c        lastErrno,
8540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
8560: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4c                (L
8580: 50 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20  PSTR) &zTemp,.  
8590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85a0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85c0: 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20             0);. 
85d0: 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30     if( dwLen > 0
85e0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c   ){.      /* all
85f0: 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61  ocate a buffer a
8600: 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54  nd convert to UT
8610: 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  F8 */.      sqli
8620: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
8630: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f  lloc();.      zO
8640: 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  ut = sqlite3_win
8650: 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
8660: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71  zTemp);.      sq
8670: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
8680: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a  lloc();.      /*
8690: 20 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d   free the system
86a0: 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
86b0: 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61  d by FormatMessa
86c0: 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f  ge */.      osLo
86d0: 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a  calFree(zTemp);.
86e0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
86f0: 0a 20 20 69 66 28 20 30 20 3d 3d 20 64 77 4c 65  .  if( 0 == dwLe
8700: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
8710: 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20  _snprintf(nBuf, 
8720: 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f 72 20 30  zBuf, "OsError 0
8730: 78 25 78 20 28 25 75 29 22 2c 20 6c 61 73 74 45  x%x (%u)", lastE
8740: 72 72 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29  rrno, lastErrno)
8750: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
8760: 2a 20 63 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d  * copy a maximum
8770: 20 6f 66 20 6e 42 75 66 20 63 68 61 72 73 20 74   of nBuf chars t
8780: 6f 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  o output buffer 
8790: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
87a0: 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42  nprintf(nBuf, zB
87b0: 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b  uf, "%s", zOut);
87c0: 0a 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65  .    /* free the
87d0: 20 55 54 46 38 20 62 75 66 66 65 72 20 2a 2f 0a   UTF8 buffer */.
87e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
87f0: 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65  (zOut);.  }.  re
8800: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
8810: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
8820: 6e 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41  n - winLogErrorA
8830: 74 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c  tLine() - is onl
8840: 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69  y ever called vi
8850: 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77  a the macro.** w
8860: 69 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a  inLogError()..**
8870: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8880: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65   is invoked afte
8890: 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  r an error occur
88a0: 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74  s in an OS funct
88b0: 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20  ion..** It logs 
88c0: 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20  a message using 
88d0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f  sqlite3_log() co
88e0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72  ntaining the cur
88f0: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a  rent value of.**
8900: 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c   error code and,
8910: 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68   if possible, th
8920: 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  e human-readable
8930: 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d   equivalent from
8940: 20 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61   .** FormatMessa
8950: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ge..**.** The fi
8960: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
8970: 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f  sed to the macro
8980: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65   should be the e
8990: 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a  rror code that.*
89a0: 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  * will be return
89b0: 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e  ed to SQLite (e.
89c0: 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  g. SQLITE_IOERR_
89d0: 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43  DELETE, SQLITE_C
89e0: 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68  ANTOPEN). .** Th
89f0: 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74  e two subsequent
8a00: 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c   arguments shoul
8a10: 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  d be the name of
8a20: 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e   the OS function
8a30: 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20   that.** failed 
8a40: 61 6e 64 20 74 68 65 20 74 68 65 20 61 73 73 6f  and the the asso
8a50: 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74  ciated file-syst
8a60: 65 6d 20 70 61 74 68 2c 20 69 66 20 61 6e 79 2e  em path, if any.
8a70: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c  .*/.#define winL
8a80: 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29  ogError(a,b,c,d)
8a90: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74     winLogErrorAt
8aa0: 4c 69 6e 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c  Line(a,b,c,d,__L
8ab0: 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e  INE__).static in
8ac0: 74 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c  t winLogErrorAtL
8ad0: 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f  ine(.  int errco
8ae0: 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
8af0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65         /* SQLite
8b00: 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
8b10: 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
8b20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8b30: 20 2f 2a 20 57 69 6e 33 32 20 6c 61 73 74 20 65   /* Win32 last e
8b40: 72 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rror */.  const 
8b50: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20  char *zFunc,    
8b60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
8b70: 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e  e of OS function
8b80: 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a   that failed */.
8b90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
8ba0: 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
8bb0: 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61    /* File path a
8bc0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
8bd0: 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  rror */.  int iL
8be0: 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ine             
8bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75            /* Sou
8c00: 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  rce line number 
8c10: 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75  where error occu
8c20: 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  rred */.){.  cha
8c30: 72 20 7a 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20  r zMsg[500];    
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8c50: 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 65  Human readable e
8c60: 72 72 6f 72 20 74 65 78 74 20 2a 2f 0a 20 20 69  rror text */.  i
8c70: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
8c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8c90: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
8ca0: 2f 0a 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30  /..  zMsg[0] = 0
8cb0: 3b 0a 20 20 67 65 74 4c 61 73 74 45 72 72 6f 72  ;.  getLastError
8cc0: 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73  Msg(lastErrno, s
8cd0: 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73  izeof(zMsg), zMs
8ce0: 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 72  g);.  assert( er
8cf0: 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rcode!=SQLITE_OK
8d00: 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d   );.  if( zPath=
8d10: 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b  =0 ) zPath = "";
8d20: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67  .  for(i=0; zMsg
8d30: 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d  [i] && zMsg[i]!=
8d40: 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21  '\r' && zMsg[i]!
8d50: 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\n'; i++){}.  
8d60: 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73  zMsg[i] = 0;.  s
8d70: 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f  qlite3_log(errco
8d80: 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77 69  de,.      "os_wi
8d90: 6e 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28  n.c:%d: (%d) %s(
8da0: 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20  %s) - %s",.     
8db0: 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e   iLine, lastErrn
8dc0: 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c  o, zFunc, zPath,
8dd0: 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65   zMsg.  );..  re
8de0: 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a  turn errcode;.}.
8df0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65  ./*.** The numbe
8e00: 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20  r of times that 
8e10: 61 20 52 65 61 64 46 69 6c 65 28 29 2c 20 57 72  a ReadFile(), Wr
8e20: 69 74 65 46 69 6c 65 28 29 2c 20 61 6e 64 20 44  iteFile(), and D
8e30: 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77  eleteFile().** w
8e40: 69 6c 6c 20 62 65 20 72 65 74 72 69 65 64 20 66  ill be retried f
8e50: 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69  ollowing a locki
8e60: 6e 67 20 65 72 72 6f 72 20 2d 20 70 72 6f 62 61  ng error - proba
8e70: 62 6c 79 20 63 61 75 73 65 64 20 62 79 20 0a 2a  bly caused by .*
8e80: 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f 66 74  * antivirus soft
8e90: 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68 65 20  ware.  Also the 
8ea0: 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20 62 65  initial delay be
8eb0: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 72  fore the first r
8ec0: 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c  etry..** The del
8ed0: 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c 69 6e  ay increases lin
8ee0: 65 61 72 6c 79 20 77 69 74 68 20 65 61 63 68 20  early with each 
8ef0: 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65  retry..*/.#ifnde
8f00: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  f SQLITE_WIN32_I
8f10: 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64 65 66  OERR_RETRY.# def
8f20: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
8f30: 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31 30 0a  _IOERR_RETRY 10.
8f40: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
8f50: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
8f60: 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a 23 20  R_RETRY_DELAY.# 
8f70: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
8f80: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
8f90: 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69 66 0a  DELAY 25.#endif.
8fa0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32  static int win32
8fb0: 49 6f 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c  IoerrRetry = SQL
8fc0: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
8fd0: 52 45 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e  RETRY;.static in
8fe0: 74 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72  t win32IoerrRetr
8ff0: 79 44 65 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f  yDelay = SQLITE_
9000: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
9010: 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20  Y_DELAY;../*.** 
9020: 49 66 20 61 20 52 65 61 64 46 69 6c 65 28 29 20  If a ReadFile() 
9030: 6f 72 20 57 72 69 74 65 46 69 6c 65 28 29 20 65  or WriteFile() e
9040: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 69 6e 76  rror occurs, inv
9050: 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oke this routine
9060: 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 69 74  .** to see if it
9070: 20 73 68 6f 75 6c 64 20 62 65 20 72 65 74 72 69   should be retri
9080: 65 64 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ed.  Return TRUE
9090: 20 74 6f 20 72 65 74 72 79 2e 20 20 52 65 74 75   to retry.  Retu
90a0: 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 74 6f 20 67  rn FALSE.** to g
90b0: 69 76 65 20 75 70 20 77 69 74 68 20 61 6e 20 65  ive up with an e
90c0: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
90d0: 69 6e 74 20 72 65 74 72 79 49 6f 65 72 72 28 69  int retryIoerr(i
90e0: 6e 74 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f  nt *pnRetry, DWO
90f0: 52 44 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44  RD *pError){.  D
9100: 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61  WORD e = osGetLa
9110: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28  stError();.  if(
9120: 20 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e 33 32   *pnRetry>=win32
9130: 49 6f 65 72 72 52 65 74 72 79 20 29 7b 0a 20 20  IoerrRetry ){.  
9140: 20 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a    if( pError ){.
9150: 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20        *pError = 
9160: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  e;.    }.    ret
9170: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
9180: 20 65 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53 53   e==ERROR_ACCESS
9190: 5f 44 45 4e 49 45 44 20 7c 7c 0a 20 20 20 20 20  _DENIED ||.     
91a0: 20 65 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56   e==ERROR_LOCK_V
91b0: 49 4f 4c 41 54 49 4f 4e 20 7c 7c 0a 20 20 20 20  IOLATION ||.    
91c0: 20 20 65 3d 3d 45 52 52 4f 52 5f 53 48 41 52 49    e==ERROR_SHARI
91d0: 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 20 29 7b 0a  NG_VIOLATION ){.
91e0: 20 20 20 20 6f 73 53 6c 65 65 70 28 77 69 6e 33      osSleep(win3
91f0: 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79  2IoerrRetryDelay
9200: 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a  *(1+*pnRetry));.
9210: 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a      ++*pnRetry;.
9220: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
9230: 7d 0a 20 20 69 66 28 20 70 45 72 72 6f 72 20 29  }.  if( pError )
9240: 7b 0a 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20  {.    *pError = 
9250: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
9260: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20  0;.}../*.** Log 
9270: 61 20 49 2f 4f 20 65 72 72 6f 72 20 72 65 74 72  a I/O error retr
9280: 79 20 65 70 69 73 6f 64 65 2e 0a 2a 2f 0a 73 74  y episode..*/.st
9290: 61 74 69 63 20 76 6f 69 64 20 6c 6f 67 49 6f 65  atic void logIoe
92a0: 72 72 28 69 6e 74 20 6e 52 65 74 72 79 29 7b 0a  rr(int nRetry){.
92b0: 20 20 69 66 28 20 6e 52 65 74 72 79 20 29 7b 0a    if( nRetry ){.
92c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
92d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 0a 20  SQLITE_IOERR, . 
92e0: 20 20 20 20 20 22 64 65 6c 61 79 65 64 20 25 64       "delayed %d
92f0: 6d 73 20 66 6f 72 20 6c 6f 63 6b 2f 73 68 61 72  ms for lock/shar
9300: 69 6e 67 20 63 6f 6e 66 6c 69 63 74 22 2c 0a 20  ing conflict",. 
9310: 20 20 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52       win32IoerrR
9320: 65 74 72 79 44 65 6c 61 79 2a 6e 52 65 74 72 79  etryDelay*nRetry
9330: 2a 28 6e 52 65 74 72 79 2b 31 29 2f 32 0a 20 20  *(nRetry+1)/2.  
9340: 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20    );.  }.}..#if 
9350: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
9360: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
9370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
93a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
93b0: 69 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e 74 61  is section conta
93c0: 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 57 69 6e  ins code for Win
93d0: 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 2f 2a 0a 2a  CE only..*/./*.*
93e0: 2a 20 57 69 6e 64 6f 77 73 20 43 45 20 64 6f 65  * Windows CE doe
93f0: 73 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f 63  s not have a loc
9400: 61 6c 74 69 6d 65 28 29 20 66 75 6e 63 74 69 6f  altime() functio
9410: 6e 2e 20 20 53 6f 20 63 72 65 61 74 65 20 61 0a  n.  So create a.
9420: 2a 2a 20 73 75 62 73 74 69 74 75 74 65 2e 0a 2a  ** substitute..*
9430: 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65  /.#include <time
9440: 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a 5f  .h>.struct tm *_
9450: 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d 65  _cdecl localtime
9460: 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a 74  (const time_t *t
9470: 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72  ).{.  static str
9480: 75 63 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c 45  uct tm y;.  FILE
9490: 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20  TIME uTm, lTm;. 
94a0: 20 53 59 53 54 45 4d 54 49 4d 45 20 70 54 6d 3b   SYSTEMTIME pTm;
94b0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
94c0: 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a 74   t64;.  t64 = *t
94d0: 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34 20 2b  ;.  t64 = (t64 +
94e0: 20 31 31 36 34 34 34 37 33 36 30 30 29 2a 31 30   11644473600)*10
94f0: 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64 77  000000;.  uTm.dw
9500: 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20 28 44  LowDateTime = (D
9510: 57 4f 52 44 29 28 74 36 34 20 26 20 30 78 46 46  WORD)(t64 & 0xFF
9520: 46 46 46 46 46 46 29 3b 0a 20 20 75 54 6d 2e 64  FFFFFF);.  uTm.d
9530: 77 48 69 67 68 44 61 74 65 54 69 6d 65 3d 20 28  wHighDateTime= (
9540: 44 57 4f 52 44 29 28 74 36 34 20 3e 3e 20 33 32  DWORD)(t64 >> 32
9550: 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54  );.  osFileTimeT
9560: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28 26  oLocalFileTime(&
9570: 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 6f 73 46  uTm,&lTm);.  osF
9580: 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54  ileTimeToSystemT
9590: 69 6d 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a  ime(&lTm,&pTm);.
95a0: 20 20 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70 54    y.tm_year = pT
95b0: 6d 2e 77 59 65 61 72 20 2d 20 31 39 30 30 3b 0a  m.wYear - 1900;.
95c0: 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d    y.tm_mon = pTm
95d0: 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20 79  .wMonth - 1;.  y
95e0: 2e 74 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e 77  .tm_wday = pTm.w
95f0: 44 61 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e 74  DayOfWeek;.  y.t
9600: 6d 5f 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44 61  m_mday = pTm.wDa
9610: 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20 3d  y;.  y.tm_hour =
9620: 20 70 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79 2e   pTm.wHour;.  y.
9630: 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d 69  tm_min = pTm.wMi
9640: 6e 75 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65 63  nute;.  y.tm_sec
9650: 20 3d 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a   = pTm.wSecond;.
9660: 20 20 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a 0a    return &y;.}..
9670: 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f 54  #define HANDLE_T
9680: 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28 77 69  O_WINFILE(a) (wi
9690: 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72 2a 29  nFile*)&((char*)
96a0: 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74 6f  a)[-(int)offseto
96b0: 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f  f(winFile,h)]../
96c0: 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 6c  *.** Acquire a l
96d0: 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64 6c  ock on the handl
96e0: 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  e h.*/.static vo
96f0: 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  id winceMutexAcq
9700: 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29 7b 0a  uire(HANDLE h){.
9710: 20 20 20 44 57 4f 52 44 20 64 77 45 72 72 3b 0a     DWORD dwErr;.
9720: 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64 77 45     do {.     dwE
9730: 72 72 20 3d 20 57 61 69 74 46 6f 72 53 69 6e 67  rr = WaitForSing
9740: 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e 46 49  leObject(h, INFI
9750: 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77 68 69 6c  NITE);.   } whil
9760: 65 20 28 64 77 45 72 72 20 21 3d 20 57 41 49 54  e (dwErr != WAIT
9770: 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20 64 77 45  _OBJECT_0 && dwE
9780: 72 72 20 21 3d 20 57 41 49 54 5f 41 42 41 4e 44  rr != WAIT_ABAND
9790: 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52  ONED);.}./*.** R
97a0: 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20 61 63  elease a lock ac
97b0: 71 75 69 72 65 64 20 62 79 20 77 69 6e 63 65 4d  quired by winceM
97c0: 75 74 65 78 41 63 71 75 69 72 65 28 29 0a 2a 2f  utexAcquire().*/
97d0: 0a 23 64 65 66 69 6e 65 20 77 69 6e 63 65 4d 75  .#define winceMu
97e0: 74 65 78 52 65 6c 65 61 73 65 28 68 29 20 52 65  texRelease(h) Re
97f0: 6c 65 61 73 65 4d 75 74 65 78 28 68 29 0a 0a 2f  leaseMutex(h)../
9800: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
9810: 6d 75 74 65 78 20 61 6e 64 20 73 68 61 72 65 64  mutex and shared
9820: 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 66 6f 72   memory used for
9830: 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 65 20   locking in the 
9840: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
9850: 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74 61 74  or pFile.*/.stat
9860: 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 43 72 65  ic BOOL winceCre
9870: 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68  ateLock(const ch
9880: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 77  ar *zFilename, w
9890: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
98a0: 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b 3b 0a 20    LPWSTR zTok;. 
98b0: 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65 3b 0a 20   LPWSTR zName;. 
98c0: 20 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52   BOOL bInit = TR
98d0: 55 45 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 75  UE;..  zName = u
98e0: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
98f0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
9900: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Name==0 ){.    /
9910: 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20  * out of memory 
9920: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41  */.    return FA
9930: 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  LSE;.  }..  /* I
9940: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f  nitialize the lo
9950: 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a  cal lockdata */.
9960: 20 20 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d    memset(&pFile-
9970: 3e 6c 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f  >local, 0, sizeo
9980: 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29  f(pFile->local))
9990: 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20  ;..  /* Replace 
99a0: 74 68 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20  the backslashes 
99b0: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d  from the filenam
99c0: 65 20 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20  e and lowercase 
99d0: 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76  it.  ** to deriv
99e0: 65 20 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20  e a mutex name. 
99f0: 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68  */.  zTok = osCh
9a00: 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b  arLowerW(zName);
9a10: 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a  .  for (;*zTok;z
9a20: 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28  Tok++){.    if (
9a30: 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a  *zTok == '\\') *
9a40: 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a  zTok = '_';.  }.
9a50: 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65  .  /* Create/ope
9a60: 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65  n the named mute
9a70: 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d  x */.  pFile->hM
9a80: 75 74 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d  utex = osCreateM
9a90: 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53  utexW(NULL, FALS
9aa0: 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20  E, zName);.  if 
9ab0: 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  (!pFile->hMutex)
9ac0: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
9ad0: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
9ae0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 77  stError();.    w
9af0: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
9b00: 45 5f 45 52 52 4f 52 2c 20 70 46 69 6c 65 2d 3e  E_ERROR, pFile->
9b10: 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 63  lastErrno, "winc
9b20: 65 43 72 65 61 74 65 4c 6f 63 6b 31 22 2c 20 7a  eCreateLock1", z
9b30: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 73  Filename);.    s
9b40: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d  qlite3_free(zNam
9b50: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46  e);.    return F
9b60: 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ALSE;.  }..  /* 
9b70: 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65  Acquire the mute
9b80: 78 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  x before continu
9b90: 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75  ing */.  winceMu
9ba0: 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
9bb0: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 0a 20 20  ->hMutex);.  .  
9bc0: 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 6e 61 6d  /* Since the nam
9bd0: 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65  es of named mute
9be0: 78 65 73 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c  xes, semaphores,
9bf0: 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 73 20 65   file mappings e
9c00: 74 63 20 61 72 65 20 0a 20 20 2a 2a 20 63 61 73  tc are .  ** cas
9c10: 65 2d 73 65 6e 73 69 74 69 76 65 2c 20 74 61 6b  e-sensitive, tak
9c20: 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  e advantage of t
9c30: 68 61 74 20 62 79 20 75 70 70 65 72 63 61 73 69  hat by uppercasi
9c40: 6e 67 20 74 68 65 20 6d 75 74 65 78 20 6e 61 6d  ng the mutex nam
9c50: 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e 67  e.  ** and using
9c60: 20 74 68 61 74 20 61 73 20 74 68 65 20 73 68 61   that as the sha
9c70: 72 65 64 20 66 69 6c 65 6d 61 70 70 69 6e 67 20  red filemapping 
9c80: 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 6f 73 43  name..  */.  osC
9c90: 68 61 72 55 70 70 65 72 57 28 7a 4e 61 6d 65 29  harUpperW(zName)
9ca0: 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72  ;.  pFile->hShar
9cb0: 65 64 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ed = osCreateFil
9cc0: 65 4d 61 70 70 69 6e 67 57 28 49 4e 56 41 4c 49  eMappingW(INVALI
9cd0: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 2c 20  D_HANDLE_VALUE, 
9ce0: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
9cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
9d10: 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c  GE_READWRITE, 0,
9d20: 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63   sizeof(winceLoc
9d30: 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  k),.            
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
9d60: 65 29 3b 20 20 0a 0a 20 20 2f 2a 20 53 65 74 20  e);  ..  /* Set 
9d70: 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69  a flag that indi
9d80: 63 61 74 65 73 20 77 65 27 72 65 20 74 68 65 20  cates we're the 
9d90: 66 69 72 73 74 20 74 6f 20 63 72 65 61 74 65 20  first to create 
9da0: 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74  the memory so it
9db0: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a   .  ** must be z
9dc0: 65 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20  ero-initialized 
9dd0: 2a 2f 0a 20 20 69 66 20 28 6f 73 47 65 74 4c 61  */.  if (osGetLa
9de0: 73 74 45 72 72 6f 72 28 29 20 3d 3d 20 45 52 52  stError() == ERR
9df0: 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58 49 53 54  OR_ALREADY_EXIST
9e00: 53 29 7b 0a 20 20 20 20 62 49 6e 69 74 20 3d 20  S){.    bInit = 
9e10: 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71  FALSE;.  }..  sq
9e20: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65  lite3_free(zName
9e30: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 73  );..  /* If we s
9e40: 75 63 63 65 65 64 65 64 20 69 6e 20 6d 61 6b 69  ucceeded in maki
9e50: 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
9e60: 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70  mory handle, map
9e70: 20 69 74 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46   it. */.  if (pF
9e80: 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 7b 0a 20  ile->hShared){. 
9e90: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
9ea0: 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f   = (winceLock*)o
9eb0: 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  sMapViewOfFile(p
9ec0: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 2c 20 0a  File->hShared, .
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 49 4c               FIL
9ee0: 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f  E_MAP_READ|FILE_
9ef0: 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c  MAP_WRITE, 0, 0,
9f00: 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63   sizeof(winceLoc
9f10: 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d  k));.    /* If m
9f20: 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2c 20 63  apping failed, c
9f30: 6c 6f 73 65 20 74 68 65 20 73 68 61 72 65 64 20  lose the shared 
9f40: 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e  memory handle an
9f50: 64 20 65 72 61 73 65 20 69 74 20 2a 2f 0a 20 20  d erase it */.  
9f60: 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 73 68    if (!pFile->sh
9f70: 61 72 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69  ared){.      pFi
9f80: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
9f90: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
9fa0: 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72  ;.      winLogEr
9fb0: 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52  ror(SQLITE_ERROR
9fc0: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
9fd0: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
9fe0: 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c     "winceCreateL
9ff0: 6f 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  ock2", zFilename
a000: 29 3b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65  );.      osClose
a010: 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53  Handle(pFile->hS
a020: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 46  hared);.      pF
a030: 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e  ile->hShared = N
a040: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ULL;.    }.  }..
a050: 20 20 2f 2a 20 49 66 20 73 68 61 72 65 64 20 6d    /* If shared m
a060: 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20  emory could not 
a070: 62 65 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e  be created, then
a080: 20 63 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78   close the mutex
a090: 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20 69   and fail */.  i
a0a0: 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  f (pFile->hShare
a0b0: 64 20 3d 3d 20 4e 55 4c 4c 29 7b 0a 20 20 20 20  d == NULL){.    
a0c0: 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
a0d0: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
a0e0: 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e  ;.    osCloseHan
a0f0: 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  dle(pFile->hMute
a100: 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68  x);.    pFile->h
a110: 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20  Mutex = NULL;.  
a120: 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a    return FALSE;.
a130: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 6e 69 74    }.  .  /* Init
a140: 69 61 6c 69 7a 65 20 74 68 65 20 73 68 61 72 65  ialize the share
a150: 64 20 6d 65 6d 6f 72 79 20 69 66 20 77 65 27 72  d memory if we'r
a160: 65 20 73 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f  e supposed to */
a170: 0a 20 20 69 66 20 28 62 49 6e 69 74 29 20 7b 0a  .  if (bInit) {.
a180: 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65      memset(pFile
a190: 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20 73 69 7a  ->shared, 0, siz
a1a0: 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b  eof(winceLock));
a1b0: 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74  .  }..  winceMut
a1c0: 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
a1d0: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  >hMutex);.  retu
a1e0: 72 6e 20 54 52 55 45 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn TRUE;.}../*.*
a1f0: 2a 20 44 65 73 74 72 6f 79 20 74 68 65 20 70 61  * Destroy the pa
a200: 72 74 20 6f 66 20 77 69 6e 46 69 6c 65 20 74 68  rt of winFile th
a210: 61 74 20 64 65 61 6c 73 20 77 69 74 68 20 77 69  at deals with wi
a220: 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61  nce locks.*/.sta
a230: 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 44 65  tic void winceDe
a240: 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46 69 6c  stroyLock(winFil
a250: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66 20  e *pFile){.  if 
a260: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b  (pFile->hMutex){
a270: 0a 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20  .    /* Acquire 
a280: 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20  the mutex */.   
a290: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
a2a0: 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  re(pFile->hMutex
a2b0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  );..    /* The f
a2c0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20  ollowing blocks 
a2d0: 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20  should probably 
a2e0: 61 73 73 65 72 74 20 69 6e 20 64 65 62 75 67 20  assert in debug 
a2f0: 6d 6f 64 65 2c 20 62 75 74 20 74 68 65 79 0a 20  mode, but they. 
a300: 20 20 20 20 20 20 61 72 65 20 74 6f 20 63 6c 65        are to cle
a310: 61 6e 75 70 20 69 6e 20 63 61 73 65 20 61 6e 79  anup in case any
a320: 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65 64 20   locks remained 
a330: 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28  open */.    if (
a340: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
a350: 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 70 46  aders){.      pF
a360: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65  ile->shared->nRe
a370: 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a  aders --;.    }.
a380: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
a390: 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 7b  ocal.bReserved){
a3a0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
a3b0: 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20  ared->bReserved 
a3c0: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20  = FALSE;.    }. 
a3d0: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
a3e0: 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20  cal.bPending){. 
a3f0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
a400: 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46  ed->bPending = F
a410: 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ALSE;.    }.    
a420: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
a430: 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20  .bExclusive){.  
a440: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
a450: 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  d->bExclusive = 
a460: 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  FALSE;.    }..  
a470: 20 20 2f 2a 20 44 65 2d 72 65 66 65 72 65 6e 63    /* De-referenc
a480: 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75 72 20  e and close our 
a490: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 68 61 72  copy of the shar
a4a0: 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65  ed memory handle
a4b0: 20 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d 61 70 56   */.    osUnmapV
a4c0: 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d  iewOfFile(pFile-
a4d0: 3e 73 68 61 72 65 64 29 3b 0a 20 20 20 20 6f 73  >shared);.    os
a4e0: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
a4f0: 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 0a 20 20  e->hShared);..  
a500: 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74 68 20 74    /* Done with t
a510: 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20  he mutex */.    
a520: 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
a530: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
a540: 3b 20 20 20 20 0a 20 20 20 20 6f 73 43 6c 6f 73  ;    .    osClos
a550: 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
a560: 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c  Mutex);.    pFil
a570: 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c  e->hMutex = NULL
a580: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  ;.  }.}../* .** 
a590: 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  An implementatio
a5a0: 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c  n of the LockFil
a5b0: 65 28 29 20 41 50 49 20 6f 66 20 57 69 6e 64 6f  e() API of Windo
a5c0: 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61  ws for CE.*/.sta
a5d0: 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f  tic BOOL winceLo
a5e0: 63 6b 46 69 6c 65 28 0a 20 20 48 41 4e 44 4c 45  ckFile(.  HANDLE
a5f0: 20 2a 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52   *phFile,.  DWOR
a600: 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f  D dwFileOffsetLo
a610: 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  w,.  DWORD dwFil
a620: 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44  eOffsetHigh,.  D
a630: 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
a640: 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20  tesToLockLow,.  
a650: 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42  DWORD nNumberOfB
a660: 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29  ytesToLockHigh.)
a670: 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
a680: 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57  le = HANDLE_TO_W
a690: 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a  INFILE(phFile);.
a6a0: 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d    BOOL bReturn =
a6b0: 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45   FALSE;..  UNUSE
a6c0: 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46 69  D_PARAMETER(dwFi
a6d0: 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20  leOffsetHigh);. 
a6e0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
a6f0: 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  R(nNumberOfBytes
a700: 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20  ToLockHigh);..  
a710: 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74  if (!pFile->hMut
a720: 65 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b  ex) return TRUE;
a730: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
a740: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
a750: 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74 69  ex);..  /* Wanti
a760: 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ng an exclusive 
a770: 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20 28 64  lock? */.  if (d
a780: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
a790: 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
a7a0: 46 49 52 53 54 0a 20 20 20 20 20 20 20 26 26 20  FIRST.       && 
a7b0: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
a7c0: 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  LockLow == (DWOR
a7d0: 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a  D)SHARED_SIZE){.
a7e0: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73      if (pFile->s
a7f0: 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20  hared->nReaders 
a800: 3d 3d 20 30 20 26 26 20 70 46 69 6c 65 2d 3e 73  == 0 && pFile->s
a810: 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
a820: 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 20  e == 0){.       
a830: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
a840: 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45  Exclusive = TRUE
a850: 3b 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ;.       pFile->
a860: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
a870: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20   = TRUE;.       
a880: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
a890: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
a8a0: 57 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  Want a read-only
a8b0: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65   lock? */.  else
a8c0: 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
a8d0: 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53  tLow == (DWORD)S
a8e0: 48 41 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20  HARED_FIRST &&. 
a8f0: 20 20 20 20 20 20 20 20 20 20 6e 4e 75 6d 62 65            nNumbe
a900: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
a910: 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20  w == 1){.    if 
a920: 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e  (pFile->shared->
a930: 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29  bExclusive == 0)
a940: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
a950: 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b 2b  ocal.nReaders ++
a960: 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c  ;.      if (pFil
a970: 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
a980: 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20 20  s == 1){.       
a990: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
a9a0: 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20  nReaders ++;.   
a9b0: 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75     }.      bRetu
a9c0: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
a9d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20  .  }..  /* Want 
a9e0: 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20  a pending lock? 
a9f0: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
aa00: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
aa10: 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f   (DWORD)PENDING_
aa20: 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f  BYTE && nNumberO
aa30: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
aa40: 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66  == 1){.    /* If
aa50: 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b   no pending lock
aa60: 20 68 61 73 20 62 65 65 6e 20 61 63 71 75 69 72   has been acquir
aa70: 65 64 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65  ed, then acquire
aa80: 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70   it */.    if (p
aa90: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
aaa0: 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20  ending == 0) {. 
aab0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
aac0: 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54  ed->bPending = T
aad0: 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  RUE;.      pFile
aae0: 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67  ->local.bPending
aaf0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62   = TRUE;.      b
ab00: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
ab10: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
ab20: 61 6e 74 20 61 20 72 65 73 65 72 76 65 64 20 6c  ant a reserved l
ab30: 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69  ock? */.  else i
ab40: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
ab50: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53  ow == (DWORD)RES
ab60: 45 52 56 45 44 5f 42 59 54 45 20 26 26 20 6e 4e  ERVED_BYTE && nN
ab70: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
ab80: 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
ab90: 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72   if (pFile->shar
aba0: 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 3d  ed->bReserved ==
abb0: 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c   0) {.      pFil
abc0: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
abd0: 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20  rved = TRUE;.   
abe0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
abf0: 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45  bReserved = TRUE
ac00: 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  ;.      bReturn 
ac10: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
ac20: 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52  }..  winceMutexR
ac30: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
ac40: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
ac50: 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  bReturn;.}../*.*
ac60: 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  * An implementat
ac70: 69 6f 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63  ion of the Unloc
ac80: 6b 46 69 6c 65 20 41 50 49 20 6f 66 20 57 69 6e  kFile API of Win
ac90: 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73  dows for CE.*/.s
aca0: 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65  tatic BOOL wince
acb0: 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 48 41  UnlockFile(.  HA
acc0: 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a 20 20  NDLE *phFile,.  
acd0: 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
ace0: 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64  etLow,.  DWORD d
acf0: 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c  wFileOffsetHigh,
ad00: 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
ad10: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
ad20: 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d  ow,.  DWORD nNum
ad30: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
ad40: 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46  ckHigh.){.  winF
ad50: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e  ile *pFile = HAN
ad60: 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70  DLE_TO_WINFILE(p
ad70: 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62  hFile);.  BOOL b
ad80: 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a  Return = FALSE;.
ad90: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
ada0: 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74  TER(dwFileOffset
adb0: 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f  High);.  UNUSED_
adc0: 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65  PARAMETER(nNumbe
add0: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
ade0: 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70  High);..  if (!p
adf0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65  File->hMutex) re
ae00: 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e  turn TRUE;.  win
ae10: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
ae20: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a  File->hMutex);..
ae30: 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61    /* Releasing a
ae40: 20 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20   reader lock or 
ae50: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
ae60: 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c  k */.  if (dwFil
ae70: 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44  eOffsetLow == (D
ae80: 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53  WORD)SHARED_FIRS
ae90: 54 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20 77  T){.    /* Did w
aea0: 65 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  e have an exclus
aeb0: 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20  ive lock? */.   
aec0: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
aed0: 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20  l.bExclusive){. 
aee0: 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d       assert(nNum
aef0: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
af00: 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  ckLow == (DWORD)
af10: 53 48 41 52 45 44 5f 53 49 5a 45 29 3b 0a 20 20  SHARED_SIZE);.  
af20: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
af30: 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41  .bExclusive = FA
af40: 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  LSE;.      pFile
af50: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
af60: 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20  sive = FALSE;.  
af70: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
af80: 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  UE;.    }..    /
af90: 2a 20 44 69 64 20 77 65 20 6a 75 73 74 20 68 61  * Did we just ha
afa0: 76 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b  ve a reader lock
afb0: 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  ? */.    else if
afc0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
afd0: 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20  Readers){.      
afe0: 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66  assert(nNumberOf
aff0: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
b000: 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
b010: 44 5f 53 49 5a 45 20 7c 7c 20 6e 4e 75 6d 62 65  D_SIZE || nNumbe
b020: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
b030: 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20  Low == 1);.     
b040: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52   pFile->local.nR
b050: 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20  eaders --;.     
b060: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
b070: 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 29  l.nReaders == 0)
b080: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
b090: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
b0a0: 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20  nReaders --;.   
b0b0: 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75     }.      bRetu
b0c0: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
b0d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  .  }..  /* Relea
b0e0: 73 69 6e 67 20 61 20 70 65 6e 64 69 6e 67 20 6c  sing a pending l
b0f0: 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ock */.  else if
b100: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
b110: 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44  w == (DWORD)PEND
b120: 49 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d  ING_BYTE && nNum
b130: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
b140: 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
b150: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
b160: 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20  l.bPending){.   
b170: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
b180: 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45  bPending = FALSE
b190: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  ;.      pFile->s
b1a0: 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
b1b0: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62  = FALSE;.      b
b1c0: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
b1d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65     }.  }.  /* Re
b1e0: 6c 65 61 73 69 6e 67 20 61 20 72 65 73 65 72 76  leasing a reserv
b1f0: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73  ed lock */.  els
b200: 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
b210: 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
b220: 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 26 26  RESERVED_BYTE &&
b230: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
b240: 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  oUnlockLow == 1)
b250: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
b260: 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
b270: 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
b280: 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
b290: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
b2a0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
b2b0: 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45  Reserved = FALSE
b2c0: 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  ;.      bReturn 
b2d0: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
b2e0: 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52  }..  winceMutexR
b2f0: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
b300: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
b310: 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  bReturn;.}../*.*
b320: 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  * An implementat
b330: 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46  ion of the LockF
b340: 69 6c 65 45 78 28 29 20 41 50 49 20 6f 66 20 57  ileEx() API of W
b350: 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f  indows for CE.*/
b360: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
b370: 63 65 4c 6f 63 6b 46 69 6c 65 45 78 28 0a 20 20  ceLockFileEx(.  
b380: 48 41 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a  HANDLE *phFile,.
b390: 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 2c    DWORD dwFlags,
b3a0: 0a 20 20 44 57 4f 52 44 20 64 77 52 65 73 65 72  .  DWORD dwReser
b3b0: 76 65 64 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75  ved,.  DWORD nNu
b3c0: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
b3d0: 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  kLow,.  DWORD nN
b3e0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
b3f0: 63 6b 48 69 67 68 2c 0a 20 20 4c 50 4f 56 45 52  ckHigh,.  LPOVER
b400: 4c 41 50 50 45 44 20 6c 70 4f 76 65 72 6c 61 70  LAPPED lpOverlap
b410: 70 65 64 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ped.){.  UNUSED_
b420: 50 41 52 41 4d 45 54 45 52 28 64 77 52 65 73 65  PARAMETER(dwRese
b430: 72 76 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  rved);.  UNUSED_
b440: 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65  PARAMETER(nNumbe
b450: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69  rOfBytesToLockHi
b460: 67 68 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  gh);..  /* If th
b470: 65 20 63 61 6c 6c 65 72 20 77 61 6e 74 73 20 61  e caller wants a
b480: 20 73 68 61 72 65 64 20 72 65 61 64 20 6c 6f 63   shared read loc
b490: 6b 2c 20 66 6f 72 77 61 72 64 20 74 68 69 73 20  k, forward this 
b4a0: 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 77 69 6e  call.  ** to win
b4b0: 63 65 4c 6f 63 6b 46 69 6c 65 20 2a 2f 0a 20 20  ceLockFile */.  
b4c0: 69 66 20 28 6c 70 4f 76 65 72 6c 61 70 70 65 64  if (lpOverlapped
b4d0: 2d 3e 4f 66 66 73 65 74 20 3d 3d 20 28 44 57 4f  ->Offset == (DWO
b4e0: 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20  RD)SHARED_FIRST 
b4f0: 26 26 0a 20 20 20 20 20 20 64 77 46 6c 61 67 73  &&.      dwFlags
b500: 20 3d 3d 20 31 20 26 26 0a 20 20 20 20 20 20 6e   == 1 &&.      n
b510: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
b520: 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  ockLow == (DWORD
b530: 29 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20  )SHARED_SIZE){. 
b540: 20 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 4c     return winceL
b550: 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20  ockFile(phFile, 
b560: 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
b570: 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   1, 0);.  }.  re
b580: 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 2f 2a  turn FALSE;.}./*
b590: 0a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73  .** End of the s
b5a0: 70 65 63 69 61 6c 20 63 6f 64 65 20 66 6f 72 20  pecial code for 
b5b0: 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  wince.**********
b5c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b5d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b5e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b5f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b600: 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ***/.#endif /* S
b610: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a  QLITE_OS_WINCE *
b620: 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
b630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b670: 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 72  *.** The next gr
b680: 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  oup of routines 
b690: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f  implement the I/
b6a0: 4f 20 6d 65 74 68 6f 64 73 20 73 70 65 63 69 66  O methods specif
b6b0: 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 71  ied.** by the sq
b6c0: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
b6d0: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a   object..*******
b6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b720: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
b730: 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20 63  Some Microsoft c
b740: 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68  ompilers lack th
b750: 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a  is definition..*
b760: 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49  /.#ifndef INVALI
b770: 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
b780: 45 52 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41  ER.# define INVA
b790: 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
b7a0: 4e 54 45 52 20 28 28 44 57 4f 52 44 29 2d 31 29  NTER ((DWORD)-1)
b7b0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
b7c0: 6f 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ove the current 
b7d0: 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  position of the 
b7e0: 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 61 73 73  file handle pass
b7f0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
b800: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  .** argument to 
b810: 6f 66 66 73 65 74 20 69 4f 66 66 73 65 74 20 77  offset iOffset w
b820: 69 74 68 69 6e 20 74 68 65 20 66 69 6c 65 2e 20  ithin the file. 
b830: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  If successful, r
b840: 65 74 75 72 6e 20 30 2e 20 0a 2a 2a 20 4f 74 68  eturn 0. .** Oth
b850: 65 72 77 69 73 65 2c 20 73 65 74 20 70 46 69 6c  erwise, set pFil
b860: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 61 6e 64  e->lastErrno and
b870: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
b880: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b890: 73 65 65 6b 57 69 6e 46 69 6c 65 28 77 69 6e 46  seekWinFile(winF
b8a0: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69  ile *pFile, sqli
b8b0: 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 66 73 65  te3_int64 iOffse
b8c0: 74 29 7b 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72  t){.  LONG upper
b8d0: 42 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20  Bits;           
b8e0: 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69        /* Most si
b8f0: 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65  g. 32 bits of ne
b900: 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f  w offset */.  LO
b910: 4e 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20 20  NG lowerBits;   
b920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b930: 20 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20 62   Least sig. 32 b
b940: 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65  its of new offse
b950: 74 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 52  t */.  DWORD dwR
b960: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
b970: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
b980: 72 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46  returned by SetF
b990: 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a  ilePointer() */.
b9a0: 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
b9b0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
b9c0: 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
b9d0: 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72  ned by GetLastEr
b9e0: 72 6f 72 28 29 20 2a 2f 0a 0a 20 20 75 70 70 65  ror() */..  uppe
b9f0: 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28  rBits = (LONG)((
ba00: 69 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30  iOffset>>32) & 0
ba10: 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f  x7fffffff);.  lo
ba20: 77 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29  werBits = (LONG)
ba30: 28 69 4f 66 66 73 65 74 20 26 20 30 78 66 66 66  (iOffset & 0xfff
ba40: 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50  fffff);..  /* AP
ba50: 49 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75 63  I oddity: If suc
ba60: 63 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c 65  cessful, SetFile
ba70: 50 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72 6e  Pointer() return
ba80: 73 20 61 20 64 77 6f 72 64 20 0a 20 20 2a 2a 20  s a dword .  ** 
ba90: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c  containing the l
baa0: 6f 77 65 72 20 33 32 2d 62 69 74 73 20 6f 66 20  ower 32-bits of 
bab0: 74 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66  the new file-off
bac0: 73 65 74 2e 20 4f 72 2c 20 69 66 20 69 74 20 66  set. Or, if it f
bad0: 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65  ails,.  ** it re
bae0: 74 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45  turns INVALID_SE
baf0: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20  T_FILE_POINTER. 
bb00: 48 6f 77 65 76 65 72 20 61 63 63 6f 72 64 69 6e  However accordin
bb10: 67 20 74 6f 20 4d 53 44 4e 2c 20 0a 20 20 2a 2a  g to MSDN, .  **
bb20: 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c   INVALID_SET_FIL
bb30: 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c  E_POINTER may al
bb40: 73 6f 20 62 65 20 61 20 76 61 6c 69 64 20 6e 65  so be a valid ne
bb50: 77 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f 20  w offset. So to 
bb60: 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20  determine .  ** 
bb70: 77 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f 72  whether an error
bb80: 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f 63   has actually oc
bb90: 63 75 72 65 64 2c 20 69 74 20 69 73 20 61 6c 73  cured, it is als
bba0: 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 63  o necessary to c
bbb0: 61 6c 6c 20 0a 20 20 2a 2a 20 47 65 74 4c 61 73  all .  ** GetLas
bbc0: 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20  tError()..  */. 
bbd0: 20 64 77 52 65 74 20 3d 20 6f 73 53 65 74 46 69   dwRet = osSetFi
bbe0: 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d  lePointer(pFile-
bbf0: 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26  >h, lowerBits, &
bc00: 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f  upperBits, FILE_
bc10: 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 20 28  BEGIN);..  if( (
bc20: 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53  dwRet==INVALID_S
bc30: 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a  ET_FILE_POINTER.
bc40: 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45        && ((lastE
bc50: 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
bc60: 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52  Error())!=NO_ERR
bc70: 4f 52 29 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  OR)) ){.    pFil
bc80: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
bc90: 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69  astErrno;.    wi
bca0: 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
bcb0: 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69  _IOERR_SEEK, pFi
bcc0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 22 73 65 65              "see
bce0: 6b 57 69 6e 46 69 6c 65 22 2c 20 70 46 69 6c 65  kWinFile", pFile
bcf0: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65  ->zPath);.    re
bd00: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 72  turn 1;.  }..  r
bd10: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
bd20: 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
bd30: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65 70 6f  **.** It is repo
bd40: 72 74 65 64 20 74 68 61 74 20 61 6e 20 61 74 74  rted that an att
bd50: 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20 61 20  empt to close a 
bd60: 68 61 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d  handle might som
bd70: 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20  etimes.** fail. 
bd80: 20 54 68 69 73 20 69 73 20 61 20 76 65 72 79 20   This is a very 
bd90: 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72 65 73  unreasonable res
bda0: 75 6c 74 2c 20 62 75 74 20 57 69 6e 64 6f 77 73  ult, but Windows
bdb0: 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a   is notorious.**
bdc0: 20 66 6f 72 20 62 65 69 6e 67 20 75 6e 72 65 61   for being unrea
bdd0: 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f 20  sonable so I do 
bde0: 6e 6f 74 20 64 6f 75 62 74 20 74 68 61 74 20 69  not doubt that i
bdf0: 74 20 6d 69 67 68 74 20 68 61 70 70 65 6e 2e 20  t might happen. 
be00: 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65   If.** the close
be10: 20 66 61 69 6c 73 2c 20 77 65 20 70 61 75 73 65   fails, we pause
be20: 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73 65   for 100 millise
be30: 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 61 67  conds and try ag
be40: 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79  ain.  As.** many
be50: 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54   as MX_CLOSE_ATT
be60: 45 4d 50 54 20 61 74 74 65 6d 70 74 73 20 74 6f  EMPT attempts to
be70: 20 63 6c 6f 73 65 20 74 68 65 20 68 61 6e 64 6c   close the handl
be80: 65 20 61 72 65 20 6d 61 64 65 20 62 65 66 6f 72  e are made befor
be90: 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70 20 61  e.** giving up a
bea0: 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20  nd returning an 
beb0: 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  error..*/.#defin
bec0: 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  e MX_CLOSE_ATTEM
bed0: 50 54 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20  PT 3.static int 
bee0: 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  winClose(sqlite3
bef0: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e  _file *id){.  in
bf00: 74 20 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20  t rc, cnt = 0;. 
bf10: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
bf20: 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
bf30: 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
bf40: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46   );.  assert( pF
bf50: 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a  ile->pShm==0 );.
bf60: 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53    OSTRACE(("CLOS
bf70: 45 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E %d\n", pFile->
bf80: 68 29 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 72  h));.  do{.    r
bf90: 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  c = osCloseHandl
bfa0: 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20  e(pFile->h);.   
bfb0: 20 2f 2a 20 53 69 6d 75 6c 61 74 65 49 4f 45 72   /* SimulateIOEr
bfc0: 72 6f 72 28 20 72 63 3d 30 3b 20 63 6e 74 3d 4d  ror( rc=0; cnt=M
bfd0: 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 3b  X_CLOSE_ATTEMPT;
bfe0: 20 29 3b 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28   ); */.  }while(
bff0: 20 72 63 3d 3d 30 20 26 26 20 2b 2b 63 6e 74 20   rc==0 && ++cnt 
c000: 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  < MX_CLOSE_ATTEM
c010: 50 54 20 26 26 20 28 6f 73 53 6c 65 65 70 28 31  PT && (osSleep(1
c020: 30 30 29 2c 20 31 29 20 29 3b 0a 23 69 66 20 53  00), 1) );.#if S
c030: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23  QLITE_OS_WINCE.#
c040: 64 65 66 69 6e 65 20 57 49 4e 43 45 5f 44 45 4c  define WINCE_DEL
c050: 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33  ETION_ATTEMPTS 3
c060: 0a 20 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c  .  winceDestroyL
c070: 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  ock(pFile);.  if
c080: 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65  ( pFile->zDelete
c090: 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20 69  OnClose ){.    i
c0a0: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
c0b0: 77 68 69 6c 65 28 0a 20 20 20 20 20 20 20 20 20  while(.         
c0c0: 20 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28    osDeleteFileW(
c0d0: 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
c0e0: 43 6c 6f 73 65 29 3d 3d 30 0a 20 20 20 20 20 20  Close)==0.      
c0f0: 20 20 26 26 20 6f 73 47 65 74 46 69 6c 65 41 74    && osGetFileAt
c100: 74 72 69 62 75 74 65 73 57 28 70 46 69 6c 65 2d  tributesW(pFile-
c110: 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29  >zDeleteOnClose)
c120: 21 3d 30 78 66 66 66 66 66 66 66 66 20 0a 20 20  !=0xffffffff .  
c130: 20 20 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c        && cnt++ <
c140: 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f   WINCE_DELETION_
c150: 41 54 54 45 4d 50 54 53 0a 20 20 20 20 29 7b 0a  ATTEMPTS.    ){.
c160: 20 20 20 20 20 20 20 6f 73 53 6c 65 65 70 28 31         osSleep(1
c170: 30 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61 20  00);  /* Wait a 
c180: 6c 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74 72  little before tr
c190: 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20 20  ying again */.  
c1a0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
c1b0: 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65 6c  free(pFile->zDel
c1c0: 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d  eteOnClose);.  }
c1d0: 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43  .#endif.  OSTRAC
c1e0: 45 28 28 22 43 4c 4f 53 45 20 25 64 20 25 73 5c  E(("CLOSE %d %s\
c1f0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
c200: 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
c210: 64 22 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e  d"));.  OpenCoun
c220: 74 65 72 28 2d 31 29 3b 0a 20 20 72 65 74 75 72  ter(-1);.  retur
c230: 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  n rc ? SQLITE_OK
c240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 77  .            : w
c250: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
c260: 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 6f  E_IOERR_CLOSE, o
c270: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
c280: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c290: 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 43             "winC
c2a0: 6c 6f 73 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  lose", pFile->zP
c2b0: 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ath);.}../*.** R
c2c0: 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ead data from a 
c2d0: 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66  file into a buff
c2e0: 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  er.  Return SQLI
c2f0: 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20  TE_OK if all.** 
c300: 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20  bytes were read 
c310: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64  successfully and
c320: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66   SQLITE_IOERR if
c330: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
c340: 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  * wrong..*/.stat
c350: 69 63 20 69 6e 74 20 77 69 6e 52 65 61 64 28 0a  ic int winRead(.
c360: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
c370: 69 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  id,          /* 
c380: 46 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f  File to read fro
c390: 6d 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  m */.  void *pBu
c3a0: 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
c3b0: 20 20 2f 2a 20 57 72 69 74 65 20 63 6f 6e 74 65    /* Write conte
c3c0: 6e 74 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  nt into this buf
c3d0: 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74  fer */.  int amt
c3e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c3f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c400: 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
c410: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
c420: 34 20 6f 66 66 73 65 74 20 20 20 20 20 20 20 2f  4 offset       /
c430: 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20  * Begin reading 
c440: 61 74 20 74 68 69 73 20 6f 66 66 73 65 74 20 2a  at this offset *
c450: 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  /.){.  winFile *
c460: 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
c470: 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c 65 20 68  *)id;  /* file h
c480: 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57 4f 52 44  andle */.  DWORD
c490: 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20 20   nRead;         
c4a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c4b0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
c4c0: 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  tually read from
c4d0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
c4e0: 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20  Retry = 0;      
c4f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c500: 6d 62 65 72 20 6f 66 20 72 65 74 72 79 73 20 2a  mber of retrys *
c510: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  /..  assert( id!
c520: 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  =0 );.  Simulate
c530: 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
c540: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
c550: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52  );.  OSTRACE(("R
c560: 45 41 44 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e  EAD %d lock=%d\n
c570: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69  ", pFile->h, pFi
c580: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  le->locktype));.
c590: 0a 20 20 69 66 28 20 73 65 65 6b 57 69 6e 46 69  .  if( seekWinFi
c5a0: 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  le(pFile, offset
c5b0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
c5c0: 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d  SQLITE_FULL;.  }
c5d0: 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52 65 61  .  while( !osRea
c5e0: 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  dFile(pFile->h, 
c5f0: 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61  pBuf, amt, &nRea
c600: 64 2c 20 30 29 20 29 7b 0a 20 20 20 20 44 57 4f  d, 0) ){.    DWO
c610: 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
c620: 20 20 69 66 28 20 72 65 74 72 79 49 6f 65 72 72    if( retryIoerr
c630: 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45  (&nRetry, &lastE
c640: 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65  rrno) ) continue
c650: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  ;.    pFile->las
c660: 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
c670: 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  no;.    return w
c680: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
c690: 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c 20 70 46  E_IOERR_READ, pF
c6a0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
c6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
c6c0: 6e 52 65 61 64 22 2c 20 70 46 69 6c 65 2d 3e 7a  nRead", pFile->z
c6d0: 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 6c 6f 67  Path);.  }.  log
c6e0: 49 6f 65 72 72 28 6e 52 65 74 72 79 29 3b 0a 20  Ioerr(nRetry);. 
c6f0: 20 69 66 28 20 6e 52 65 61 64 3c 28 44 57 4f 52   if( nRead<(DWOR
c700: 44 29 61 6d 74 20 29 7b 0a 20 20 20 20 2f 2a 20  D)amt ){.    /* 
c710: 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20  Unread parts of 
c720: 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20  the buffer must 
c730: 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a  be zero-filled *
c740: 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28  /.    memset(&((
c750: 63 68 61 72 2a 29 70 42 75 66 29 5b 6e 52 65 61  char*)pBuf)[nRea
c760: 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52 65 61 64  d], 0, amt-nRead
c770: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
c780: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
c790: 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 72 65  _READ;.  }..  re
c7a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c7b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  }../*.** Write d
c7c0: 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65  ata from a buffe
c7d0: 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20  r into a file.  
c7e0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
c7f0: 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f   on success.** o
c800: 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
c810: 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75  or code on failu
c820: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
c830: 74 20 77 69 6e 57 72 69 74 65 28 0a 20 20 73 71  t winWrite(.  sq
c840: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
c850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c860: 20 46 69 6c 65 20 74 6f 20 77 72 69 74 65 20 69   File to write i
c870: 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  nto */.  const v
c880: 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
c890: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
c8a0: 62 79 74 65 73 20 74 6f 20 62 65 20 77 72 69 74  bytes to be writ
c8b0: 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74  ten */.  int amt
c8c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c8d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
c8e0: 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77  er of bytes to w
c8f0: 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rite */.  sqlite
c900: 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20  3_int64 offset  
c910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
c920: 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  set into the fil
c930: 65 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69  e to begin writi
c940: 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ng at */.){.  in
c950: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
c960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c970: 20 54 72 75 65 20 69 66 20 65 72 72 6f 72 20 68   True if error h
c980: 61 73 20 6f 63 63 75 72 65 64 2c 20 65 6c 73 65  as occured, else
c990: 20 66 61 6c 73 65 20 2a 2f 0a 20 20 77 69 6e 46   false */.  winF
c9a0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
c9b0: 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46  nFile*)id;  /* F
c9c0: 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ile handle */.  
c9d0: 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20  int nRetry = 0; 
c9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74  /* Number of ret
ca00: 72 69 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ries */..  asser
ca10: 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73  t( amt>0 );.  as
ca20: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
ca30: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
ca40: 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
ca50: 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a 20 20 53  OERR_WRITE);.  S
ca60: 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
ca70: 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
ca80: 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54  TE_FULL);..  OST
ca90: 52 41 43 45 28 28 22 57 52 49 54 45 20 25 64 20  RACE(("WRITE %d 
caa0: 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c  lock=%d\n", pFil
cab0: 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
cac0: 6b 74 79 70 65 29 29 3b 0a 0a 20 20 72 63 20 3d  ktype));..  rc =
cad0: 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46 69   seekWinFile(pFi
cae0: 6c 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69  le, offset);.  i
caf0: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
cb00: 75 38 20 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a  u8 *aRem = (u8 *
cb10: 29 70 42 75 66 3b 20 20 20 20 20 20 20 20 2f 2a  )pBuf;        /*
cb20: 20 44 61 74 61 20 79 65 74 20 74 6f 20 62 65 20   Data yet to be 
cb30: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69  written */.    i
cb40: 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20  nt nRem = amt;  
cb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cb60: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
cb70: 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65  yet to be writte
cb80: 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e  n */.    DWORD n
cb90: 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
cba0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
cbb0: 77 72 69 74 74 65 6e 20 62 79 20 65 61 63 68 20  written by each 
cbc0: 57 72 69 74 65 46 69 6c 65 28 29 20 63 61 6c 6c  WriteFile() call
cbd0: 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6c 61   */.    DWORD la
cbe0: 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52  stErrno = NO_ERR
cbf0: 4f 52 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20 72  OR;   /* Value r
cc00: 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61  eturned by GetLa
cc10: 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20 20  stError() */..  
cc20: 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20    while( nRem>0 
cc30: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73  ){.      if( !os
cc40: 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d  WriteFile(pFile-
cc50: 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20  >h, aRem, nRem, 
cc60: 26 6e 57 72 69 74 65 2c 20 30 29 20 29 7b 0a 20  &nWrite, 0) ){. 
cc70: 20 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79         if( retry
cc80: 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26  Ioerr(&nRetry, &
cc90: 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e  lastErrno) ) con
cca0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 62  tinue;.        b
ccb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
ccc0: 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 3c 3d      if( nWrite<=
ccd0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
cce0: 20 61 52 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b   aRem += nWrite;
ccf0: 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e  .      nRem -= n
cd00: 57 72 69 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Write;.    }.   
cd10: 20 69 66 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20   if( nRem>0 ){. 
cd20: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
cd30: 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
cd40: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  o;.      rc = 1;
cd50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
cd60: 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20  ( rc ){.    if( 
cd70: 20 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45    ( pFile->lastE
cd80: 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44  rrno==ERROR_HAND
cd90: 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20  LE_DISK_FULL ). 
cda0: 20 20 20 20 20 20 7c 7c 20 28 20 70 46 69 6c 65        || ( pFile
cdb0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  ->lastErrno==ERR
cdc0: 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b  OR_DISK_FULL )){
cdd0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
cde0: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d  LITE_FULL;.    }
cdf0: 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
ce00: 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
ce10: 4f 45 52 52 5f 57 52 49 54 45 2c 20 70 46 69 6c  OERR_WRITE, pFil
ce20: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
ce30: 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 57             "winW
ce40: 72 69 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  rite", pFile->zP
ce50: 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ath);.  }else{. 
ce60: 20 20 20 6c 6f 67 49 6f 65 72 72 28 6e 52 65 74     logIoerr(nRet
ce70: 72 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ry);.  }.  retur
ce80: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
ce90: 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61  /*.** Truncate a
cea0: 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61  n open file to a
ceb0: 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a   specified size.
cec0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
ced0: 6e 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65  nTruncate(sqlite
cee0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69  3_file *id, sqli
cef0: 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29  te3_int64 nByte)
cf00: 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
cf10: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
cf20: 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64  d;  /* File hand
cf30: 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  le object */.  i
cf40: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
cf50: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
cf60: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 6f  * Return code fo
cf70: 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
cf80: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  */..  assert( pF
cf90: 69 6c 65 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  ile );..  OSTRAC
cfa0: 45 28 28 22 54 52 55 4e 43 41 54 45 20 25 64 20  E(("TRUNCATE %d 
cfb0: 25 6c 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %lld\n", pFile->
cfc0: 68 2c 20 6e 42 79 74 65 29 29 3b 0a 20 20 53 69  h, nByte));.  Si
cfd0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
cfe0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
cff0: 52 5f 54 52 55 4e 43 41 54 45 29 3b 0a 0a 20 20  R_TRUNCATE);..  
d000: 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68  /* If the user h
d010: 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20  as configured a 
d020: 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74  chunk-size for t
d030: 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61  his file, trunca
d040: 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65  te the.  ** file
d050: 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73   so that it cons
d060: 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67  ists of an integ
d070: 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75  er number of chu
d080: 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20  nks (i.e. the.  
d090: 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73  ** actual file s
d0a0: 69 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f 70  ize after the op
d0b0: 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c  eration may be l
d0c0: 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 72  arger than the r
d0d0: 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69  equested.  ** si
d0e0: 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ze)..  */.  if( 
d0f0: 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30  pFile->szChunk>0
d100: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
d110: 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d  ((nByte + pFile-
d120: 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46  >szChunk - 1)/pF
d130: 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20  ile->szChunk) * 
d140: 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a  pFile->szChunk;.
d150: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 45 6e 64    }..  /* SetEnd
d160: 4f 66 46 69 6c 65 28 29 20 72 65 74 75 72 6e 73  OfFile() returns
d170: 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 73   non-zero when s
d180: 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 7a 65  uccessful, or ze
d190: 72 6f 20 77 68 65 6e 20 69 74 20 66 61 69 6c 73  ro when it fails
d1a0: 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 65 6b 57  . */.  if( seekW
d1b0: 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42  inFile(pFile, nB
d1c0: 79 74 65 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  yte) ){.    rc =
d1d0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
d1e0: 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
d1f0: 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  TE, pFile->lastE
d200: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
d210: 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65 31     "winTruncate1
d220: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
d230: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 30 3d  ;.  }else if( 0=
d240: 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 28  =osSetEndOfFile(
d250: 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20 20  pFile->h) ){.   
d260: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
d270: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
d280: 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 77  or();.    rc = w
d290: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
d2a0: 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
d2b0: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
d2c0: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
d2d0: 20 22 77 69 6e 54 72 75 6e 63 61 74 65 32 22 2c   "winTruncate2",
d2e0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
d2f0: 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
d300: 22 54 52 55 4e 43 41 54 45 20 25 64 20 25 6c 6c  "TRUNCATE %d %ll
d310: 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d %s\n", pFile->
d320: 68 2c 20 6e 42 79 74 65 2c 20 72 63 20 3f 20 22  h, nByte, rc ? "
d330: 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29  failed" : "ok"))
d340: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
d350: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
d360: 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  TEST./*.** Count
d370: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
d380: 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72  ullsyncs and nor
d390: 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73  mal syncs.  This
d3a0: 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
d3b0: 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61  .** that syncs a
d3c0: 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65  nd fullsyncs are
d3d0: 20 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68 65   occuring at the
d3e0: 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f   right times..*/
d3f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e  .int sqlite3_syn
d400: 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74  c_count = 0;.int
d410: 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
d420: 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  c_count = 0;.#en
d430: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  dif../*.** Make 
d440: 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20  sure all writes 
d450: 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  to a particular 
d460: 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74  file are committ
d470: 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73  ed to disk..*/.s
d480: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 79 6e  tatic int winSyn
d490: 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  c(sqlite3_file *
d4a0: 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  id, int flags){.
d4b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e  #ifndef SQLITE_N
d4c0: 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a  O_SYNC.  /*.  **
d4d0: 20 55 73 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20   Used only when 
d4e0: 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69  SQLITE_NO_SYNC i
d4f0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e 0a 20  s not defined.. 
d500: 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a    */.  BOOL rc;.
d510: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
d520: 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 21  ned(NDEBUG) || !
d530: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e  defined(SQLITE_N
d540: 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c 0a 20 20 20  O_SYNC) || \.   
d550: 20 28 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   (defined(SQLITE
d560: 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65  _TEST) && define
d570: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 29  d(SQLITE_DEBUG))
d580: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20  .  /*.  ** Used 
d590: 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  when SQLITE_NO_S
d5a0: 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  YNC is not defin
d5b0: 65 64 20 61 6e 64 20 62 79 20 74 68 65 20 61 73  ed and by the as
d5c0: 73 65 72 74 28 29 20 61 6e 64 2f 6f 72 0a 20 20  sert() and/or.  
d5d0: 2a 2a 20 4f 53 54 52 41 43 45 28 29 20 6d 61 63  ** OSTRACE() mac
d5e0: 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20 77 69 6e  ros..   */.  win
d5f0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
d600: 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 23 65 6c 73  inFile*)id;.#els
d610: 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
d620: 45 54 45 52 28 69 64 29 3b 0a 23 65 6e 64 69 66  ETER(id);.#endif
d630: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
d640: 65 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20  e );.  /* Check 
d650: 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49  that one of SQLI
d660: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  TE_SYNC_NORMAL o
d670: 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65  r FULL was passe
d680: 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66  d */.  assert((f
d690: 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
d6a0: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20  TE_SYNC_NORMAL. 
d6b0: 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30       || (flags&0
d6c0: 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
d6d0: 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 4f  C_FULL.  );..  O
d6e0: 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 25 64  STRACE(("SYNC %d
d6f0: 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69   lock=%d\n", pFi
d700: 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
d710: 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20  cktype));..  /* 
d720: 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74  Unix cannot, but
d730: 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61   some systems ma
d740: 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
d750: 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20  FULL from here. 
d760: 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69  This.  ** line i
d770: 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64  s to test that d
d780: 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74  oing so does not
d790: 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c   cause any probl
d7a0: 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ems..  */.  Simu
d7b0: 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
d7c0: 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
d7d0: 5f 46 55 4c 4c 20 29 3b 0a 0a 23 69 66 6e 64 65  _FULL );..#ifnde
d7e0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
d7f0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
d800: 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65 0a 20  (flags);.#else. 
d810: 20 69 66 28 20 28 66 6c 61 67 73 26 30 78 30 46   if( (flags&0x0F
d820: 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
d830: 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ULL ){.    sqlit
d840: 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
d850: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  t++;.  }.  sqlit
d860: 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  e3_sync_count++;
d870: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
d880: 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   we compiled wit
d890: 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f  h the SQLITE_NO_
d8a0: 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20  SYNC flag, then 
d8b0: 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a  syncing is a.  *
d8c0: 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66  * no-op.  */.#if
d8d0: 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
d8e0: 4e 43 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  NC.  return SQLI
d8f0: 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 72  TE_OK;.#else.  r
d900: 63 20 3d 20 6f 73 46 6c 75 73 68 46 69 6c 65 42  c = osFlushFileB
d910: 75 66 66 65 72 73 28 70 46 69 6c 65 2d 3e 68 29  uffers(pFile->h)
d920: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
d930: 72 6f 72 28 20 72 63 3d 46 41 4c 53 45 20 29 3b  ror( rc=FALSE );
d940: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
d950: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d960: 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
d970: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
d980: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
d990: 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  r();.    return 
d9a0: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
d9b0: 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20  TE_IOERR_FSYNC, 
d9c0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
d9d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
d9e0: 77 69 6e 53 79 6e 63 22 2c 20 70 46 69 6c 65 2d  winSync", pFile-
d9f0: 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 65 6e  >zPath);.  }.#en
da00: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  dif.}../*.** Det
da10: 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65  ermine the curre
da20: 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c  nt size of a fil
da30: 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74  e in bytes.*/.st
da40: 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65  atic int winFile
da50: 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
da60: 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69  e *id, sqlite3_i
da70: 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20  nt64 *pSize){.  
da80: 44 57 4f 52 44 20 75 70 70 65 72 42 69 74 73 3b  DWORD upperBits;
da90: 0a 20 20 44 57 4f 52 44 20 6c 6f 77 65 72 42 69  .  DWORD lowerBi
daa0: 74 73 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  ts;.  winFile *p
dab0: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
dac0: 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  )id;.  DWORD las
dad0: 74 45 72 72 6e 6f 3b 0a 0a 20 20 61 73 73 65 72  tErrno;..  asser
dae0: 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53 69  t( id!=0 );.  Si
daf0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
db00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
db10: 52 5f 46 53 54 41 54 29 3b 0a 20 20 6c 6f 77 65  R_FSTAT);.  lowe
db20: 72 42 69 74 73 20 3d 20 6f 73 47 65 74 46 69 6c  rBits = osGetFil
db30: 65 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20  eSize(pFile->h, 
db40: 26 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20 69  &upperBits);.  i
db50: 66 28 20 20 20 28 6c 6f 77 65 72 42 69 74 73 20  f(   (lowerBits 
db60: 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  == INVALID_FILE_
db70: 53 49 5a 45 29 0a 20 20 20 20 20 26 26 20 28 28  SIZE).     && ((
db80: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
db90: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e  tLastError())!=N
dba0: 4f 5f 45 52 52 4f 52 29 20 29 0a 20 20 7b 0a 20  O_ERROR) ).  {. 
dbb0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
dbc0: 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
dbd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
dbe0: 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
dbf0: 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c  OERR_FSTAT, pFil
dc00: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
dc10: 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
dc20: 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d  ileSize", pFile-
dc30: 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 2a  >zPath);.  }.  *
dc40: 70 53 69 7a 65 20 3d 20 28 28 28 73 71 6c 69 74  pSize = (((sqlit
dc50: 65 33 5f 69 6e 74 36 34 29 75 70 70 65 72 42 69  e3_int64)upperBi
dc60: 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72  ts)<<32) + lower
dc70: 42 69 74 73 3b 0a 20 20 72 65 74 75 72 6e 20 53  Bits;.  return S
dc80: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
dc90: 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ** LOCKFILE_FAIL
dca0: 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 69 73 20  _IMMEDIATELY is 
dcb0: 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d  undefined on som
dcc0: 65 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  e Windows system
dcd0: 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f  s..*/.#ifndef LO
dce0: 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
dcf0: 44 49 41 54 45 4c 59 0a 23 20 64 65 66 69 6e 65  DIATELY.# define
dd00: 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
dd10: 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a 23 65 6e  MMEDIATELY 1.#en
dd20: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  dif../*.** Acqui
dd30: 72 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b  re a reader lock
dd40: 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 41  ..** Different A
dd50: 50 49 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  PI routines are 
dd60: 63 61 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e 67  called depending
dd70: 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
dd80: 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73 20 57 69  ot this.** is Wi
dd90: 6e 39 78 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f  n9x or WinNT..*/
dda0: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 52  .static int getR
ddb0: 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20  eadLock(winFile 
ddc0: 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72  *pFile){.  int r
ddd0: 65 73 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29  es;.  if( isNT()
dde0: 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50   ){.    OVERLAPP
ddf0: 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6f 76 6c  ED ovlp;.    ovl
de00: 70 2e 4f 66 66 73 65 74 20 3d 20 53 48 41 52 45  p.Offset = SHARE
de10: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6f 76 6c  D_FIRST;.    ovl
de20: 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 30  p.OffsetHigh = 0
de30: 3b 0a 20 20 20 20 6f 76 6c 70 2e 68 45 76 65 6e  ;.    ovlp.hEven
de40: 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 73 20 3d  t = 0;.    res =
de50: 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 28 70 46   osLockFileEx(pF
de60: 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 46 49 4c 45  ile->h, LOCKFILE
de70: 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
de80: 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y,.             
de90: 20 20 20 20 20 20 20 20 20 20 30 2c 20 53 48 41            0, SHA
dea0: 52 45 44 5f 53 49 5a 45 2c 20 30 2c 20 26 6f 76  RED_SIZE, 0, &ov
deb0: 6c 70 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69  lp);./* isNT() i
dec0: 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53  s 1 if SQLITE_OS
ded0: 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68  _WINCE==1, so th
dee0: 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72  is else is never
def0: 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2f 0a 23   executed. .*/.#
df00: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
df10: 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20  CE==0.  }else{. 
df20: 20 20 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73     int lk;.    s
df30: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
df40: 73 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c  s(sizeof(lk), &l
df50: 6b 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73  k);.    pFile->s
df60: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20  haredLockByte = 
df70: 28 73 68 6f 72 74 29 28 28 6c 6b 20 26 20 30 78  (short)((lk & 0x
df80: 37 66 66 66 66 66 66 66 29 25 28 53 48 41 52 45  7fffffff)%(SHARE
df90: 44 5f 53 49 5a 45 20 2d 20 31 29 29 3b 0a 20 20  D_SIZE - 1));.  
dfa0: 20 20 72 65 73 20 3d 20 6f 73 4c 6f 63 6b 46 69    res = osLockFi
dfb0: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  le(pFile->h, SHA
dfc0: 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d  RED_FIRST+pFile-
dfd0: 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c  >sharedLockByte,
dfe0: 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65 6e 64 69   0, 1, 0);.#endi
dff0: 66 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 73 20  f.  }.  if( res 
e000: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  == 0 ){.    pFil
e010: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
e020: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
e030: 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20  .    /* No need 
e040: 74 6f 20 6c 6f 67 20 61 20 66 61 69 6c 75 72 65  to log a failure
e050: 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a   to lock */.  }.
e060: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
e070: 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 72 65  ./*.** Undo a re
e080: 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63  adlock.*/.static
e090: 20 69 6e 74 20 75 6e 6c 6f 63 6b 52 65 61 64 4c   int unlockReadL
e0a0: 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ock(winFile *pFi
e0b0: 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  le){.  int res;.
e0c0: 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
e0d0: 6f 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  o;.  if( isNT() 
e0e0: 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 6f 73 55  ){.    res = osU
e0f0: 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d  nlockFile(pFile-
e100: 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
e110: 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  , 0, SHARED_SIZE
e120: 2c 20 30 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20  , 0);./* isNT() 
e130: 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f  is 1 if SQLITE_O
e140: 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74  S_WINCE==1, so t
e150: 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65  his else is neve
e160: 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2f 0a  r executed. .*/.
e170: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
e180: 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a  NCE==0.  }else{.
e190: 20 20 20 20 72 65 73 20 3d 20 6f 73 55 6e 6c 6f      res = osUnlo
e1a0: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
e1b0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20   SHARED_FIRST + 
e1c0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
e1d0: 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b  kByte, 0, 1, 0);
e1e0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66  .#endif.  }.  if
e1f0: 28 20 72 65 73 3d 3d 30 20 26 26 20 28 28 6c 61  ( res==0 && ((la
e200: 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
e210: 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52  astError())!=ERR
e220: 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29 20 29  OR_NOT_LOCKED) )
e230: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
e240: 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
e250: 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  no;.    winLogEr
e260: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
e270: 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65 2d 3e  _UNLOCK, pFile->
e280: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
e290: 20 20 20 20 20 20 20 20 22 75 6e 6c 6f 63 6b 52          "unlockR
e2a0: 65 61 64 4c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d  eadLock", pFile-
e2b0: 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72  >zPath);.  }.  r
e2c0: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
e2d0: 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
e2e0: 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
e2f0: 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
e300: 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20  ameter locktype 
e310: 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
e320: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
e330: 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
e340: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
e350: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
e360: 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
e370: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
e380: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
e390: 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
e3a0: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
e3b0: 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
e3c0: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
e3d0: 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
e3e0: 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
e3f0: 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
e400: 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
e410: 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
e420: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
e430: 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
e440: 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
e450: 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
e460: 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
e470: 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
e480: 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
e490: 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
e4a0: 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
e4b0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
e4c0: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
e4d0: 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
e4e0: 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
e4f0: 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
e500: 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
e510: 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
e520: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
e530: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
e540: 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
e550: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
e560: 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
e570: 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
e580: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
e590: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
e5a0: 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54  rease a lock.  T
e5b0: 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72  he winUnlock() r
e5c0: 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73  outine.** erases
e5d0: 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e   all locks at on
e5e0: 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 75  ce and returns u
e5f0: 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  s immediately to
e600: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30   locking level 0
e610: 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70  ..** It is not p
e620: 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72  ossible to lower
e630: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
e640: 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20 61  el one step at a
e650: 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d   time.  You.** m
e660: 75 73 74 20 67 6f 20 73 74 72 61 69 67 68 74 20  ust go straight 
e670: 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  to locking level
e680: 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
e690: 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74 65  t winLock(sqlite
e6a0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
e6b0: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
e6c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e6d0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
e6e0: 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69  de from subrouti
e6f0: 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  nes */.  int res
e700: 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
e710: 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 20 57  /* Result of a W
e720: 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c  indows lock call
e730: 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63   */.  int newLoc
e740: 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20  ktype;       /* 
e750: 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  Set pFile->lockt
e760: 79 70 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ype to this valu
e770: 65 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  e before exiting
e780: 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e   */.  int gotPen
e790: 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20  dingLock = 0;/* 
e7a0: 54 72 75 65 20 69 66 20 77 65 20 61 63 71 75 69  True if we acqui
e7b0: 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  red a PENDING lo
e7c0: 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a  ck this time */.
e7d0: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
e7e0: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
e7f0: 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
e800: 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a  no = NO_ERROR;..
e810: 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
e820: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
e830: 4f 43 4b 20 25 64 20 25 64 20 77 61 73 20 25 64  OCK %d %d was %d
e840: 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  (%d)\n",.       
e850: 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f      pFile->h, lo
e860: 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 6c  cktype, pFile->l
e870: 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e  ocktype, pFile->
e880: 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 29 29  sharedLockByte))
e890: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
e8a0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f   is already a lo
e8b0: 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ck of this type 
e8c0: 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74  or more restrict
e8d0: 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ive on the.  ** 
e8e0: 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69  OsFile, do nothi
e8f0: 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68  ng. Don't use th
e900: 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  e end_lock: exit
e910: 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 73   path, as.  ** s
e920: 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74  qlite3OsEnterMut
e930: 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
e940: 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
e950: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
e960: 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70  ocktype>=locktyp
e970: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
e980: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
e990: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
e9a0: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
e9b0: 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20  nce is correct. 
e9c0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
e9d0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e  ile->locktype!=N
e9e0: 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79  O_LOCK || lockty
e9f0: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
ea00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
ea10: 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c  ktype!=PENDING_L
ea20: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
ea30: 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52   locktype!=RESER
ea40: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
ea50: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  e->locktype==SHA
ea60: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  RED_LOCK );..  /
ea70: 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e 44 49  * Lock the PENDI
ea80: 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 66 20  NG_LOCK byte if 
ea90: 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71 75 69  we need to acqui
eaa0: 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  re a PENDING loc
eab0: 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48 41 52  k or.  ** a SHAR
eac0: 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77 65 20  ED lock.  If we 
ead0: 61 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20  are acquiring a 
eae0: 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
eaf0: 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f 66 0a   acquisition of.
eb00: 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49 4e 47    ** the PENDING
eb10: 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20 74 65  _LOCK byte is te
eb20: 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  mporary..  */.  
eb30: 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 70 46  newLocktype = pF
eb40: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  ile->locktype;. 
eb50: 20 69 66 28 20 20 20 28 70 46 69 6c 65 2d 3e 6c   if(   (pFile->l
eb60: 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
eb70: 29 0a 20 20 20 20 20 7c 7c 20 28 20 20 20 28 6c  ).     || (   (l
eb80: 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
eb90: 56 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20  VE_LOCK).       
eba0: 20 20 26 26 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    && (pFile->loc
ebb0: 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f  ktype==RESERVED_
ebc0: 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20  LOCK)).  ){.    
ebd0: 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20 20 20  int cnt = 3;.   
ebe0: 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20   while( cnt-->0 
ebf0: 26 26 20 28 72 65 73 20 3d 20 6f 73 4c 6f 63 6b  && (res = osLock
ec00: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50  File(pFile->h, P
ec10: 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20  ENDING_BYTE, 0, 
ec20: 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20  1, 0))==0 ){.   
ec30: 20 20 20 2f 2a 20 54 72 79 20 33 20 74 69 6d 65     /* Try 3 time
ec40: 73 20 74 6f 20 67 65 74 20 74 68 65 20 70 65 6e  s to get the pen
ec50: 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68 69 73  ding lock.  This
ec60: 20 69 73 20 6e 65 65 64 65 64 20 74 6f 20 77 6f   is needed to wo
ec70: 72 6b 0a 20 20 20 20 20 20 2a 2a 20 61 72 6f 75  rk.      ** arou
ec80: 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63 61 75 73  nd problems caus
ec90: 65 64 20 62 79 20 69 6e 64 65 78 69 6e 67 20 61  ed by indexing a
eca0: 6e 64 2f 6f 72 20 61 6e 74 69 2d 76 69 72 75 73  nd/or anti-virus
ecb0: 20 73 6f 66 74 77 61 72 65 20 6f 6e 0a 20 20 20   software on.   
ecc0: 20 20 20 2a 2a 20 57 69 6e 64 6f 77 73 20 73 79     ** Windows sy
ecd0: 73 74 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2a 20  stems..      ** 
ece0: 49 66 20 79 6f 75 20 61 72 65 20 75 73 69 6e 67  If you are using
ecf0: 20 74 68 69 73 20 63 6f 64 65 20 61 73 20 61 20   this code as a 
ed00: 6d 6f 64 65 6c 20 66 6f 72 20 61 6c 74 65 72 6e  model for altern
ed10: 61 74 69 76 65 20 56 46 53 65 73 2c 20 64 6f 20  ative VFSes, do 
ed20: 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70  not.      ** cop
ed30: 79 20 74 68 69 73 20 72 65 74 72 79 20 6c 6f 67  y this retry log
ed40: 69 63 2e 20 20 49 74 20 69 73 20 61 20 68 61 63  ic.  It is a hac
ed50: 6b 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 57  k intended for W
ed60: 69 6e 64 6f 77 73 20 6f 6e 6c 79 2e 0a 20 20 20  indows only..   
ed70: 20 20 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52     */.      OSTR
ed80: 41 43 45 28 28 22 63 6f 75 6c 64 20 6e 6f 74 20  ACE(("could not 
ed90: 67 65 74 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  get a PENDING lo
eda0: 63 6b 2e 20 63 6e 74 3d 25 64 5c 6e 22 2c 20 63  ck. cnt=%d\n", c
edb0: 6e 74 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nt));.      if( 
edc0: 63 6e 74 20 29 20 6f 73 53 6c 65 65 70 28 31 29  cnt ) osSleep(1)
edd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50  ;.    }.    gotP
ede0: 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73  endingLock = res
edf0: 3b 0a 20 20 20 20 69 66 28 20 21 72 65 73 20 29  ;.    if( !res )
ee00: 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
ee10: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
ee20: 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  or();.    }.  }.
ee30: 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
ee40: 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f  shared lock.  */
ee50: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
ee60: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
ee70: 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72  res ){.    asser
ee80: 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
ee90: 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20  pe==NO_LOCK );. 
eea0: 20 20 20 72 65 73 20 3d 20 67 65 74 52 65 61 64     res = getRead
eeb0: 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20  Lock(pFile);.   
eec0: 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
eed0: 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
eee0: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
eef0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61   }else{.      la
ef00: 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
ef10: 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
ef20: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75  }.  }..  /* Acqu
ef30: 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c  ire a RESERVED l
ef40: 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
ef50: 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45  ocktype==RESERVE
ef60: 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  D_LOCK && res ){
ef70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
ef80: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  le->locktype==SH
ef90: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
efa0: 20 72 65 73 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c   res = osLockFil
efb0: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45  e(pFile->h, RESE
efc0: 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
efd0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73   0);.    if( res
efe0: 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
eff0: 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56 45 44  ktype = RESERVED
f000: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
f010: 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
f020: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
f030: 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  or();.    }.  }.
f040: 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
f050: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a  PENDING lock.  *
f060: 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
f070: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
f080: 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 6e   && res ){.    n
f090: 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e  ewLocktype = PEN
f0a0: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67  DING_LOCK;.    g
f0b0: 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
f0c0: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71  0;.  }..  /* Acq
f0d0: 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
f0e0: 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  E lock.  */.  if
f0f0: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  ( locktype==EXCL
f100: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65  USIVE_LOCK && re
f110: 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  s ){.    assert(
f120: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
f130: 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
f140: 0a 20 20 20 20 72 65 73 20 3d 20 75 6e 6c 6f 63  .    res = unloc
f150: 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  kReadLock(pFile)
f160: 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
f170: 75 6e 72 65 61 64 6c 6f 63 6b 20 3d 20 25 64 5c  unreadlock = %d\
f180: 6e 22 2c 20 72 65 73 29 29 3b 0a 20 20 20 20 72  n", res));.    r
f190: 65 73 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65 28  es = osLockFile(
f1a0: 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
f1b0: 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45  _FIRST, 0, SHARE
f1c0: 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20  D_SIZE, 0);.    
f1d0: 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
f1e0: 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45   newLocktype = E
f1f0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20  XCLUSIVE_LOCK;. 
f200: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f210: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
f220: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
f230: 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 65 72      OSTRACE(("er
f240: 72 6f 72 2d 63 6f 64 65 20 3d 20 25 64 5c 6e 22  ror-code = %d\n"
f250: 2c 20 6c 61 73 74 45 72 72 6e 6f 29 29 3b 0a 20  , lastErrno));. 
f260: 20 20 20 20 20 67 65 74 52 65 61 64 4c 6f 63 6b       getReadLock
f270: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
f280: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61   }..  /* If we a
f290: 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e  re holding a PEN
f2a0: 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f  DING lock that o
f2b0: 75 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61  ught to be relea
f2c0: 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72  sed, then.  ** r
f2d0: 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20  elease it now.. 
f2e0: 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e   */.  if( gotPen
f2f0: 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b  dingLock && lock
f300: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
f310: 4b 20 29 7b 0a 20 20 20 20 6f 73 55 6e 6c 6f 63  K ){.    osUnloc
f320: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
f330: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c  PENDING_BYTE, 0,
f340: 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f   1, 0);.  }..  /
f350: 2a 20 55 70 64 61 74 65 20 74 68 65 20 73 74 61  * Update the sta
f360: 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68  te of the lock h
f370: 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66  as held in the f
f380: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
f390: 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  hen.  ** return 
f3a0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
f3b0: 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a  result code..  *
f3c0: 2f 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20  /.  if( res ){. 
f3d0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
f3e0: 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
f3f0: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 46  OSTRACE(("LOCK F
f400: 41 49 4c 45 44 20 25 64 20 74 72 79 69 6e 67 20  AILED %d trying 
f410: 66 6f 72 20 25 64 20 62 75 74 20 67 6f 74 20 25  for %d but got %
f420: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  d\n", pFile->h,.
f430: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74             lockt
f440: 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65  ype, newLocktype
f450: 29 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ));.    pFile->l
f460: 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
f470: 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 53  rrno;.    rc = S
f480: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
f490: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
f4a0: 65 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74  e = (u8)newLockt
f4b0: 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ype;.  return rc
f4c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
f4d0: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
f4e0: 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
f4f0: 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
f500: 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
f510: 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
f520: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
f530: 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
f540: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72   lock is held, r
f550: 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
f560: 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65 72  o, otherwise zer
f570: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
f580: 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65   winCheckReserve
f590: 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
f5a0: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
f5b0: 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  sOut){.  int rc;
f5c0: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
f5d0: 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
f5e0: 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
f5f0: 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
f600: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
f610: 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
f620: 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
f630: 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
f640: 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52  >locktype>=RESER
f650: 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  VED_LOCK ){.    
f660: 72 63 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52  rc = 1;.    OSTR
f670: 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
f680: 43 4b 20 25 64 20 25 64 20 28 6c 6f 63 61 6c 29  CK %d %d (local)
f690: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
f6a0: 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  c));.  }else{.  
f6b0: 20 20 72 63 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c    rc = osLockFil
f6c0: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45  e(pFile->h, RESE
f6d0: 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
f6e0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
f6f0: 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 6f 63  ){.      osUnloc
f700: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
f710: 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
f720: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 0);.    }. 
f730: 20 20 20 72 63 20 3d 20 21 72 63 3b 0a 20 20 20     rc = !rc;.   
f740: 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
f750: 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 72  WR-LOCK %d %d (r
f760: 65 6d 6f 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65  emote)\n", pFile
f770: 2d 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d 0a 20  ->h, rc));.  }. 
f780: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a   *pResOut = rc;.
f790: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f7a0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  OK;.}../*.** Low
f7b0: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
f7c0: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
f7d0: 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f  criptor id to lo
f7e0: 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70  cktype.  locktyp
f7f0: 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  e.** must be eit
f800: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
f810: 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
f820: 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
f830: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
f840: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
f850: 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
f860: 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
f870: 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
f880: 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
f890: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
f8a0: 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f  .** It is not po
f8b0: 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20  ssible for this 
f8c0: 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c 20  routine to fail 
f8d0: 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
f8e0: 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f  gument.** is NO_
f8f0: 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 73 65  LOCK.  If the se
f900: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
f910: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65   SHARED_LOCK the
f920: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
f930: 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 53  * might return S
f940: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a  QLITE_IOERR;.*/.
f950: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e  static int winUn
f960: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
f970: 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
f980: 79 70 65 29 7b 0a 20 20 69 6e 74 20 74 79 70 65  ype){.  int type
f990: 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  ;.  winFile *pFi
f9a0: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
f9b0: 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
f9c0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
f9d0: 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20  t( pFile!=0 );. 
f9e0: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
f9f0: 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e<=SHARED_LOCK )
fa00: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
fa10: 4c 4f 43 4b 20 25 64 20 74 6f 20 25 64 20 77 61  LOCK %d to %d wa
fa20: 73 20 25 64 28 25 64 29 5c 6e 22 2c 20 70 46 69  s %d(%d)\n", pFi
fa30: 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c  le->h, locktype,
fa40: 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
fa50: 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c  ->locktype, pFil
fa60: 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e->sharedLockByt
fa70: 65 29 29 3b 0a 20 20 74 79 70 65 20 3d 20 70 46  e));.  type = pF
fa80: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  ile->locktype;. 
fa90: 20 69 66 28 20 74 79 70 65 3e 3d 45 58 43 4c 55   if( type>=EXCLU
faa0: 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
fab0: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46   osUnlockFile(pF
fac0: 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
fad0: 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f  IRST, 0, SHARED_
fae0: 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  SIZE, 0);.    if
faf0: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
fb00: 45 44 5f 4c 4f 43 4b 20 26 26 20 21 67 65 74 52  ED_LOCK && !getR
fb10: 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 20 29  eadLock(pFile) )
fb20: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
fb30: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
fb40: 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c 64 20  pen.  We should 
fb50: 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65 20 74  always be able t
fb60: 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 63 71  o.      ** reacq
fb70: 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
fb80: 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  ck */.      rc =
fb90: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
fba0: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
fbb0: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
fbc0: 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
fbd0: 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20     "winUnlock", 
fbe0: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
fbf0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74     }.  }.  if( t
fc00: 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype>=RESERVED_LO
fc10: 43 4b 20 29 7b 0a 20 20 20 20 6f 73 55 6e 6c 6f  CK ){.    osUnlo
fc20: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
fc30: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
fc40: 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 1, 0);.  }.  
fc50: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  if( locktype==NO
fc60: 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53  _LOCK && type>=S
fc70: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
fc80: 20 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b    unlockReadLock
fc90: 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69  (pFile);.  }.  i
fca0: 66 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47  f( type>=PENDING
fcb0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 6f 73 55  _LOCK ){.    osU
fcc0: 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d  nlockFile(pFile-
fcd0: 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  >h, PENDING_BYTE
fce0: 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
fcf0: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
fd00: 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65  e = (u8)locktype
fd10: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
fd20: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20  ../*.** Control 
fd30: 61 6e 64 20 71 75 65 72 79 20 6f 66 20 74 68 65  and query of the
fd40: 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c   open file handl
fd50: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
fd60: 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 28   winFileControl(
fd70: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
fd80: 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
fd90: 70 41 72 67 29 7b 0a 20 20 77 69 6e 46 69 6c 65  pArg){.  winFile
fda0: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
fdb0: 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69 74 63 68  le*)id;.  switch
fdc0: 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
fdd0: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f   SQLITE_FCNTL_LO
fde0: 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20  CKSTATE: {.     
fdf0: 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70   *(int*)pArg = p
fe00: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a  File->locktype;.
fe10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
fe20: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
fe30: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41    case SQLITE_LA
fe40: 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20  ST_ERRNO: {.    
fe50: 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
fe60: 28 69 6e 74 29 70 46 69 6c 65 2d 3e 6c 61 73 74  (int)pFile->last
fe70: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74  Errno;.      ret
fe80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
fe90: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
fea0: 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b  LITE_FCNTL_CHUNK
feb0: 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70  _SIZE: {.      p
fec0: 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20  File->szChunk = 
fed0: 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20  *(int *)pArg;.  
fee0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fef0: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
ff00: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
ff10: 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20  L_SIZE_HINT: {. 
ff20: 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e       if( pFile->
ff30: 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20  szChunk>0 ){.   
ff40: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
ff50: 36 34 20 6f 6c 64 53 7a 3b 0a 20 20 20 20 20 20  64 oldSz;.      
ff60: 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 46 69    int rc = winFi
ff70: 6c 65 53 69 7a 65 28 69 64 2c 20 26 6f 6c 64 53  leSize(id, &oldS
ff80: 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
ff90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
ffa0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ffb0: 65 33 5f 69 6e 74 36 34 20 6e 65 77 53 7a 20 3d  e3_int64 newSz =
ffc0: 20 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34   *(sqlite3_int64
ffd0: 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 20 20  *)pArg;.        
ffe0: 20 20 69 66 28 20 6e 65 77 53 7a 3e 6f 6c 64 53    if( newSz>oldS
fff0: 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  z ){.           
10000 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
10010 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
10020 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54         rc = winT
10030 72 75 6e 63 61 74 65 28 69 64 2c 20 6e 65 77 53  runcate(id, newS
10040 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  z);.            
10050 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
10060 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
10070 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
10080 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
10090 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
100a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
100b0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
100c0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
100d0 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20  ERSIST_WAL: {.  
100e0 20 20 20 20 69 6e 74 20 62 50 65 72 73 69 73 74      int bPersist
100f0 20 3d 20 2a 28 69 6e 74 2a 29 70 41 72 67 3b 0a   = *(int*)pArg;.
10100 20 20 20 20 20 20 69 66 28 20 62 50 65 72 73 69        if( bPersi
10110 73 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  st<0 ){.        
10120 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46  *(int*)pArg = pF
10130 69 6c 65 2d 3e 62 50 65 72 73 69 73 74 57 61 6c  ile->bPersistWal
10140 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
10150 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 62 50         pFile->bP
10160 65 72 73 69 73 74 57 61 6c 20 3d 20 62 50 65 72  ersistWal = bPer
10170 73 69 73 74 21 3d 30 3b 0a 20 20 20 20 20 20 7d  sist!=0;.      }
10180 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
10190 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
101a0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
101b0 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a  CNTL_VFSNAME: {.
101c0 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70        *(char**)p
101d0 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Arg = sqlite3_mp
101e0 72 69 6e 74 66 28 22 77 69 6e 33 32 22 29 3b 0a  rintf("win32");.
101f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
10200 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
10210 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
10220 4e 54 4c 5f 53 59 4e 43 5f 4f 4d 49 54 54 45 44  NTL_SYNC_OMITTED
10230 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
10240 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
10250 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
10260 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 56  E_FCNTL_WIN32_AV
10270 5f 52 45 54 52 59 3a 20 7b 0a 20 20 20 20 20 20  _RETRY: {.      
10280 69 6e 74 20 2a 61 20 3d 20 28 69 6e 74 2a 29 70  int *a = (int*)p
10290 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20 61  Arg;.      if( a
102a0 5b 30 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  [0]>0 ){.       
102b0 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79   win32IoerrRetry
102c0 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 7d   = a[0];.      }
102d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b  else{.        a[
102e0 30 5d 20 3d 20 77 69 6e 33 32 49 6f 65 72 72 52  0] = win32IoerrR
102f0 65 74 72 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20  etry;.      }.  
10300 20 20 20 20 69 66 28 20 61 5b 31 5d 3e 30 20 29      if( a[1]>0 )
10310 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 33 32 49  {.        win32I
10320 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d  oerrRetryDelay =
10330 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c   a[1];.      }el
10340 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 31 5d  se{.        a[1]
10350 20 3d 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74   = win32IoerrRet
10360 72 79 44 65 6c 61 79 3b 0a 20 20 20 20 20 20 7d  ryDelay;.      }
10370 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
10380 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
10390 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
103a0 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a  TE_NOTFOUND;.}..
103b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
103c0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20   sector size in 
103d0 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64  bytes of the und
103e0 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65  erlying block de
103f0 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  vice for.** the 
10400 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20  specified file. 
10410 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61  This is almost a
10420 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c  lways 512 bytes,
10430 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c   but may be.** l
10440 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64  arger for some d
10450 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51  evices..**.** SQ
10460 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65  Lite code assume
10470 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
10480 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20  cannot fail. It 
10490 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61  also assumes tha
104a0 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65  t.** if two file
104b0 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e  s are created in
104c0 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73   the same file-s
104d0 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20  ystem directory 
104e0 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62  (i.e..** a datab
104f0 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72  ase and its jour
10500 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74  nal file) that t
10510 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77  he sector size w
10520 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61  ill be the.** sa
10530 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a  me for both..*/.
10540 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65  static int winSe
10550 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
10560 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 61 73  _file *id){.  as
10570 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
10580 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28 28 28   return (int)(((
10590 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 73 65  winFile*)id)->se
105a0 63 74 6f 72 53 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a  ctorSize);.}../*
105b0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65 63  .** Return a vec
105c0 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63 68  tor of device ch
105d0 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a 2a  aracteristics..*
105e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
105f0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
10600 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69  stics(sqlite3_fi
10610 6c 65 20 2a 69 64 29 7b 0a 20 20 55 4e 55 53 45  le *id){.  UNUSE
10620 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b  D_PARAMETER(id);
10630 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10640 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
10650 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 3b 0a 7d 0a  LE_WHEN_OPEN;.}.
10660 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10670 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 20 0a 2a 2a  OMIT_WAL../* .**
10680 20 57 69 6e 64 6f 77 73 20 77 69 6c 6c 20 6f 6e   Windows will on
10690 6c 79 20 6c 65 74 20 79 6f 75 20 63 72 65 61 74  ly let you creat
106a0 65 20 66 69 6c 65 20 76 69 65 77 20 6d 61 70 70  e file view mapp
106b0 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63  ings.** on alloc
106c0 61 74 69 6f 6e 20 73 69 7a 65 20 67 72 61 6e 75  ation size granu
106d0 6c 61 72 69 74 79 20 62 6f 75 6e 64 61 72 69 65  larity boundarie
106e0 73 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 73 71 6c  s..** During sql
106f0 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77  ite3_os_init() w
10700 65 20 64 6f 20 61 20 47 65 74 53 79 73 74 65 6d  e do a GetSystem
10710 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20 67 65 74  Info().** to get
10720 20 74 68 65 20 67 72 61 6e 75 6c 61 72 69 74 79   the granularity
10730 20 73 69 7a 65 2e 0a 2a 2f 0a 53 59 53 54 45 4d   size..*/.SYSTEM
10740 5f 49 4e 46 4f 20 77 69 6e 53 79 73 49 6e 66 6f  _INFO winSysInfo
10750 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  ;../*.** Helper 
10760 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74  functions to obt
10770 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69  ain and relinqui
10780 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  sh the global mu
10790 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62  tex. The.** glob
107a0 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64  al mutex is used
107b0 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20   to protect the 
107c0 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65  winLockInfo obje
107d0 63 74 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20  cts used by .** 
107e0 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f  this file, all o
107f0 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 73  f which may be s
10800 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c  hared by multipl
10810 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a  e threads..**.**
10820 20 46 75 6e 63 74 69 6f 6e 20 77 69 6e 53 68 6d   Function winShm
10830 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75  MutexHeld() is u
10840 73 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20  sed to assert() 
10850 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20  that the global 
10860 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c  mutex .** is hel
10870 64 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e  d when required.
10880 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
10890 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70  s only used as p
108a0 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
108b0 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  .** statements. 
108c0 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e  e.g..**.**   win
108d0 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 0a  ShmEnterMutex().
108e0 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 77  **     assert( w
108f0 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
10900 20 29 3b 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 4c   );.**   winShmL
10910 65 61 76 65 4d 75 74 65 78 28 29 0a 2a 2f 0a 73  eaveMutex().*/.s
10920 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
10930 6d 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64  mEnterMutex(void
10940 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
10950 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33  ex_enter(sqlite3
10960 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
10970 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
10980 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69  ASTER));.}.stati
10990 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 4c 65 61  c void winShmLea
109a0 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  veMutex(void){. 
109b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
109c0 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65  eave(sqlite3Mute
109d0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
109e0 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
109f0 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51  R));.}.#ifdef SQ
10a00 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69  LITE_DEBUG.stati
10a10 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 75 74 65  c int winShmMute
10a20 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20  xHeld(void) {.  
10a30 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
10a40 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65  utex_held(sqlite
10a50 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
10a60 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
10a70 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64  MASTER));.}.#end
10a80 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74  if../*.** Object
10a90 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
10aa0 6e 74 20 61 20 73 69 6e 67 6c 65 20 66 69 6c 65  nt a single file
10ab0 20 6f 70 65 6e 65 64 20 61 6e 64 20 6d 6d 61 70   opened and mmap
10ac0 70 65 64 20 74 6f 20 70 72 6f 76 69 64 65 0a 2a  ped to provide.*
10ad0 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  * shared memory.
10ae0 20 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20    When multiple 
10af0 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65  threads all refe
10b00 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65 0a 2a  rence the same.*
10b10 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c 20 65  * log-summary, e
10b20 61 63 68 20 74 68 72 65 61 64 20 68 61 73 20 69  ach thread has i
10b30 74 73 20 6f 77 6e 20 77 69 6e 46 69 6c 65 20 6f  ts own winFile o
10b40 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79 20  bject, but they 
10b50 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20  all.** point to 
10b60 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63  a single instanc
10b70 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  e of this object
10b80 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
10b90 73 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73  s, each.** log-s
10ba0 75 6d 6d 61 72 79 20 69 73 20 6f 70 65 6e 65 64  ummary is opened
10bb0 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70   only once per p
10bc0 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 69  rocess..**.** wi
10bd0 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
10be0 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68 65  must be true whe
10bf0 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65  n creating or de
10c00 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73  stroying.** this
10c10 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65   object or while
10c20 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
10c30 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
10c40 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20  g fields:.**.** 
10c50 20 20 20 20 20 6e 52 65 66 0a 2a 2a 20 20 20 20       nRef.**    
10c60 20 20 70 4e 65 78 74 20 0a 2a 2a 0a 2a 2a 20 54    pNext .**.** T
10c70 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
10c80 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  lds are read-onl
10c90 79 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65  y after the obje
10ca0 63 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a  ct is created:.*
10cb0 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a  * .**      fid.*
10cc0 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  *      zFilename
10cd0 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 77 69  .**.** Either wi
10ce0 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d  nShmNode.mutex m
10cf0 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20 77  ust be held or w
10d00 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d  inShmNode.nRef==
10d10 30 20 61 6e 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d  0 and.** winShmM
10d20 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 74 72  utexHeld() is tr
10d30 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20  ue when reading 
10d40 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f  or writing any o
10d50 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e  ther field.** in
10d60 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e   this structure.
10d70 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69  .**.*/.struct wi
10d80 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 73 71 6c  nShmNode {.  sql
10d90 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
10da0 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78  x;      /* Mutex
10db0 20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20   to access this 
10dc0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72  object */.  char
10dd0 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
10de0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
10df0 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  f the file */.  
10e00 77 69 6e 46 69 6c 65 20 68 46 69 6c 65 3b 20 20  winFile hFile;  
10e10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
10e20 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 77  le handle from w
10e30 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74  inOpen */..  int
10e40 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20   szRegion;      
10e50 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10e60 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
10e70 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   regions */.  in
10e80 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  t nRegion;      
10e90 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
10ea0 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69   of array apRegi
10eb0 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  on */.  struct S
10ec0 68 6d 52 65 67 69 6f 6e 20 7b 0a 20 20 20 20 48  hmRegion {.    H
10ed0 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20  ANDLE hMap;     
10ee0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
10ef0 68 61 6e 64 6c 65 20 66 72 6f 6d 20 43 72 65 61  handle from Crea
10f00 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 20 2a 2f  teFileMapping */
10f10 0a 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 3b  .    void *pMap;
10f20 0a 20 20 7d 20 2a 61 52 65 67 69 6f 6e 3b 0a 20  .  } *aRegion;. 
10f30 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
10f40 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
10f50 68 65 20 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f  he Windows errno
10f60 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49   from the last I
10f70 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 69  /O error */..  i
10f80 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
10f90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
10fa0 62 65 72 20 6f 66 20 77 69 6e 53 68 6d 20 6f 62  ber of winShm ob
10fb0 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
10fc0 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53  o this */.  winS
10fd0 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20  hm *pFirst;     
10fe0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 77 69         /* All wi
10ff0 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69  nShm objects poi
11000 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f  nting to this */
11010 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
11020 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Next;         /*
11030 20 4e 65 78 74 20 69 6e 20 6c 69 73 74 20 6f 66   Next in list of
11040 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20   all winShmNode 
11050 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66 64 65  objects */.#ifde
11060 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
11070 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20   u8 nextShmId;  
11080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
11090 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 77 69  ext available wi
110a0 6e 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f  nShm.id value */
110b0 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
110c0 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72 72 61 79  * A global array
110d0 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f   of all winShmNo
110e0 64 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a  de objects..**.*
110f0 2a 20 54 68 65 20 77 69 6e 53 68 6d 4d 75 74 65  * The winShmMute
11100 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20  xHeld() must be 
11110 74 72 75 65 20 77 68 69 6c 65 20 72 65 61 64 69  true while readi
11120 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
11130 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  is list..*/.stat
11140 69 63 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 77  ic winShmNode *w
11150 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20  inShmNodeList = 
11160 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74  0;../*.** Struct
11170 75 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61  ure used interna
11180 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46 53 20  lly by this VFS 
11190 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 74  to record the st
111a0 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65  ate of an.** ope
111b0 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  n shared memory 
111c0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
111d0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
111e0 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69  fields are initi
111f0 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73  alized when this
11200 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
11210 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65  ed and.** are re
11220 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74  ad-only thereaft
11230 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 77 69 6e  er:.**.**    win
11240 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20  Shm.pShmNode.** 
11250 20 20 20 77 69 6e 53 68 6d 2e 69 64 0a 2a 2a 0a     winShm.id.**.
11260 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65  ** All other fie
11270 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77 72 69  lds are read/wri
11280 74 65 2e 20 20 54 68 65 20 77 69 6e 53 68 6d 2e  te.  The winShm.
11290 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
112a0 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20  must be held.** 
112b0 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20  while accessing 
112c0 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20 66  any read/write f
112d0 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  ields..*/.struct
112e0 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77 69 6e 53   winShm {.  winS
112f0 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
11300 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e  ;      /* The un
11310 64 65 72 6c 79 69 6e 67 20 77 69 6e 53 68 6d 4e  derlying winShmN
11320 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ode object */.  
11330 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20  winShm *pNext;  
11340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
11350 78 74 20 77 69 6e 53 68 6d 20 77 69 74 68 20 74  xt winShm with t
11360 68 65 20 73 61 6d 65 20 77 69 6e 53 68 6d 4e 6f  he same winShmNo
11370 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75  de */.  u8 hasMu
11380 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  tex;            
11390 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f     /* True if ho
113a0 6c 64 69 6e 67 20 74 68 65 20 77 69 6e 53 68 6d  lding the winShm
113b0 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20  Node mutex */.  
113c0 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20  u16 sharedMask; 
113d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
113e0 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
113f0 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36  ks held */.  u16
11400 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20   exclMask;      
11410 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
11420 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  of exclusive loc
11430 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66 64 65  ks held */.#ifde
11440 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
11450 20 75 38 20 69 64 3b 20 20 20 20 20 20 20 20 20   u8 id;         
11460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
11470 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  d of this connec
11480 74 69 6f 6e 20 77 69 74 68 20 69 74 73 20 77 69  tion with its wi
11490 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64  nShmNode */.#end
114a0 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  if.};../*.** Con
114b0 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20  stants used for 
114c0 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69  locking.*/.#defi
114d0 6e 65 20 57 49 4e 5f 53 48 4d 5f 42 41 53 45 20  ne WIN_SHM_BASE 
114e0 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48    ((22+SQLITE_SH
114f0 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20  M_NLOCK)*4)     
11500 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b     /* first lock
11510 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65   byte */.#define
11520 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 20 20 20 20   WIN_SHM_DMS    
11530 28 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2b 53 51  (WIN_SHM_BASE+SQ
11540 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20  LITE_SHM_NLOCK) 
11550 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74   /* deadman swit
11560 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  ch */../*.** App
11570 6c 79 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ly advisory lock
11580 73 20 66 6f 72 20 61 6c 6c 20 6e 20 62 79 74 65  s for all n byte
11590 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 6f  s beginning at o
115a0 66 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  fst..*/.#define 
115b0 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23 64  _SHM_UNLCK  1.#d
115c0 65 66 69 6e 65 20 5f 53 48 4d 5f 52 44 4c 43 4b  efine _SHM_RDLCK
115d0 20 20 32 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d    2.#define _SHM
115e0 5f 57 52 4c 43 4b 20 20 33 0a 73 74 61 74 69 63  _WRLCK  3.static
115f0 20 69 6e 74 20 77 69 6e 53 68 6d 53 79 73 74 65   int winShmSyste
11600 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e  mLock(.  winShmN
11610 6f 64 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f  ode *pFile,    /
11620 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f  * Apply locks to
11630 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65   this open share
11640 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
11650 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79   */.  int lockTy
11660 70 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 5f  pe,         /* _
11670 53 48 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f  SHM_UNLCK, _SHM_
11680 52 44 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57  RDLCK, or _SHM_W
11690 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  RLCK */.  int of
116a0 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
116b0 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 66 69 72  /* Offset to fir
116c0 73 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f  st byte to be lo
116d0 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f  cked/unlocked */
116e0 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20  .  int nByte    
116f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
11700 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c  er of bytes to l
11710 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f  ock or unlock */
11720 0a 29 7b 0a 20 20 4f 56 45 52 4c 41 50 50 45 44  .){.  OVERLAPPED
11730 20 6f 76 6c 70 3b 0a 20 20 44 57 4f 52 44 20 64   ovlp;.  DWORD d
11740 77 46 6c 61 67 73 3b 0a 20 20 69 6e 74 20 72 63  wFlags;.  int rc
11750 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
11760 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
11770 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b 46  orm Lock/UnlockF
11780 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f 2a  ileEx() */..  /*
11790 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 77   Access to the w
117a0 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
117b0 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62   is serialized b
117c0 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  y the caller */.
117d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
117e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 69  3_mutex_held(pFi
117f0 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 46  le->mutex) || pF
11800 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  ile->nRef==0 );.
11810 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
11820 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72   the locking par
11830 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 64 77 46  ameters */.  dwF
11840 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f  lags = LOCKFILE_
11850 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
11860 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65  ;.  if( lockType
11870 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 29   == _SHM_WRLCK )
11880 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b   dwFlags |= LOCK
11890 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c  FILE_EXCLUSIVE_L
118a0 4f 43 4b 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26  OCK;..  memset(&
118b0 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ovlp, 0, sizeof(
118c0 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20  OVERLAPPED));.  
118d0 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66  ovlp.Offset = of
118e0 73 74 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73  st;..  /* Releas
118f0 65 2f 41 63 71 75 69 72 65 20 74 68 65 20 73 79  e/Acquire the sy
11900 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20  stem-level lock 
11910 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 70  */.  if( lockTyp
11920 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b  e==_SHM_UNLCK ){
11930 0a 20 20 20 20 72 63 20 3d 20 6f 73 55 6e 6c 6f  .    rc = osUnlo
11940 63 6b 46 69 6c 65 45 78 28 70 46 69 6c 65 2d 3e  ckFileEx(pFile->
11950 68 46 69 6c 65 2e 68 2c 20 30 2c 20 6e 42 79 74  hFile.h, 0, nByt
11960 65 2c 20 30 2c 20 26 6f 76 6c 70 29 3b 0a 20 20  e, 0, &ovlp);.  
11970 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
11980 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 28 70 46 69  osLockFileEx(pFi
11990 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 64 77 46  le->hFile.h, dwF
119a0 6c 61 67 73 2c 20 30 2c 20 6e 42 79 74 65 2c 20  lags, 0, nByte, 
119b0 30 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 0a 20  0, &ovlp);.  }. 
119c0 20 0a 20 20 69 66 28 20 72 63 21 3d 20 30 20 29   .  if( rc!= 0 )
119d0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
119e0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
119f0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
11a00 72 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73 74  rno =  osGetLast
11a10 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20  Error();.    rc 
11a20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
11a30 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
11a40 53 48 4d 2d 4c 4f 43 4b 20 25 64 20 25 73 20 25  SHM-LOCK %d %s %
11a50 73 20 30 78 25 30 38 6c 78 5c 6e 22 2c 20 0a 20  s 0x%08lx\n", . 
11a60 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
11a70 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20  >hFile.h,.      
11a80 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
11a90 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
11aa0 6c 65 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20  led",.          
11ab0 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f   lockType==_SHM_
11ac0 55 4e 4c 43 4b 20 3f 20 22 55 6e 6c 6f 63 6b 46  UNLCK ? "UnlockF
11ad0 69 6c 65 45 78 22 20 3a 20 22 4c 6f 63 6b 46 69  ileEx" : "LockFi
11ae0 6c 65 45 78 22 2c 0a 20 20 20 20 20 20 20 20 20  leEx",.         
11af0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
11b00 6e 6f 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  no));..  return 
11b10 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
11b20 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  d references to 
11b30 56 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73  VFS methods */.s
11b40 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65  tatic int winOpe
11b50 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 63  n(sqlite3_vfs*,c
11b60 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74  onst char*,sqlit
11b70 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74  e3_file*,int,int
11b80 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  *);.static int w
11b90 69 6e 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  inDelete(sqlite3
11ba0 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20 63 68 61  _vfs *,const cha
11bb0 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  r*,int);../*.** 
11bc0 50 75 72 67 65 20 74 68 65 20 77 69 6e 53 68 6d  Purge the winShm
11bd0 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66  NodeList list of
11be0 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74   all entries wit
11bf0 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65  h winShmNode.nRe
11c00 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  f==0..**.** This
11c10 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68   is not a VFS sh
11c20 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
11c30 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c  od; it is a util
11c40 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ity function cal
11c50 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68  led.** by VFS sh
11c60 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
11c70 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ods..*/.static v
11c80 6f 69 64 20 77 69 6e 53 68 6d 50 75 72 67 65 28  oid winShmPurge(
11c90 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
11ca0 73 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61  s, int deleteFla
11cb0 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  g){.  winShmNode
11cc0 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53 68 6d 4e   **pp;.  winShmN
11cd0 6f 64 65 20 2a 70 3b 0a 20 20 42 4f 4f 4c 20 62  ode *p;.  BOOL b
11ce0 52 63 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69  Rc;.  assert( wi
11cf0 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
11d00 29 3b 0a 20 20 70 70 20 3d 20 26 77 69 6e 53 68  );.  pp = &winSh
11d10 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69  mNodeList;.  whi
11d20 6c 65 28 20 28 70 20 3d 20 2a 70 70 29 21 3d 30  le( (p = *pp)!=0
11d30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   ){.    if( p->n
11d40 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
11d50 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28  int i;.      if(
11d60 20 70 2d 3e 6d 75 74 65 78 20 29 20 73 71 6c 69   p->mutex ) sqli
11d70 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
11d80 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
11d90 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52  for(i=0; i<p->nR
11da0 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  egion; i++){.   
11db0 20 20 20 20 20 62 52 63 20 3d 20 6f 73 55 6e 6d       bRc = osUnm
11dc0 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 2d 3e  apViewOfFile(p->
11dd0 61 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29  aRegion[i].pMap)
11de0 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43  ;.        OSTRAC
11df0 45 28 28 22 53 48 4d 2d 50 55 52 47 45 20 70 69  E(("SHM-PURGE pi
11e00 64 2d 25 64 20 75 6e 6d 61 70 20 72 65 67 69 6f  d-%d unmap regio
11e10 6e 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  n=%d %s\n",.    
11e20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
11e30 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  t)osGetCurrentPr
11e40 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 0a 20 20  ocessId(), i,.  
11e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
11e60 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  Rc ? "ok" : "fai
11e70 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20  led"));.        
11e80 62 52 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e  bRc = osCloseHan
11e90 64 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69  dle(p->aRegion[i
11ea0 5d 2e 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20  ].hMap);.       
11eb0 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50   OSTRACE(("SHM-P
11ec0 55 52 47 45 20 70 69 64 2d 25 64 20 63 6c 6f 73  URGE pid-%d clos
11ed0 65 20 72 65 67 69 6f 6e 3d 25 64 20 25 73 5c 6e  e region=%d %s\n
11ee0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
11ef0 20 20 20 20 28 69 6e 74 29 6f 73 47 65 74 43 75      (int)osGetCu
11f00 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
11f10 2c 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , i,.           
11f20 20 20 20 20 20 20 62 52 63 20 3f 20 22 6f 6b 22        bRc ? "ok"
11f30 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
11f40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
11f50 20 70 2d 3e 68 46 69 6c 65 2e 68 20 21 3d 20 49   p->hFile.h != I
11f60 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
11f70 4c 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20 53  LUE ){.        S
11f80 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
11f90 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20  nign(1);.       
11fa0 20 77 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74   winClose((sqlit
11fb0 65 33 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46  e3_file *)&p->hF
11fc0 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 53 69  ile);.        Si
11fd0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
11fe0 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ign(0);.      }.
11ff0 20 20 20 20 20 20 69 66 28 20 64 65 6c 65 74 65        if( delete
12000 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
12010 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
12020 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
12030 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56 66 73    winDelete(pVfs
12040 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  , p->zFilename, 
12050 30 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75  0);.        Simu
12060 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
12070 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n(0);.      }.  
12080 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65      *pp = p->pNe
12090 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  xt;.      sqlite
120a0 33 5f 66 72 65 65 28 70 2d 3e 61 52 65 67 69 6f  3_free(p->aRegio
120b0 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
120c0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 7d  3_free(p);.    }
120d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 20 3d  else{.      pp =
120e0 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20   &p->pNext;.    
120f0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  }.  }.}../*.** O
12100 70 65 6e 20 74 68 65 20 73 68 61 72 65 64 2d 6d  pen the shared-m
12110 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63  emory area assoc
12120 69 61 74 65 64 20 77 69 74 68 20 64 61 74 61 62  iated with datab
12130 61 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e 0a  ase file pDbFd..
12140 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69  **.** When openi
12150 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d  ng a new shared-
12160 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20  memory file, if 
12170 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63  no other instanc
12180 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69  es of that.** fi
12190 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  le are currently
121a0 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70   open, in this p
121b0 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68  rocess or in oth
121c0 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68  er processes, th
121d0 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d  en.** the file m
121e0 75 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 64  ust be truncated
121f0 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20   to zero length 
12200 6f 72 20 68 61 76 65 20 69 74 73 20 68 65 61 64  or have its head
12210 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73  er cleared..*/.s
12220 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65  tatic int winOpe
12230 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 77 69  nSharedMemory(wi
12240 6e 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20  nFile *pDbFd){. 
12250 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 2a   struct winShm *
12260 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
12270 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
12280 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e  ction to be open
12290 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77  ed */.  struct w
122a0 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
122b0 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68  ode = 0;   /* Th
122c0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61  e underlying mma
122d0 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69  pped file */.  i
122e0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
122f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12300 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
12310 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e   */.  struct win
12320 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b 20 20  ShmNode *pNew;  
12330 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c           /* Newl
12340 79 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 6e 53  y allocated winS
12350 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  hmNode */.  int 
12360 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
12370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12380 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 20  * Size of zName 
12390 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 61  in bytes */..  a
123a0 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53  ssert( pDbFd->pS
123b0 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e  hm==0 );    /* N
123c0 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70  ot previously op
123d0 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  ened */..  /* Al
123e0 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
123f0 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74 65 33   the new sqlite3
12400 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20 20 41 6c  _shm object.  Al
12410 73 6f 20 73 70 65 63 75 6c 61 74 69 76 65 6c 79  so speculatively
12420 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 73  .  ** allocate s
12430 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 77  pace for a new w
12440 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64 20 66 69  inShmNode and fi
12450 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70  lename..  */.  p
12460 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
12470 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  c( sizeof(*p) );
12480 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
12490 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
124a0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65  R_NOMEM;.  memse
124b0 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(p, 0, sizeof(*
124c0 70 29 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73  p));.  nName = s
124d0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
124e0 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
124f0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pNew = sqlite3_m
12500 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
12510 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d 65  ShmNode) + nName
12520 20 2b 20 31 35 20 29 3b 0a 20 20 69 66 28 20 70   + 15 );.  if( p
12530 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
12540 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
12550 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12560 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
12570 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c  }.  memset(pNew,
12580 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77   0, sizeof(*pNew
12590 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 46 69 6c  ));.  pNew->zFil
125a0 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  ename = (char*)&
125b0 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69 74  pNew[1];.  sqlit
125c0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61 6d  e3_snprintf(nNam
125d0 65 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c  e+15, pNew->zFil
125e0 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c  ename, "%s-shm",
125f0 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
12600 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
12610 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74  fix3(pDbFd->zPat
12620 68 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61  h, pNew->zFilena
12630 6d 65 29 3b 20 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  me); ..  /* Look
12640 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
12650 20 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20   is an existing 
12660 77 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74 20  winShmNode that 
12670 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20 2a  can be used..  *
12680 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67  * If no matching
12690 20 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72 72   winShmNode curr
126a0 65 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63 72  ently exists, cr
126b0 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a  eate a new one..
126c0 20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74    */.  winShmEnt
126d0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72  erMutex();.  for
126e0 28 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e 53  (pShmNode = winS
126f0 68 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68 6d  hmNodeList; pShm
12700 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d 70  Node; pShmNode=p
12710 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29 7b  ShmNode->pNext){
12720 0a 20 20 20 20 2f 2a 20 54 42 44 20 6e 65 65 64  .    /* TBD need
12730 20 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74 68   to come up with
12740 20 62 65 74 74 65 72 20 6d 61 74 63 68 20 68 65   better match he
12750 72 65 2e 20 20 50 65 72 68 61 70 73 0a 20 20 20  re.  Perhaps.   
12760 20 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49 44 5f   ** use FILE_ID_
12770 42 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53 74  BOTH_DIR_INFO St
12780 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  ructure..    */.
12790 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
127a0 74 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65 2d  trICmp(pShmNode-
127b0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77  >zFilename, pNew
127c0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20  ->zFilename)==0 
127d0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
127e0 66 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20  f( pShmNode ){. 
127f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12800 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNew);.  }else{.
12810 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70      pShmNode = p
12820 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  New;.    pNew = 
12830 30 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c 65  0;.    ((winFile
12840 2a 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  *)(&pShmNode->hF
12850 69 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41 4c  ile))->h = INVAL
12860 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b  ID_HANDLE_VALUE;
12870 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  .    pShmNode->p
12880 4e 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f 64  Next = winShmNod
12890 65 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53 68  eList;.    winSh
128a0 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68 6d  mNodeList = pShm
128b0 4e 6f 64 65 3b 0a 0a 20 20 20 20 70 53 68 6d 4e  Node;..    pShmN
128c0 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  ode->mutex = sql
128d0 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
128e0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
128f0 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68  ST);.    if( pSh
12900 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20  mNode->mutex==0 
12910 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
12920 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
12930 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
12940 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
12950 0a 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70  ..    rc = winOp
12960 65 6e 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 0a  en(pDbFd->pVfs,.
12970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12980 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65   pShmNode->zFile
12990 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  name,           
129a0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
129b0 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f   file (UTF-8) */
129c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
129d0 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
129e0 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
129f0 65 2c 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64  e,  /* File hand
12a00 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 20 20 20  le here */.     
12a10 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
12a20 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 20 53 51  TE_OPEN_WAL | SQ
12a30 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
12a40 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
12a50 4e 5f 43 52 45 41 54 45 2c 20 2f 2a 20 4d 6f 64  N_CREATE, /* Mod
12a60 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 20 20 20  e flags */.     
12a70 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a              0);.
12a80 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
12a90 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 72  K!=rc ){.      r
12aa0 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
12ab0 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  PEN_BKPT;.      
12ac0 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
12ad0 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  r;.    }..    /*
12ae0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12af0 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
12b00 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   is holding the 
12b10 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e  dead-man switch.
12b20 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20  .    ** If not, 
12b30 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  truncate the fil
12b40 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  e to zero length
12b50 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
12b60 28 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  ( winShmSystemLo
12b70 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
12b80 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d  M_WRLCK, WIN_SHM
12b90 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45  _DMS, 1)==SQLITE
12ba0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
12bb0 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73  = winTruncate((s
12bc0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
12bd0 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
12be0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
12bf0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12c00 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c         rc = winL
12c10 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
12c20 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f 73  OERR_SHMOPEN, os
12c30 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
12c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c50 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70   "winOpenShm", p
12c60 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
12c70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
12c80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
12c90 4b 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 53 68  K ){.      winSh
12ca0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
12cb0 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b  Node, _SHM_UNLCK
12cc0 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
12cd0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  );.      rc = wi
12ce0 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
12cf0 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44  ShmNode, _SHM_RD
12d00 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
12d10 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
12d20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68  if( rc ) goto sh
12d30 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a  m_open_err;.  }.
12d40 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e  .  /* Make the n
12d50 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20  ew connection a 
12d60 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69 6e  child of the win
12d70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e  ShmNode */.  p->
12d80 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e  pShmNode = pShmN
12d90 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ode;.#ifdef SQLI
12da0 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64  TE_DEBUG.  p->id
12db0 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78   = pShmNode->nex
12dc0 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66  tShmId++;.#endif
12dd0 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
12de0 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  f++;.  pDbFd->pS
12df0 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d  hm = p;.  winShm
12e00 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
12e10 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63   /* The referenc
12e20 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e  e count on pShmN
12e30 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ode has already 
12e40 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64  been incremented
12e50 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20   under.  ** the 
12e60 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77 69 6e  cover of the win
12e70 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 20  ShmEnterMutex() 
12e80 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f  mutex and the po
12e90 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20  inter from the. 
12ea0 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20   ** new (struct 
12eb0 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20 74  winShm) object t
12ec0 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68  o the pShmNode h
12ed0 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c  as been set. All
12ee0 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65   that is.  ** le
12ef0 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c  ft to do is to l
12f00 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65  ink the new obje
12f10 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  ct into the link
12f20 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
12f30 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64  .  ** at pShmNod
12f40 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20  e->pFirst. This 
12f50 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69  must be done whi
12f60 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70  le holding the p
12f70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a  ShmNode->mutex .
12f80 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f    ** mutex..  */
12f90 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
12fa0 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
12fb0 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e  >mutex);.  p->pN
12fc0 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ext = pShmNode->
12fd0 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f  pFirst;.  pShmNo
12fe0 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a  de->pFirst = p;.
12ff0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
13000 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
13010 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
13020 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
13030 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61  * Jump here on a
13040 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f  ny error */.shm_
13050 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53  open_err:.  winS
13060 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
13070 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43  mNode, _SHM_UNLC
13080 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
13090 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72 67  1);.  winShmPurg
130a0 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 30  e(pDbFd->pVfs, 0
130b0 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  );      /* This 
130c0 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e  call frees pShmN
130d0 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20  ode if required 
130e0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
130f0 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  e(p);.  sqlite3_
13100 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77 69  free(pNew);.  wi
13110 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
13120 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13130 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
13140 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68  connection to sh
13150 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65  ared-memory.  De
13160 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lete the underly
13170 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20  ing .** storage 
13180 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73  if deleteFlag is
13190 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
131a0 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70   int winShmUnmap
131b0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
131c0 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *fd,          /
131d0 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
131e0 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ng shared memory
131f0 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65   */.  int delete
13200 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
13210 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74 65 72   /* Delete after
13220 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72 75 65   closing if true
13230 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65   */.){.  winFile
13240 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 2f   *pDbFd;       /
13250 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
13260 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ng shared-memory
13270 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b   */.  winShm *p;
13280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13290 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
132a0 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20   be closed */.  
132b0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
132c0 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64  Node; /* The und
132d0 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d  erlying shared-m
132e0 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
132f0 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20  winShm **pp;    
13300 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
13310 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e  ping over siblin
13320 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  g connections */
13330 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69 6e  ..  pDbFd = (win
13340 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20  File*)fd;.  p = 
13350 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69  pDbFd->pShm;.  i
13360 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
13370 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53   SQLITE_OK;.  pS
13380 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
13390 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f  Node;..  /* Remo
133a0 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  ve connection p 
133b0 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20  from the set of 
133c0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f  connections asso
133d0 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68  ciated.  ** with
133e0 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73   pShmNode */.  s
133f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
13400 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
13410 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70  ex);.  for(pp=&p
13420 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
13430 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20   (*pp)!=p; pp = 
13440 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d  &(*pp)->pNext){}
13450 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78  .  *pp = p->pNex
13460 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68  t;..  /* Free th
13470 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a  e connection p *
13480 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
13490 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  (p);.  pDbFd->pS
134a0 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  hm = 0;.  sqlite
134b0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
134c0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
134d0 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64  .  /* If pShmNod
134e0 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63  e->nRef has reac
134f0 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73  hed 0, then clos
13500 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
13510 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d  .  ** shared-mem
13520 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f  ory file, too */
13530 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  .  winShmEnterMu
13540 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
13550 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e   pShmNode->nRef>
13560 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  0 );.  pShmNode-
13570 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
13580 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30  ShmNode->nRef==0
13590 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50 75   ){.    winShmPu
135a0 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c  rge(pDbFd->pVfs,
135b0 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20   deleteFlag);.  
135c0 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  }.  winShmLeaveM
135d0 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72  utex();..  retur
135e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
135f0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
13600 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20   lock state for 
13610 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  a shared-memory 
13620 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  segment..*/.stat
13630 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63  ic int winShmLoc
13640 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  k(.  sqlite3_fil
13650 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
13660 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
13670 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
13680 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
13690 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
136a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
136b0 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75  rst lock to acqu
136c0 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
136d0 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
136e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
136f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b  * Number of lock
13700 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  s to acquire or 
13710 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
13720 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
13730 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
13740 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c  to do with the l
13750 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  ock */.){.  winF
13760 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69  ile *pDbFd = (wi
13770 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20  nFile*)fd;      
13780 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
13790 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d  holding shared m
137a0 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68  emory */.  winSh
137b0 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  m *p = pDbFd->pS
137c0 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
137d0 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d   /* The shared m
137e0 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b  emory being lock
137f0 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ed */.  winShm *
13800 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
13810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13820 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
13830 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a  r all siblings *
13840 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  /.  winShmNode *
13850 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
13860 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63  hmNode;.  int rc
13870 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
13880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13890 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
138a0 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20  /.  u16 mask;   
138b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
138d0 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61  k of locks to ta
138e0 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  ke or release */
138f0 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74  ..  assert( ofst
13900 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53  >=0 && ofst+n<=S
13910 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20  QLITE_SHM_NLOCK 
13920 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d  );.  assert( n>=
13930 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  1 );.  assert( f
13940 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
13950 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  M_LOCK | SQLITE_
13960 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20  SHM_SHARED).    
13970 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
13980 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
13990 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
139a0 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20  SIVE).       || 
139b0 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
139c0 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
139d0 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
139e0 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
139f0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  (SQLITE_SHM_UNLO
13a00 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
13a10 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20  EXCLUSIVE) );.  
13a20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20  assert( n==1 || 
13a30 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
13a40 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  SHM_EXCLUSIVE)!=
13a50 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28  0 );..  mask = (
13a60 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b  u16)((1U<<(ofst+
13a70 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29  n)) - (1U<<ofst)
13a80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31  );.  assert( n>1
13a90 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66   || mask==(1<<of
13aa0 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  st) );.  sqlite3
13ab0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
13ac0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
13ad0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
13ae0 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29  ITE_SHM_UNLOCK )
13af0 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73  {.    u16 allMas
13b00 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f  k = 0; /* Mask o
13b10 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
13b20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20  siblings */..   
13b30 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73   /* See if any s
13b40 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69  iblings hold thi
13b50 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20  s same lock */. 
13b60 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
13b70 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
13b80 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
13b90 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29       if( pX==p )
13ba0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
13bb0 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78   assert( (pX->ex
13bc0 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63  clMask & (p->exc
13bd0 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d  lMask|p->sharedM
13be0 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ask))==0 );.    
13bf0 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d    allMask |= pX-
13c00 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
13c10 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63   }..    /* Unloc
13c20 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76  k the system-lev
13c30 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  el locks */.    
13c40 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d  if( (mask & allM
13c50 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
13c60 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74   rc = winShmSyst
13c70 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
13c80 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73   _SHM_UNLCK, ofs
13c90 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20  t+WIN_SHM_BASE, 
13ca0 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
13cb0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13cc0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  _OK;.    }..    
13cd0 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61  /* Undo the loca
13ce0 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
13cf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13d00 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63   ){.      p->exc
13d10 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
13d20 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d        p->sharedM
13d30 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
13d40 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28    } .  }else if(
13d50 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
13d60 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  SHM_SHARED ){.  
13d70 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20    u16 allShared 
13d80 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f  = 0;  /* Union o
13d90 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
13da0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
13db0 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20  r than "p" */.. 
13dc0 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77     /* Find out w
13dd0 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b  hich shared lock
13de0 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65  s are already he
13df0 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f  ld by sibling co
13e00 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a  nnections..    *
13e10 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67  * If any sibling
13e20 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61   already holds a
13e30 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
13e40 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72  , go ahead and r
13e50 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c  eturn.    ** SQL
13e60 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f  ITE_BUSY..    */
13e70 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
13e80 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
13e90 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
13ea0 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e  .      if( (pX->
13eb0 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29  exclMask & mask)
13ec0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
13ed0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
13ee0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
13ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c        }.      al
13f00 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73  lShared |= pX->s
13f10 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d  haredMask;.    }
13f20 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61  ..    /* Get sha
13f30 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  red locks at the
13f40 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69   system level, i
13f50 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
13f60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13f70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
13f80 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d  ( (allShared & m
13f90 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
13fa0 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79     rc = winShmSy
13fb0 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
13fc0 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f  e, _SHM_RDLCK, o
13fd0 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45  fst+WIN_SHM_BASE
13fe0 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , n);.      }els
13ff0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
14000 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
14010 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
14020 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73   Get the local s
14030 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20  hared locks */. 
14040 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14050 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
14060 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d  >sharedMask |= m
14070 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
14080 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  se{.    /* Make 
14090 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20  sure no sibling 
140a0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64  connections hold
140b0 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c   locks that will
140c0 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20   block this.    
140d0 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79  ** lock.  If any
140e0 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49   do, return SQLI
140f0 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61 77  TE_BUSY right aw
14100 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ay..    */.    f
14110 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
14120 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
14130 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
14140 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61   if( (pX->exclMa
14150 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c  sk & mask)!=0 ||
14160 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b   (pX->sharedMask
14170 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20   & mask)!=0 ){. 
14180 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
14190 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
141a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
141b0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
141c0 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  Get the exclusiv
141d0 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  e locks at the s
141e0 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68  ystem level.  Th
141f0 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  en if successful
14200 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72  .    ** also mar
14210 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e  k the local conn
14220 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20  ection as being 
14230 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  locked..    */. 
14240 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14250 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
14260 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c   = winShmSystemL
14270 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
14280 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 57  HM_WRLCK, ofst+W
14290 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IN_SHM_BASE, n);
142a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
142b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
142c0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e      assert( (p->
142d0 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
142e0 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  k)==0 );.       
142f0 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20   p->exclMask |= 
14300 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mask;.      }.  
14310 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
14320 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
14330 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
14340 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
14350 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70  LOCK shmid-%d, p
14360 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c 25  id-%d got %03x,%
14370 30 33 78 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  03x %s\n",.     
14380 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 28 69 6e        p->id, (in
14390 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  t)osGetCurrentPr
143a0 6f 63 65 73 73 49 64 28 29 2c 20 70 2d 3e 73 68  ocessId(), p->sh
143b0 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63  aredMask, p->exc
143c0 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20  lMask,.         
143d0 20 20 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20    rc ? "failed" 
143e0 3a 20 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75  : "ok"));.  retu
143f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14400 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f  Implement a memo
14410 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65  ry barrier or me
14420 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68  mory fence on sh
14430 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a  ared memory.  .*
14440 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61  *.** All loads a
14450 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20  nd stores begun 
14460 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69  before the barri
14470 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65  er must complete
14480 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c   before.** any l
14490 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67  oad or store beg
144a0 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72  un after the bar
144b0 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rier..*/.static 
144c0 76 6f 69 64 20 77 69 6e 53 68 6d 42 61 72 72 69  void winShmBarri
144d0 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  er(.  sqlite3_fi
144e0 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20  le *fd          
144f0 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
14500 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
14510 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e  emory */.){.  UN
14520 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
14530 64 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42  d);.  /* MemoryB
14540 61 72 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65  arrier(); // doe
14550 73 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f  s not work -- do
14560 20 6e 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f   not know why no
14570 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74  t */.  winShmEnt
14580 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 77 69 6e  erMutex();.  win
14590 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
145a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
145b0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
145c0 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f  d to obtain a po
145d0 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20  inter to region 
145e0 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a  iRegion of the .
145f0 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
14600 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
14610 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14620 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65  le fd. Shared-me
14630 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a  mory regions .**
14640 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74   are numbered st
14650 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f  arting from zero
14660 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65  . Each shared-me
14670 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73  mory region is s
14680 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65  zRegion .** byte
14690 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
146a0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
146b0 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
146c0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
146d0 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  nd *pp is set to
146e0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68   NULL..**.** Oth
146f0 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 69  erwise, if the i
14700 73 57 72 69 74 65 20 70 61 72 61 6d 65 74 65 72  sWrite parameter
14710 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65   is 0 and the re
14720 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
14730 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20  emory.** region 
14740 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
14750 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63  ocated (by any c
14760 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67  lient, including
14770 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20   one running in 
14780 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72  a.** separate pr
14790 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70  ocess), then *pp
147a0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
147b0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
147c0 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 69  turned. If .** i
147d0 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  sWrite is non-ze
147e0 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65  ro and the reque
147f0 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
14800 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ry region has no
14810 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61  t yet .** been a
14820 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20  llocated, it is 
14830 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
14840 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
14850 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d  * If the shared-
14860 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
14870 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
14880 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61  llocated or is a
14890 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
148a0 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63  his call as desc
148b0 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65  ribed above, the
148c0 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69  n it is mapped i
148d0 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
148e0 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73  es .** address s
148f0 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e  pace (if it is n
14900 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70  ot already), *pp
14910 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
14920 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a   to the mapped .
14930 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51  ** memory and SQ
14940 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
14950 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14960 77 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c  winShmMap(.  sql
14970 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
14980 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14990 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64  Handle open on d
149a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
149b0 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20    int iRegion,  
149c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149d0 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72    /* Region to r
149e0 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74  etrieve */.  int
149f0 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20   szRegion,      
14a00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14a10 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20  Size of regions 
14a20 2a 2f 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65  */.  int isWrite
14a30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14a40 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
14a50 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e  extend file if n
14a60 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f  ecessary */.  vo
14a70 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70  id volatile **pp
14a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14a90 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d   OUT: Mapped mem
14aa0 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  ory */.){.  winF
14ab0 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69  ile *pDbFd = (wi
14ac0 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e  nFile*)fd;.  win
14ad0 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e  Shm *p = pDbFd->
14ae0 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f  pShm;.  winShmNo
14af0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de *pShmNode;.  
14b00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
14b10 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 20 29 7b  OK;..  if( !p ){
14b20 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65  .    rc = winOpe
14b30 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44  nSharedMemory(pD
14b40 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  bFd);.    if( rc
14b50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
14b60 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 20 3d  turn rc;.    p =
14b70 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
14b80 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  }.  pShmNode = p
14b90 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73  ->pShmNode;..  s
14ba0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
14bb0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
14bc0 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ex);.  assert( s
14bd0 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
14be0 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
14bf0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
14c00 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  ==0 );..  if( pS
14c10 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
14c20 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  =iRegion ){.    
14c30 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e  struct ShmRegion
14c40 20 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20   *apNew;        
14c50 20 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f     /* New aRegio
14c60 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  n[] array */.   
14c70 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52   int nByte = (iR
14c80 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f  egion+1)*szRegio
14c90 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72  n;  /* Minimum r
14ca0 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
14cb0 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
14cc0 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20  _int64 sz;      
14cd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
14ce0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77  urrent size of w
14cf0 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f  al-index file */
14d00 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
14d10 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67  szRegion = szReg
14d20 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ion;..    /* The
14d30 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
14d40 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20  n is not mapped 
14d50 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
14d60 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
14d70 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20  e..    ** Check 
14d80 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73  to see if it has
14d90 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
14da0 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c  (i.e. if the wal
14db0 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20  -index file is. 
14dc0 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75     ** large enou
14dd0 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  gh to contain th
14de0 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
14df0 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  on)..    */.    
14e00 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65  rc = winFileSize
14e10 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
14e20 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
14e30 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28  e, &sz);.    if(
14e40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14e50 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
14e60 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
14e70 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f  IOERR_SHMSIZE, o
14e80 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
14e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14ea0 22 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44  "winShmMap1", pD
14eb0 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  bFd->zPath);.   
14ec0 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
14ed0 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
14ee0 69 66 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a  if( sz<nByte ){.
14ef0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71        /* The req
14f00 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
14f10 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78  gion does not ex
14f20 69 73 74 2e 20 49 66 20 69 73 57 72 69 74 65 20  ist. If isWrite 
14f30 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20  is set to.      
14f40 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20 65 61  ** zero, exit ea
14f50 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65  rly. *pp will be
14f60 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
14f70 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
14f80 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ned..      **.  
14f90 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69      ** Alternati
14fa0 76 65 6c 79 2c 20 69 66 20 69 73 57 72 69 74 65  vely, if isWrite
14fb0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73   is non-zero, us
14fc0 65 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f  e ftruncate() to
14fd0 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20   allocate.      
14fe0 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
14ff0 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a   memory region..
15000 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
15010 66 28 20 21 69 73 57 72 69 74 65 20 29 20 67 6f  f( !isWrite ) go
15020 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
15030 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72        rc = winTr
15040 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f  uncate((sqlite3_
15050 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65  file *)&pShmNode
15060 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b  ->hFile, nByte);
15070 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
15080 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15090 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
150a0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
150b0 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74  R_SHMSIZE, osGet
150c0 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
150d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
150e0 69 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 46  inShmMap2", pDbF
150f0 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
15100 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
15110 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
15120 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74   }..    /* Map t
15130 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
15140 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20  ory region into 
15150 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
15160 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f  ddress space. */
15170 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74  .    apNew = (st
15180 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a  ruct ShmRegion *
15190 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
151a0 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  (.        pShmNo
151b0 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52  de->aRegion, (iR
151c0 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28  egion+1)*sizeof(
151d0 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b  apNew[0]).    );
151e0 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20  .    if( !apNew 
151f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
15200 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
15210 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
15220 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
15230 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52      pShmNode->aR
15240 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a  egion = apNew;..
15250 20 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e      while( pShmN
15260 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52  ode->nRegion<=iR
15270 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48  egion ){.      H
15280 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20  ANDLE hMap;     
15290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69             /* fi
152a0 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c  le-mapping handl
152b0 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20  e */.      void 
152c0 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20  *pMap = 0;      
152d0 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 65 64         /* Mapped
152e0 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a   memory region *
152f0 2f 0a 20 20 20 20 20 0a 20 20 20 20 20 20 68 4d  /.     .      hM
15300 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
15310 65 4d 61 70 70 69 6e 67 28 70 53 68 6d 4e 6f 64  eMapping(pShmNod
15320 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a 20 20 20  e->hFile.h, .   
15330 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47         NULL, PAG
15340 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20  E_READWRITE, 0, 
15350 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20  nByte, NULL.    
15360 20 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41    );.      OSTRA
15370 43 45 28 28 22 53 48 4d 2d 4d 41 50 20 70 69 64  CE(("SHM-MAP pid
15380 2d 25 64 20 63 72 65 61 74 65 20 72 65 67 69 6f  -%d create regio
15390 6e 3d 25 64 20 6e 62 79 74 65 3d 25 64 20 25 73  n=%d nbyte=%d %s
153a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
153b0 20 20 20 20 28 69 6e 74 29 6f 73 47 65 74 43 75      (int)osGetCu
153c0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
153d0 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  , pShmNode->nReg
153e0 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20  ion, nByte,.    
153f0 20 20 20 20 20 20 20 20 20 20 20 68 4d 61 70 20             hMap 
15400 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
15410 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68  "));.      if( h
15420 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Map ){.        i
15430 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 70 53 68  nt iOffset = pSh
15440 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73  mNode->nRegion*s
15450 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20  zRegion;.       
15460 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66   int iOffsetShif
15470 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69  t = iOffset % wi
15480 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63  nSysInfo.dwAlloc
15490 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79  ationGranularity
154a0 3b 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d  ;.        pMap =
154b0 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
154c0 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f  (hMap, FILE_MAP_
154d0 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50  WRITE | FILE_MAP
154e0 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20  _READ,.         
154f0 20 20 20 30 2c 20 69 4f 66 66 73 65 74 20 2d 20     0, iOffset - 
15500 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a  iOffsetShift, sz
15510 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74  Region + iOffset
15520 53 68 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b  Shift.        );
15530 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
15540 28 28 22 53 48 4d 2d 4d 41 50 20 70 69 64 2d 25  (("SHM-MAP pid-%
15550 64 20 6d 61 70 20 72 65 67 69 6f 6e 3d 25 64 20  d map region=%d 
15560 6f 66 66 73 65 74 3d 25 64 20 73 69 7a 65 3d 25  offset=%d size=%
15570 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
15580 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 6f            (int)o
15590 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
155a0 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65  ssId(), pShmNode
155b0 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f 66 66 73  ->nRegion, iOffs
155c0 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  et,.            
155d0 20 20 20 20 20 73 7a 52 65 67 69 6f 6e 2c 20 70       szRegion, p
155e0 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  Map ? "ok" : "fa
155f0 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d  iled"));.      }
15600 0a 20 20 20 20 20 20 69 66 28 20 21 70 4d 61 70  .      if( !pMap
15610 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68 6d   ){.        pShm
15620 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  Node->lastErrno 
15630 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
15640 28 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ();.        rc =
15650 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
15660 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50  ITE_IOERR_SHMMAP
15670 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74  , pShmNode->last
15680 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
15690 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d          "winShmM
156a0 61 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  ap3", pDbFd->zPa
156b0 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  th);.        if(
156c0 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65 48   hMap ) osCloseH
156d0 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20  andle(hMap);.   
156e0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
156f0 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  e_out;.      }..
15700 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
15710 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65  aRegion[pShmNode
15720 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20  ->nRegion].pMap 
15730 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20 20 70 53  = pMap;.      pS
15740 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b  hmNode->aRegion[
15750 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
15760 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a  n].hMap = hMap;.
15770 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
15780 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d  nRegion++;.    }
15790 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75  .  }..shmpage_ou
157a0 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  t:.  if( pShmNod
157b0 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69  e->nRegion>iRegi
157c0 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f  on ){.    int iO
157d0 66 66 73 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a  ffset = iRegion*
157e0 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e  szRegion;.    in
157f0 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d  t iOffsetShift =
15800 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79   iOffset % winSy
15810 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69  sInfo.dwAllocati
15820 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20  onGranularity;. 
15830 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63 68     char *p = (ch
15840 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61  ar *)pShmNode->a
15850 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e  Region[iRegion].
15860 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20  pMap;.    *pp = 
15870 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66 73  (void *)&p[iOffs
15880 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73  etShift];.  }els
15890 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a  e{.    *pp = 0;.
158a0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
158b0 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
158c0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  de->mutex);.  re
158d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73  turn rc;.}..#els
158e0 65 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68  e.# define winSh
158f0 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66  mMap     0.# def
15900 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20  ine winShmLock  
15910 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e    0.# define win
15920 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64  ShmBarrier 0.# d
15930 65 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61  efine winShmUnma
15940 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20  p   0.#endif /* 
15950 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15960 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a  MIT_WAL */../*.*
15970 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20  * Here ends the 
15980 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
15990 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69  f all sqlite3_fi
159a0 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a  le methods..**.*
159b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
159c0 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65  ***** End sqlite
159d0 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a  3_file Methods *
159e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
159f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
15a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
15a50 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f  /*.** This vecto
15a60 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68  r defines all th
15a70 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63  e methods that c
15a80 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e  an operate on an
15a90 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  .** sqlite3_file
15aa0 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73   for win32..*/.s
15ab0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
15ac0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77  te3_io_methods w
15ad0 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20  inIoMethod = {. 
15ae0 20 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   2,             
15af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b00 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
15b10 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20 20 20    winClose,     
15b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b30 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20    /* xClose */. 
15b40 20 77 69 6e 52 65 61 64 2c 20 20 20 20 20 20 20   winRead,       
15b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b60 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 77   /* xRead */.  w
15b70 69 6e 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  inWrite,        
15b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15b90 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 77 69  * xWrite */.  wi
15ba0 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
15bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15bc0 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20   xTruncate */.  
15bd0 77 69 6e 53 79 6e 63 2c 20 20 20 20 20 20 20 20  winSync,        
15be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bf0 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 77 69  /* xSync */.  wi
15c00 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20  nFileSize,      
15c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15c20 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20   xFileSize */.  
15c30 77 69 6e 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  winLock,        
15c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c50 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69  /* xLock */.  wi
15c60 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  nUnlock,        
15c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15c80 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69   xUnlock */.  wi
15c90 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  nCheckReservedLo
15ca0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ck,           /*
15cb0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
15cc0 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ock */.  winFile
15cd0 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20  Control,        
15ce0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
15cf0 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77 69  eControl */.  wi
15d00 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20  nSectorSize,    
15d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15d20 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a   xSectorSize */.
15d30 20 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61    winDeviceChara
15d40 63 74 65 72 69 73 74 69 63 73 2c 20 20 20 20 20  cteristics,     
15d50 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72    /* xDeviceChar
15d60 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20  acteristics */. 
15d70 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20 20 20   winShmMap,     
15d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d90 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20   /* xShmMap */. 
15da0 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20 20   winShmLock,    
15db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15dc0 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a   /* xShmLock */.
15dd0 20 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 2c    winShmBarrier,
15de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15df0 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72    /* xShmBarrier
15e00 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e 6d 61   */.  winShmUnma
15e10 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
15e20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d        /* xShmUnm
15e30 61 70 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a  ap */.};../*****
15e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15e80 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
15e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15ea0 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  **** sqlite3_vfs
15eb0 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
15ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15ed0 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
15ee0 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
15ef0 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ns the implement
15f00 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73  ation of methods
15f10 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   on the.** sqlit
15f20 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a  e3_vfs object..*
15f30 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  /../*.** Convert
15f40 20 61 20 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d   a UTF-8 filenam
15f50 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20  e into whatever 
15f60 66 6f 72 6d 20 74 68 65 20 75 6e 64 65 72 6c 79  form the underly
15f70 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67  ing.** operating
15f80 20 73 79 73 74 65 6d 20 77 61 6e 74 73 20 66 69   system wants fi
15f90 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20 53 70 61  lenames in.  Spa
15fa0 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
15fb0 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61  esult.** is obta
15fc0 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
15fd0 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
15fe0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
15ff0 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  g.** function..*
16000 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 63  /.static void *c
16010 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61  onvertUtf8Filena
16020 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  me(const char *z
16030 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69  Filename){.  voi
16040 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  d *zConverted = 
16050 30 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  0;.  if( isNT() 
16060 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65  ){.    zConverte
16070 64 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64  d = utf8ToUnicod
16080 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 2f 2a  e(zFilename);./*
16090 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20   isNT() is 1 if 
160a0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
160b0 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65  =1, so this else
160c0 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74   is never execut
160d0 65 64 2e 20 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  ed. .*/.#if SQLI
160e0 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20  TE_OS_WINCE==0. 
160f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e   }else{.    zCon
16100 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33  verted = sqlite3
16110 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d  _win32_utf8_to_m
16120 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  bcs(zFilename);.
16130 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 2f 2a 20  #endif.  }.  /* 
16140 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64  caller will hand
16150 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  le out of memory
16160 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f   */.  return zCo
16170 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  nverted;.}../*.*
16180 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f  * Create a tempo
16190 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69  rary file name i
161a0 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75  n zBuf.  zBuf mu
161b0 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68  st be big enough
161c0 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 70   to.** hold at p
161d0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
161e0 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73  characters..*/.s
161f0 74 61 74 69 63 20 69 6e 74 20 67 65 74 54 65 6d  tatic int getTem
16200 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20  pname(int nBuf, 
16210 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73  char *zBuf){.  s
16220 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61 72  tatic char zChar
16230 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65  s[] =.    "abcde
16240 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
16250 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44  vwxyz".    "ABCD
16260 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
16270 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32  UVWXYZ".    "012
16280 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a 65  3456789";.  size
16290 5f 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20  _t i, j;.  char 
162a0 7a 54 65 6d 70 50 61 74 68 5b 4d 41 58 5f 50 41  zTempPath[MAX_PA
162b0 54 48 2b 31 5d 3b 0a 0a 20 20 2f 2a 20 49 74 27  TH+1];..  /* It'
162c0 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
162d0 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
162e0 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
162f0 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
16300 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
16310 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
16320 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
16330 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
16340 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
16350 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f  n failing. .  */
16360 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
16370 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
16380 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 69 66  E_IOERR );..  if
16390 28 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  ( sqlite3_temp_d
163a0 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20  irectory ){.    
163b0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
163c0 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54  (MAX_PATH-30, zT
163d0 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20 73  empPath, "%s", s
163e0 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
163f0 63 74 6f 72 79 29 3b 0a 20 20 7d 65 6c 73 65 20  ctory);.  }else 
16400 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
16410 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a    char *zMulti;.
16420 20 20 20 20 57 43 48 41 52 20 7a 57 69 64 65 50      WCHAR zWideP
16430 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20  ath[MAX_PATH];. 
16440 20 20 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68     osGetTempPath
16450 57 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a  W(MAX_PATH-30, z
16460 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 7a  WidePath);.    z
16470 4d 75 6c 74 69 20 3d 20 75 6e 69 63 6f 64 65 54  Multi = unicodeT
16480 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74 68 29  oUtf8(zWidePath)
16490 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74 69  ;.    if( zMulti
164a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
164b0 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
164c0 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74  ATH-30, zTempPat
164d0 68 2c 20 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29  h, "%s", zMulti)
164e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
164f0 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20  free(zMulti);.  
16500 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
16510 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
16520 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  RR_NOMEM;.    }.
16530 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69  /* isNT() is 1 i
16540 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
16550 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c  E==1, so this el
16560 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63  se is never exec
16570 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20  uted. .** Since 
16580 74 68 65 20 41 4e 53 49 20 76 65 72 73 69 6f 6e  the ANSI version
16590 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77   of these Window
165a0 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69  s API do not exi
165b0 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a  st for WINCE,.**
165c0 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20   it's important 
165d0 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65  to not reference
165e0 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20   them for WINCE 
165f0 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53  builds..*/.#if S
16600 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
16610 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  0.  }else{.    c
16620 68 61 72 20 2a 7a 55 74 66 38 3b 0a 20 20 20 20  har *zUtf8;.    
16630 63 68 61 72 20 7a 4d 62 63 73 50 61 74 68 5b 4d  char zMbcsPath[M
16640 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 6f 73  AX_PATH];.    os
16650 47 65 74 54 65 6d 70 50 61 74 68 41 28 4d 41 58  GetTempPathA(MAX
16660 5f 50 41 54 48 2d 33 30 2c 20 7a 4d 62 63 73 50  _PATH-30, zMbcsP
16670 61 74 68 29 3b 0a 20 20 20 20 7a 55 74 66 38 20  ath);.    zUtf8 
16680 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
16690 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 4d 62  mbcs_to_utf8(zMb
166a0 63 73 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28  csPath);.    if(
166b0 20 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20   zUtf8 ){.      
166c0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
166d0 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54  (MAX_PATH-30, zT
166e0 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20 7a  empPath, "%s", z
166f0 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  Utf8);.      sql
16700 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29  ite3_free(zUtf8)
16710 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16720 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16730 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
16740 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
16750 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
16760 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
16770 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  r is large enoug
16780 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72  h for the tempor
16790 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e  ary file .  ** n
167a0 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ame. If it is no
167b0 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
167c0 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69  _ERROR..  */.  i
167d0 66 28 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65  f( (sqlite3Strle
167e0 6e 33 30 28 7a 54 65 6d 70 50 61 74 68 29 20 2b  n30(zTempPath) +
167f0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
16800 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  (SQLITE_TEMP_FIL
16810 45 5f 50 52 45 46 49 58 29 20 2b 20 31 37 29 20  E_PREFIX) + 17) 
16820 3e 3d 20 6e 42 75 66 20 29 7b 0a 20 20 20 20 72  >= nBuf ){.    r
16830 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
16840 4f 52 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69  OR;.  }..  for(i
16850 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
16860 28 7a 54 65 6d 70 50 61 74 68 29 3b 20 69 3e 30  (zTempPath); i>0
16870 20 26 26 20 7a 54 65 6d 70 50 61 74 68 5b 69 2d   && zTempPath[i-
16880 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d 2d 29 7b 7d  1]=='\\'; i--){}
16890 0a 20 20 7a 54 65 6d 70 50 61 74 68 5b 69 5d 20  .  zTempPath[i] 
168a0 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  = 0;..  sqlite3_
168b0 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 37  snprintf(nBuf-17
168c0 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20 20  , zBuf,.        
168d0 20 20 20 20 20 20 20 20 20 20 20 22 25 73 5c 5c             "%s\\
168e0 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  "SQLITE_TEMP_FIL
168f0 45 5f 50 52 45 46 49 58 2c 20 7a 54 65 6d 70 50  E_PREFIX, zTempP
16900 61 74 68 29 3b 0a 20 20 6a 20 3d 20 73 71 6c 69  ath);.  j = sqli
16910 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66  te3Strlen30(zBuf
16920 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  );.  sqlite3_ran
16930 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75  domness(15, &zBu
16940 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  f[j]);.  for(i=0
16950 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b  ; i<15; i++, j++
16960 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d  ){.    zBuf[j] =
16970 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28   (char)zChars[ (
16980 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
16990 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28  Buf[j])%(sizeof(
169a0 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20  zChars)-1) ];.  
169b0 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b  }.  zBuf[j] = 0;
169c0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ..  OSTRACE(("TE
169d0 4d 50 20 46 49 4c 45 4e 41 4d 45 3a 20 25 73 5c  MP FILENAME: %s\
169e0 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20 20 72 65  n", zBuf));.  re
169f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
16a00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
16a10 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
16a20 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20 20   int winOpen(.  
16a30 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
16a40 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74  s,        /* Not
16a50 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74   used */.  const
16a60 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
16a70 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
16a80 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29  the file (UTF-8)
16a90 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
16aa0 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
16ab0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 53 51 4c  /* Write the SQL
16ac0 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  ite file handle 
16ad0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
16ae0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
16af0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65      /* Open mode
16b00 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20   flags */.  int 
16b10 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20  *pOutFlags      
16b20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20        /* Status 
16b30 72 65 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f 0a  return flags */.
16b40 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20  ){.  HANDLE h;. 
16b50 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
16b60 3b 0a 20 20 44 57 4f 52 44 20 64 77 44 65 73 69  ;.  DWORD dwDesi
16b70 72 65 64 41 63 63 65 73 73 3b 0a 20 20 44 57 4f  redAccess;.  DWO
16b80 52 44 20 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a  RD dwShareMode;.
16b90 20 20 44 57 4f 52 44 20 64 77 43 72 65 61 74 69    DWORD dwCreati
16ba0 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20  onDisposition;. 
16bb0 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 41 6e   DWORD dwFlagsAn
16bc0 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 30 3b  dAttributes = 0;
16bd0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
16be0 49 4e 43 45 0a 20 20 69 6e 74 20 69 73 54 65 6d  INCE.  int isTem
16bf0 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  p = 0;.#endif.  
16c00 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
16c10 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
16c20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
16c30 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
16c40 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f  /* Filename in O
16c50 53 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20  S encoding */.  
16c60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66  const char *zUtf
16c70 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f  8Name = zName; /
16c80 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54  * Filename in UT
16c90 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a  F-8 encoding */.
16ca0 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a    int cnt = 0;..
16cb0 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74    /* If argument
16cc0 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c   zPath is a NULL
16cd0 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66   pointer, this f
16ce0 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69  unction is requi
16cf0 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a  red to open.  **
16d00 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
16d10 65 2e 20 55 73 65 20 74 68 69 73 20 62 75 66 66  e. Use this buff
16d20 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  er to store the 
16d30 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20  file name in..  
16d40 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61  */.  char zTmpna
16d50 6d 65 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 20  me[MAX_PATH+1]; 
16d60 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73      /* Buffer us
16d70 65 64 20 74 6f 20 63 72 65 61 74 65 20 74 65 6d  ed to create tem
16d80 70 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 0a 20  p filename */.. 
16d90 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16da0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
16db0 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75  /* Function Retu
16dc0 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69 66 20 21  rn Code */.#if !
16dd0 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
16de0 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  || SQLITE_OS_WIN
16df0 43 45 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  CE.  int eType =
16e00 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30   flags&0xFFFFFF0
16e10 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66  0;  /* Type of f
16e20 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23  ile to open */.#
16e30 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20 69 73 45  endif..  int isE
16e40 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61  xclusive  = (fla
16e50 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
16e60 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69  _EXCLUSIVE);.  i
16e70 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20  nt isDelete     
16e80 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
16e90 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
16ea0 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43  LOSE);.  int isC
16eb0 72 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61  reate     = (fla
16ec0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
16ed0 5f 43 52 45 41 54 45 29 3b 0a 23 69 66 6e 64 65  _CREATE);.#ifnde
16ee0 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69  f NDEBUG.  int i
16ef0 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66  sReadonly   = (f
16f00 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
16f10 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 23 65  EN_READONLY);.#e
16f20 6e 64 69 66 0a 20 20 69 6e 74 20 69 73 52 65 61  ndif.  int isRea
16f30 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73  dWrite  = (flags
16f40 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
16f50 45 41 44 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e  EADWRITE);..#ifn
16f60 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74  def NDEBUG.  int
16f70 20 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d   isOpenJournal =
16f80 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a   (isCreate && (.
16f90 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53          eType==S
16fa0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
16fb0 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  R_JOURNAL .     
16fc0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
16fd0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
16fe0 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
16ff0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
17000 41 4c 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a  AL.  ));.#endif.
17010 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20  .  /* Check the 
17020 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d  following statem
17030 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a  ents are true: .
17040 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20    **.  **   (a) 
17050 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74  Exactly one of t
17060 68 65 20 52 45 41 44 57 52 49 54 45 20 61 6e 64  he READWRITE and
17070 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20   READONLY flags 
17080 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64  must be set, and
17090 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20   .  **   (b) if 
170a0 43 52 45 41 54 45 20 69 73 20 73 65 74 2c 20 74  CREATE is set, t
170b0 68 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75  hen READWRITE mu
170c0 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20  st also be set, 
170d0 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69  and.  **   (c) i
170e0 66 20 45 58 43 4c 55 53 49 56 45 20 69 73 20 73  f EXCLUSIVE is s
170f0 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20  et, then CREATE 
17100 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
17110 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20  ..  **   (d) if 
17120 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73  DELETEONCLOSE is
17130 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54   set, then CREAT
17140 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
17150 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
17160 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30  t((isReadonly==0
17170 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d   || isReadWrite=
17180 3d 30 29 20 26 26 20 28 69 73 52 65 61 64 57 72  =0) && (isReadWr
17190 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c  ite || isReadonl
171a0 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  y));.  assert(is
171b0 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52  Create==0 || isR
171c0 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73  eadWrite);.  ass
171d0 65 72 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d  ert(isExclusive=
171e0 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
171f0 0a 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65  .  assert(isDele
17200 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74  te==0 || isCreat
17210 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61  e);..  /* The ma
17220 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72  in DB, main jour
17230 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e  nal, WAL file an
17240 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  d master journal
17250 20 61 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a   are never .  **
17260 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
17270 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20  eleted. Nor are 
17280 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72  they ever tempor
17290 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20  ary files.  */. 
172a0 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
172b0 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
172c0 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
172d0 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20  PEN_MAIN_DB );. 
172e0 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
172f0 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
17300 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
17310 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
17320 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
17330 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
17340 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
17350 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
17360 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73  JOURNAL );.  ass
17370 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
17380 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
17390 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
173a0 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73  WAL );..  /* Ass
173b0 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70  ert that the upp
173c0 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74  er layer has set
173d0 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c   one of the "fil
173e0 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a  e-type" flags. *
173f0 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  /.  assert( eTyp
17400 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
17410 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65  AIN_DB      || e
17420 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
17430 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20  N_TEMP_DB .     
17440 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
17450 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
17460 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53  RNAL || eType==S
17470 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
17480 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20  JOURNAL .       
17490 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
174a0 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
174b0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
174c0 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
174d0 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20  JOURNAL .       
174e0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
174f0 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
17500 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  DB || eType==SQL
17510 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29  ITE_OPEN_WAL.  )
17520 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ;..  assert( id!
17530 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =0 );.  UNUSED_P
17540 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
17550 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 49 4e  .  pFile->h = IN
17560 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
17570 55 45 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  UE;..  /* If the
17580 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
17590 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
175a0 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 65 6e 65 72  n is NULL, gener
175b0 61 74 65 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70  ate a .  ** temp
175c0 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
175d0 74 6f 20 75 73 65 20 0a 20 20 2a 2f 0a 20 20 69  to use .  */.  i
175e0 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 29 7b  f( !zUtf8Name ){
175f0 0a 20 20 20 20 61 73 73 65 72 74 28 69 73 44 65  .    assert(isDe
17600 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65 6e 4a  lete && !isOpenJ
17610 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 72 63 20  ournal);.    rc 
17620 3d 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41  = getTempname(MA
17630 58 5f 50 41 54 48 2b 31 2c 20 7a 54 6d 70 6e 61  X_PATH+1, zTmpna
17640 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  me);.    if( rc!
17650 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17660 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17670 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e 61     }.    zUtf8Na
17680 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20  me = zTmpname;. 
17690 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74   }..  /* Convert
176a0 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f   the filename to
176b0 20 74 68 65 20 73 79 73 74 65 6d 20 65 6e 63 6f   the system enco
176c0 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76  ding. */.  zConv
176d0 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55  erted = convertU
176e0 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66  tf8Filename(zUtf
176f0 38 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43  8Name);.  if( zC
17700 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
17710 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17720 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
17730 7d 0a 0a 20 20 69 66 28 20 69 73 52 65 61 64 57  }..  if( isReadW
17740 72 69 74 65 20 29 7b 0a 20 20 20 20 64 77 44 65  rite ){.    dwDe
17750 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47 45  siredAccess = GE
17760 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e  NERIC_READ | GEN
17770 45 52 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65  ERIC_WRITE;.  }e
17780 6c 73 65 7b 0a 20 20 20 20 64 77 44 65 73 69 72  lse{.    dwDesir
17790 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52  edAccess = GENER
177a0 49 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20  IC_READ;.  }..  
177b0 2f 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45  /* SQLITE_OPEN_E
177c0 58 43 4c 55 53 49 56 45 20 69 73 20 75 73 65 64  XCLUSIVE is used
177d0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
177e0 61 74 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73  at a new file is
177f0 20 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 2e 20   .  ** created. 
17800 53 51 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 75  SQLite doesn't u
17810 73 65 20 69 74 20 74 6f 20 69 6e 64 69 63 61 74  se it to indicat
17820 65 20 22 65 78 63 6c 75 73 69 76 65 20 61 63 63  e "exclusive acc
17830 65 73 73 22 20 0a 20 20 2a 2a 20 61 73 20 69 74  ess" .  ** as it
17840 20 69 73 20 75 73 75 61 6c 6c 79 20 75 6e 64 65   is usually unde
17850 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69  rstood..  */.  i
17860 66 28 20 69 73 45 78 63 6c 75 73 69 76 65 20 29  f( isExclusive )
17870 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 73  {.    /* Creates
17880 20 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f 6e 6c   a new file, onl
17890 79 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  y if it does not
178a0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20   already exist. 
178b0 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  */.    /* If the
178c0 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 69 74   file exists, it
178d0 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 64   fails. */.    d
178e0 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
178f0 74 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f 4e 45  tion = CREATE_NE
17900 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  W;.  }else if( i
17910 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 2f  sCreate ){.    /
17920 2a 20 4f 70 65 6e 20 65 78 69 73 74 69 6e 67 20  * Open existing 
17930 66 69 6c 65 2c 20 6f 72 20 63 72 65 61 74 65 20  file, or create 
17940 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 65 78  if it doesn't ex
17950 69 73 74 20 2a 2f 0a 20 20 20 20 64 77 43 72 65  ist */.    dwCre
17960 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
17970 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a   = OPEN_ALWAYS;.
17980 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
17990 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f 6e  Opens a file, on
179a0 6c 79 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  ly if it exists.
179b0 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69   */.    dwCreati
179c0 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20  onDisposition = 
179d0 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20  OPEN_EXISTING;. 
179e0 20 7d 0a 0a 20 20 64 77 53 68 61 72 65 4d 6f 64   }..  dwShareMod
179f0 65 20 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f 52  e = FILE_SHARE_R
17a00 45 41 44 20 7c 20 46 49 4c 45 5f 53 48 41 52 45  EAD | FILE_SHARE
17a10 5f 57 52 49 54 45 3b 0a 0a 20 20 69 66 28 20 69  _WRITE;..  if( i
17a20 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 53  sDelete ){.#if S
17a30 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
17a40 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
17a50 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41  ributes = FILE_A
17a60 54 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 3b  TTRIBUTE_HIDDEN;
17a70 0a 20 20 20 20 69 73 54 65 6d 70 20 3d 20 31 3b  .    isTemp = 1;
17a80 0a 23 65 6c 73 65 0a 20 20 20 20 64 77 46 6c 61  .#else.    dwFla
17a90 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
17aa0 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  = FILE_ATTRIBUTE
17ab0 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20 20 20 20  _TEMPORARY.     
17ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ad0 20 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45            | FILE
17ae0 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 45  _ATTRIBUTE_HIDDE
17af0 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N.              
17b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b10 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c   | FILE_FLAG_DEL
17b20 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65  ETE_ON_CLOSE;.#e
17b30 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
17b40 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
17b50 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54  ibutes = FILE_AT
17b60 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a  TRIBUTE_NORMAL;.
17b70 20 20 7d 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73    }.  /* Reports
17b80 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e   from the intern
17b90 65 74 20 61 72 65 20 74 68 61 74 20 70 65 72 66  et are that perf
17ba0 6f 72 6d 61 6e 63 65 20 69 73 20 61 6c 77 61 79  ormance is alway
17bb0 73 0a 20 20 2a 2a 20 62 65 74 74 65 72 20 69 66  s.  ** better if
17bc0 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f   FILE_FLAG_RANDO
17bd0 4d 5f 41 43 43 45 53 53 20 69 73 20 75 73 65 64  M_ACCESS is used
17be0 2e 20 20 54 69 63 6b 65 74 20 23 32 36 39 39 2e  .  Ticket #2699.
17bf0 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   */.#if SQLITE_O
17c00 53 5f 57 49 4e 43 45 0a 20 20 64 77 46 6c 61 67  S_WINCE.  dwFlag
17c10 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 7c  sAndAttributes |
17c20 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44  = FILE_FLAG_RAND
17c30 4f 4d 5f 41 43 43 45 53 53 3b 0a 23 65 6e 64 69  OM_ACCESS;.#endi
17c40 66 0a 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  f..  if( isNT() 
17c50 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68  ){.    while( (h
17c60 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57   = osCreateFileW
17c70 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
17c80 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
17c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ca0 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
17cb0 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ess,.           
17cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cd0 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20     dwShareMode, 
17ce0 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
17cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d00 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
17d10 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20  sposition,.     
17d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d30 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67 73           dwFlags
17d40 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20  AndAttributes,. 
17d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d60 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c               NUL
17d70 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  L))==INVALID_HAN
17d80 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20  DLE_VALUE &&.   
17d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17da0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 72 79             retry
17db0 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
17dc0 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 2f 2a 20 69  tErrno) ){}./* i
17dd0 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51  sNT() is 1 if SQ
17de0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31  LITE_OS_WINCE==1
17df0 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69  , so this else i
17e00 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64  s never executed
17e10 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20  . .** Since the 
17e20 41 4e 53 49 20 76 65 72 73 69 6f 6e 20 6f 66 20  ANSI version of 
17e30 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50  these Windows AP
17e40 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66  I do not exist f
17e50 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27  or WINCE,.** it'
17e60 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e  s important to n
17e70 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ot reference the
17e80 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c  m for WINCE buil
17e90 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ds..*/.#if SQLIT
17ea0 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20  E_OS_WINCE==0.  
17eb0 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
17ec0 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46  ( (h = osCreateF
17ed0 69 6c 65 41 28 28 4c 50 43 53 54 52 29 7a 43 6f  ileA((LPCSTR)zCo
17ee0 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f00 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
17f10 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
17f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f30 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
17f40 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  e, NULL,.       
17f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f60 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f         dwCreatio
17f70 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20  nDisposition,.  
17f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f90 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c              dwFl
17fa0 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
17fb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fd0 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f  NULL))==INVALID_
17fe0 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a  HANDLE_VALUE &&.
17ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
18010 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
18020 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 23  lastErrno) ){}.#
18030 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 6c 6f 67  endif.  }..  log
18040 49 6f 65 72 72 28 63 6e 74 29 3b 0a 0a 20 20 4f  Ioerr(cnt);..  O
18050 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64  STRACE(("OPEN %d
18060 20 25 73 20 30 78 25 6c 78 20 25 73 5c 6e 22 2c   %s 0x%lx %s\n",
18070 20 0a 20 20 20 20 20 20 20 20 20 20 20 68 2c 20   .           h, 
18080 7a 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64  zName, dwDesired
18090 41 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20 20  Access, .       
180a0 20 20 20 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48      h==INVALID_H
180b0 41 4e 44 4c 45 5f 56 41 4c 55 45 20 3f 20 22 66  ANDLE_VALUE ? "f
180c0 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b  ailed" : "ok"));
180d0 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c  ..  if( h==INVAL
180e0 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
180f0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
18100 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
18110 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45  rno;.    winLogE
18120 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
18130 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  OPEN, pFile->las
18140 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 65 6e  tErrno, "winOpen
18150 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20  ", zUtf8Name);. 
18160 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
18170 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
18180 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
18190 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65   && !isExclusive
181a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
181b0 20 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a   winOpen(pVfs, z
181c0 4e 61 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20 20  Name, id, .     
181d0 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 7c          ((flags|
181e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
181f0 4f 4e 4c 59 29 26 7e 28 53 51 4c 49 54 45 5f 4f  ONLY)&~(SQLITE_O
18200 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54  PEN_CREATE|SQLIT
18210 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
18220 29 29 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a  )), pOutFlags);.
18230 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18240 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
18250 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
18260 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
18270 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  OutFlags ){.    
18280 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
18290 29 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c  ){.      *pOutFl
182a0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
182b0 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20  N_READWRITE;.   
182c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
182d0 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  OutFlags = SQLIT
182e0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
182f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6d 65  .    }.  }..  me
18300 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73  mset(pFile, 0, s
18310 69 7a 65 6f 66 28 2a 70 46 69 6c 65 29 29 3b 0a  izeof(*pFile));.
18320 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64    pFile->pMethod
18330 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b   = &winIoMethod;
18340 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b  .  pFile->h = h;
18350 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  .  pFile->lastEr
18360 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a  rno = NO_ERROR;.
18370 20 20 70 46 69 6c 65 2d 3e 70 56 66 73 20 3d 20    pFile->pVfs = 
18380 70 56 66 73 3b 0a 20 20 70 46 69 6c 65 2d 3e 70  pVfs;.  pFile->p
18390 53 68 6d 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65  Shm = 0;.  pFile
183a0 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b  ->zPath = zName;
183b0 0a 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72  .  pFile->sector
183c0 53 69 7a 65 20 3d 20 67 65 74 53 65 63 74 6f 72  Size = getSector
183d0 53 69 7a 65 28 70 56 66 73 2c 20 7a 55 74 66 38  Size(pVfs, zUtf8
183e0 4e 61 6d 65 29 3b 0a 0a 23 69 66 20 53 51 4c 49  Name);..#if SQLI
183f0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66  TE_OS_WINCE.  if
18400 28 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26  ( isReadWrite &&
18410 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
18420 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20 20 20  PEN_MAIN_DB.    
18430 20 20 20 26 26 20 21 77 69 6e 63 65 43 72 65 61     && !winceCrea
18440 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 46  teLock(zName, pF
18450 69 6c 65 29 0a 20 20 29 7b 0a 20 20 20 20 6f 73  ile).  ){.    os
18460 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29 3b 0a  CloseHandle(h);.
18470 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
18480 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
18490 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
184a0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
184b0 20 7d 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20   }.  if( isTemp 
184c0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44  ){.    pFile->zD
184d0 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a  eleteOnClose = z
184e0 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c  Converted;.  }el
184f0 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
18500 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
18510 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a  Converted);.  }.
18520 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b  .  OpenCounter(+
18530 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  1);.  return rc;
18540 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
18550 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e   the named file.
18560 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
18570 20 57 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f   Windows does no
18580 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c 65 20 74  t allow a file t
18590 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 66 20  o be deleted if 
185a0 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72  some other.** pr
185b0 6f 63 65 73 73 20 68 61 73 20 69 74 20 6f 70 65  ocess has it ope
185c0 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20 61 20  n.  Sometimes a 
185d0 76 69 72 75 73 20 73 63 61 6e 6e 65 72 20 6f 72  virus scanner or
185e0 20 69 6e 64 65 78 69 6e 67 20 70 72 6f 67 72 61   indexing progra
185f0 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e 20 61  m.** will open a
18600 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 68   journal file sh
18610 6f 72 74 6c 79 20 61 66 74 65 72 20 69 74 20 69  ortly after it i
18620 73 20 63 72 65 61 74 65 64 20 69 6e 20 6f 72 64  s created in ord
18630 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77 68 61 74  er to do.** what
18640 65 76 65 72 20 69 74 20 64 6f 65 73 2e 20 20 57  ever it does.  W
18650 68 69 6c 65 20 74 68 69 73 20 6f 74 68 65 72 20  hile this other 
18660 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
18670 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 6f  ng the.** file o
18680 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20 62 65 20  pen, we will be 
18690 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  unable to delete
186a0 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72   it.  To work ar
186b0 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20 70 72 6f  ound this.** pro
186c0 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61 79 20 31  blem, we delay 1
186d0 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  00 milliseconds 
186e0 61 6e 64 20 74 72 79 20 74 6f 20 64 65 6c 65 74  and try to delet
186f0 65 20 61 67 61 69 6e 2e 20 20 55 70 0a 2a 2a 20  e again.  Up.** 
18700 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41  to MX_DELETION_A
18710 54 54 45 4d 50 54 73 20 64 65 6c 65 74 69 6f 6e  TTEMPTs deletion
18720 20 61 74 74 65 6d 70 74 73 20 61 72 65 20 72 75   attempts are ru
18730 6e 20 62 65 66 6f 72 65 20 67 69 76 69 6e 67 0a  n before giving.
18740 2a 2a 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e  ** up and return
18750 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f  ing an error..*/
18760 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44  .static int winD
18770 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33  elete(.  sqlite3
18780 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
18790 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64       /* Not used
187a0 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63   on win32 */.  c
187b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
187c0 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61  name,      /* Na
187d0 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 65  me of file to de
187e0 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 73 79  lete */.  int sy
187f0 6e 63 44 69 72 20 20 20 20 20 20 20 20 20 20 20  ncDir           
18800 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65        /* Not use
18810 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 29 7b  d on win32 */.){
18820 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
18830 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52    int rc;.  DWOR
18840 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 76  D lastErrno;.  v
18850 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b  oid *zConverted;
18860 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
18870 54 45 52 28 70 56 66 73 29 3b 0a 20 20 55 4e 55  TER(pVfs);.  UNU
18880 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 73 79  SED_PARAMETER(sy
18890 6e 63 44 69 72 29 3b 0a 0a 20 20 53 69 6d 75 6c  ncDir);..  Simul
188a0 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
188b0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  n SQLITE_IOERR_D
188c0 45 4c 45 54 45 29 3b 0a 20 20 7a 43 6f 6e 76 65  ELETE);.  zConve
188d0 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74  rted = convertUt
188e0 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65  f8Filename(zFile
188f0 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  name);.  if( zCo
18900 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
18910 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18920 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
18930 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
18940 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
18950 20 77 68 69 6c 65 28 20 6f 73 47 65 74 46 69 6c   while( osGetFil
18960 65 41 74 74 72 69 62 75 74 65 73 57 28 7a 43 6f  eAttributesW(zCo
18970 6e 76 65 72 74 65 64 29 21 3d 49 4e 56 41 4c 49  nverted)!=INVALI
18980 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
18990 53 20 26 26 0a 20 20 20 20 20 20 20 20 20 28 72  S &&.         (r
189a0 63 20 3d 20 6f 73 44 65 6c 65 74 65 46 69 6c 65  c = osDeleteFile
189b0 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 29 3d 3d  W(zConverted))==
189c0 30 20 26 26 20 72 65 74 72 79 49 6f 65 72 72 28  0 && retryIoerr(
189d0 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
189e0 29 20 29 7b 7d 0a 20 20 20 20 72 63 20 3d 20 72  ) ){}.    rc = r
189f0 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  c ? SQLITE_OK : 
18a00 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 2f 2a  SQLITE_ERROR;./*
18a10 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20   isNT() is 1 if 
18a20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
18a30 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65  =1, so this else
18a40 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74   is never execut
18a50 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68  ed. .** Since th
18a60 65 20 41 4e 53 49 20 76 65 72 73 69 6f 6e 20 6f  e ANSI version o
18a70 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20  f these Windows 
18a80 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  API do not exist
18a90 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69   for WINCE,.** i
18aa0 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f  t's important to
18ab0 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74   not reference t
18ac0 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75  hem for WINCE bu
18ad0 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  ilds..*/.#if SQL
18ae0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a  ITE_OS_WINCE==0.
18af0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
18b00 3d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 1;.    while( 
18b10 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
18b20 74 65 73 41 28 7a 43 6f 6e 76 65 72 74 65 64 29  tesA(zConverted)
18b30 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  !=INVALID_FILE_A
18b40 54 54 52 49 42 55 54 45 53 20 26 26 0a 20 20 20  TTRIBUTES &&.   
18b50 20 20 20 20 20 20 28 72 63 20 3d 20 6f 73 44 65        (rc = osDe
18b60 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65  leteFileA(zConve
18b70 72 74 65 64 29 29 3d 3d 30 20 26 26 20 72 65 74  rted))==0 && ret
18b80 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
18b90 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20  astErrno) ){}.  
18ba0 20 20 72 63 20 3d 20 72 63 20 3f 20 53 51 4c 49    rc = rc ? SQLI
18bb0 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 45  TE_OK : SQLITE_E
18bc0 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  RROR;.#endif.  }
18bd0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
18be0 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
18bf0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  r(SQLITE_IOERR_D
18c00 45 4c 45 54 45 2c 20 6c 61 73 74 45 72 72 6e 6f  ELETE, lastErrno
18c10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
18c20 77 69 6e 44 65 6c 65 74 65 22 2c 20 7a 46 69 6c  winDelete", zFil
18c30 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  ename);.  }else{
18c40 0a 20 20 20 20 6c 6f 67 49 6f 65 72 72 28 63 6e  .    logIoerr(cn
18c50 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
18c60 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
18c70 64 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  d);.  OSTRACE(("
18c80 44 45 4c 45 54 45 20 5c 22 25 73 5c 22 20 25 73  DELETE \"%s\" %s
18c90 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  \n", zFilename, 
18ca0 28 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20 3a  (rc ? "failed" :
18cb0 20 22 6f 6b 22 20 29 29 29 3b 0a 20 20 72 65 74   "ok" )));.  ret
18cc0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18cd0 20 43 68 65 63 6b 20 74 68 65 20 65 78 69 73 74   Check the exist
18ce0 61 6e 63 65 20 61 6e 64 20 73 74 61 74 75 73 20  ance and status 
18cf0 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  of a file..*/.st
18d00 61 74 69 63 20 69 6e 74 20 77 69 6e 41 63 63 65  atic int winAcce
18d10 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ss(.  sqlite3_vf
18d20 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
18d30 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20   /* Not used on 
18d40 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74  win32 */.  const
18d50 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
18d60 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ,     /* Name of
18d70 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a   file to check *
18d80 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
18d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18da0 2a 20 54 79 70 65 20 6f 66 20 74 65 73 74 20 74  * Type of test t
18db0 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 66  o make on this f
18dc0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  ile */.  int *pR
18dd0 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  esOut           
18de0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75      /* OUT: Resu
18df0 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44  lt */.){.  DWORD
18e00 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20   attr;.  int rc 
18e10 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  = 0;.  DWORD las
18e20 74 45 72 72 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a  tErrno;.  void *
18e30 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e  zConverted;.  UN
18e40 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
18e50 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  Vfs);..  Simulat
18e60 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
18e70 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
18e80 43 45 53 53 3b 20 29 3b 0a 20 20 7a 43 6f 6e 76  CESS; );.  zConv
18e90 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55  erted = convertU
18ea0 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c  tf8Filename(zFil
18eb0 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43  ename);.  if( zC
18ec0 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
18ed0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18ee0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
18ef0 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  }.  if( isNT() )
18f00 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20  {.    int cnt = 
18f10 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c  0;.    WIN32_FIL
18f20 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41  E_ATTRIBUTE_DATA
18f30 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20   sAttrData;.    
18f40 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74  memset(&sAttrDat
18f50 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74  a, 0, sizeof(sAt
18f60 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68  trData));.    wh
18f70 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65  ile( !(rc = osGe
18f80 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
18f90 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  xW((LPCWSTR)zCon
18fa0 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
18fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fc0 20 20 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e       GetFileExIn
18fd0 66 6f 53 74 61 6e 64 61 72 64 2c 20 0a 20 20 20  foStandard, .   
18fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ff0 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72            &sAttr
19000 44 61 74 61 29 29 20 26 26 20 72 65 74 72 79 49  Data)) && retryI
19010 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
19020 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69  Errno) ){}.    i
19030 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  f( rc ){.      /
19040 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f  * For an SQLITE_
19050 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 71 75  ACCESS_EXISTS qu
19060 65 72 79 2c 20 74 72 65 61 74 20 61 20 7a 65 72  ery, treat a zer
19070 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65 0a 20 20  o-length file.  
19080 20 20 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20      ** as if it 
19090 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
190a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
190b0 66 28 20 20 20 20 66 6c 61 67 73 3d 3d 53 51 4c  f(    flags==SQL
190c0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
190d0 53 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73  S.          && s
190e0 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69  AttrData.nFileSi
190f0 7a 65 48 69 67 68 3d 3d 30 20 0a 20 20 20 20 20  zeHigh==0 .     
19100 20 20 20 20 20 26 26 20 73 41 74 74 72 44 61 74       && sAttrDat
19110 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d  a.nFileSizeLow==
19120 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74  0 ){.        att
19130 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  r = INVALID_FILE
19140 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20  _ATTRIBUTES;.   
19150 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19160 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61    attr = sAttrDa
19170 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75  ta.dwFileAttribu
19180 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  tes;.      }.   
19190 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f   }else{.      lo
191a0 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20 20 20  gIoerr(cnt);.   
191b0 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f     if( lastErrno
191c0 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54  !=ERROR_FILE_NOT
191d0 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20  _FOUND ){.      
191e0 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
191f0 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
19200 53 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77  S, lastErrno, "w
19210 69 6e 41 63 63 65 73 73 22 2c 20 7a 46 69 6c 65  inAccess", zFile
19220 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73  name);.        s
19230 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
19240 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  verted);.       
19250 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
19260 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20  OERR_ACCESS;.   
19270 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19280 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44    attr = INVALID
19290 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
192a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
192b0 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69  /* isNT() is 1 i
192c0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
192d0 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c  E==1, so this el
192e0 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63  se is never exec
192f0 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20  uted. .** Since 
19300 74 68 65 20 41 4e 53 49 20 76 65 72 73 69 6f 6e  the ANSI version
19310 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77   of these Window
19320 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69  s API do not exi
19330 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a  st for WINCE,.**
19340 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20   it's important 
19350 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65  to not reference
19360 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20   them for WINCE 
19370 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53  builds..*/.#if S
19380 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
19390 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  0.  }else{.    a
193a0 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  ttr = osGetFileA
193b0 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61 72  ttributesA((char
193c0 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23  *)zConverted);.#
193d0 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69  endif.  }.  sqli
193e0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
193f0 74 65 64 29 3b 0a 20 20 73 77 69 74 63 68 28 20  ted);.  switch( 
19400 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73  flags ){.    cas
19410 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
19420 52 45 41 44 3a 0a 20 20 20 20 63 61 73 65 20 53  READ:.    case S
19430 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
19440 53 54 53 3a 0a 20 20 20 20 20 20 72 63 20 3d 20  STS:.      rc = 
19450 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49  attr!=INVALID_FI
19460 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20  LE_ATTRIBUTES;. 
19470 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19480 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
19490 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20  SS_READWRITE:.  
194a0 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49      rc = attr!=I
194b0 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
194c0 49 42 55 54 45 53 20 26 26 0a 20 20 20 20 20 20  IBUTES &&.      
194d0 20 20 20 20 20 20 20 28 61 74 74 72 20 26 20 46         (attr & F
194e0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45  ILE_ATTRIBUTE_RE
194f0 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20  ADONLY)==0;.    
19500 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
19510 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65  ault:.      asse
19520 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61  rt(!"Invalid fla
19530 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20  gs argument");. 
19540 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20   }.  *pResOut = 
19550 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  rc;.  return SQL
19560 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
19570 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76  * Turn a relativ
19580 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  e pathname into 
19590 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e  a full pathname.
195a0 20 20 57 72 69 74 65 20 74 68 65 20 66 75 6c 6c    Write the full
195b0 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e 74  .** pathname int
195c0 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b  o zOut[].  zOut[
195d0 5d 20 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61  ] will be at lea
195e0 73 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  st pVfs->mxPathn
195f0 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20  ame.** bytes in 
19600 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
19610 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e  int winFullPathn
19620 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ame(.  sqlite3_v
19630 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
19640 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
19650 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  to vfs object */
19660 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
19670 52 65 6c 61 74 69 76 65 2c 20 20 20 20 20 20 20  Relative,       
19680 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c   /* Possibly rel
19690 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68  ative input path
196a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c   */.  int nFull,
196b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196c0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f      /* Size of o
196d0 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20  utput buffer in 
196e0 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
196f0 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20 20 20 20  *zFull          
19700 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
19710 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a  ut buffer */.){.
19720 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f    .#if defined(_
19730 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d  _CYGWIN__).  Sim
19740 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
19750 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
19760 52 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  R );.  UNUSED_PA
19770 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a  RAMETER(nFull);.
19780 20 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 74 6f    cygwin_conv_to
19790 5f 66 75 6c 6c 5f 77 69 6e 33 32 5f 70 61 74 68  _full_win32_path
197a0 28 7a 52 65 6c 61 74 69 76 65 2c 20 7a 46 75 6c  (zRelative, zFul
197b0 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  l);.  return SQL
197c0 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a  ITE_OK;.#endif..
197d0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
197e0 4e 43 45 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  NCE.  SimulateIO
197f0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
19800 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20  LITE_ERROR );.  
19810 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
19820 28 6e 46 75 6c 6c 29 3b 0a 20 20 2f 2a 20 57 69  (nFull);.  /* Wi
19830 6e 43 45 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65  nCE has no conce
19840 70 74 20 6f 66 20 61 20 72 65 6c 61 74 69 76 65  pt of a relative
19850 20 70 61 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f   pathname, or so
19860 20 49 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20   I am told. */. 
19870 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
19880 66 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  f(pVfs->mxPathna
19890 6d 65 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c  me, zFull, "%s",
198a0 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 72   zRelative);.  r
198b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
198c0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51  .#endif..#if !SQ
198d0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
198e0 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57   !defined(__CYGW
198f0 49 4e 5f 5f 29 0a 20 20 69 6e 74 20 6e 42 79 74  IN__).  int nByt
19900 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  e;.  void *zConv
19910 65 72 74 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a  erted;.  char *z
19920 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Out;..  /* If th
19930 69 73 20 70 61 74 68 20 6e 61 6d 65 20 62 65 67  is path name beg
19940 69 6e 73 20 77 69 74 68 20 22 2f 58 3a 22 2c 20  ins with "/X:", 
19950 77 68 65 72 65 20 22 58 22 20 69 73 20 61 6e 79  where "X" is any
19960 20 61 6c 70 68 61 62 65 74 69 63 0a 20 20 2a 2a   alphabetic.  **
19970 20 63 68 61 72 61 63 74 65 72 2c 20 64 69 73 63   character, disc
19980 61 72 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ard the initial 
19990 22 2f 22 20 66 72 6f 6d 20 74 68 65 20 70 61 74  "/" from the pat
199a0 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  hname..  */.  if
199b0 28 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d  ( zRelative[0]==
199c0 27 2f 27 20 26 26 20 73 71 6c 69 74 65 33 49 73  '/' && sqlite3Is
199d0 61 6c 70 68 61 28 7a 52 65 6c 61 74 69 76 65 5b  alpha(zRelative[
199e0 31 5d 29 20 26 26 20 7a 52 65 6c 61 74 69 76 65  1]) && zRelative
199f0 5b 32 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20  [2]==':' ){.    
19a00 7a 52 65 6c 61 74 69 76 65 2b 2b 3b 0a 20 20 7d  zRelative++;.  }
19a10 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20  ..  /* It's odd 
19a20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69  to simulate an i
19a30 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75  o-error here, bu
19a40 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73  t really this is
19a50 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67   just.  ** using
19a60 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e   the io-error in
19a70 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20  frastructure to 
19a80 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
19a90 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20   handles this.  
19aa0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c  ** function fail
19ab0 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ing. This functi
19ac0 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66  on could fail if
19ad0 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  , for example, t
19ae0 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
19af0 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72  working director
19b00 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e  y has been unlin
19b10 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ked..  */.  Simu
19b20 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
19b30 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
19b40 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
19b50 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20  AMETER(nFull);. 
19b60 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f   zConverted = co
19b70 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d  nvertUtf8Filenam
19b80 65 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  e(zRelative);.  
19b90 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
19ba0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
19bb0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
19bc0 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  EM;.  }.  if( is
19bd0 4e 54 28 29 20 29 7b 0a 20 20 20 20 4c 50 57 53  NT() ){.    LPWS
19be0 54 52 20 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42  TR zTemp;.    nB
19bf0 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50  yte = osGetFullP
19c00 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54  athNameW((LPCWST
19c10 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c  R)zConverted, 0,
19c20 20 30 2c 20 30 29 20 2b 20 33 3b 0a 20 20 20 20   0, 0) + 3;.    
19c30 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 5f  zTemp = sqlite3_
19c40 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69  malloc( nByte*si
19c50 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29  zeof(zTemp[0]) )
19c60 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d  ;.    if( zTemp=
19c70 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
19c80 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
19c90 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
19ca0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
19cb0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
19cc0 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
19cd0 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  meW((LPCWSTR)zCo
19ce0 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20  nverted, nByte, 
19cf0 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 73  zTemp, 0);.    s
19d00 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
19d10 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75  verted);.    zOu
19d20 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66  t = unicodeToUtf
19d30 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71  8(zTemp);.    sq
19d40 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70  lite3_free(zTemp
19d50 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20  );./* isNT() is 
19d60 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  1 if SQLITE_OS_W
19d70 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73  INCE==1, so this
19d80 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65   else is never e
19d90 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e  xecuted. .** Sin
19da0 63 65 20 74 68 65 20 41 4e 53 49 20 76 65 72 73  ce the ANSI vers
19db0 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e  ion of these Win
19dc0 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20  dows API do not 
19dd0 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c  exist for WINCE,
19de0 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61  .** it's importa
19df0 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65  nt to not refere
19e00 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e  nce them for WIN
19e10 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69  CE builds..*/.#i
19e20 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
19e30 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E==0.  }else{.  
19e40 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20    char *zTemp;. 
19e50 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74     nByte = osGet
19e60 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63  FullPathNameA((c
19e70 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c  har*)zConverted,
19e80 20 30 2c 20 30 2c 20 30 29 20 2b 20 33 3b 0a 20   0, 0, 0) + 3;. 
19e90 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74     zTemp = sqlit
19ea0 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65  e3_malloc( nByte
19eb0 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d  *sizeof(zTemp[0]
19ec0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65  ) );.    if( zTe
19ed0 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  mp==0 ){.      s
19ee0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
19ef0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72  verted);.      r
19f00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
19f10 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  RR_NOMEM;.    }.
19f20 20 20 20 20 6f 73 47 65 74 46 75 6c 6c 50 61 74      osGetFullPat
19f30 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43  hNameA((char*)zC
19f40 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c  onverted, nByte,
19f50 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20   zTemp, 0);.    
19f60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
19f70 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f  nverted);.    zO
19f80 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  ut = sqlite3_win
19f90 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
19fa0 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69  zTemp);.    sqli
19fb0 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b  te3_free(zTemp);
19fc0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66  .#endif.  }.  if
19fd0 28 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71  ( zOut ){.    sq
19fe0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 70  lite3_snprintf(p
19ff0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c  Vfs->mxPathname,
1a000 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f   zFull, "%s", zO
1a010 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
1a020 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20  _free(zOut);.   
1a030 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a040 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
1a050 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1a060 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23  ERR_NOMEM;.  }.#
1a070 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  endif.}../*.** G
1a080 65 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  et the sector si
1a090 7a 65 20 6f 66 20 74 68 65 20 64 65 76 69 63 65  ze of the device
1a0a0 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a   used to store.*
1a0b0 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  * file..*/.stati
1a0c0 63 20 69 6e 74 20 67 65 74 53 65 63 74 6f 72 53  c int getSectorS
1a0d0 69 7a 65 28 0a 20 20 20 20 73 71 6c 69 74 65 33  ize(.    sqlite3
1a0e0 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 20 20  _vfs *pVfs,.    
1a0f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c  const char *zRel
1a100 61 74 69 76 65 20 20 20 20 20 2f 2a 20 55 54 46  ative     /* UTF
1a110 2d 38 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a  -8 file name */.
1a120 29 7b 0a 20 20 44 57 4f 52 44 20 62 79 74 65 73  ){.  DWORD bytes
1a130 50 65 72 53 65 63 74 6f 72 20 3d 20 53 51 4c 49  PerSector = SQLI
1a140 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f  TE_DEFAULT_SECTO
1a150 52 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 47 65 74  R_SIZE;.  /* Get
1a160 44 69 73 6b 46 72 65 65 53 70 61 63 65 20 69 73  DiskFreeSpace is
1a170 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 75   not supported u
1a180 6e 64 65 72 20 57 49 4e 43 45 20 2a 2f 0a 23 69  nder WINCE */.#i
1a190 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
1a1a0 45 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  E.  UNUSED_PARAM
1a1b0 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 55 4e  ETER(pVfs);.  UN
1a1c0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a  USED_PARAMETER(z
1a1d0 52 65 6c 61 74 69 76 65 29 3b 0a 23 65 6c 73 65  Relative);.#else
1a1e0 0a 20 20 63 68 61 72 20 7a 46 75 6c 6c 70 61 74  .  char zFullpat
1a1f0 68 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 0a 20  h[MAX_PATH+1];. 
1a200 20 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52 44   int rc;.  DWORD
1a210 20 64 77 52 65 74 20 3d 20 30 3b 0a 20 20 44 57   dwRet = 0;.  DW
1a220 4f 52 44 20 64 77 44 75 6d 6d 79 3b 0a 0a 20 20  ORD dwDummy;..  
1a230 2f 2a 0a 20 20 2a 2a 20 57 65 20 6e 65 65 64 20  /*.  ** We need 
1a240 74 6f 20 67 65 74 20 74 68 65 20 66 75 6c 6c 20  to get the full 
1a250 70 61 74 68 20 6e 61 6d 65 20 6f 66 20 74 68 65  path name of the
1a260 20 66 69 6c 65 0a 20 20 2a 2a 20 74 6f 20 67 65   file.  ** to ge
1a270 74 20 74 68 65 20 64 72 69 76 65 20 6c 65 74 74  t the drive lett
1a280 65 72 20 74 6f 20 6c 6f 6f 6b 20 75 70 20 74 68  er to look up th
1a290 65 20 73 65 63 74 6f 72 0a 20 20 2a 2a 20 73 69  e sector.  ** si
1a2a0 7a 65 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ze..  */.  Simul
1a2b0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1a2c0 28 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65  (1);.  sqlite3Be
1a2d0 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
1a2e0 29 3b 0a 20 20 72 63 20 3d 20 77 69 6e 46 75 6c  );.  rc = winFul
1a2f0 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
1a300 7a 52 65 6c 61 74 69 76 65 2c 20 4d 41 58 5f 50  zRelative, MAX_P
1a310 41 54 48 2c 20 7a 46 75 6c 6c 70 61 74 68 29 3b  ATH, zFullpath);
1a320 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e  .  sqlite3EndBen
1a330 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 53  ignMalloc();.  S
1a340 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1a350 6e 69 67 6e 28 30 29 3b 0a 20 20 69 66 28 20 72  nign(0);.  if( r
1a360 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29  c == SQLITE_OK )
1a370 0a 20 20 7b 0a 20 20 20 20 76 6f 69 64 20 2a 7a  .  {.    void *z
1a380 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 20 20 73  Converted;.    s
1a390 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
1a3a0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7a  nMalloc();.    z
1a3b0 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
1a3c0 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
1a3d0 7a 46 75 6c 6c 70 61 74 68 29 3b 0a 20 20 20 20  zFullpath);.    
1a3e0 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
1a3f0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66  Malloc();.    if
1a400 28 20 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a  ( zConverted ){.
1a410 20 20 20 20 20 20 69 66 28 20 69 73 4e 54 28 29        if( isNT()
1a420 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 74   ){.        /* t
1a430 72 69 6d 20 70 61 74 68 20 74 6f 20 6a 75 73 74  rim path to just
1a440 20 64 72 69 76 65 20 72 65 66 65 72 65 6e 63 65   drive reference
1a450 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c 50 57 53   */.        LPWS
1a460 54 52 20 70 20 3d 20 7a 43 6f 6e 76 65 72 74 65  TR p = zConverte
1a470 64 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b  d;.        for(;
1a480 2a 70 3b 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20  *p;p++){.       
1a490 20 20 20 69 66 28 20 2a 70 20 3d 3d 20 27 5c 5c     if( *p == '\\
1a4a0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
1a4b0 20 2a 70 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20   *p = '\0';.    
1a4c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1a4d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1a4e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 77 52     }.        dwR
1a4f0 65 74 20 3d 20 6f 73 47 65 74 44 69 73 6b 46 72  et = osGetDiskFr
1a500 65 65 53 70 61 63 65 57 28 28 4c 50 43 57 53 54  eeSpaceW((LPCWST
1a510 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  R)zConverted,.  
1a520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a540 20 20 26 64 77 44 75 6d 6d 79 2c 0a 20 20 20 20    &dwDummy,.    
1a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a570 26 62 79 74 65 73 50 65 72 53 65 63 74 6f 72 2c  &bytesPerSector,
1a580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5a0 20 20 20 20 20 26 64 77 44 75 6d 6d 79 2c 0a 20       &dwDummy,. 
1a5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5d0 20 20 20 26 64 77 44 75 6d 6d 79 29 3b 0a 20 20     &dwDummy);.  
1a5e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a5f0 20 20 20 2f 2a 20 74 72 69 6d 20 70 61 74 68 20     /* trim path 
1a600 74 6f 20 6a 75 73 74 20 64 72 69 76 65 20 72 65  to just drive re
1a610 66 65 72 65 6e 63 65 20 2a 2f 0a 20 20 20 20 20  ference */.     
1a620 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63 68     char *p = (ch
1a630 61 72 20 2a 29 7a 43 6f 6e 76 65 72 74 65 64 3b  ar *)zConverted;
1a640 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 2a 70  .        for(;*p
1a650 3b 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ;p++){.         
1a660 20 69 66 28 20 2a 70 20 3d 3d 20 27 5c 5c 27 20   if( *p == '\\' 
1a670 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
1a680 70 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  p = '\0';.      
1a690 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a6a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a6b0 20 7d 0a 20 20 20 20 20 20 20 20 64 77 52 65 74   }.        dwRet
1a6c0 20 3d 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65   = osGetDiskFree
1a6d0 53 70 61 63 65 41 28 28 63 68 61 72 2a 29 7a 43  SpaceA((char*)zC
1a6e0 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
1a6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 64                &d
1a710 77 44 75 6d 6d 79 2c 0a 20 20 20 20 20 20 20 20  wDummy,.        
1a720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a730 20 20 20 20 20 20 20 20 20 20 20 20 26 62 79 74              &byt
1a740 65 73 50 65 72 53 65 63 74 6f 72 2c 0a 20 20 20  esPerSector,.   
1a750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a770 20 26 64 77 44 75 6d 6d 79 2c 0a 20 20 20 20 20   &dwDummy,.     
1a780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
1a7a0 64 77 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20  dwDummy);.      
1a7b0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
1a7c0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
1a7d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1a7e0 21 64 77 52 65 74 20 29 7b 0a 20 20 20 20 20 20  !dwRet ){.      
1a7f0 62 79 74 65 73 50 65 72 53 65 63 74 6f 72 20 3d  bytesPerSector =
1a800 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1a810 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 20  SECTOR_SIZE;.   
1a820 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
1a830 72 65 74 75 72 6e 20 28 69 6e 74 29 20 62 79 74  return (int) byt
1a840 65 73 50 65 72 53 65 63 74 6f 72 3b 20 0a 7d 0a  esPerSector; .}.
1a850 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1a860 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
1a870 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  ION./*.** Interf
1a880 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67  aces for opening
1a890 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72   a shared librar
1a8a0 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79  y, finding entry
1a8b0 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69   points.** withi
1a8c0 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  n the shared lib
1a8d0 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e  rary, and closin
1a8e0 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  g the shared lib
1a8f0 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49  rary..*/./*.** I
1a900 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70  nterfaces for op
1a910 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  ening a shared l
1a920 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20  ibrary, finding 
1a930 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  entry points.** 
1a940 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65  within the share
1a950 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63  d library, and c
1a960 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65  losing the share
1a970 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74  d library..*/.st
1a980 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c  atic void *winDl
1a990 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
1a9a0 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68   *pVfs, const ch
1a9b0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
1a9c0 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 76 6f    HANDLE h;.  vo
1a9d0 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d  id *zConverted =
1a9e0 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65   convertUtf8File
1a9f0 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
1aa00 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1aa10 54 45 52 28 70 56 66 73 29 3b 0a 20 20 69 66 28  TER(pVfs);.  if(
1aa20 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
1aa30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
1aa40 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29    }.  if( isNT()
1aa50 20 29 7b 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f   ){.    h = osLo
1aa60 61 64 4c 69 62 72 61 72 79 57 28 28 4c 50 43 57  adLibraryW((LPCW
1aa70 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b  STR)zConverted);
1aa80 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20  ./* isNT() is 1 
1aa90 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1aaa0 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65  CE==1, so this e
1aab0 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65  lse is never exe
1aac0 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65  cuted. .** Since
1aad0 20 74 68 65 20 41 4e 53 49 20 76 65 72 73 69 6f   the ANSI versio
1aae0 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f  n of these Windo
1aaf0 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78  ws API do not ex
1ab00 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a  ist for WINCE,.*
1ab10 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74  * it's important
1ab20 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63   to not referenc
1ab30 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45  e them for WINCE
1ab40 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20   builds..*/.#if 
1ab50 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
1ab60 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  =0.  }else{.    
1ab70 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72  h = osLoadLibrar
1ab80 79 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  yA((char*)zConve
1ab90 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rted);.#endif.  
1aba0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
1abb0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
1abc0 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b  return (void*)h;
1abd0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  .}.static void w
1abe0 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  inDlError(sqlite
1abf0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
1ac00 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
1ac10 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  fOut){.  UNUSED_
1ac20 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
1ac30 0a 20 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d  .  getLastErrorM
1ac40 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  sg(osGetLastErro
1ac50 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 4f  r(), nBuf, zBufO
1ac60 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ut);.}.static vo
1ac70 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71  id (*winDlSym(sq
1ac80 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
1ac90 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 2c 20   void *pHandle, 
1aca0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d  const char *zSym
1acb0 62 6f 6c 29 29 28 76 6f 69 64 29 7b 0a 20 20 55  bol))(void){.  U
1acc0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1acd0 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVfs);.  return 
1ace0 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29 29 6f  (void(*)(void))o
1acf0 73 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  sGetProcAddressA
1ad00 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65  ((HANDLE)pHandle
1ad10 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 7d 0a 73 74  , zSymbol);.}.st
1ad20 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 43  atic void winDlC
1ad30 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lose(sqlite3_vfs
1ad40 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48   *pVfs, void *pH
1ad50 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44  andle){.  UNUSED
1ad60 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
1ad70 3b 0a 20 20 6f 73 46 72 65 65 4c 69 62 72 61 72  ;.  osFreeLibrar
1ad80 79 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c  y((HANDLE)pHandl
1ad90 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69  e);.}.#else /* i
1ada0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
1adb0 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20  AD_EXTENSION is 
1adc0 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64  defined: */.  #d
1add0 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20  efine winDlOpen 
1ade0 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e   0.  #define win
1adf0 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66  DlError 0.  #def
1ae00 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20 20 30  ine winDlSym   0
1ae10 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c  .  #define winDl
1ae20 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a  Close 0.#endif..
1ae30 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70 20  ./*.** Write up 
1ae40 74 6f 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66  to nBuf bytes of
1ae50 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f   randomness into
1ae60 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63   zBuf..*/.static
1ae70 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65   int winRandomne
1ae80 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ss(sqlite3_vfs *
1ae90 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20  pVfs, int nBuf, 
1aea0 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69  char *zBuf){.  i
1aeb0 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 55 4e 55 53  nt n = 0;.  UNUS
1aec0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
1aed0 73 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  s);.#if defined(
1aee0 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 6e  SQLITE_TEST).  n
1aef0 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65 6d 73 65   = nBuf;.  memse
1af00 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29  t(zBuf, 0, nBuf)
1af10 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69  ;.#else.  if( si
1af20 7a 65 6f 66 28 53 59 53 54 45 4d 54 49 4d 45 29  zeof(SYSTEMTIME)
1af30 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20  <=nBuf-n ){.    
1af40 53 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20  SYSTEMTIME x;.  
1af50 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d    osGetSystemTim
1af60 65 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70  e(&x);.    memcp
1af70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c 20  y(&zBuf[n], &x, 
1af80 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20  sizeof(x));.    
1af90 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29 3b 0a  n += sizeof(x);.
1afa0 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66    }.  if( sizeof
1afb0 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20  (DWORD)<=nBuf-n 
1afc0 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 70 69 64  ){.    DWORD pid
1afd0 20 3d 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50   = osGetCurrentP
1afe0 72 6f 63 65 73 73 49 64 28 29 3b 0a 20 20 20 20  rocessId();.    
1aff0 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
1b000 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69   &pid, sizeof(pi
1b010 64 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  d));.    n += si
1b020 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 7d 0a 20  zeof(pid);.  }. 
1b030 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52   if( sizeof(DWOR
1b040 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20  D)<=nBuf-n ){.  
1b050 20 20 44 57 4f 52 44 20 63 6e 74 20 3d 20 6f 73    DWORD cnt = os
1b060 47 65 74 54 69 63 6b 43 6f 75 6e 74 28 29 3b 0a  GetTickCount();.
1b070 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
1b080 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f  [n], &cnt, sizeo
1b090 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b  f(cnt));.    n +
1b0a0 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20  = sizeof(cnt);. 
1b0b0 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28   }.  if( sizeof(
1b0c0 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 29 3c 3d  LARGE_INTEGER)<=
1b0d0 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 4c 41  nBuf-n ){.    LA
1b0e0 52 47 45 5f 49 4e 54 45 47 45 52 20 69 3b 0a 20  RGE_INTEGER i;. 
1b0f0 20 20 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72     osQueryPerfor
1b100 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28 26 69 29  manceCounter(&i)
1b110 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
1b120 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a 65 6f  uf[n], &i, sizeo
1b130 66 28 69 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  f(i));.    n += 
1b140 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20 7d 0a 23  sizeof(i);.  }.#
1b150 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e  endif.  return n
1b160 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  ;.}.../*.** Slee
1b170 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
1b180 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
1b190 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
1b1a0 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69   slept..*/.stati
1b1b0 63 20 69 6e 74 20 77 69 6e 53 6c 65 65 70 28 73  c int winSleep(s
1b1c0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1b1d0 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b  , int microsec){
1b1e0 0a 20 20 6f 73 53 6c 65 65 70 28 28 6d 69 63 72  .  osSleep((micr
1b1f0 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29 3b  osec+999)/1000);
1b200 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1b210 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74  TER(pVfs);.  ret
1b220 75 72 6e 20 28 28 6d 69 63 72 6f 73 65 63 2b 39  urn ((microsec+9
1b230 39 39 29 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a  99)/1000)*1000;.
1b240 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
1b250 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c  lowing variable,
1b260 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e   if set to a non
1b270 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20  -zero value, is 
1b280 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a  interpreted as.*
1b290 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
1b2a0 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
1b2b0 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20 74  70 and is used t
1b2c0 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74  o set the result
1b2d0 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73   of.** sqlite3Os
1b2e0 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75  CurrentTime() du
1b2f0 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f  ring testing..*/
1b300 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1b310 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
1b320 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30  current_time = 0
1b330 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65  ;  /* Fake syste
1b340 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64  m time in second
1b350 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f  s since 1970. */
1b360 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
1b370 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
1b380 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
1b390 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
1b3a0 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74  ime).  Write int
1b3b0 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20  o *piNow.** the 
1b3c0 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64  current time and
1b3d0 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61   date as a Julia
1b3e0 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d  n Day number tim
1b3f0 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20  es 86_400_000.  
1b400 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64  In.** other word
1b410 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70  s, write into *p
1b420 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20  iNow the number 
1b430 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
1b440 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e  since the Julian
1b450 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f  .** epoch of noo
1b460 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f  n in Greenwich o
1b470 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34  n November 24, 4
1b480 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e  714 B.C accordin
1b490 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c  g to the.** prol
1b4a0 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20  eptic Gregorian 
1b4b0 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20  calendar..**.** 
1b4c0 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 75  On success, retu
1b4d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52  rn SQLITE_OK.  R
1b4e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1b4f0 4f 52 20 69 66 20 74 68 65 20 74 69 6d 65 20 61  OR if the time a
1b500 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e  nd date .** cann
1b510 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
1b520 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75  static int winCu
1b530 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73  rrentTimeInt64(s
1b540 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1b550 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
1b560 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46 49  *piNow){.  /* FI
1b570 4c 45 54 49 4d 45 20 73 74 72 75 63 74 75 72 65  LETIME structure
1b580 20 69 73 20 61 20 36 34 2d 62 69 74 20 76 61 6c   is a 64-bit val
1b590 75 65 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  ue representing 
1b5a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20  the number of . 
1b5b0 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65 63 6f      100-nanoseco
1b5c0 6e 64 20 69 6e 74 65 72 76 61 6c 73 20 73 69 6e  nd intervals sin
1b5d0 63 65 20 4a 61 6e 75 61 72 79 20 31 2c 20 31 36  ce January 1, 16
1b5e0 30 31 20 28 3d 20 4a 44 20 32 33 30 35 38 31 33  01 (= JD 2305813
1b5f0 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20 20 46 49 4c  .5). .  */.  FIL
1b600 45 54 49 4d 45 20 66 74 3b 0a 20 20 73 74 61 74  ETIME ft;.  stat
1b610 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
1b620 5f 69 6e 74 36 34 20 77 69 6e 46 69 6c 65 74 69  _int64 winFileti
1b630 6d 65 45 70 6f 63 68 20 3d 20 32 33 30 35 38 31  meEpoch = 230581
1b640 33 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  35*(sqlite3_int6
1b650 34 29 38 36 34 30 30 30 30 3b 0a 23 69 66 64 65  4)8640000;.#ifde
1b660 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
1b670 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
1b680 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45  ite3_int64 unixE
1b690 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a  poch = 24405875*
1b6a0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38  (sqlite3_int64)8
1b6b0 36 34 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 20  640000;.#endif. 
1b6c0 20 2f 2a 20 32 5e 33 32 20 2d 20 74 6f 20 61 76   /* 2^32 - to av
1b6d0 6f 69 64 20 75 73 65 20 6f 66 20 4c 4c 20 61 6e  oid use of LL an
1b6e0 64 20 77 61 72 6e 69 6e 67 73 20 69 6e 20 67 63  d warnings in gc
1b6f0 63 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  c */.  static co
1b700 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  nst sqlite3_int6
1b710 34 20 6d 61 78 33 32 42 69 74 56 61 6c 75 65 20  4 max32BitValue 
1b720 3d 20 0a 20 20 20 20 20 20 28 73 71 6c 69 74 65  = .      (sqlite
1b730 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 30  3_int64)20000000
1b740 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e  00 + (sqlite3_in
1b750 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20 2b  t64)2000000000 +
1b760 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
1b770 32 39 34 39 36 37 32 39 36 3b 0a 0a 23 69 66 20  294967296;..#if 
1b780 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
1b790 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69 6d    SYSTEMTIME tim
1b7a0 65 3b 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d  e;.  osGetSystem
1b7b0 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f  Time(&time);.  /
1b7c0 2a 20 69 66 20 53 79 73 74 65 6d 54 69 6d 65 54  * if SystemTimeT
1b7d0 6f 46 69 6c 65 54 69 6d 65 28 29 20 66 61 69 6c  oFileTime() fail
1b7e0 73 2c 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  s, it returns ze
1b7f0 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21 6f 73  ro. */.  if (!os
1b800 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
1b810 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74 29 29  Time(&time,&ft))
1b820 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1b830 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23  ITE_ERROR;.  }.#
1b840 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74  else.  osGetSyst
1b850 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
1b860 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a  ( &ft );.#endif.
1b870 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46  .  *piNow = winF
1b880 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20  iletimeEpoch +. 
1b890 20 20 20 20 20 20 20 20 20 20 20 28 28 28 28 73             ((((s
1b8a0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e  qlite3_int64)ft.
1b8b0 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 29 2a  dwHighDateTime)*
1b8c0 6d 61 78 33 32 42 69 74 56 61 6c 75 65 29 20 2b  max32BitValue) +
1b8d0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1b8e0 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
1b8f0 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65  ft.dwLowDateTime
1b900 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  )/(sqlite3_int64
1b910 29 31 30 30 30 30 3b 0a 0a 23 69 66 64 65 66 20  )10000;..#ifdef 
1b920 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
1b930 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  ( sqlite3_curren
1b940 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70  t_time ){.    *p
1b950 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c  iNow = 1000*(sql
1b960 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74  ite3_int64)sqlit
1b970 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
1b980 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d  + unixEpoch;.  }
1b990 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44  .#endif.  UNUSED
1b9a0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
1b9b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1b9c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  E_OK;.}../*.** F
1b9d0 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
1b9e0 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
1b9f0 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
1ba00 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65  ime).  Write the
1ba10 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65  .** current time
1ba20 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
1ba30 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
1ba40 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64   into *prNow and
1ba50 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52  .** return 0.  R
1ba60 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
1ba70 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
1ba80 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
1ba90 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43  .static int winC
1baa0 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74  urrentTime(sqlit
1bab0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f  e3_vfs *pVfs, do
1bac0 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20  uble *prNow){.  
1bad0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
1bae0 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72 63 20  3_int64 i;.  rc 
1baf0 3d 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65  = winCurrentTime
1bb00 49 6e 74 36 34 28 70 56 66 73 2c 20 26 69 29 3b  Int64(pVfs, &i);
1bb10 0a 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20  .  if( !rc ){.  
1bb20 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34    *prNow = i/864
1bb30 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 72  00000.0;.  }.  r
1bb40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1bb50 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74  ** The idea is t
1bb60 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hat this functio
1bb70 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20 63  n works like a c
1bb80 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a  ombination of.**
1bb90 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20   GetLastError() 
1bba0 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73 61 67  and FormatMessag
1bbb0 65 28 29 20 6f 6e 20 57 69 6e 64 6f 77 73 20 28  e() on Windows (
1bbc0 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20  or errno and.** 
1bbd0 73 74 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20  strerror_r() on 
1bbe0 55 6e 69 78 29 2e 20 41 66 74 65 72 20 61 6e 20  Unix). After an 
1bbf0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
1bc00 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 75  d by an OS.** fu
1bc10 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63  nction, SQLite c
1bc20 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69  alls this functi
1bc30 6f 6e 20 77 69 74 68 20 7a 42 75 66 20 70 6f 69  on with zBuf poi
1bc40 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 75  nting to.** a bu
1bc50 66 66 65 72 20 6f 66 20 6e 42 75 66 20 62 79 74  ffer of nBuf byt
1bc60 65 73 2e 20 54 68 65 20 4f 53 20 6c 61 79 65 72  es. The OS layer
1bc70 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65   should populate
1bc80 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 20 77   the.** buffer w
1bc90 69 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e  ith a nul-termin
1bca0 61 74 65 64 20 55 54 46 2d 38 20 65 6e 63 6f 64  ated UTF-8 encod
1bcb0 65 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ed error message
1bcc0 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 74  .** describing t
1bcd0 68 65 20 6c 61 73 74 20 49 4f 20 65 72 72 6f 72  he last IO error
1bce0 20 74 6f 20 68 61 76 65 20 6f 63 63 75 72 72 65   to have occurre
1bcf0 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c  d within the cal
1bd00 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e 0a  ling.** thread..
1bd10 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72 72  **.** If the err
1bd20 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 74 6f  or message is to
1bd30 6f 20 6c 61 72 67 65 20 66 6f 72 20 74 68 65 20  o large for the 
1bd40 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 2c  supplied buffer,
1bd50 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20 62 65  .** it should be
1bd60 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65 20   truncated. The 
1bd70 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
1bd80 78 47 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a 2a  xGetLastError.**
1bd90 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20   is zero if the 
1bda0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69  error message fi
1bdb0 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  ts in the buffer
1bdc0 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a  , or non-zero.**
1bdd0 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74   otherwise (if t
1bde0 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74  he message was t
1bdf0 72 75 6e 63 61 74 65 64 29 2e 20 49 66 20 6e 6f  runcated). If no
1be00 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  n-zero is return
1be10 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69  ed,.** then it i
1be20 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
1be30 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  to include the n
1be40 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63 68  ul-terminator ch
1be50 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68  aracter.** in th
1be60 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e  e output buffer.
1be70 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 6c  .**.** Not suppl
1be80 79 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65  ying an error me
1be90 73 73 61 67 65 20 77 69 6c 6c 20 68 61 76 65 20  ssage will have 
1bea0 6e 6f 20 61 64 76 65 72 73 65 20 65 66 66 65 63  no adverse effec
1beb0 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e 20  t.** on SQLite. 
1bec0 49 74 20 69 73 20 66 69 6e 65 20 74 6f 20 68 61  It is fine to ha
1bed0 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ve an implementa
1bee0 74 69 6f 6e 20 74 68 61 74 20 6e 65 76 65 72 0a  tion that never.
1bef0 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  ** returns an er
1bf00 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a  ror message:.**.
1bf10 2a 2a 20 20 20 69 6e 74 20 78 47 65 74 4c 61 73  **   int xGetLas
1bf20 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
1bf30 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
1bf40 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
1bf50 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 7a  .**     assert(z
1bf60 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a  Buf[0]=='\0');.*
1bf70 2a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  *     return 0;.
1bf80 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77  **   }.**.** How
1bf90 65 76 65 72 20 69 66 20 61 6e 20 65 72 72 6f 72  ever if an error
1bfa0 20 6d 65 73 73 61 67 65 20 69 73 20 73 75 70 70   message is supp
1bfb0 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65  lied, it will be
1bfc0 20 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a 2a   incorporated.**
1bfd0 20 62 79 20 73 71 6c 69 74 65 20 69 6e 74 6f 20   by sqlite into 
1bfe0 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
1bff0 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  e available to t
1c000 68 65 20 75 73 65 72 20 75 73 69 6e 67 0a 2a 2a  he user using.**
1c010 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
1c020 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b 69  ), possibly maki
1c030 6e 67 20 49 4f 20 65 72 72 6f 72 73 20 65 61 73  ng IO errors eas
1c040 69 65 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a 2f  ier to debug..*/
1c050 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47  .static int winG
1c060 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
1c070 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
1c080 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
1c090 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  Buf){.  UNUSED_P
1c0a0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
1c0b0 20 20 72 65 74 75 72 6e 20 67 65 74 4c 61 73 74    return getLast
1c0c0 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61  ErrorMsg(osGetLa
1c0d0 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c  stError(), nBuf,
1c0e0 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zBuf);.}../*.**
1c0f0 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20   Initialize and 
1c100 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  deinitialize the
1c110 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
1c120 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  m interface..*/.
1c130 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69  int sqlite3_os_i
1c140 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  nit(void){.  sta
1c150 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20  tic sqlite3_vfs 
1c160 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20 33  winVfs = {.    3
1c170 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c180 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
1c190 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69  */.    sizeof(wi
1c1a0 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73  nFile),     /* s
1c1b0 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 4d  zOsFile */.    M
1c1c0 41 58 5f 50 41 54 48 2c 20 20 20 20 20 20 20 20  AX_PATH,        
1c1d0 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d      /* mxPathnam
1c1e0 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
1c1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c200 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77   pNext */.    "w
1c210 69 6e 33 32 22 2c 20 20 20 20 20 20 20 20 20 20  in32",          
1c220 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20     /* zName */. 
1c230 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
1c240 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44          /* pAppD
1c250 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70  ata */.    winOp
1c260 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
1c270 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20  /* xOpen */.    
1c280 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20  winDelete,      
1c290 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20       /* xDelete 
1c2a0 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73  */.    winAccess
1c2b0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
1c2c0 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  Access */.    wi
1c2d0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  nFullPathname,  
1c2e0 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e     /* xFullPathn
1c2f0 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ame */.    winDl
1c300 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
1c310 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20  /* xDlOpen */.  
1c320 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20    winDlError,   
1c330 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72         /* xDlErr
1c340 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53  or */.    winDlS
1c350 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ym,            /
1c360 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20  * xDlSym */.    
1c370 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20  winDlClose,     
1c380 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65       /* xDlClose
1c390 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f   */.    winRando
1c3a0 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20  mness,       /* 
1c3b0 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20  xRandomness */. 
1c3c0 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20     winSleep,    
1c3d0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65          /* xSlee
1c3e0 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72  p */.    winCurr
1c3f0 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a  entTime,      /*
1c400 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f   xCurrentTime */
1c410 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45  .    winGetLastE
1c420 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 65  rror,     /* xGe
1c430 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20  tLastError */.  
1c440 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65    winCurrentTime
1c450 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65  Int64, /* xCurre
1c460 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20  ntTimeInt64 */. 
1c470 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43     winSetSystemC
1c480 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74 53  all,    /* xSetS
1c490 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20  ystemCall */.   
1c4a0 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c   winGetSystemCal
1c4b0 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73  l,    /* xGetSys
1c4c0 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77  temCall */.    w
1c4d0 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c  inNextSystemCall
1c4e0 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74  ,   /* xNextSyst
1c4f0 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 0a  emCall */.  };..
1c500 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63 68 65 63    /* Double-chec
1c510 6b 20 74 68 61 74 20 74 68 65 20 61 53 79 73 63  k that the aSysc
1c520 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68 61 73 20  all[] array has 
1c530 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64  been constructed
1c540 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e  .  ** correctly.
1c550 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b 62 62    See ticket [bb
1c560 33 61 38 36 65 38 39 30 63 38 65 39 36 61 62 5d  3a86e890c8e96ab]
1c570 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 41 72   */.  assert( Ar
1c580 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
1c590 29 3d 3d 36 30 20 29 3b 0a 0a 23 69 66 6e 64 65  )==60 );..#ifnde
1c5a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1c5b0 4c 0a 20 20 2f 2a 20 67 65 74 20 6d 65 6d 6f 72  L.  /* get memor
1c5c0 79 20 6d 61 70 20 61 6c 6c 6f 63 61 74 69 6f 6e  y map allocation
1c5d0 20 67 72 61 6e 75 6c 61 72 69 74 79 20 2a 2f 0a   granularity */.
1c5e0 20 20 6d 65 6d 73 65 74 28 26 77 69 6e 53 79 73    memset(&winSys
1c5f0 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
1c600 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a 20  SYSTEM_INFO));. 
1c610 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66 6f   osGetSystemInfo
1c620 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 20  (&winSysInfo);. 
1c630 20 61 73 73 65 72 74 28 77 69 6e 53 79 73 49 6e   assert(winSysIn
1c640 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47  fo.dwAllocationG
1c650 72 61 6e 75 6c 61 72 69 74 79 20 3e 20 30 29 3b  ranularity > 0);
1c660 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
1c670 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
1c680 26 77 69 6e 56 66 73 2c 20 31 29 3b 0a 20 20 72  &winVfs, 1);.  r
1c690 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c6a0 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33   .}..int sqlite3
1c6b0 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a  _os_end(void){ .
1c6c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c6d0 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
1c6e0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 2a   SQLITE_OS_WIN *
1c6f0 2f 0a                                            /.