/ Hex Artifact Content
Login

Artifact 7378d50e4f8c3dafc0c11ca99615801c84329a4d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59   */..#ifdef __CY
0220: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0230: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0240: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
0250: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
0260: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
0270: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
0280: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
0290: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 53  mmon.h"../*.** S
02a0: 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f  ome Microsoft co
02b0: 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69  mpilers lack thi
02c0: 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f  s definition..*/
02d0: 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44  .#ifndef INVALID
02e0: 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
02f0: 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49  .# define INVALI
0300: 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
0310: 53 20 28 28 44 57 4f 52 44 29 2d 31 29 20 0a 23  S ((DWORD)-1) .#
0320: 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72  endif../* Forwar
0330: 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a  d references */.
0340: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
0350: 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20 20 20  inShm winShm;   
0360: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6e          /* A con
0370: 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65  nection to share
0380: 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65  d-memory */.type
0390: 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 53 68  def struct winSh
03a0: 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f 64 65  mNode winShmNode
03b0: 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f 6e 20  ;   /* A region 
03c0: 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
03d0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 43 45   */../*.** WinCE
03e0: 20 6c 61 63 6b 73 20 6e 61 74 69 76 65 20 73 75   lacks native su
03f0: 70 70 6f 72 74 20 66 6f 72 20 66 69 6c 65 20 6c  pport for file l
0400: 6f 63 6b 69 6e 67 20 73 6f 20 77 65 20 68 61 76  ocking so we hav
0410: 65 20 74 6f 20 66 61 6b 65 20 69 74 0a 2a 2a 20  e to fake it.** 
0420: 77 69 74 68 20 73 6f 6d 65 20 63 6f 64 65 20 6f  with some code o
0430: 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a 23 69  f our own..*/.#i
0440: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
0450: 45 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  E.typedef struct
0460: 20 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20 20 69   winceLock {.  i
0470: 6e 74 20 6e 52 65 61 64 65 72 73 3b 20 20 20 20  nt nReaders;    
0480: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0490: 72 65 61 64 65 72 20 6c 6f 63 6b 73 20 6f 62 74  reader locks obt
04a0: 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ained */.  BOOL 
04b0: 62 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 2f  bPending;      /
04c0: 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20 70 65  * Indicates a pe
04d0: 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62  nding lock has b
04e0: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a  een obtained */.
04f0: 20 20 42 4f 4f 4c 20 62 52 65 73 65 72 76 65 64    BOOL bReserved
0500: 3b 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74  ;     /* Indicat
0510: 65 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  es a reserved lo
0520: 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61  ck has been obta
0530: 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  ined */.  BOOL b
0540: 45 78 63 6c 75 73 69 76 65 3b 20 20 20 20 2f 2a  Exclusive;    /*
0550: 20 49 6e 64 69 63 61 74 65 73 20 61 6e 20 65 78   Indicates an ex
0560: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 68 61 73  clusive lock has
0570: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a   been obtained *
0580: 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b 0a 23  /.} winceLock;.#
0590: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
05a0: 20 77 69 6e 46 69 6c 65 20 73 74 72 75 63 74 75   winFile structu
05b0: 72 65 20 69 73 20 61 20 73 75 62 63 6c 61 73 73  re is a subclass
05c0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   of sqlite3_file
05d0: 2a 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68  * specific to th
05e0: 65 20 77 69 6e 33 32 0a 2a 2a 20 70 6f 72 74 61  e win32.** porta
05f0: 62 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a 2f  bility layer..*/
0600: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0610: 77 69 6e 46 69 6c 65 20 77 69 6e 46 69 6c 65 3b  winFile winFile;
0620: 0a 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20  .struct winFile 
0630: 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  {.  const sqlite
0640: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d  3_io_methods *pM
0650: 65 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75 73 74  ethod; /*** Must
0660: 20 62 65 20 66 69 72 73 74 20 2a 2a 2a 2f 0a 20   be first ***/. 
0670: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
0680: 66 73 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  fs;      /* The 
0690: 56 46 53 20 75 73 65 64 20 74 6f 20 6f 70 65 6e  VFS used to open
06a0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
06b0: 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20 20  HANDLE h;       
06c0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
06d0: 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20  e for accessing 
06e0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  the file */.  u8
06f0: 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20   locktype;      
0700: 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
0710: 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79 20   lock currently 
0720: 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 69 6c  held on this fil
0730: 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73 68 61  e */.  short sha
0740: 72 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20 20 2f  redLockByte;   /
0750: 2a 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f 73 65  * Randomly chose
0760: 6e 20 62 79 74 65 20 75 73 65 64 20 61 73 20 61  n byte used as a
0770: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a   shared lock */.
0780: 20 20 75 38 20 63 74 72 6c 46 6c 61 67 73 3b 20    u8 ctrlFlags; 
0790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
07a0: 67 73 2e 20 20 53 65 65 20 57 49 4e 46 49 4c 45  gs.  See WINFILE
07b0: 5f 2a 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 44 57  _* below */.  DW
07c0: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  ORD lastErrno;  
07d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e        /* The Win
07e0: 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20  dows errno from 
07f0: 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72  the last I/O err
0800: 6f 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  or */.  winShm *
0810: 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pShm;           
0820: 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20 73  /* Instance of s
0830: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e 20  hared memory on 
0840: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 63  this file */.  c
0850: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
0860: 3b 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70  ;      /* Full p
0870: 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 69 73 20  athname of this 
0880: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  file */.  int sz
0890: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
08a0: 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65 20    /* Chunk size 
08b0: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46 43  configured by FC
08c0: 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2a  NTL_CHUNK_SIZE *
08d0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
08e0: 57 49 4e 43 45 0a 20 20 4c 50 57 53 54 52 20 7a  WINCE.  LPWSTR z
08f0: 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20 20  DeleteOnClose;  
0900: 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
0910: 74 6f 20 64 65 6c 65 74 65 20 77 68 65 6e 20 63  to delete when c
0920: 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e 44  losing */.  HAND
0930: 4c 45 20 68 4d 75 74 65 78 3b 20 20 20 20 20 20  LE hMutex;      
0940: 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 75 73 65      /* Mutex use
0950: 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63  d to control acc
0960: 65 73 73 20 74 6f 20 73 68 61 72 65 64 20 6c 6f  ess to shared lo
0970: 63 6b 20 2a 2f 20 20 0a 20 20 48 41 4e 44 4c 45  ck */  .  HANDLE
0980: 20 68 53 68 61 72 65 64 3b 20 20 20 20 20 20 20   hShared;       
0990: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
09a0: 72 79 20 73 65 67 6d 65 6e 74 20 75 73 65 64 20  ry segment used 
09b0: 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20  for locking */. 
09c0: 20 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c   winceLock local
09d0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b  ;        /* Lock
09e0: 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68  s obtained by th
09f0: 69 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 77  is instance of w
0a00: 69 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 63  inFile */.  winc
0a10: 65 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20 20  eLock *shared;  
0a20: 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 68      /* Global sh
0a30: 61 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79  ared lock memory
0a40: 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 20 2a   for the file  *
0a50: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
0a60: 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  ** Allowed value
0a70: 73 20 66 6f 72 20 77 69 6e 46 69 6c 65 2e 63 74  s for winFile.ct
0a80: 72 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69  rlFlags.*/.#defi
0a90: 6e 65 20 57 49 4e 46 49 4c 45 5f 50 45 52 53 49  ne WINFILE_PERSI
0aa0: 53 54 5f 57 41 4c 20 20 20 20 20 30 78 30 34 20  ST_WAL     0x04 
0ab0: 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74 20    /* Persistent 
0ac0: 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 64 65 66  WAL mode */.#def
0ad0: 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57  ine WINFILE_PSOW
0ae0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31 30              0x10
0af0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43     /* SQLITE_IOC
0b00: 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
0b10: 52 57 52 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 20 2a  RWRITE */../*. *
0b20: 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   If compiled wit
0b30: 68 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  h SQLITE_WIN32_M
0b40: 41 4c 4c 4f 43 20 6f 6e 20 57 69 6e 64 6f 77 73  ALLOC on Windows
0b50: 2c 20 77 65 20 77 69 6c 6c 20 75 73 65 20 74 68  , we will use th
0b60: 65 0a 20 2a 20 76 61 72 69 6f 75 73 20 57 69 6e  e. * various Win
0b70: 33 32 20 41 50 49 20 68 65 61 70 20 66 75 6e 63  32 API heap func
0b80: 74 69 6f 6e 73 20 69 6e 73 74 65 61 64 20 6f 66  tions instead of
0b90: 20 6f 75 72 20 6f 77 6e 2e 0a 20 2a 2f 0a 23 69   our own.. */.#i
0ba0: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
0bb0: 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 20 2a 20 54  2_MALLOC./*. * T
0bc0: 68 65 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20  he initial size 
0bd0: 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  of the Win32-spe
0be0: 63 69 66 69 63 20 68 65 61 70 2e 20 20 54 68 69  cific heap.  Thi
0bf0: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  s value may be z
0c00: 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ero.. */.#ifndef
0c10: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
0c20: 41 50 5f 49 4e 49 54 5f 53 49 5a 45 0a 23 20 20  AP_INIT_SIZE.#  
0c30: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
0c40: 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49  N32_HEAP_INIT_SI
0c50: 5a 45 20 28 28 53 51 4c 49 54 45 5f 44 45 46 41  ZE ((SQLITE_DEFA
0c60: 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 20  ULT_CACHE_SIZE) 
0c70: 2a 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  * \.            
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c90: 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49             (SQLI
0ca0: 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
0cb0: 53 49 5a 45 29 20 2b 20 34 31 39 34 33 30 34 29  SIZE) + 4194304)
0cc0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
0cd0: 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20  he maximum size 
0ce0: 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  of the Win32-spe
0cf0: 63 69 66 69 63 20 68 65 61 70 2e 20 20 54 68 69  cific heap.  Thi
0d00: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  s value may be z
0d10: 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ero.. */.#ifndef
0d20: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
0d30: 41 50 5f 4d 41 58 5f 53 49 5a 45 0a 23 20 20 64  AP_MAX_SIZE.#  d
0d40: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
0d50: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45  32_HEAP_MAX_SIZE
0d60: 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a    (0).#endif../*
0d70: 0a 20 2a 20 54 68 65 20 65 78 74 72 61 20 66 6c  . * The extra fl
0d80: 61 67 73 20 74 6f 20 75 73 65 20 69 6e 20 63 61  ags to use in ca
0d90: 6c 6c 73 20 74 6f 20 74 68 65 20 57 69 6e 33 32  lls to the Win32
0da0: 20 68 65 61 70 20 41 50 49 73 2e 20 20 54 68 69   heap APIs.  Thi
0db0: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 0a 20  s value may be. 
0dc0: 2a 20 7a 65 72 6f 20 66 6f 72 20 74 68 65 20 64  * zero for the d
0dd0: 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f 72 2e  efault behavior.
0de0: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
0df0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
0e00: 4c 41 47 53 0a 23 20 20 64 65 66 69 6e 65 20 53  LAGS.#  define S
0e10: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
0e20: 5f 46 4c 41 47 53 20 20 20 20 20 28 30 29 0a 23  _FLAGS     (0).#
0e30: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
0e40: 20 77 69 6e 4d 65 6d 44 61 74 61 20 73 74 72 75   winMemData stru
0e50: 63 74 75 72 65 20 73 74 6f 72 65 73 20 69 6e 66  cture stores inf
0e60: 6f 72 6d 61 74 69 6f 6e 20 72 65 71 75 69 72 65  ormation require
0e70: 64 20 62 79 20 74 68 65 20 57 69 6e 33 32 2d 73  d by the Win32-s
0e80: 70 65 63 69 66 69 63 0a 2a 2a 20 73 71 6c 69 74  pecific.** sqlit
0e90: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 69  e3_mem_methods i
0ea0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a  mplementation..*
0eb0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0ec0: 20 77 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 4d   winMemData winM
0ed0: 65 6d 44 61 74 61 3b 0a 73 74 72 75 63 74 20 77  emData;.struct w
0ee0: 69 6e 4d 65 6d 44 61 74 61 20 7b 0a 23 69 66 6e  inMemData {.#ifn
0ef0: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 75 33 32  def NDEBUG.  u32
0f00: 20 6d 61 67 69 63 3b 20 20 20 20 2f 2a 20 4d 61   magic;    /* Ma
0f10: 67 69 63 20 6e 75 6d 62 65 72 20 74 6f 20 64 65  gic number to de
0f20: 74 65 63 74 20 73 74 72 75 63 74 75 72 65 20 63  tect structure c
0f30: 6f 72 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65  orruption. */.#e
0f40: 6e 64 69 66 0a 20 20 48 41 4e 44 4c 45 20 68 48  ndif.  HANDLE hH
0f50: 65 61 70 3b 20 2f 2a 20 54 68 65 20 68 61 6e 64  eap; /* The hand
0f60: 6c 65 20 74 6f 20 6f 75 72 20 68 65 61 70 2e 20  le to our heap. 
0f70: 2a 2f 0a 20 20 42 4f 4f 4c 20 62 4f 77 6e 65 64  */.  BOOL bOwned
0f80: 3b 20 20 2f 2a 20 44 6f 20 77 65 20 6f 77 6e 20  ;  /* Do we own 
0f90: 74 68 65 20 68 65 61 70 20 28 69 2e 65 2e 20 64  the heap (i.e. d
0fa0: 65 73 74 72 6f 79 20 69 74 20 6f 6e 20 73 68 75  estroy it on shu
0fb0: 74 64 6f 77 6e 29 3f 20 2a 2f 0a 7d 3b 0a 0a 23  tdown)? */.};..#
0fc0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64  ifndef NDEBUG.#d
0fd0: 65 66 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47  efine WINMEM_MAG
0fe0: 49 43 20 20 20 20 20 30 78 34 32 62 32 38 33 30  IC     0x42b2830
0ff0: 62 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63  b.#endif..static
1000: 20 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61   struct winMemDa
1010: 74 61 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 20  ta win_mem_data 
1020: 3d 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  = {.#ifndef NDEB
1030: 55 47 0a 20 20 57 49 4e 4d 45 4d 5f 4d 41 47 49  UG.  WINMEM_MAGI
1040: 43 2c 0a 23 65 6e 64 69 66 0a 20 20 4e 55 4c 4c  C,.#endif.  NULL
1050: 2c 20 46 41 4c 53 45 0a 7d 3b 0a 0a 23 69 66 6e  , FALSE.};..#ifn
1060: 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66 69  def NDEBUG.#defi
1070: 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  ne winMemAssertM
1080: 61 67 69 63 28 29 20 61 73 73 65 72 74 28 20 77  agic() assert( w
1090: 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69  in_mem_data.magi
10a0: 63 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20  c==WINMEM_MAGIC 
10b0: 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ).#else.#define 
10c0: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
10d0: 63 28 29 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66  c().#endif..#def
10e0: 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  ine winMemGetHea
10f0: 70 28 29 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61  p() win_mem_data
1100: 2e 68 48 65 61 70 0a 0a 73 74 61 74 69 63 20 76  .hHeap..static v
1110: 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f  oid *winMemMallo
1120: 63 28 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73  c(int nBytes);.s
1130: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65  tatic void winMe
1140: 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69  mFree(void *pPri
1150: 6f 72 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  or);.static void
1160: 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28   *winMemRealloc(
1170: 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e  void *pPrior, in
1180: 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69  t nBytes);.stati
1190: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65  c int winMemSize
11a0: 28 76 6f 69 64 20 2a 70 29 3b 0a 73 74 61 74 69  (void *p);.stati
11b0: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e  c int winMemRoun
11c0: 64 75 70 28 69 6e 74 20 6e 29 3b 0a 73 74 61 74  dup(int n);.stat
11d0: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69  ic int winMemIni
11e0: 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  t(void *pAppData
11f0: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  );.static void w
1200: 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f  inMemShutdown(vo
1210: 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 0a  id *pAppData);..
1220: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65  const sqlite3_me
1230: 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74  m_methods *sqlit
1240: 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f  e3MemGetWin32(vo
1250: 69 64 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  id);.#endif /* S
1260: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
1270: 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OC */../*.** The
1280: 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
1290: 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c 79  ble is (normally
12a0: 29 20 73 65 74 20 6f 6e 63 65 20 61 6e 64 20 6e  ) set once and n
12b0: 65 76 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a 20  ever changes.** 
12c0: 74 68 65 72 65 61 66 74 65 72 2e 20 20 49 74 20  thereafter.  It 
12d0: 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72 20  records whether 
12e0: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
12f0: 73 74 65 6d 20 69 73 20 57 69 6e 39 78 0a 2a 2a  stem is Win9x.**
1300: 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a   or WinNT..**.**
1310: 20 30 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20   0:   Operating 
1320: 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a  system unknown..
1330: 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61 74 69 6e  ** 1:   Operatin
1340: 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39  g system is Win9
1350: 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72 61  x..** 2:   Opera
1360: 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57  ting system is W
1370: 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  inNT..**.** In o
1380: 72 64 65 72 20 74 6f 20 66 61 63 69 6c 69 74 61  rder to facilita
1390: 74 65 20 74 65 73 74 69 6e 67 20 6f 6e 20 61 20  te testing on a 
13a0: 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74 68  WinNT system, th
13b0: 65 20 74 65 73 74 20 66 69 78 74 75 72 65 0a 2a  e test fixture.*
13c0: 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20 73  * can manually s
13d0: 65 74 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f  et this value to
13e0: 20 31 20 74 6f 20 65 6d 75 6c 61 74 65 20 57 69   1 to emulate Wi
13f0: 6e 39 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  n98 behavior..*/
1400: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1410: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
1420: 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6c  os_type = 0;.#el
1430: 73 65 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  se.static int sq
1440: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20  lite3_os_type = 
1450: 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  0;.#endif..#if !
1460: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
1470: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
1480: 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20 53 51  NRT.#  define SQ
1490: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
14a0: 4e 53 49 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  NSI.#endif..#if 
14b0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
14c0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  || SQLITE_OS_WIN
14d0: 4e 54 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  NT || SQLITE_OS_
14e0: 57 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20  WINRT.#  define 
14f0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
1500: 5f 57 49 44 45 0a 23 65 6e 64 69 66 0a 0a 23 69  _WIDE.#endif..#i
1510: 66 6e 64 65 66 20 53 59 53 43 41 4c 4c 0a 23 20  fndef SYSCALL.# 
1520: 20 64 65 66 69 6e 65 20 53 59 53 43 41 4c 4c 20   define SYSCALL 
1530: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
1540: 70 74 72 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ptr.#endif..#if 
1550: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
1560: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 6d 61 63 72  /*.** These macr
1570: 6f 73 20 61 72 65 20 6e 65 63 65 73 73 61 72 79  os are necessary
1580: 20 62 65 63 61 75 73 65 20 57 69 6e 64 6f 77 73   because Windows
1590: 20 43 45 20 64 6f 65 73 20 6e 6f 74 20 6e 61 74   CE does not nat
15a0: 69 76 65 6c 79 20 73 75 70 70 6f 72 74 20 74 68  ively support th
15b0: 65 0a 2a 2a 20 57 69 6e 33 32 20 41 50 49 73 20  e.** Win32 APIs 
15c0: 4c 6f 63 6b 46 69 6c 65 2c 20 55 6e 6c 6f 63 6b  LockFile, Unlock
15d0: 46 69 6c 65 2c 20 61 6e 64 20 4c 6f 63 6b 46 69  File, and LockFi
15e0: 6c 65 45 78 2e 0a 20 2a 2f 0a 0a 23 20 20 64 65  leEx.. */..#  de
15f0: 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 28 61 2c  fine LockFile(a,
1600: 62 2c 63 2c 64 2c 65 29 20 20 20 20 20 20 20 77  b,c,d,e)       w
1610: 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26 61 2c  inceLockFile(&a,
1620: 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23 20 20   b, c, d, e).#  
1630: 64 65 66 69 6e 65 20 55 6e 6c 6f 63 6b 46 69 6c  define UnlockFil
1640: 65 28 61 2c 62 2c 63 2c 64 2c 65 29 20 20 20 20  e(a,b,c,d,e)    
1650: 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65   winceUnlockFile
1660: 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29  (&a, b, c, d, e)
1670: 0a 23 20 20 64 65 66 69 6e 65 20 4c 6f 63 6b 46  .#  define LockF
1680: 69 6c 65 45 78 28 61 2c 62 2c 63 2c 64 2c 65 2c  ileEx(a,b,c,d,e,
1690: 66 29 20 20 20 77 69 6e 63 65 4c 6f 63 6b 46 69  f)   winceLockFi
16a0: 6c 65 45 78 28 26 61 2c 20 62 2c 20 63 2c 20 64  leEx(&a, b, c, d
16b0: 2c 20 65 2c 20 66 29 0a 0a 2f 2a 0a 2a 2a 20 54  , e, f)../*.** T
16c0: 68 65 73 65 20 61 72 65 20 74 68 65 20 73 70 65  hese are the spe
16d0: 63 69 61 6c 20 73 79 73 63 61 6c 6c 20 68 61 63  cial syscall hac
16e0: 6b 73 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 43  ks for Windows C
16f0: 45 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  E.  The locking 
1700: 72 65 6c 61 74 65 64 0a 2a 2a 20 64 65 66 69 6e  related.** defin
1710: 65 73 20 68 65 72 65 20 72 65 66 65 72 20 74 6f  es here refer to
1720: 20 74 68 65 20 6d 61 63 72 6f 73 20 64 65 66 69   the macros defi
1730: 6e 65 64 20 6a 75 73 74 20 61 62 6f 76 65 2e 0a  ned just above..
1740: 20 2a 2f 0a 0a 23 20 20 64 65 66 69 6e 65 20 6f   */..#  define o
1750: 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
1760: 28 29 20 20 20 20 20 20 20 31 0a 23 20 20 64 65  ()       1.#  de
1770: 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 20  fine osLockFile 
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
1790: 6f 63 6b 46 69 6c 65 0a 23 20 20 64 65 66 69 6e  ockFile.#  defin
17a0: 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 20  e osUnlockFile  
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 55 6e 6c 6f              Unlo
17c0: 63 6b 46 69 6c 65 0a 23 20 20 64 65 66 69 6e 65  ckFile.#  define
17d0: 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20 20 20   osLockFileEx   
17e0: 20 20 20 20 20 20 20 20 20 20 20 4c 6f 63 6b 46             LockF
17f0: 69 6c 65 45 78 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ileEx.#endif../*
1800: 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20  .** Many system 
1810: 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73  calls are access
1820: 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74  ed through point
1830: 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20  er-to-functions 
1840: 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20  so that.** they 
1850: 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65  may be overridde
1860: 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20  n at runtime to 
1870: 66 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74  facilitate fault
1880: 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e   injection durin
1890: 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  g.** testing and
18a0: 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68   sandboxing.  Th
18b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61  e following arra
18c0: 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  y holds the name
18d0: 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a  s and pointers.*
18e0: 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64  * to all overrid
18f0: 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c  eable system cal
1900: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  ls..*/.static st
1910: 72 75 63 74 20 77 69 6e 5f 73 79 73 63 61 6c 6c  ruct win_syscall
1920: 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   {.  const char 
1930: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
1940: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1950: 65 20 73 79 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a  e sytem call */.
1960: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
1970: 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20  l_ptr pCurrent; 
1980: 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65  /* Current value
1990: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   of the system c
19a0: 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  all */.  sqlite3
19b0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65  _syscall_ptr pDe
19c0: 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c  fault; /* Defaul
19d0: 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79  t value */.} aSy
19e0: 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 23 69 66 20  scall[] = {.#if 
19f0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
1a00: 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41 70 69  .  { "AreFileApi
1a10: 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20 20 20  sANSI",         
1a20: 28 53 59 53 43 41 4c 4c 29 41 72 65 46 69 6c 65  (SYSCALL)AreFile
1a30: 41 70 69 73 41 4e 53 49 2c 20 20 20 20 20 20 20  ApisANSI,       
1a40: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
1a50: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
1a60: 49 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  I ((BOOL(WINAPI*
1a70: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  )(VOID))aSyscall
1a80: 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65  [0].pCurrent).#e
1a90: 6c 73 65 0a 20 20 7b 20 22 41 72 65 46 69 6c 65  lse.  { "AreFile
1aa0: 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20  ApisANSI",      
1ab0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
1ae0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
1af0: 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64  WINCE && defined
1b00: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
1b10: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61  S_WIDE).  { "Cha
1b20: 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20 20  rLowerW",       
1b30: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
1b40: 43 68 61 72 4c 6f 77 65 72 57 2c 20 20 20 20 20  CharLowerW,     
1b50: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
1b60: 6c 73 65 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77  lse.  { "CharLow
1b70: 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  erW",           
1b80: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
1bb0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72  ..#define osChar
1bc0: 4c 6f 77 65 72 57 20 28 28 4c 50 57 53 54 52 28  LowerW ((LPWSTR(
1bd0: 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29  WINAPI*)(LPWSTR)
1be0: 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75  )aSyscall[1].pCu
1bf0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
1c00: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64  TE_OS_WINCE && d
1c10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
1c20: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
1c30: 7b 20 22 43 68 61 72 55 70 70 65 72 57 22 2c 20  { "CharUpperW", 
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
1c50: 53 43 41 4c 4c 29 43 68 61 72 55 70 70 65 72 57  SCALL)CharUpperW
1c60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
1c70: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
1c80: 68 61 72 55 70 70 65 72 57 22 2c 20 20 20 20 20  harUpperW",     
1c90: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
1ca0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
1cb0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
1cc0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
1cd0: 6f 73 43 68 61 72 55 70 70 65 72 57 20 28 28 4c  osCharUpperW ((L
1ce0: 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c  PWSTR(WINAPI*)(L
1cf0: 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PWSTR))aSyscall[
1d00: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
1d10: 7b 20 22 43 6c 6f 73 65 48 61 6e 64 6c 65 22 2c  { "CloseHandle",
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
1d30: 53 43 41 4c 4c 29 43 6c 6f 73 65 48 61 6e 64 6c  SCALL)CloseHandl
1d40: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  e,             0
1d50: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43   },..#define osC
1d60: 6c 6f 73 65 48 61 6e 64 6c 65 20 28 28 42 4f 4f  loseHandle ((BOO
1d70: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
1d80: 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70  E))aSyscall[3].p
1d90: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
1da0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1db0: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
1dc0: 20 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c 20   "CreateFileA", 
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
1de0: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 41  CALL)CreateFileA
1df0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
1e00: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
1e10: 65 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20  eateFileA",     
1e20: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
1e30: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
1e40: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
1e50: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
1e60: 73 43 72 65 61 74 65 46 69 6c 65 41 20 28 28 48  sCreateFileA ((H
1e70: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ANDLE(WINAPI*)(L
1e80: 50 43 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52  PCSTR,DWORD,DWOR
1e90: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  D, \.        LPS
1ea0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
1eb0: 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48  ES,DWORD,DWORD,H
1ec0: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
1ed0: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
1ee0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1ef0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
1f00: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
1f10: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
1f20: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46  (SYSCALL)CreateF
1f30: 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20 20  ileW,           
1f40: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
1f50: 20 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20   "CreateFileW", 
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
1f70: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
1f90: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
1fa0: 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57  ne osCreateFileW
1fb0: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
1fc0: 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44  *)(LPCWSTR,DWORD
1fd0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
1fe0: 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54    LPSECURITY_ATT
1ff0: 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57  RIBUTES,DWORD,DW
2000: 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73  ORD,HANDLE))aSys
2010: 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74  call[5].pCurrent
2020: 29 0a 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  )..  { "CreateFi
2030: 6c 65 4d 61 70 70 69 6e 67 22 2c 20 20 20 20 20  leMapping",     
2040: 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74    (SYSCALL)Creat
2050: 65 46 69 6c 65 4d 61 70 70 69 6e 67 2c 20 20 20  eFileMapping,   
2060: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
2070: 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  e osCreateFileMa
2080: 70 70 69 6e 67 20 28 28 48 41 4e 44 4c 45 28 57  pping ((HANDLE(W
2090: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
20a0: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
20b0: 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20  UTES, \.        
20c0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
20d0: 44 2c 4c 50 43 54 53 54 52 29 29 61 53 79 73 63  D,LPCTSTR))aSysc
20e0: 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29  all[6].pCurrent)
20f0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
2100: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
2110: 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65  IDE).  { "Create
2120: 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20  FileMappingW",  
2130: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
2140: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 2c  ateFileMappingW,
2150: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
2160: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
2170: 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20 20 20  MappingW",      
2180: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
21b0: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
21c0: 69 6c 65 4d 61 70 70 69 6e 67 57 20 28 28 48 41  ileMappingW ((HA
21d0: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41  NDLE(WINAPI*)(HA
21e0: 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f  NDLE,LPSECURITY_
21f0: 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20  ATTRIBUTES, \.  
2200: 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52        DWORD,DWOR
2210: 44 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52 29  D,DWORD,LPCWSTR)
2220: 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75  )aSyscall[7].pCu
2230: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
2240: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
2250: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
2260: 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20 20  CreateMutexW",  
2270: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
2280: 4c 4c 29 43 72 65 61 74 65 4d 75 74 65 78 57 2c  LL)CreateMutexW,
2290: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
22a0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
22b0: 74 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20  teMutexW",      
22c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
22d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
22f0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
2300: 72 65 61 74 65 4d 75 74 65 78 57 20 28 28 48 41  reateMutexW ((HA
2310: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
2320: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
2330: 54 45 53 2c 42 4f 4f 4c 2c 20 5c 0a 20 20 20 20  TES,BOOL, \.    
2340: 20 20 20 20 4c 50 43 57 53 54 52 29 29 61 53 79      LPCWSTR))aSy
2350: 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e  scall[8].pCurren
2360: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
2370: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
2380: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 44 65 6c 65  _ANSI).  { "Dele
2390: 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20  teFileA",       
23a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 44        (SYSCALL)D
23b0: 65 6c 65 74 65 46 69 6c 65 41 2c 20 20 20 20 20  eleteFileA,     
23c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
23d0: 73 65 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69  se.  { "DeleteFi
23e0: 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  leA",           
23f0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2410: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
2420: 0a 23 64 65 66 69 6e 65 20 6f 73 44 65 6c 65 74  .#define osDelet
2430: 65 46 69 6c 65 41 20 28 28 42 4f 4f 4c 28 57 49  eFileA ((BOOL(WI
2440: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61  NAPI*)(LPCSTR))a
2450: 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72  Syscall[9].pCurr
2460: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
2470: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
2480: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 44 65  AS_WIDE).  { "De
2490: 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20  leteFileW",     
24a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
24b0: 29 44 65 6c 65 74 65 46 69 6c 65 57 2c 20 20 20  )DeleteFileW,   
24c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
24d0: 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65 74 65  else.  { "Delete
24e0: 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20  FileW",         
24f0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
2520: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44 65 6c  f..#define osDel
2530: 65 74 65 46 69 6c 65 57 20 28 28 42 4f 4f 4c 28  eteFileW ((BOOL(
2540: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
2550: 29 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70  ))aSyscall[10].p
2560: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
2570: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
2580: 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63  { "FileTimeToLoc
2590: 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  alFileTime", (SY
25a0: 53 43 41 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f  SCALL)FileTimeTo
25b0: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 2c 20 30  LocalFileTime, 0
25c0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46   },.#else.  { "F
25d0: 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69  ileTimeToLocalFi
25e0: 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c  leTime", (SYSCAL
25f0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
2600: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2610: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
2620: 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61  osFileTimeToLoca
2630: 6c 46 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c  lFileTime ((BOOL
2640: 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20  (WINAPI*)(CONST 
2650: 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20  FILETIME*, \.   
2660: 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29       LPFILETIME)
2670: 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43  )aSyscall[11].pC
2680: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
2690: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b  ITE_OS_WINCE.  {
26a0: 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74   "FileTimeToSyst
26b0: 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53  emTime",    (SYS
26c0: 43 41 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f 53  CALL)FileTimeToS
26d0: 79 73 74 65 6d 54 69 6d 65 2c 20 20 20 20 30 20  ystemTime,    0 
26e0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 69  },.#else.  { "Fi
26f0: 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69  leTimeToSystemTi
2700: 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  me",    (SYSCALL
2710: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
2720: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
2730: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
2740: 73 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65  sFileTimeToSyste
2750: 6d 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e  mTime ((BOOL(WIN
2760: 41 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45  API*)(CONST FILE
2770: 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20  TIME*, \.       
2780: 20 4c 50 53 59 53 54 45 4d 54 49 4d 45 29 29 61   LPSYSTEMTIME))a
2790: 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72  Syscall[12].pCur
27a0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 46 6c 75 73  rent)..  { "Flus
27b0: 68 46 69 6c 65 42 75 66 66 65 72 73 22 2c 20 20  hFileBuffers",  
27c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46        (SYSCALL)F
27d0: 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 2c  lushFileBuffers,
27e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
27f0: 65 66 69 6e 65 20 6f 73 46 6c 75 73 68 46 69 6c  efine osFlushFil
2800: 65 42 75 66 66 65 72 73 20 28 28 42 4f 4f 4c 28  eBuffers ((BOOL(
2810: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29  WINAPI*)(HANDLE)
2820: 29 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43  )aSyscall[13].pC
2830: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
2840: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
2850: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
2860: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22  "FormatMessageA"
2870: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
2880: 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67  ALL)FormatMessag
2890: 65 41 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  eA,          0 }
28a0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72  ,.#else.  { "For
28b0: 6d 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20  matMessageA",   
28c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
28d0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
28e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
28f0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
2900: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 20 28  FormatMessageA (
2910: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
2920: 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57  DWORD,LPCVOID,DW
2930: 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c  ORD,DWORD,LPSTR,
2940: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
2950: 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63  ,va_list*))aSysc
2960: 61 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74  all[14].pCurrent
2970: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
2980: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2990: 57 49 44 45 29 0a 20 20 7b 20 22 46 6f 72 6d 61  WIDE).  { "Forma
29a0: 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20 20  tMessageW",     
29b0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f       (SYSCALL)Fo
29c0: 72 6d 61 74 4d 65 73 73 61 67 65 57 2c 20 20 20  rmatMessageW,   
29d0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
29e0: 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73  e.  { "FormatMes
29f0: 73 61 67 65 57 22 2c 20 20 20 20 20 20 20 20 20  sageW",         
2a00: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a20: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
2a30: 23 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74  #define osFormat
2a40: 4d 65 73 73 61 67 65 57 20 28 28 44 57 4f 52 44  MessageW ((DWORD
2a50: 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c  (WINAPI*)(DWORD,
2a60: 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57  LPCVOID,DWORD,DW
2a70: 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20  ORD,LPWSTR, \.  
2a80: 20 20 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c        DWORD,va_l
2a90: 69 73 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31  ist*))aSyscall[1
2aa0: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  5].pCurrent)..  
2ab0: 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c  { "FreeLibrary",
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
2ad0: 53 43 41 4c 4c 29 46 72 65 65 4c 69 62 72 61 72  SCALL)FreeLibrar
2ae0: 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  y,             0
2af0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46   },..#define osF
2b00: 72 65 65 4c 69 62 72 61 72 79 20 28 28 42 4f 4f  reeLibrary ((BOO
2b10: 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55  L(WINAPI*)(HMODU
2b20: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d  LE))aSyscall[16]
2b30: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
2b40: 22 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  "GetCurrentProce
2b50: 73 73 49 64 22 2c 20 20 20 20 20 28 53 59 53 43  ssId",     (SYSC
2b60: 41 4c 4c 29 47 65 74 43 75 72 72 65 6e 74 50 72  ALL)GetCurrentPr
2b70: 6f 63 65 73 73 49 64 2c 20 20 20 20 20 30 20 7d  ocessId,     0 }
2b80: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  ,..#define osGet
2b90: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
2ba0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
2bb0: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  )(VOID))aSyscall
2bc0: 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [17].pCurrent)..
2bd0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
2be0: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
2bf0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
2c00: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 44  _ANSI).  { "GetD
2c10: 69 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20  iskFreeSpaceA", 
2c20: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
2c30: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
2c40: 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ,       0 },.#el
2c50: 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  se.  { "GetDiskF
2c60: 72 65 65 53 70 61 63 65 41 22 2c 20 20 20 20 20  reeSpaceA",     
2c70: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c90: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
2ca0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69  .#define osGetDi
2cb0: 73 6b 46 72 65 65 53 70 61 63 65 41 20 28 28 42  skFreeSpaceA ((B
2cc0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
2cd0: 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57  STR,LPDWORD,LPDW
2ce0: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
2cf0: 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29         LPDWORD))
2d00: 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75  aSyscall[18].pCu
2d10: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
2d20: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
2d30: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
2d40: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
2d50: 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53   { "GetDiskFreeS
2d60: 70 61 63 65 57 22 2c 20 20 20 20 20 20 20 28 53  paceW",       (S
2d70: 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46 72  YSCALL)GetDiskFr
2d80: 65 65 53 70 61 63 65 57 2c 20 20 20 20 20 20 20  eeSpaceW,       
2d90: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
2da0: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
2db0: 57 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41  W",       (SYSCA
2dc0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
2de0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
2df0: 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53 70   osGetDiskFreeSp
2e00: 61 63 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41  aceW ((BOOL(WINA
2e10: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 4c 50 44  PI*)(LPCWSTR,LPD
2e20: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44  WORD,LPDWORD,LPD
2e30: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
2e40: 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  LPDWORD))aSyscal
2e50: 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[19].pCurrent).
2e60: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
2e70: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
2e80: 53 49 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  SI).  { "GetFile
2e90: 41 74 74 72 69 62 75 74 65 73 41 22 2c 20 20 20  AttributesA",   
2ea0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
2eb0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 2c 20  ileAttributesA, 
2ec0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
2ed0: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
2ee0: 69 62 75 74 65 73 41 22 2c 20 20 20 20 20 20 28  ibutesA",      (
2ef0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f10: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
2f20: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41  efine osGetFileA
2f30: 74 74 72 69 62 75 74 65 73 41 20 28 28 44 57 4f  ttributesA ((DWO
2f40: 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53  RD(WINAPI*)(LPCS
2f50: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d  TR))aSyscall[20]
2f60: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
2f70: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
2f80: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
2f90: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
2fa0: 62 75 74 65 73 57 22 2c 20 20 20 20 20 20 28 53  butesW",      (S
2fb0: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74  YSCALL)GetFileAt
2fc0: 74 72 69 62 75 74 65 73 57 2c 20 20 20 20 20 20  tributesW,      
2fd0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
2fe0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
2ff0: 73 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  sW",      (SYSCA
3000: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3010: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3020: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3030: 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
3040: 75 74 65 73 57 20 28 28 44 57 4f 52 44 28 57 49  utesW ((DWORD(WI
3050: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29  NAPI*)(LPCWSTR))
3060: 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75  aSyscall[21].pCu
3070: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
3080: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3090: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
30a0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
30b0: 73 45 78 57 22 2c 20 20 20 20 28 53 59 53 43 41  sExW",    (SYSCA
30c0: 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62  LL)GetFileAttrib
30d0: 75 74 65 73 45 78 57 2c 20 20 20 20 30 20 7d 2c  utesExW,    0 },
30e0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
30f0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
3100: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30  ",    (SYSCALL)0
3110: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3120: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3130: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
3140: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
3150: 45 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ExW ((BOOL(WINAP
3160: 49 2a 29 28 4c 50 43 57 53 54 52 2c 47 45 54 5f  I*)(LPCWSTR,GET_
3170: 46 49 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56 45  FILEEX_INFO_LEVE
3180: 4c 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  LS, \.        LP
3190: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32  VOID))aSyscall[2
31a0: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
31b0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
31c0: 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69  T.  { "GetFileSi
31d0: 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ze",            
31e0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3200: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3210: 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c  { "GetFileSize",
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
3230: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a  SCALL)GetFileSiz
3240: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  e,             0
3250: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
3260: 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 53 69 7a  ine osGetFileSiz
3270: 65 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  e ((DWORD(WINAPI
3280: 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52  *)(HANDLE,LPDWOR
3290: 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e  D))aSyscall[23].
32a0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
32b0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
32c0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
32d0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
32e0: 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61  ).  { "GetFullPa
32f0: 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20  thNameA",       
3300: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c   (SYSCALL)GetFul
3310: 6c 50 61 74 68 4e 61 6d 65 41 2c 20 20 20 20 20  lPathNameA,     
3320: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3330: 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  { "GetFullPathNa
3340: 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 59  meA",        (SY
3350: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
3360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3370: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
3380: 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  ine osGetFullPat
3390: 68 4e 61 6d 65 41 20 28 28 44 57 4f 52 44 28 57  hNameA ((DWORD(W
33a0: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44  INAPI*)(LPCSTR,D
33b0: 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20  WORD,LPSTR, \.  
33c0: 20 20 20 20 20 20 4c 50 53 54 52 2a 29 29 61 53        LPSTR*))aS
33d0: 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72  yscall[24].pCurr
33e0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
33f0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65  E_OS_WINCE && de
3400: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3410: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
3420: 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
3430: 65 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  eW",        (SYS
3440: 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68  CALL)GetFullPath
3450: 4e 61 6d 65 57 2c 20 20 20 20 20 20 20 20 30 20  NameW,        0 
3460: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
3470: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c  tFullPathNameW",
3480: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3490: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
34a0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
34b0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
34c0: 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
34d0: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
34e0: 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44  *)(LPCWSTR,DWORD
34f0: 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  ,LPWSTR, \.     
3500: 20 20 20 4c 50 57 53 54 52 2a 29 29 61 53 79 73     LPWSTR*))aSys
3510: 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e  call[25].pCurren
3520: 74 29 0a 0a 20 20 7b 20 22 47 65 74 4c 61 73 74  t)..  { "GetLast
3530: 45 72 72 6f 72 22 2c 20 20 20 20 20 20 20 20 20  Error",         
3540: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 4c     (SYSCALL)GetL
3550: 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20  astError,       
3560: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
3570: 6e 65 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  ne osGetLastErro
3580: 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  r ((DWORD(WINAPI
3590: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
35a0: 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[26].pCurrent).
35b0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
35c0: 49 4e 43 45 0a 20 20 2f 2a 20 54 68 65 20 47 65  INCE.  /* The Ge
35d0: 74 50 72 6f 63 41 64 64 72 65 73 73 41 28 29 20  tProcAddressA() 
35e0: 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
35f0: 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e  available on Win
3600: 64 6f 77 73 20 43 45 2e 20 2a 2f 0a 20 20 7b 20  dows CE. */.  { 
3610: 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  "GetProcAddressA
3620: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
3630: 41 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65  ALL)GetProcAddre
3640: 73 73 41 2c 20 20 20 20 20 20 20 20 20 30 20 7d  ssA,         0 }
3650: 2c 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c  ,.#else.  /* All
3660: 20 6f 74 68 65 72 20 57 69 6e 64 6f 77 73 20 70   other Windows p
3670: 6c 61 74 66 6f 72 6d 73 20 65 78 70 65 63 74 20  latforms expect 
3680: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 28 29  GetProcAddress()
3690: 20 74 6f 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e   to take.  ** an
36a0: 20 41 4e 53 49 20 73 74 72 69 6e 67 20 72 65 67   ANSI string reg
36b0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 5f  ardless of the _
36c0: 55 4e 49 43 4f 44 45 20 73 65 74 74 69 6e 67 20  UNICODE setting 
36d0: 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41  */.  { "GetProcA
36e0: 64 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20  ddressA",       
36f0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72    (SYSCALL)GetPr
3700: 6f 63 41 64 64 72 65 73 73 2c 20 20 20 20 20 20  ocAddress,      
3710: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3720: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72  .#define osGetPr
3730: 6f 63 41 64 64 72 65 73 73 41 20 28 28 46 41 52  ocAddressA ((FAR
3740: 50 52 4f 43 28 57 49 4e 41 50 49 2a 29 28 48 4d  PROC(WINAPI*)(HM
3750: 4f 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20  ODULE, \.       
3760: 20 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c   LPCSTR))aSyscal
3770: 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[27].pCurrent).
3780: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49  .  { "GetSystemI
3790: 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20  nfo",           
37a0: 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74  (SYSCALL)GetSyst
37b0: 65 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  emInfo,         
37c0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
37d0: 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 20  osGetSystemInfo 
37e0: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
37f0: 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61  LPSYSTEM_INFO))a
3800: 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70 43 75 72  Syscall[28].pCur
3810: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 53  rent)..  { "GetS
3820: 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 20  ystemTime",     
3830: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
3840: 65 74 53 79 73 74 65 6d 54 69 6d 65 2c 20 20 20  etSystemTime,   
3850: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
3860: 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65  efine osGetSyste
3870: 6d 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49 4e  mTime ((VOID(WIN
3880: 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d 54 49  API*)(LPSYSTEMTI
3890: 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 32 39 5d  ME))aSyscall[29]
38a0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
38b0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
38c0: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54  .  { "GetSystemT
38d0: 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20  imeAsFileTime", 
38e0: 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74  (SYSCALL)GetSyst
38f0: 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
3900: 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b  , 0 },.#else.  {
3910: 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41   "GetSystemTimeA
3920: 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53  sFileTime", (SYS
3930: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
3940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3950: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
3960: 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69  ne osGetSystemTi
3970: 6d 65 41 73 46 69 6c 65 54 69 6d 65 20 28 28 56  meAsFileTime ((V
3980: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a  OID(WINAPI*)( \.
3990: 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49          LPFILETI
39a0: 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 30 5d  ME))aSyscall[30]
39b0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
39c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
39d0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
39e0: 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 41   { "GetTempPathA
39f0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
3a00: 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50 61  YSCALL)GetTempPa
3a10: 74 68 41 2c 20 20 20 20 20 20 20 20 20 20 20 20  thA,            
3a20: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3a30: 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c 20 20  GetTempPathA",  
3a40: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3a50: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3a60: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3a70: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3a80: 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41 20   osGetTempPathA 
3a90: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
3aa0: 28 44 57 4f 52 44 2c 4c 50 53 54 52 29 29 61 53  (DWORD,LPSTR))aS
3ab0: 79 73 63 61 6c 6c 5b 33 31 5d 2e 70 43 75 72 72  yscall[31].pCurr
3ac0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
3ad0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3ae0: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65  AS_WIDE).  { "Ge
3af0: 74 54 65 6d 70 50 61 74 68 57 22 2c 20 20 20 20  tTempPathW",    
3b00: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3b10: 29 47 65 74 54 65 6d 70 50 61 74 68 57 2c 20 20  )GetTempPathW,  
3b20: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3b30: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d  else.  { "GetTem
3b40: 70 50 61 74 68 57 22 2c 20 20 20 20 20 20 20 20  pPathW",        
3b50: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b70: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3b80: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
3b90: 54 65 6d 70 50 61 74 68 57 20 28 28 44 57 4f 52  TempPathW ((DWOR
3ba0: 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  D(WINAPI*)(DWORD
3bb0: 2c 4c 50 57 53 54 52 29 29 61 53 79 73 63 61 6c  ,LPWSTR))aSyscal
3bc0: 6c 5b 33 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[32].pCurrent).
3bd0: 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75  .  { "GetTickCou
3be0: 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  nt",            
3bf0: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b  (SYSCALL)GetTick
3c00: 43 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20  Count,          
3c10: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
3c20: 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 20 28  osGetTickCount (
3c30: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
3c40: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33  VOID))aSyscall[3
3c50: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
3c60: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
3c70: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
3c80: 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e  .  { "GetVersion
3c90: 45 78 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  ExA",           
3ca0: 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72 73  (SYSCALL)GetVers
3cb0: 69 6f 6e 45 78 41 2c 20 20 20 20 20 20 20 20 20  ionExA,         
3cc0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3cd0: 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22   "GetVersionExA"
3ce0: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
3cf0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
3d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3d10: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
3d20: 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45  ne osGetVersionE
3d30: 78 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  xA ((BOOL(WINAPI
3d40: 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  *)( \.        LP
3d50: 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29  OSVERSIONINFOA))
3d60: 61 53 79 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75  aSyscall[34].pCu
3d70: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61  rrent)..  { "Hea
3d80: 70 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20  pAlloc",        
3d90: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3da0: 48 65 61 70 41 6c 6c 6f 63 2c 20 20 20 20 20 20  HeapAlloc,      
3db0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
3dc0: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 41 6c 6c  define osHeapAll
3dd0: 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41  oc ((LPVOID(WINA
3de0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
3df0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  D, \.        SIZ
3e00: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 35  E_T))aSyscall[35
3e10: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3e20: 20 22 48 65 61 70 43 72 65 61 74 65 22 2c 20 20   "HeapCreate",  
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3e40: 43 41 4c 4c 29 48 65 61 70 43 72 65 61 74 65 2c  CALL)HeapCreate,
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3e60: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
3e70: 61 70 43 72 65 61 74 65 20 28 28 48 41 4e 44 4c  apCreate ((HANDL
3e80: 45 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  E(WINAPI*)(DWORD
3e90: 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20 20 20 20 20  ,SIZE_T, \.     
3ea0: 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63     SIZE_T))aSysc
3eb0: 61 6c 6c 5b 33 36 5d 2e 70 43 75 72 72 65 6e 74  all[36].pCurrent
3ec0: 29 0a 0a 20 20 7b 20 22 48 65 61 70 44 65 73 74  )..  { "HeapDest
3ed0: 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  roy",           
3ee0: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 44    (SYSCALL)HeapD
3ef0: 65 73 74 72 6f 79 2c 20 20 20 20 20 20 20 20 20  estroy,         
3f00: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
3f10: 65 20 6f 73 48 65 61 70 44 65 73 74 72 6f 79 20  e osHeapDestroy 
3f20: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
3f30: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
3f40: 5b 33 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [37].pCurrent)..
3f50: 20 20 7b 20 22 48 65 61 70 46 72 65 65 22 2c 20    { "HeapFree", 
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
3f70: 53 59 53 43 41 4c 4c 29 48 65 61 70 46 72 65 65  SYSCALL)HeapFree
3f80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3f90: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
3fa0: 73 48 65 61 70 46 72 65 65 20 28 28 42 4f 4f 4c  sHeapFree ((BOOL
3fb0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
3fc0: 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 29 29 61  ,DWORD,LPVOID))a
3fd0: 53 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43 75 72  Syscall[38].pCur
3fe0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70  rent)..  { "Heap
3ff0: 52 65 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20  ReAlloc",       
4000: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
4010: 65 61 70 52 65 41 6c 6c 6f 63 2c 20 20 20 20 20  eapReAlloc,     
4020: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
4030: 65 66 69 6e 65 20 6f 73 48 65 61 70 52 65 41 6c  efine osHeapReAl
4040: 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e  loc ((LPVOID(WIN
4050: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
4060: 52 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a 20 20 20  RD,LPVOID, \.   
4070: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
4080: 73 63 61 6c 6c 5b 33 39 5d 2e 70 43 75 72 72 65  scall[39].pCurre
4090: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 53 69  nt)..  { "HeapSi
40a0: 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ze",            
40b0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
40c0: 70 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  pSize,          
40d0: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
40e0: 69 6e 65 20 6f 73 48 65 61 70 53 69 7a 65 20 28  ine osHeapSize (
40f0: 28 53 49 5a 45 5f 54 28 57 49 4e 41 50 49 2a 29  (SIZE_T(WINAPI*)
4100: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c  (HANDLE,DWORD, \
4110: 0a 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44  .        LPCVOID
4120: 29 29 61 53 79 73 63 61 6c 6c 5b 34 30 5d 2e 70  ))aSyscall[40].p
4130: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48  Current)..  { "H
4140: 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20 20  eapValidate",   
4150: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4160: 4c 29 48 65 61 70 56 61 6c 69 64 61 74 65 2c 20  L)HeapValidate, 
4170: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4180: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 56  .#define osHeapV
4190: 61 6c 69 64 61 74 65 20 28 28 42 4f 4f 4c 28 57  alidate ((BOOL(W
41a0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
41b0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
41c0: 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c  LPCVOID))aSyscal
41d0: 6c 5b 34 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[41].pCurrent).
41e0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
41f0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
4200: 53 49 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62  SI).  { "LoadLib
4210: 72 61 72 79 41 22 2c 20 20 20 20 20 20 20 20 20  raryA",         
4220: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64     (SYSCALL)Load
4230: 4c 69 62 72 61 72 79 41 2c 20 20 20 20 20 20 20  LibraryA,       
4240: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4250: 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79    { "LoadLibrary
4260: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  A",            (
4270: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4290: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
42a0: 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72  efine osLoadLibr
42b0: 61 72 79 41 20 28 28 48 4d 4f 44 55 4c 45 28 57  aryA ((HMODULE(W
42c0: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29  INAPI*)(LPCSTR))
42d0: 61 53 79 73 63 61 6c 6c 5b 34 32 5d 2e 70 43 75  aSyscall[42].pCu
42e0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
42f0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4300: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
4310: 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20 20  LoadLibraryW",  
4320: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4330: 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 57 2c  LL)LoadLibraryW,
4340: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4350: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64  .#else.  { "Load
4360: 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20 20  LibraryW",      
4370: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4380: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4390: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
43a0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c  dif..#define osL
43b0: 6f 61 64 4c 69 62 72 61 72 79 57 20 28 28 48 4d  oadLibraryW ((HM
43c0: 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ODULE(WINAPI*)(L
43d0: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
43e0: 5b 34 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [43].pCurrent)..
43f0: 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c    { "LocalFree",
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
4410: 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46 72 65  SYSCALL)LocalFre
4420: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
4430: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
4440: 73 4c 6f 63 61 6c 46 72 65 65 20 28 28 48 4c 4f  sLocalFree ((HLO
4450: 43 41 4c 28 57 49 4e 41 50 49 2a 29 28 48 4c 4f  CAL(WINAPI*)(HLO
4460: 43 41 4c 29 29 61 53 79 73 63 61 6c 6c 5b 34 34  CAL))aSyscall[44
4470: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4480: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
4490: 45 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22  E.  { "LockFile"
44a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
44b0: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69   (SYSCALL)LockFi
44c0: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
44d0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
44e0: 20 6f 73 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f   osLockFile ((BO
44f0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
4500: 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  LE,DWORD,DWORD,D
4510: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
4520: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
4530: 34 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65  45].pCurrent).#e
4540: 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c  lse.  { "LockFil
4550: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
4560: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4580: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4590: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
45a0: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c 6f 63 6b  _WINCE.  { "Lock
45b0: 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20  FileEx",        
45c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c        (SYSCALL)L
45d0: 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20 20 20  ockFileEx,      
45e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
45f0: 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65  efine osLockFile
4600: 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  Ex ((BOOL(WINAPI
4610: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
4620: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
4630: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f  D, \.        LPO
4640: 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63  VERLAPPED))aSysc
4650: 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65 6e 74  all[46].pCurrent
4660: 29 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63  ).#else.  { "Loc
4670: 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20  kFileEx",       
4680: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4690: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
46a0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
46b0: 6e 64 69 66 0a 0a 20 20 7b 20 22 4d 61 70 56 69  ndif..  { "MapVi
46c0: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
46d0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61       (SYSCALL)Ma
46e0: 70 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20  pViewOfFile,    
46f0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
4700: 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f 66  fine osMapViewOf
4710: 46 69 6c 65 20 28 28 4c 50 56 4f 49 44 28 57 49  File ((LPVOID(WI
4720: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
4730: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
4740: 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f   \.        SIZE_
4750: 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 37 5d 2e  T))aSyscall[47].
4760: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
4770: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
4780: 68 61 72 22 2c 20 20 20 20 20 28 53 59 53 43 41  har",     (SYSCA
4790: 4c 4c 29 4d 75 6c 74 69 42 79 74 65 54 6f 57 69  LL)MultiByteToWi
47a0: 64 65 43 68 61 72 2c 20 20 20 20 20 30 20 7d 2c  deChar,     0 },
47b0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75 6c 74  ..#define osMult
47c0: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 20  iByteToWideChar 
47d0: 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 28 55  ((int(WINAPI*)(U
47e0: 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52  INT,DWORD,LPCSTR
47f0: 2c 69 6e 74 2c 4c 50 57 53 54 52 2c 20 5c 0a 20  ,int,LPWSTR, \. 
4800: 20 20 20 20 20 20 20 69 6e 74 29 29 61 53 79 73         int))aSys
4810: 63 61 6c 6c 5b 34 38 5d 2e 70 43 75 72 72 65 6e  call[48].pCurren
4820: 74 29 0a 0a 20 20 7b 20 22 51 75 65 72 79 50 65  t)..  { "QueryPe
4830: 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72  rformanceCounter
4840: 22 2c 20 28 53 59 53 43 41 4c 4c 29 51 75 65 72  ", (SYSCALL)Quer
4850: 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e  yPerformanceCoun
4860: 74 65 72 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69  ter, 0 },..#defi
4870: 6e 65 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72  ne osQueryPerfor
4880: 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 28 28 42  manceCounter ((B
4890: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a  OOL(WINAPI*)( \.
48a0: 20 20 20 20 20 20 20 20 4c 41 52 47 45 5f 49 4e          LARGE_IN
48b0: 54 45 47 45 52 2a 29 29 61 53 79 73 63 61 6c 6c  TEGER*))aSyscall
48c0: 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [49].pCurrent)..
48d0: 20 20 7b 20 22 52 65 61 64 46 69 6c 65 22 2c 20    { "ReadFile", 
48e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
48f0: 53 59 53 43 41 4c 4c 29 52 65 61 64 46 69 6c 65  SYSCALL)ReadFile
4900: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4910: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
4920: 73 52 65 61 64 46 69 6c 65 20 28 28 42 4f 4f 4c  sReadFile ((BOOL
4930: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
4940: 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50  ,LPVOID,DWORD,LP
4950: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
4960: 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61   LPOVERLAPPED))a
4970: 53 79 73 63 61 6c 6c 5b 35 30 5d 2e 70 43 75 72  Syscall[50].pCur
4980: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 65 74 45  rent)..  { "SetE
4990: 6e 64 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ndOfFile",      
49a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53        (SYSCALL)S
49b0: 65 74 45 6e 64 4f 66 46 69 6c 65 2c 20 20 20 20  etEndOfFile,    
49c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
49d0: 65 66 69 6e 65 20 6f 73 53 65 74 45 6e 64 4f 66  efine osSetEndOf
49e0: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
49f0: 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79  PI*)(HANDLE))aSy
4a00: 73 63 61 6c 6c 5b 35 31 5d 2e 70 43 75 72 72 65  scall[51].pCurre
4a10: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
4a20: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 65  OS_WINRT.  { "Se
4a30: 74 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20  tFilePointer",  
4a40: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4a50: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4a60: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4a70: 65 6c 73 65 0a 20 20 7b 20 22 53 65 74 46 69 6c  else.  { "SetFil
4a80: 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20 20 20  ePointer",      
4a90: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74      (SYSCALL)Set
4aa0: 46 69 6c 65 50 6f 69 6e 74 65 72 2c 20 20 20 20  FilePointer,    
4ab0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4ac0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74  f..#define osSet
4ad0: 46 69 6c 65 50 6f 69 6e 74 65 72 20 28 28 44 57  FilePointer ((DW
4ae0: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  ORD(WINAPI*)(HAN
4af0: 44 4c 45 2c 4c 4f 4e 47 2c 50 4c 4f 4e 47 2c 20  DLE,LONG,PLONG, 
4b00: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29  \.        DWORD)
4b10: 29 61 53 79 73 63 61 6c 6c 5b 35 32 5d 2e 70 43  )aSyscall[52].pC
4b20: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
4b30: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
4b40: 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20 20   "Sleep",       
4b50: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4b60: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4b80: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 6c  },.#else.  { "Sl
4b90: 65 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20  eep",           
4ba0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4bb0: 29 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20  )Sleep,         
4bc0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4bd0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4be0: 73 53 6c 65 65 70 20 28 28 56 4f 49 44 28 57 49  sSleep ((VOID(WI
4bf0: 4e 41 50 49 2a 29 28 44 57 4f 52 44 29 29 61 53  NAPI*)(DWORD))aS
4c00: 79 73 63 61 6c 6c 5b 35 33 5d 2e 70 43 75 72 72  yscall[53].pCurr
4c10: 65 6e 74 29 0a 0a 20 20 7b 20 22 53 79 73 74 65  ent)..  { "Syste
4c20: 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 22  mTimeToFileTime"
4c30: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 79  ,    (SYSCALL)Sy
4c40: 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69  stemTimeToFileTi
4c50: 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65  me,    0 },..#de
4c60: 66 69 6e 65 20 6f 73 53 79 73 74 65 6d 54 69 6d  fine osSystemTim
4c70: 65 54 6f 46 69 6c 65 54 69 6d 65 20 28 28 42 4f  eToFileTime ((BO
4c80: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53  OL(WINAPI*)(CONS
4c90: 54 20 53 59 53 54 45 4d 54 49 4d 45 2a 2c 20 5c  T SYSTEMTIME*, \
4ca0: 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54  .        LPFILET
4cb0: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 34  IME))aSyscall[54
4cc0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4cd0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
4ce0: 45 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c  E.  { "UnlockFil
4cf0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
4d00: 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b   (SYSCALL)Unlock
4d10: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
4d20: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
4d30: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 28 28   osUnlockFile ((
4d40: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
4d50: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
4d60: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
4d70: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
4d80: 6c 5b 35 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[55].pCurrent).
4d90: 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63  #else.  { "Unloc
4da0: 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  kFile",         
4db0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dd0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4de0: 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  if..#if !SQLITE_
4df0: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55 6e  OS_WINCE.  { "Un
4e00: 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20  lockFileEx",    
4e10: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4e20: 29 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c 20 20  )UnlockFileEx,  
4e30: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
4e40: 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b  #define osUnlock
4e50: 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49  FileEx ((BOOL(WI
4e60: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
4e70: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
4e80: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45   \.        LPOVE
4e90: 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c  RLAPPED))aSyscal
4ea0: 6c 5b 35 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[56].pCurrent).
4eb0: 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63  #else.  { "Unloc
4ec0: 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20  kFileEx",       
4ed0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ef0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4f00: 69 66 0a 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69  if..  { "UnmapVi
4f10: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
4f20: 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6d 61     (SYSCALL)Unma
4f30: 70 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20  pViewOfFile,    
4f40: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
4f50: 6e 65 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66  ne osUnmapViewOf
4f60: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
4f70: 50 49 2a 29 28 4c 50 43 56 4f 49 44 29 29 61 53  PI*)(LPCVOID))aS
4f80: 79 73 63 61 6c 6c 5b 35 37 5d 2e 70 43 75 72 72  yscall[57].pCurr
4f90: 65 6e 74 29 0a 0a 20 20 7b 20 22 57 69 64 65 43  ent)..  { "WideC
4fa0: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c  harToMultiByte",
4fb0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 69       (SYSCALL)Wi
4fc0: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
4fd0: 65 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65  e,     0 },..#de
4fe0: 66 69 6e 65 20 6f 73 57 69 64 65 43 68 61 72 54  fine osWideCharT
4ff0: 6f 4d 75 6c 74 69 42 79 74 65 20 28 28 69 6e 74  oMultiByte ((int
5000: 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44  (WINAPI*)(UINT,D
5010: 57 4f 52 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74  WORD,LPCWSTR,int
5020: 2c 4c 50 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20  ,LPSTR,int, \.  
5030: 20 20 20 20 20 20 4c 50 43 53 54 52 2c 4c 50 42        LPCSTR,LPB
5040: 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 35 38  OOL))aSyscall[58
5050: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5060: 20 22 57 72 69 74 65 46 69 6c 65 22 2c 20 20 20   "WriteFile",   
5070: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5080: 43 41 4c 4c 29 57 72 69 74 65 46 69 6c 65 2c 20  CALL)WriteFile, 
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
50a0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 72  },..#define osWr
50b0: 69 74 65 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  iteFile ((BOOL(W
50c0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
50d0: 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44  PCVOID,DWORD,LPD
50e0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
50f0: 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53  LPOVERLAPPED))aS
5100: 79 73 63 61 6c 6c 5b 35 39 5d 2e 70 43 75 72 72  yscall[59].pCurr
5110: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5120: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22  E_OS_WINCE.  { "
5130: 43 72 65 61 74 65 45 76 65 6e 74 45 78 22 2c 20  CreateEventEx", 
5140: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5150: 4c 4c 29 43 72 65 61 74 65 45 76 65 6e 74 45 78  LL)CreateEventEx
5160: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
5170: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
5180: 74 65 45 76 65 6e 74 45 78 20 28 28 48 41 4e 44  teEventEx ((HAND
5190: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 45  LE(WINAPI*)(LPSE
51a0: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
51b0: 53 2c 4c 50 43 54 53 54 52 2c 20 5c 0a 20 20 20  S,LPCTSTR, \.   
51c0: 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44       DWORD,DWORD
51d0: 29 29 61 53 79 73 63 61 6c 6c 5b 36 30 5d 2e 70  ))aSyscall[60].p
51e0: 43 75 72 72 65 6e 74 29 0a 23 65 6c 73 65 0a 20  Current).#else. 
51f0: 20 7b 20 22 43 72 65 61 74 65 45 76 65 6e 74 45   { "CreateEventE
5200: 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  x",           (S
5210: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5230: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 20 20 7b  0 },.#endif..  {
5240: 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f   "WaitForSingleO
5250: 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59 53  bject",     (SYS
5260: 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e 67  CALL)WaitForSing
5270: 6c 65 4f 62 6a 65 63 74 2c 20 20 20 20 20 30 20  leObject,     0 
5280: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61  },..#define osWa
5290: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
52a0: 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  t ((DWORD(WINAPI
52b0: 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20  *)(HANDLE, \.   
52c0: 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73       DWORD))aSys
52d0: 63 61 6c 6c 5b 36 31 5d 2e 70 43 75 72 72 65 6e  call[61].pCurren
52e0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
52f0: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 57 61  OS_WINCE.  { "Wa
5300: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
5310: 74 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c  tEx",   (SYSCALL
5320: 29 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  )WaitForSingleOb
5330: 6a 65 63 74 45 78 2c 20 20 20 30 20 7d 2c 0a 0a  jectEx,   0 },..
5340: 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74 46 6f  #define osWaitFo
5350: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 20  rSingleObjectEx 
5360: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
5370: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c  (HANDLE,DWORD, \
5380: 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 29 29 61  .        BOOL))a
5390: 53 79 73 63 61 6c 6c 5b 36 32 5d 2e 70 43 75 72  Syscall[62].pCur
53a0: 72 65 6e 74 29 0a 23 65 6c 73 65 0a 20 20 7b 20  rent).#else.  { 
53b0: 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  "WaitForSingleOb
53c0: 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59 53 43  jectEx",   (SYSC
53d0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
53e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
53f0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53  ,.#endif..#if !S
5400: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
5410: 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74   { "SetFilePoint
5420: 65 72 45 78 22 2c 20 20 20 20 20 20 20 20 28 53  erEx",        (S
5430: 59 53 43 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f  YSCALL)SetFilePo
5440: 69 6e 74 65 72 45 78 2c 20 20 20 20 20 20 20 20  interEx,        
5450: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
5460: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78  SetFilePointerEx
5470: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
5480: 28 48 41 4e 44 4c 45 2c 4c 41 52 47 45 5f 49 4e  (HANDLE,LARGE_IN
5490: 54 45 47 45 52 2c 20 5c 0a 20 20 20 20 20 20 20  TEGER, \.       
54a0: 20 50 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2c   PLARGE_INTEGER,
54b0: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
54c0: 36 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65  63].pCurrent).#e
54d0: 6c 73 65 0a 20 20 7b 20 22 53 65 74 46 69 6c 65  lse.  { "SetFile
54e0: 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20 20  PointerEx",     
54f0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
5500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5510: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5520: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
5530: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 47 65 74 46  _WINCE.  { "GetF
5540: 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79  ileInformationBy
5550: 48 61 6e 64 6c 65 45 78 22 2c 20 28 53 59 53 43  HandleEx", (SYSC
5560: 41 4c 4c 29 47 65 74 46 69 6c 65 49 6e 66 6f 72  ALL)GetFileInfor
5570: 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78  mationByHandleEx
5580: 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20  , 0 },..#define 
5590: 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61  osGetFileInforma
55a0: 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 20 28  tionByHandleEx (
55b0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
55c0: 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20  ANDLE, \.       
55d0: 20 46 49 4c 45 5f 49 4e 46 4f 5f 42 59 5f 48 41   FILE_INFO_BY_HA
55e0: 4e 44 4c 45 5f 43 4c 41 53 53 2c 4c 50 56 4f 49  NDLE_CLASS,LPVOI
55f0: 44 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  D,DWORD))aSyscal
5600: 6c 5b 36 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[64].pCurrent).
5610: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
5620: 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48  leInformationByH
5630: 61 6e 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41  andleEx", (SYSCA
5640: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5650: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5660: 69 66 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66  if..}; /* End of
5670: 20 74 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c   the overrideabl
5680: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a  e system calls *
5690: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  /../*.** This is
56a0: 20 74 68 65 20 78 53 65 74 53 79 73 74 65 6d 43   the xSetSystemC
56b0: 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66 20  all() method of 
56c0: 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f 72 20  sqlite3_vfs for 
56d0: 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22 77  all of the.** "w
56e0: 69 6e 33 32 22 20 56 46 53 65 73 2e 20 20 52 65  in32" VFSes.  Re
56f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
5700: 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  pon successfully
5710: 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a   updating the.**
5720: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69   system call poi
5730: 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f  nter, or SQLITE_
5740: 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65 72  NOTFOUND if ther
5750: 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72  e is no configur
5760: 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63  able.** system c
5770: 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e  all named zName.
5780: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
5790: 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28  inSetSystemCall(
57a0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
57b0: 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20 20  pNotUsed,       
57c0: 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f 69 6e   /* The VFS poin
57d0: 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a  ter.  Not used *
57e0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
57f0: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  zName,          
5800: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73    /* Name of sys
5810: 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72  tem call to over
5820: 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ride */.  sqlite
5830: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e  3_syscall_ptr pN
5840: 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74  ewFunc  /* Point
5850: 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74 65 6d  er to new system
5860: 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29   call value */.)
5870: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
5880: 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   i;.  int rc = S
5890: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
58a0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
58b0: 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20  TER(pNotUsed);. 
58c0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
58d0: 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e  .    /* If no zN
58e0: 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20 72 65  ame is given, re
58f0: 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74 65 6d  store all system
5900: 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69 72 20   calls to their 
5910: 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73  default.    ** s
5920: 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65 74 75  ettings and retu
5930: 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20  rn NULL.    */. 
5940: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
5950: 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  K;.    for(i=0; 
5960: 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  i<sizeof(aSyscal
5970: 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61  l)/sizeof(aSysca
5980: 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ll[0]); i++){.  
5990: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
59a0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a  [i].pDefault ){.
59b0: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
59c0: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 61  [i].pCurrent = a
59d0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
59e0: 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ult;.      }.   
59f0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
5a00: 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 73  /* If zName is s
5a10: 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72 61 74  pecified, operat
5a20: 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e  e on only the on
5a30: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20  e system call.  
5a40: 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 2e 0a    ** specified..
5a50: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
5a60: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
5a70: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
5a80: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
5a90: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
5aa0: 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61  mp(zName, aSysca
5ab0: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ll[i].zName)==0 
5ac0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
5ad0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
5ae0: 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ult==0 ){.      
5af0: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e      aSyscall[i].
5b00: 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79 73 63  pDefault = aSysc
5b10: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b  all[i].pCurrent;
5b20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5b30: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
5b40: 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  K;.        if( p
5b50: 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65  NewFunc==0 ) pNe
5b60: 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c  wFunc = aSyscall
5b70: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20  [i].pDefault;.  
5b80: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69        aSyscall[i
5b90: 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70 4e 65  ].pCurrent = pNe
5ba0: 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 62  wFunc;.        b
5bb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
5bc0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
5bd0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
5be0: 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
5bf0: 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  f a system call.
5c00: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
5c10: 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a   zName is not a.
5c20: 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 73 79  ** recognized sy
5c30: 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20  stem call name. 
5c40: 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65   NULL is also re
5c50: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 73 79  turned if the sy
5c60: 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20  stem call.** is 
5c70: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 66 69  currently undefi
5c80: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ned..*/.static s
5c90: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
5ca0: 74 72 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43  tr winGetSystemC
5cb0: 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  all(.  sqlite3_v
5cc0: 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20  fs *pNotUsed,.  
5cd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
5ce0: 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  e.){.  unsigned 
5cf0: 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44  int i;..  UNUSED
5d00: 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55  _PARAMETER(pNotU
5d10: 73 65 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  sed);.  for(i=0;
5d20: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
5d30: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
5d40: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
5d50: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
5d60: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
5d70: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74  .zName)==0 ) ret
5d80: 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  urn aSyscall[i].
5d90: 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20  pCurrent;.  }.  
5da0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
5db0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
5dc0: 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  me of the first 
5dd0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 66 74 65  system call afte
5de0: 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61  r zName.  If zNa
5df0: 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e  me==NULL.** then
5e00: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   return the name
5e10: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79   of the first sy
5e20: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75  stem call.  Retu
5e30: 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65  rn NULL if zName
5e40: 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20  .** is the last 
5e50: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69  system call or i
5e60: 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74  f zName is not t
5e70: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c  he name of a val
5e80: 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  id.** system cal
5e90: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  l..*/.static con
5ea0: 73 74 20 63 68 61 72 20 2a 77 69 6e 4e 65 78 74  st char *winNext
5eb0: 53 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74  SystemCall(sqlit
5ec0: 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74  e3_vfs *p, const
5ed0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
5ee0: 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20   int i = -1;..  
5ef0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
5f00: 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  (p);.  if( zName
5f10: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
5f20: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79   i<ArraySize(aSy
5f30: 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a  scall)-1; i++){.
5f40: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
5f50: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
5f60: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
5f70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
5f80: 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72  .  for(i++; i<Ar
5f90: 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
5fa0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
5fb0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
5fc0: 72 72 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72  rrent!=0 ) retur
5fd0: 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  n aSyscall[i].zN
5fe0: 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ame;.  }.  retur
5ff0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
6000: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
6010: 69 6e 65 20 53 75 73 70 65 6e 64 73 20 74 68 65  ine Suspends the
6020: 20 74 68 72 65 61 64 20 66 6f 72 20 61 74 20 6c   thread for at l
6030: 65 61 73 74 20 6d 73 20 6d 69 6c 6c 69 73 65 63  east ms millisec
6040: 6f 6e 64 73 2e 20 20 54 68 69 73 20 69 73 20 65  onds.  This is e
6050: 71 75 69 76 61 6c 65 6e 74 0a 2a 2a 20 74 6f 20  quivalent.** to 
6060: 74 68 65 20 77 69 6e 33 32 20 53 6c 65 65 70 28  the win32 Sleep(
6070: 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  ) interface..*/.
6080: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
6090: 4e 52 54 0a 73 74 61 74 69 63 20 48 41 4e 44 4c  NRT.static HANDL
60a0: 45 20 73 6c 65 65 70 4f 62 6a 3b 0a 73 74 61 74  E sleepObj;.stat
60b0: 69 63 20 76 6f 69 64 20 70 6f 72 74 61 62 6c 65  ic void portable
60c0: 53 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20  Sleep(int ms){. 
60d0: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
60e0: 4f 62 6a 65 63 74 45 78 28 73 6c 65 65 70 4f 62  ObjectEx(sleepOb
60f0: 6a 2c 20 6d 73 2c 20 46 41 4c 53 45 29 3b 0a 7d  j, ms, FALSE);.}
6100: 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 76 6f  .#else.static vo
6110: 69 64 20 70 6f 72 74 61 62 6c 65 53 6c 65 65 70  id portableSleep
6120: 28 69 6e 74 20 6d 73 29 7b 0a 20 20 6f 73 53 6c  (int ms){.  osSl
6130: 65 65 70 28 6d 73 29 3b 20 0a 7d 0a 23 65 6e 64  eep(ms); .}.#end
6140: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
6150: 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29   true (non-zero)
6160: 20 69 66 20 77 65 20 61 72 65 20 72 75 6e 6e 69   if we are runni
6170: 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e 54 2c 20  ng under WinNT, 
6180: 57 69 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a  Win2K, WinXP,.**
6190: 20 6f 72 20 57 69 6e 43 45 2e 20 20 52 65 74 75   or WinCE.  Retu
61a0: 72 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f 29 20  rn false (zero) 
61b0: 66 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e 39 38  for Win95, Win98
61c0: 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a  , or WinME..**.*
61d0: 2a 20 48 65 72 65 20 69 73 20 61 6e 20 69 6e 74  * Here is an int
61e0: 65 72 65 73 74 69 6e 67 20 6f 62 73 65 72 76 61  eresting observa
61f0: 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20 57 69  tion:  Win95, Wi
6200: 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45 20 6c  n98, and WinME l
6210: 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46  ack.** the LockF
6220: 69 6c 65 45 78 28 29 20 41 50 49 2e 20 20 42 75  ileEx() API.  Bu
6230: 74 20 77 65 20 63 61 6e 20 73 74 69 6c 6c 20 73  t we can still s
6240: 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 20 61  tatically link a
6250: 67 61 69 6e 73 74 20 74 68 61 74 0a 2a 2a 20 41  gainst that.** A
6260: 50 49 20 61 73 20 6c 6f 6e 67 20 61 73 20 77 65  PI as long as we
6270: 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74 20 77   don't call it w
6280: 68 65 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e 39  hen running Win9
6290: 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c 6c  5/98/ME.  A call
62a0: 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74   to.** this rout
62b0: 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  ine is used to d
62c0: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
62d0: 68 6f 73 74 20 69 73 20 57 69 6e 39 35 2f 39 38  host is Win95/98
62e0: 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f  /ME or.** WinNT/
62f0: 32 4b 2f 58 50 20 73 6f 20 74 68 61 74 20 77 65  2K/XP so that we
6300: 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74 68   will know wheth
6310: 65 72 20 6f 72 20 6e 6f 74 20 77 65 20 63 61 6e  er or not we can
6320: 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20   safely call.** 
6330: 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29  the LockFileEx()
6340: 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c   API..*/.#if SQL
6350: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 20 7c 7c  ITE_OS_WINCE  ||
6360: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
6370: 0a 23 20 64 65 66 69 6e 65 20 69 73 4e 54 28 29  .# define isNT()
6380: 20 20 28 31 29 0a 23 65 6c 73 65 0a 20 20 73 74    (1).#else.  st
6390: 61 74 69 63 20 69 6e 74 20 69 73 4e 54 28 76 6f  atic int isNT(vo
63a0: 69 64 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  id){.    if( sql
63b0: 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 30 20  ite3_os_type==0 
63c0: 29 7b 0a 20 20 20 20 20 20 4f 53 56 45 52 53 49  ){.      OSVERSI
63d0: 4f 4e 49 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a 20  ONINFOA sInfo;. 
63e0: 20 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56       sInfo.dwOSV
63f0: 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d  ersionInfoSize =
6400: 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a   sizeof(sInfo);.
6410: 20 20 20 20 20 20 6f 73 47 65 74 56 65 72 73 69        osGetVersi
6420: 6f 6e 45 78 41 28 26 73 49 6e 66 6f 29 3b 0a 20  onExA(&sInfo);. 
6430: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f       sqlite3_os_
6440: 74 79 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77 50  type = sInfo.dwP
6450: 6c 61 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f 50  latformId==VER_P
6460: 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54  LATFORM_WIN32_NT
6470: 20 3f 20 32 20 3a 20 31 3b 0a 20 20 20 20 7d 0a   ? 2 : 1;.    }.
6480: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
6490: 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 3b 0a 20  e3_os_type==2;. 
64a0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
64b0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a  ITE_OS_WINCE */.
64c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
64d0: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a  IN32_MALLOC./*.*
64e0: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
64f0: 73 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  s of memory..*/.
6500: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e  static void *win
6510: 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42  MemMalloc(int nB
6520: 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20  ytes){.  HANDLE 
6530: 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70  hHeap;.  void *p
6540: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
6550: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
6560: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
6570: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
6580: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
6590: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
65a0: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
65b0: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
65c0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
65d0: 41 4c 49 44 41 54 45 0a 20 20 61 73 73 65 72 74  ALIDATE.  assert
65e0: 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74   ( osHeapValidat
65f0: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
6600: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
6610: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
6620: 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  f.  assert( nByt
6630: 65 73 3e 3d 30 20 29 3b 0a 20 20 70 20 3d 20 6f  es>=0 );.  p = o
6640: 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70  sHeapAlloc(hHeap
6650: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
6660: 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45  EAP_FLAGS, (SIZE
6670: 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  _T)nBytes);.  if
6680: 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( !p ){.    sqli
6690: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
66a0: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
66b0: 20 48 65 61 70 41 6c 6c 6f 63 20 25 75 20 62 79   HeapAlloc %u by
66c0: 74 65 73 20 28 25 64 29 2c 20 68 65 61 70 3d 25  tes (%d), heap=%
66d0: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
66e0: 20 20 20 20 6e 42 79 74 65 73 2c 20 6f 73 47 65      nBytes, osGe
66f0: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76  tLastError(), (v
6700: 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d  oid*)hHeap);.  }
6710: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
6720: 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72  /*.** Free memor
6730: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
6740: 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69  d winMemFree(voi
6750: 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20 48 41  d *pPrior){.  HA
6760: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77  NDLE hHeap;..  w
6770: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
6780: 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69  ();.  hHeap = wi
6790: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20  nMemGetHeap();. 
67a0: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
67b0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  0 );.  assert( h
67c0: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
67d0: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
67e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
67f0: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
6800: 45 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73 48  E.  assert ( osH
6810: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
6820: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
6830: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69  HEAP_FLAGS, pPri
6840: 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  or) );.#endif.  
6850: 69 66 28 20 21 70 50 72 69 6f 72 20 29 20 72 65  if( !pPrior ) re
6860: 74 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69 6e 67  turn; /* Passing
6870: 20 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46 72 65   NULL to HeapFre
6880: 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20  e is undefined. 
6890: 2a 2f 0a 20 20 69 66 28 20 21 6f 73 48 65 61 70  */.  if( !osHeap
68a0: 46 72 65 65 28 68 48 65 61 70 2c 20 53 51 4c 49  Free(hHeap, SQLI
68b0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
68c0: 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 7b 0a  AGS, pPrior) ){.
68d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
68e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
68f0: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 46 72 65  ailed to HeapFre
6900: 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 64 29 2c  e block %p (%d),
6910: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
6920: 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69 6f             pPrio
6930: 72 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  r, osGetLastErro
6940: 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61  r(), (void*)hHea
6950: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
6960: 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65   Change the size
6970: 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   of an existing 
6980: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
6990: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
69a0: 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28   *winMemRealloc(
69b0: 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e  void *pPrior, in
69c0: 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41 4e  t nBytes){.  HAN
69d0: 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f 69  DLE hHeap;.  voi
69e0: 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41  d *p;..  winMemA
69f0: 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20  ssertMagic();.  
6a00: 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65  hHeap = winMemGe
6a10: 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72  tHeap();.  asser
6a20: 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20  t( hHeap!=0 );. 
6a30: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
6a40: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
6a50: 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66 20 53  ALUE );.#ifdef S
6a60: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
6a70: 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20 61 73  OC_VALIDATE.  as
6a80: 73 65 72 74 20 28 20 6f 73 48 65 61 70 56 61 6c  sert ( osHeapVal
6a90: 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c  idate(hHeap, SQL
6aa0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
6ab0: 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b  LAGS, pPrior) );
6ac0: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
6ad0: 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20  ( nBytes>=0 );. 
6ae0: 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 7b 0a   if( !pPrior ){.
6af0: 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 41 6c      p = osHeapAl
6b00: 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54  loc(hHeap, SQLIT
6b10: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
6b20: 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74  GS, (SIZE_T)nByt
6b30: 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  es);.  }else{.  
6b40: 20 20 70 20 3d 20 6f 73 48 65 61 70 52 65 41 6c    p = osHeapReAl
6b50: 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54  loc(hHeap, SQLIT
6b60: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
6b70: 47 53 2c 20 70 50 72 69 6f 72 2c 20 28 53 49 5a  GS, pPrior, (SIZ
6b80: 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d  E_T)nBytes);.  }
6b90: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
6ba0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
6bb0: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
6bc0: 65 64 20 74 6f 20 25 73 20 25 75 20 62 79 74 65  ed to %s %u byte
6bd0: 73 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22  s (%d), heap=%p"
6be0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6bf0: 20 20 70 50 72 69 6f 72 20 3f 20 22 48 65 61 70    pPrior ? "Heap
6c00: 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48 65 61 70  ReAlloc" : "Heap
6c10: 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65 73 2c 20  Alloc", nBytes, 
6c20: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
6c30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6c40: 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b    (void*)hHeap);
6c50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
6c60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6c70: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20   the size of an 
6c80: 6f 75 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f  outstanding allo
6c90: 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79 74 65 73  cation, in bytes
6ca0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6cb0: 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20  winMemSize(void 
6cc0: 2a 70 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48  *p){.  HANDLE hH
6cd0: 65 61 70 3b 0a 20 20 53 49 5a 45 5f 54 20 6e 3b  eap;.  SIZE_T n;
6ce0: 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ..  winMemAssert
6cf0: 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70  Magic();.  hHeap
6d00: 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70   = winMemGetHeap
6d10: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48  ();.  assert( hH
6d20: 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  eap!=0 );.  asse
6d30: 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c  rt( hHeap!=INVAL
6d40: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
6d50: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
6d60: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
6d70: 4c 49 44 41 54 45 0a 20 20 61 73 73 65 72 74 20  LIDATE.  assert 
6d80: 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65  ( osHeapValidate
6d90: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
6da0: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
6db0: 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66   NULL) );.#endif
6dc0: 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75  .  if( !p ) retu
6dd0: 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f 73 48 65  rn 0;.  n = osHe
6de0: 61 70 53 69 7a 65 28 68 48 65 61 70 2c 20 53 51  apSize(hHeap, SQ
6df0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
6e00: 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20 69 66 28  FLAGS, p);.  if(
6e10: 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d 31 20 29   n==(SIZE_T)-1 )
6e20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
6e30: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  g(SQLITE_NOMEM, 
6e40: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 53  "failed to HeapS
6e50: 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 64  ize block %p (%d
6e60: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
6e80: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
6e90: 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b  , (void*)hHeap);
6ea0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
6eb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74   }.  return (int
6ec0: 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75  )n;.}../*.** Rou
6ed0: 6e 64 20 75 70 20 61 20 72 65 71 75 65 73 74 20  nd up a request 
6ee0: 73 69 7a 65 20 74 6f 20 74 68 65 20 6e 65 78 74  size to the next
6ef0: 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69 6f   valid allocatio
6f00: 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
6f10: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e  c int winMemRoun
6f20: 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72 65  dup(int n){.  re
6f30: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
6f40: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73   Initialize this
6f50: 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74   module..*/.stat
6f60: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69  ic int winMemIni
6f70: 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  t(void *pAppData
6f80: 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20  ){.  winMemData 
6f90: 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28  *pWinMemData = (
6fa0: 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70  winMemData *)pAp
6fb0: 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70  pData;..  if( !p
6fc0: 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74  WinMemData ) ret
6fd0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
6fe0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  ;.  assert( pWin
6ff0: 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 3d 3d  MemData->magic==
7000: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 29 3b 0a  WINMEM_MAGIC );.
7010: 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61    if( !pWinMemDa
7020: 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20  ta->hHeap ){.   
7030: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48   pWinMemData->hH
7040: 65 61 70 20 3d 20 6f 73 48 65 61 70 43 72 65 61  eap = osHeapCrea
7050: 74 65 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  te(SQLITE_WIN32_
7060: 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20  HEAP_FLAGS,.    
7070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48    SQLITE_WIN32_H
70a0: 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 0a 20  EAP_INIT_SIZE,. 
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70d0: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33       SQLITE_WIN3
70e0: 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 29  2_HEAP_MAX_SIZE)
70f0: 3b 0a 20 20 20 20 69 66 28 20 21 70 57 69 6e 4d  ;.    if( !pWinM
7100: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b  emData->hHeap ){
7110: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  .      sqlite3_l
7120: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
7130: 0a 20 20 20 20 20 20 20 20 20 20 22 66 61 69 6c  .          "fail
7140: 65 64 20 74 6f 20 48 65 61 70 43 72 65 61 74 65  ed to HeapCreate
7150: 20 28 25 64 29 2c 20 66 6c 61 67 73 3d 25 75 2c   (%d), flags=%u,
7160: 20 69 6e 69 74 53 69 7a 65 3d 25 75 2c 20 6d 61   initSize=%u, ma
7170: 78 53 69 7a 65 3d 25 75 22 2c 0a 20 20 20 20 20  xSize=%u",.     
7180: 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72       osGetLastEr
7190: 72 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f 57 49  ror(), SQLITE_WI
71a0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a  N32_HEAP_FLAGS,.
71b0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
71c0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54  _WIN32_HEAP_INIT
71d0: 5f 53 49 5a 45 2c 20 53 51 4c 49 54 45 5f 57 49  _SIZE, SQLITE_WI
71e0: 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a  N32_HEAP_MAX_SIZ
71f0: 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  E);.      return
7200: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
7210: 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d     }.    pWinMem
7220: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 54  Data->bOwned = T
7230: 52 55 45 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  RUE;.  }.  asser
7240: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
7250: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
7260: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
7270: 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  a->hHeap!=INVALI
7280: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
7290: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
72a0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
72b0: 49 44 41 54 45 0a 20 20 61 73 73 65 72 74 28 20  IDATE.  assert( 
72c0: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 70  osHeapValidate(p
72d0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
72e0: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
72f0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c  HEAP_FLAGS, NULL
7300: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  ) );.#endif.  re
7310: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7320: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74 69  }../*.** Deiniti
7330: 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c  alize this modul
7340: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
7350: 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e  d winMemShutdown
7360: 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29  (void *pAppData)
7370: 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a  {.  winMemData *
7380: 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77  pWinMemData = (w
7390: 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70  inMemData *)pApp
73a0: 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57  Data;..  if( !pW
73b0: 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75  inMemData ) retu
73c0: 72 6e 3b 0a 20 20 69 66 28 20 70 57 69 6e 4d 65  rn;.  if( pWinMe
73d0: 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a  mData->hHeap ){.
73e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e      assert( pWin
73f0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d  MemData->hHeap!=
7400: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
7410: 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66 20 53  ALUE );.#ifdef S
7420: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
7430: 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20 20 20  OC_VALIDATE.    
7440: 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61  assert( osHeapVa
7450: 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61  lidate(pWinMemDa
7460: 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54  ta->hHeap, SQLIT
7470: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
7480: 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e  GS, NULL) );.#en
7490: 64 69 66 0a 20 20 20 20 69 66 28 20 70 57 69 6e  dif.    if( pWin
74a0: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
74b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73  ){.      if( !os
74c0: 48 65 61 70 44 65 73 74 72 6f 79 28 70 57 69 6e  HeapDestroy(pWin
74d0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 20  MemData->hHeap) 
74e0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
74f0: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
7500: 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  MEM, "failed to 
7510: 48 65 61 70 44 65 73 74 72 6f 79 20 28 25 64 29  HeapDestroy (%d)
7520: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
7530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7540: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
7550: 2c 20 28 76 6f 69 64 2a 29 70 57 69 6e 4d 65 6d  , (void*)pWinMem
7560: 44 61 74 61 2d 3e 68 48 65 61 70 29 3b 0a 20 20  Data->hHeap);.  
7570: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57 69 6e      }.      pWin
7580: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
7590: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20  = FALSE;.    }. 
75a0: 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e     pWinMemData->
75b0: 68 48 65 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  hHeap = NULL;.  
75c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c  }.}../*.** Popul
75d0: 61 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65  ate the low-leve
75e0: 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  l memory allocat
75f0: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  ion function poi
7600: 6e 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c 69  nters in.** sqli
7610: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
7620: 6d 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20  m with pointers 
7630: 74 6f 20 74 68 65 20 72 6f 75 74 69 6e 65 73 20  to the routines 
7640: 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 54 68  in this file. Th
7650: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 73  e.** arguments s
7660: 70 65 63 69 66 79 20 74 68 65 20 62 6c 6f 63 6b  pecify the block
7670: 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6d 61   of memory to ma
7680: 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nage..**.** This
7690: 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
76a0: 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74   called by sqlit
76b0: 65 33 5f 63 6f 6e 66 69 67 28 29 2c 20 61 6e 64  e3_config(), and
76c0: 20 74 68 65 72 65 66 6f 72 65 0a 2a 2a 20 69 73   therefore.** is
76d0: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f   not required to
76e0: 20 62 65 20 74 68 72 65 61 64 73 61 66 65 20 28   be threadsafe (
76f0: 69 74 20 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63  it is not)..*/.c
7700: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d  onst sqlite3_mem
7710: 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65  _methods *sqlite
7720: 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f 69  3MemGetWin32(voi
7730: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  d){.  static con
7740: 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d  st sqlite3_mem_m
7750: 65 74 68 6f 64 73 20 77 69 6e 4d 65 6d 4d 65 74  ethods winMemMet
7760: 68 6f 64 73 20 3d 20 7b 0a 20 20 20 20 77 69 6e  hods = {.    win
7770: 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 77  MemMalloc,.    w
7780: 69 6e 4d 65 6d 46 72 65 65 2c 0a 20 20 20 20 77  inMemFree,.    w
7790: 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20  inMemRealloc,.  
77a0: 20 20 77 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20    winMemSize,.  
77b0: 20 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c    winMemRoundup,
77c0: 0a 20 20 20 20 77 69 6e 4d 65 6d 49 6e 69 74 2c  .    winMemInit,
77d0: 0a 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64  .    winMemShutd
77e0: 6f 77 6e 2c 0a 20 20 20 20 26 77 69 6e 5f 6d 65  own,.    &win_me
77f0: 6d 5f 64 61 74 61 0a 20 20 7d 3b 0a 20 20 72 65  m_data.  };.  re
7800: 74 75 72 6e 20 26 77 69 6e 4d 65 6d 4d 65 74 68  turn &winMemMeth
7810: 6f 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c  ods;.}..void sql
7820: 69 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c  ite3MemSetDefaul
7830: 74 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  t(void){.  sqlit
7840: 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
7850: 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20  _CONFIG_MALLOC, 
7860: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e  sqlite3MemGetWin
7870: 33 32 28 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  32());.}.#endif 
7880: 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  /* SQLITE_WIN32_
7890: 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  MALLOC */../*.**
78a0: 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38   Convert a UTF-8
78b0: 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f   string to Micro
78c0: 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 28 55 54  soft Unicode (UT
78d0: 46 2d 31 36 3f 29 2e 20 0a 2a 2a 0a 2a 2a 20 53  F-16?). .**.** S
78e0: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
78f0: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
7900: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
7910: 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61  m malloc..*/.sta
7920: 74 69 63 20 4c 50 57 53 54 52 20 75 74 66 38 54  tic LPWSTR utf8T
7930: 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63  oUnicode(const c
7940: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
7950: 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20  .  int nChar;.  
7960: 4c 50 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65  LPWSTR zWideFile
7970: 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20 3d  name;..  nChar =
7980: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
7990: 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20  deChar(CP_UTF8, 
79a0: 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  0, zFilename, -1
79b0: 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 69 66  , NULL, 0);.  if
79c0: 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20  ( nChar==0 ){.  
79d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
79e0: 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20    zWideFilename 
79f0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
7a00: 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28 7a  ( nChar*sizeof(z
7a10: 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29  WideFilename[0])
7a20: 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 46   );.  if( zWideF
7a30: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
7a40: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7a50: 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74    nChar = osMult
7a60: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
7a70: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c  CP_UTF8, 0, zFil
7a80: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64 65  ename, -1, zWide
7a90: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
7aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ab0: 20 20 20 20 20 20 20 20 20 20 6e 43 68 61 72 29            nChar)
7ac0: 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30  ;.  if( nChar==0
7ad0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
7ae0: 66 72 65 65 28 7a 57 69 64 65 46 69 6c 65 6e 61  free(zWideFilena
7af0: 6d 65 29 3b 0a 20 20 20 20 7a 57 69 64 65 46 69  me);.    zWideFi
7b00: 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  lename = 0;.  }.
7b10: 20 20 72 65 74 75 72 6e 20 7a 57 69 64 65 46 69    return zWideFi
7b20: 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
7b30: 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f   Convert Microso
7b40: 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 55 54  ft Unicode to UT
7b50: 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68  F-8.  Space to h
7b60: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
7b70: 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f 62   string is.** ob
7b80: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
7b90: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  te3_malloc()..*/
7ba0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 6e  .static char *un
7bb0: 69 63 6f 64 65 54 6f 55 74 66 38 28 4c 50 43 57  icodeToUtf8(LPCW
7bc0: 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  STR zWideFilenam
7bd0: 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  e){.  int nByte;
7be0: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
7bf0: 6d 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f  me;..  nByte = o
7c00: 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  sWideCharToMulti
7c10: 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c  Byte(CP_UTF8, 0,
7c20: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20   zWideFilename, 
7c30: 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  -1, 0, 0, 0, 0);
7c40: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20  .  if( nByte == 
7c50: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
7c60: 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61  0;.  }.  zFilena
7c70: 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  me = sqlite3_mal
7c80: 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  loc( nByte );.  
7c90: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  if( zFilename==0
7ca0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
7cb0: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
7cc0: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
7cd0: 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30  iByte(CP_UTF8, 0
7ce0: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
7cf0: 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20   -1, zFilename, 
7d00: 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20  nByte,.         
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d20: 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20         0, 0);.  
7d30: 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29  if( nByte == 0 )
7d40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
7d50: 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ee(zFilename);. 
7d60: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30     zFilename = 0
7d70: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
7d80: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
7d90: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 41 4e  ** Convert an AN
7da0: 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63  SI string to Mic
7db0: 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c 20  rosoft Unicode, 
7dc0: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
7dd0: 63 75 72 72 65 6e 74 20 63 6f 64 65 70 61 67 65  current codepage
7de0: 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20 66 69   settings for fi
7df0: 6c 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a 20  le apis..** .** 
7e00: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
7e10: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
7e20: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  g is obtained.**
7e30: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
7e40: 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lloc..*/.static 
7e50: 4c 50 57 53 54 52 20 6d 62 63 73 54 6f 55 6e 69  LPWSTR mbcsToUni
7e60: 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20  code(const char 
7e70: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69  *zFilename){.  i
7e80: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 4c 50 57 53  nt nByte;.  LPWS
7e90: 54 52 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  TR zMbcsFilename
7ea0: 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65  ;.  int codepage
7eb0: 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73   = osAreFileApis
7ec0: 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20  ANSI() ? CP_ACP 
7ed0: 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e  : CP_OEMCP;..  n
7ee0: 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79  Byte = osMultiBy
7ef0: 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64  teToWideChar(cod
7f00: 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e  epage, 0, zFilen
7f10: 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 0a 20  ame, -1, NULL,. 
7f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7f40: 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29 3b  )*sizeof(WCHAR);
7f50: 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20  .  if( nByte==0 
7f60: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
7f70: 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 46 69 6c 65  .  }.  zMbcsFile
7f80: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  name = sqlite3_m
7f90: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a  alloc( nByte*siz
7fa0: 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  eof(zMbcsFilenam
7fb0: 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a  e[0]) );.  if( z
7fc0: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  MbcsFilename==0 
7fd0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
7fe0: 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f  .  }.  nByte = o
7ff0: 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  sMultiByteToWide
8000: 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30  Char(codepage, 0
8010: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
8020: 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c 0a   zMbcsFilename,.
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8050: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e 42  nByte);.  if( nB
8060: 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  yte==0 ){.    sq
8070: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 62 63 73  lite3_free(zMbcs
8080: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Filename);.    z
8090: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 30  MbcsFilename = 0
80a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
80b0: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  MbcsFilename;.}.
80c0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d  ./*.** Convert M
80d0: 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65  icrosoft Unicode
80e0: 20 74 6f 20 6d 75 6c 74 69 2d 62 79 74 65 20 63   to multi-byte c
80f0: 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 2c  haracter string,
8100: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a   based on the.**
8110: 20 75 73 65 72 27 73 20 41 4e 53 49 20 63 6f 64   user's ANSI cod
8120: 65 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  epage..**.** Spa
8130: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
8140: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
8150: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  s obtained from.
8160: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
8170: 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  c()..*/.static c
8180: 68 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 4d 62  har *unicodeToMb
8190: 63 73 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65  cs(LPCWSTR zWide
81a0: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74  Filename){.  int
81b0: 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a   nByte;.  char *
81c0: 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74  zFilename;.  int
81d0: 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73 41 72   codepage = osAr
81e0: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20  eFileApisANSI() 
81f0: 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45  ? CP_ACP : CP_OE
8200: 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20  MCP;..  nByte = 
8210: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
8220: 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20  iByte(codepage, 
8230: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
8240: 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  , -1, 0, 0, 0, 0
8250: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d  );.  if( nByte =
8260: 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  = 0 ){.    retur
8270: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  n 0;.  }.  zFile
8280: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  name = sqlite3_m
8290: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a  alloc( nByte );.
82a0: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
82b0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
82c0: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
82d0: 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  = osWideCharToMu
82e0: 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65  ltiByte(codepage
82f0: 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61  , 0, zWideFilena
8300: 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d  me, -1, zFilenam
8310: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
8320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8330: 20 20 20 6e 42 79 74 65 2c 20 30 2c 20 30 29 3b     nByte, 0, 0);
8340: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20  .  if( nByte == 
8350: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
8360: 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29  _free(zFilename)
8370: 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20  ;.    zFilename 
8380: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
8390: 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  n zFilename;.}..
83a0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 75  /*.** Convert mu
83b0: 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74 65  ltibyte characte
83c0: 72 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46 2d  r string to UTF-
83d0: 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  8.  Space to hol
83e0: 64 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 65  d the.** returne
83f0: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
8400: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
8410: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63  3_malloc()..*/.c
8420: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e  har *sqlite3_win
8430: 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
8440: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
8450: 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  ename){.  char *
8460: 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 20  zFilenameUtf8;. 
8470: 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65   LPWSTR zTmpWide
8480: 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20  ;..  zTmpWide = 
8490: 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a 46  mbcsToUnicode(zF
84a0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
84b0: 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20  zTmpWide==0 ){. 
84c0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
84d0: 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38  .  zFilenameUtf8
84e0: 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38   = unicodeToUtf8
84f0: 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71  (zTmpWide);.  sq
8500: 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57  lite3_free(zTmpW
8510: 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  ide);.  return z
8520: 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 7d 0a  FilenameUtf8;.}.
8530: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 55  ./*.** Convert U
8540: 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69 62 79 74  TF-8 to multibyt
8550: 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69  e character stri
8560: 6e 67 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  ng.  Space to ho
8570: 6c 64 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72  ld the .** retur
8580: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
8590: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
85a0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  te3_malloc()..*/
85b0: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77  .char *sqlite3_w
85c0: 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63  in32_utf8_to_mbc
85d0: 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  s(const char *zF
85e0: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72  ilename){.  char
85f0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b   *zFilenameMbcs;
8600: 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69  .  LPWSTR zTmpWi
8610: 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20  de;..  zTmpWide 
8620: 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28  = utf8ToUnicode(
8630: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
8640: 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b  ( zTmpWide==0 ){
8650: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
8660: 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 4d 62   }.  zFilenameMb
8670: 63 73 20 3d 20 75 6e 69 63 6f 64 65 54 6f 4d 62  cs = unicodeToMb
8680: 63 73 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  cs(zTmpWide);.  
8690: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
86a0: 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e  pWide);.  return
86b0: 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a   zFilenameMbcs;.
86c0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65  }.../*.** The re
86d0: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 67 65  turn value of ge
86e0: 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a 2a 2a  tLastErrorMsg.**
86f0: 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20   is zero if the 
8700: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69  error message fi
8710: 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  ts in the buffer
8720: 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a  , or non-zero.**
8730: 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74   otherwise (if t
8740: 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74  he message was t
8750: 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a 73 74  runcated)..*/.st
8760: 61 74 69 63 20 69 6e 74 20 67 65 74 4c 61 73 74  atic int getLast
8770: 45 72 72 6f 72 4d 73 67 28 44 57 4f 52 44 20 6c  ErrorMsg(DWORD l
8780: 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20 6e 42  astErrno, int nB
8790: 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
87a0: 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73 73  .  /* FormatMess
87b0: 61 67 65 20 72 65 74 75 72 6e 73 20 30 20 6f 6e  age returns 0 on
87c0: 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68 65 72   failure.  Other
87d0: 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72 65 74  wise it.  ** ret
87e0: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
87f0: 6f 66 20 54 43 48 41 52 73 20 77 72 69 74 74 65  of TCHARs writte
8800: 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  n to the output.
8810: 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65 78 63    ** buffer, exc
8820: 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72 6d 69  luding the termi
8830: 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61 72  nating null char
8840: 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64  ..  */.  DWORD d
8850: 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72  wLen = 0;.  char
8860: 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 69   *zOut = 0;..  i
8870: 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
8880: 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 57 69 64   LPWSTR zTempWid
8890: 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77  e = NULL;.    dw
88a0: 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65  Len = osFormatMe
88b0: 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45  ssageW(FORMAT_ME
88c0: 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42  SSAGE_ALLOCATE_B
88d0: 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20  UFFER |.        
88e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88f0: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
8900: 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20  AGE_FROM_SYSTEM 
8910: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
8930: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47  ORMAT_MESSAGE_IG
8940: 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20  NORE_INSERTS,.  
8950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8960: 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c             NULL,
8970: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61                la
8990: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89b0: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
89c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89d0: 20 20 20 20 20 20 28 4c 50 57 53 54 52 29 20 26        (LPWSTR) &
89e0: 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20  zTempWide,.     
89f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a00: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
8a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a20: 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20          0);.    
8a30: 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b  if( dwLen > 0 ){
8a40: 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  .      /* alloca
8a50: 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20  te a buffer and 
8a60: 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20  convert to UTF8 
8a70: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
8a80: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
8a90: 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20  c();.      zOut 
8aa0: 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  = unicodeToUtf8(
8ab0: 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20 20  zTempWide);.    
8ac0: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
8ad0: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
8ae0: 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79    /* free the sy
8af0: 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f  stem buffer allo
8b00: 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d  cated by FormatM
8b10: 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  essage */.      
8b20: 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d  osLocalFree(zTem
8b30: 70 57 69 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pWide);.    }.  
8b40: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
8b50: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
8b60: 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20   else{.    char 
8b70: 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20  *zTemp = NULL;. 
8b80: 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72     dwLen = osFor
8b90: 6d 61 74 4d 65 73 73 61 67 65 41 28 46 4f 52 4d  matMessageA(FORM
8ba0: 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43  AT_MESSAGE_ALLOC
8bb0: 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20  ATE_BUFFER |.   
8bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bd0: 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54            FORMAT
8be0: 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59  _MESSAGE_FROM_SY
8bf0: 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20  STEM |.         
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c10: 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41      FORMAT_MESSA
8c20: 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54  GE_IGNORE_INSERT
8c30: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c50: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
8c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c70: 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20     lastErrno,.  
8c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c90: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
8ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cb0: 20 20 20 20 20 20 20 20 20 20 20 28 4c 50 53 54             (LPST
8cc0: 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20 20  R) &zTemp,.     
8cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ce0: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
8cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d00: 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20          0);.    
8d10: 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b  if( dwLen > 0 ){
8d20: 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  .      /* alloca
8d30: 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20  te a buffer and 
8d40: 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20  convert to UTF8 
8d50: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
8d60: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
8d70: 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20  c();.      zOut 
8d80: 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
8d90: 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65  mbcs_to_utf8(zTe
8da0: 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  mp);.      sqlit
8db0: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
8dc0: 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72  c();.      /* fr
8dd0: 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75  ee the system bu
8de0: 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62  ffer allocated b
8df0: 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20  y FormatMessage 
8e00: 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c  */.      osLocal
8e10: 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20  Free(zTemp);.   
8e20: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
8e30: 69 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e 20 29  if( 0 == dwLen )
8e40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
8e50: 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75  printf(nBuf, zBu
8e60: 66 2c 20 22 4f 73 45 72 72 6f 72 20 30 78 25 78  f, "OsError 0x%x
8e70: 20 28 25 75 29 22 2c 20 6c 61 73 74 45 72 72 6e   (%u)", lastErrn
8e80: 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 20  o, lastErrno);. 
8e90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 63   }else{.    /* c
8ea0: 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66  opy a maximum of
8eb0: 20 6e 42 75 66 20 63 68 61 72 73 20 74 6f 20 6f   nBuf chars to o
8ec0: 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
8ed0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
8ee0: 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c  intf(nBuf, zBuf,
8ef0: 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20   "%s", zOut);.  
8f00: 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 55 54    /* free the UT
8f10: 46 38 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20  F8 buffer */.   
8f20: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
8f30: 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ut);.  }.  retur
8f40: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a  n 0;.}../*.**.**
8f50: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d   This function -
8f60: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69   winLogErrorAtLi
8f70: 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c 79 20 65  ne() - is only e
8f80: 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74  ver called via t
8f90: 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e 4c  he macro.** winL
8fa0: 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a  ogError()..**.**
8fb0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
8fc0: 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61   invoked after a
8fd0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
8fe0: 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e  n an OS function
8ff0: 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20 61 20 6d  ..** It logs a m
9000: 65 73 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c  essage using sql
9010: 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61  ite3_log() conta
9020: 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  ining the curren
9030: 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72  t value of.** er
9040: 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c 20 69 66  ror code and, if
9050: 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68   possible, the h
9060: 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71  uman-readable eq
9070: 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 0a 2a  uivalent from .*
9080: 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 2e  * FormatMessage.
9090: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
90a0: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
90b0: 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68   to the macro sh
90c0: 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f  ould be the erro
90d0: 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77  r code that.** w
90e0: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
90f0: 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20  to SQLite (e.g. 
9100: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
9110: 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ETE, SQLITE_CANT
9120: 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74  OPEN). .** The t
9130: 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72  wo subsequent ar
9140: 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62  guments should b
9150: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
9160: 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  e OS function th
9170: 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61 6e 64  at.** failed and
9180: 20 74 68 65 20 74 68 65 20 61 73 73 6f 63 69 61   the the associa
9190: 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ted file-system 
91a0: 70 61 74 68 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f  path, if any..*/
91b0: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45  .#define winLogE
91c0: 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20 20 20  rror(a,b,c,d)   
91d0: 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  winLogErrorAtLin
91e0: 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45  e(a,b,c,d,__LINE
91f0: 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 77  __).static int w
9200: 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  inLogErrorAtLine
9210: 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c  (.  int errcode,
9220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9230: 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72      /* SQLite er
9240: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 44 57  ror code */.  DW
9250: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 20  ORD lastErrno,  
9260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9270: 20 57 69 6e 33 32 20 6c 61 73 74 20 65 72 72 6f   Win32 last erro
9280: 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
9290: 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20  r *zFunc,       
92a0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
92b0: 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  f OS function th
92c0: 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63  at failed */.  c
92d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
92e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
92f0: 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f  * File path asso
9300: 63 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f  ciated with erro
9310: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65  r */.  int iLine
9320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9330: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
9340: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65   line number whe
9350: 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  re error occurre
9360: 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a  d */.){.  char z
9370: 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20 20 20 20  Msg[500];       
9380: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 75 6d            /* Hum
9390: 61 6e 20 72 65 61 64 61 62 6c 65 20 65 72 72 6f  an readable erro
93a0: 72 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  r text */.  int 
93b0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
93c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
93d0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
93e0: 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20    zMsg[0] = 0;. 
93f0: 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67   getLastErrorMsg
9400: 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73 69 7a 65  (lastErrno, size
9410: 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 29 3b  of(zMsg), zMsg);
9420: 0a 20 20 61 73 73 65 72 74 28 20 65 72 72 63 6f  .  assert( errco
9430: 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de!=SQLITE_OK );
9440: 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20  .  if( zPath==0 
9450: 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20  ) zPath = "";.  
9460: 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67 5b 69 5d  for(i=0; zMsg[i]
9470: 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72   && zMsg[i]!='\r
9480: 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c  ' && zMsg[i]!='\
9490: 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7a 4d 73  n'; i++){}.  zMs
94a0: 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  g[i] = 0;.  sqli
94b0: 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c  te3_log(errcode,
94c0: 0a 20 20 20 20 20 20 22 6f 73 5f 77 69 6e 2e 63  .      "os_win.c
94d0: 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25 73 29  :%d: (%d) %s(%s)
94e0: 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c   - %s",.      iL
94f0: 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20  ine, lastErrno, 
9500: 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 4d  zFunc, zPath, zM
9510: 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72  sg.  );..  retur
9520: 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a  n errcode;.}../*
9530: 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  .** The number o
9540: 66 20 74 69 6d 65 73 20 74 68 61 74 20 61 20 52  f times that a R
9550: 65 61 64 46 69 6c 65 28 29 2c 20 57 72 69 74 65  eadFile(), Write
9560: 46 69 6c 65 28 29 2c 20 61 6e 64 20 44 65 6c 65  File(), and Dele
9570: 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77 69 6c 6c  teFile().** will
9580: 20 62 65 20 72 65 74 72 69 65 64 20 66 6f 6c 6c   be retried foll
9590: 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69 6e 67 20  owing a locking 
95a0: 65 72 72 6f 72 20 2d 20 70 72 6f 62 61 62 6c 79  error - probably
95b0: 20 63 61 75 73 65 64 20 62 79 20 0a 2a 2a 20 61   caused by .** a
95c0: 6e 74 69 76 69 72 75 73 20 73 6f 66 74 77 61 72  ntivirus softwar
95d0: 65 2e 20 20 41 6c 73 6f 20 74 68 65 20 69 6e 69  e.  Also the ini
95e0: 74 69 61 6c 20 64 65 6c 61 79 20 62 65 66 6f 72  tial delay befor
95f0: 65 20 74 68 65 20 66 69 72 73 74 20 72 65 74 72  e the first retr
9600: 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c 61 79 20  y..** The delay 
9610: 69 6e 63 72 65 61 73 65 73 20 6c 69 6e 65 61 72  increases linear
9620: 6c 79 20 77 69 74 68 20 65 61 63 68 20 72 65 74  ly with each ret
9630: 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ry..*/.#ifndef S
9640: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
9650: 52 5f 52 45 54 52 59 0a 23 20 64 65 66 69 6e 65  R_RETRY.# define
9660: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
9670: 45 52 52 5f 52 45 54 52 59 20 31 30 0a 23 65 6e  ERR_RETRY 10.#en
9680: 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
9690: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
96a0: 45 54 52 59 5f 44 45 4c 41 59 0a 23 20 64 65 66  ETRY_DELAY.# def
96b0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
96c0: 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c  _IOERR_RETRY_DEL
96d0: 41 59 20 32 35 0a 23 65 6e 64 69 66 0a 73 74 61  AY 25.#endif.sta
96e0: 74 69 63 20 69 6e 74 20 77 69 6e 33 32 49 6f 65  tic int win32Ioe
96f0: 72 72 52 65 74 72 79 20 3d 20 53 51 4c 49 54 45  rrRetry = SQLITE
9700: 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54  _WIN32_IOERR_RET
9710: 52 59 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  RY;.static int w
9720: 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44 65  in32IoerrRetryDe
9730: 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e  lay = SQLITE_WIN
9740: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44  32_IOERR_RETRY_D
9750: 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ELAY;../*.** If 
9760: 61 20 52 65 61 64 46 69 6c 65 28 29 20 6f 72 20  a ReadFile() or 
9770: 57 72 69 74 65 46 69 6c 65 28 29 20 65 72 72 6f  WriteFile() erro
9780: 72 20 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65  r occurs, invoke
9790: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
97a0: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 73 68   to see if it sh
97b0: 6f 75 6c 64 20 62 65 20 72 65 74 72 69 65 64 2e  ould be retried.
97c0: 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 74 6f    Return TRUE to
97d0: 20 72 65 74 72 79 2e 20 20 52 65 74 75 72 6e 20   retry.  Return 
97e0: 46 41 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65  FALSE.** to give
97f0: 20 75 70 20 77 69 74 68 20 61 6e 20 65 72 72 6f   up with an erro
9800: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
9810: 20 72 65 74 72 79 49 6f 65 72 72 28 69 6e 74 20   retryIoerr(int 
9820: 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f 52 44 20  *pnRetry, DWORD 
9830: 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44 57 4f 52  *pError){.  DWOR
9840: 44 20 65 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  D e = osGetLastE
9850: 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 2a 70  rror();.  if( *p
9860: 6e 52 65 74 72 79 3e 3d 77 69 6e 33 32 49 6f 65  nRetry>=win32Ioe
9870: 72 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20 69  rrRetry ){.    i
9880: 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20  f( pError ){.   
9890: 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a     *pError = e;.
98a0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
98b0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 3d   0;.  }.  if( e=
98c0: 3d 45 52 52 4f 52 5f 41 43 43 45 53 53 5f 44 45  =ERROR_ACCESS_DE
98d0: 4e 49 45 44 20 7c 7c 0a 20 20 20 20 20 20 65 3d  NIED ||.      e=
98e0: 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c  =ERROR_LOCK_VIOL
98f0: 41 54 49 4f 4e 20 7c 7c 0a 20 20 20 20 20 20 65  ATION ||.      e
9900: 3d 3d 45 52 52 4f 52 5f 53 48 41 52 49 4e 47 5f  ==ERROR_SHARING_
9910: 56 49 4f 4c 41 54 49 4f 4e 20 29 7b 0a 20 20 20  VIOLATION ){.   
9920: 20 70 6f 72 74 61 62 6c 65 53 6c 65 65 70 28 77   portableSleep(w
9930: 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44 65  in32IoerrRetryDe
9940: 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29  lay*(1+*pnRetry)
9950: 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72  );.    ++*pnRetr
9960: 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  y;.    return 1;
9970: 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 72 72 6f  .  }.  if( pErro
9980: 72 20 29 7b 0a 20 20 20 20 2a 70 45 72 72 6f 72  r ){.    *pError
9990: 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = e;.  }.  retu
99a0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn 0;.}../*.** L
99b0: 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72 20 72  og a I/O error r
99c0: 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a 2a 2f  etry episode..*/
99d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 67  .static void log
99e0: 49 6f 65 72 72 28 69 6e 74 20 6e 52 65 74 72 79  Ioerr(int nRetry
99f0: 29 7b 0a 20 20 69 66 28 20 6e 52 65 74 72 79 20  ){.  if( nRetry 
9a00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
9a10: 6f 67 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  og(SQLITE_IOERR,
9a20: 20 0a 20 20 20 20 20 20 22 64 65 6c 61 79 65 64   .      "delayed
9a30: 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b 2f 73   %dms for lock/s
9a40: 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63 74 22  haring conflict"
9a50: 2c 0a 20 20 20 20 20 20 77 69 6e 33 32 49 6f 65  ,.      win32Ioe
9a60: 72 72 52 65 74 72 79 44 65 6c 61 79 2a 6e 52 65  rrRetryDelay*nRe
9a70: 74 72 79 2a 28 6e 52 65 74 72 79 2b 31 29 2f 32  try*(nRetry+1)/2
9a80: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  .    );.  }.}..#
9a90: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
9aa0: 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  CE./************
9ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
9af0: 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 63 6f   This section co
9b00: 6e 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72 20  ntains code for 
9b10: 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 2f  WinCE only..*/./
9b20: 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 43 45 20  *.** Windows CE 
9b30: 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20  does not have a 
9b40: 6c 6f 63 61 6c 74 69 6d 65 28 29 20 66 75 6e 63  localtime() func
9b50: 74 69 6f 6e 2e 20 20 53 6f 20 63 72 65 61 74 65  tion.  So create
9b60: 20 61 0a 2a 2a 20 73 75 62 73 74 69 74 75 74 65   a.** substitute
9b70: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 74  ..*/.#include <t
9b80: 69 6d 65 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d  ime.h>.struct tm
9b90: 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74   *__cdecl localt
9ba0: 69 6d 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74  ime(const time_t
9bb0: 20 2a 74 29 0a 7b 0a 20 20 73 74 61 74 69 63 20   *t).{.  static 
9bc0: 73 74 72 75 63 74 20 74 6d 20 79 3b 0a 20 20 46  struct tm y;.  F
9bd0: 49 4c 45 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d  ILETIME uTm, lTm
9be0: 3b 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20 70  ;.  SYSTEMTIME p
9bf0: 54 6d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  Tm;.  sqlite3_in
9c00: 74 36 34 20 74 36 34 3b 0a 20 20 74 36 34 20 3d  t64 t64;.  t64 =
9c10: 20 2a 74 3b 0a 20 20 74 36 34 20 3d 20 28 74 36   *t;.  t64 = (t6
9c20: 34 20 2b 20 31 31 36 34 34 34 37 33 36 30 30 29  4 + 11644473600)
9c30: 2a 31 30 30 30 30 30 30 30 3b 0a 20 20 75 54 6d  *10000000;.  uTm
9c40: 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d  .dwLowDateTime =
9c50: 20 28 44 57 4f 52 44 29 28 74 36 34 20 26 20 30   (DWORD)(t64 & 0
9c60: 78 46 46 46 46 46 46 46 46 29 3b 0a 20 20 75 54  xFFFFFFFF);.  uT
9c70: 6d 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65  m.dwHighDateTime
9c80: 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20 3e 3e  = (DWORD)(t64 >>
9c90: 20 33 32 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69   32);.  osFileTi
9ca0: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
9cb0: 65 28 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20  e(&uTm,&lTm);.  
9cc0: 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74  osFileTimeToSyst
9cd0: 65 6d 54 69 6d 65 28 26 6c 54 6d 2c 26 70 54 6d  emTime(&lTm,&pTm
9ce0: 29 3b 0a 20 20 79 2e 74 6d 5f 79 65 61 72 20 3d  );.  y.tm_year =
9cf0: 20 70 54 6d 2e 77 59 65 61 72 20 2d 20 31 39 30   pTm.wYear - 190
9d00: 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20  0;.  y.tm_mon = 
9d10: 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a  pTm.wMonth - 1;.
9d20: 20 20 79 2e 74 6d 5f 77 64 61 79 20 3d 20 70 54    y.tm_wday = pT
9d30: 6d 2e 77 44 61 79 4f 66 57 65 65 6b 3b 0a 20 20  m.wDayOfWeek;.  
9d40: 79 2e 74 6d 5f 6d 64 61 79 20 3d 20 70 54 6d 2e  y.tm_mday = pTm.
9d50: 77 44 61 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75  wDay;.  y.tm_hou
9d60: 72 20 3d 20 70 54 6d 2e 77 48 6f 75 72 3b 0a 20  r = pTm.wHour;. 
9d70: 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e   y.tm_min = pTm.
9d80: 77 4d 69 6e 75 74 65 3b 0a 20 20 79 2e 74 6d 5f  wMinute;.  y.tm_
9d90: 73 65 63 20 3d 20 70 54 6d 2e 77 53 65 63 6f 6e  sec = pTm.wSecon
9da0: 64 3b 0a 20 20 72 65 74 75 72 6e 20 26 79 3b 0a  d;.  return &y;.
9db0: 7d 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c  }..#define HANDL
9dc0: 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20  E_TO_WINFILE(a) 
9dd0: 28 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61  (winFile*)&((cha
9de0: 72 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73  r*)a)[-(int)offs
9df0: 65 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d  etof(winFile,h)]
9e00: 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
9e10: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61  a lock on the ha
9e20: 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63  ndle h.*/.static
9e30: 20 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78   void winceMutex
9e40: 41 63 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68  Acquire(HANDLE h
9e50: 29 7b 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72  ){.   DWORD dwEr
9e60: 72 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  r;.   do {.     
9e70: 64 77 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f  dwErr = osWaitFo
9e80: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c  rSingleObject(h,
9e90: 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d   INFINITE);.   }
9ea0: 20 77 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d   while (dwErr !=
9eb0: 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26   WAIT_OBJECT_0 &
9ec0: 26 20 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f  & dwErr != WAIT_
9ed0: 41 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a  ABANDONED);.}./*
9ee0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f  .** Release a lo
9ef0: 63 6b 20 61 63 71 75 69 72 65 64 20 62 79 20 77  ck acquired by w
9f00: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
9f10: 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69  ().*/.#define wi
9f20: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
9f30: 68 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28  h) ReleaseMutex(
9f40: 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  h)../*.** Create
9f50: 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73   the mutex and s
9f60: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65  hared memory use
9f70: 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e  d for locking in
9f80: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73   the file.** des
9f90: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f  criptor pFile.*/
9fa0: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
9fb0: 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e  ceCreateLock(con
9fc0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
9fd0: 6d 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  me, winFile *pFi
9fe0: 6c 65 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54  le){.  LPWSTR zT
9ff0: 6f 6b 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61  ok;.  LPWSTR zNa
a000: 6d 65 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74  me;.  BOOL bInit
a010: 20 3d 20 54 52 55 45 3b 0a 0a 20 20 7a 4e 61 6d   = TRUE;..  zNam
a020: 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64  e = utf8ToUnicod
a030: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
a040: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  if( zName==0 ){.
a050: 20 20 20 20 2f 2a 20 6f 75 74 20 6f 66 20 6d 65      /* out of me
a060: 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 72 65 74 75  mory */.    retu
a070: 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20  rn FALSE;.  }.. 
a080: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
a090: 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74  he local lockdat
a0a0: 61 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70  a */.  memset(&p
a0b0: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2c 20 30 2c 20  File->local, 0, 
a0c0: 73 69 7a 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f  sizeof(pFile->lo
a0d0: 63 61 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70  cal));..  /* Rep
a0e0: 6c 61 63 65 20 74 68 65 20 62 61 63 6b 73 6c 61  lace the backsla
a0f0: 73 68 65 73 20 66 72 6f 6d 20 74 68 65 20 66 69  shes from the fi
a100: 6c 65 6e 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72  lename and lower
a110: 63 61 73 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20  case it.  ** to 
a120: 64 65 72 69 76 65 20 61 20 6d 75 74 65 78 20 6e  derive a mutex n
a130: 61 6d 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d  ame. */.  zTok =
a140: 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e   osCharLowerW(zN
a150: 61 6d 65 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a  ame);.  for (;*z
a160: 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20  Tok;zTok++){.   
a170: 20 69 66 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c   if (*zTok == '\
a180: 5c 27 29 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b  \') *zTok = '_';
a190: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74  .  }..  /* Creat
a1a0: 65 2f 6f 70 65 6e 20 74 68 65 20 6e 61 6d 65 64  e/open the named
a1b0: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c   mutex */.  pFil
a1c0: 65 2d 3e 68 4d 75 74 65 78 20 3d 20 6f 73 43 72  e->hMutex = osCr
a1d0: 65 61 74 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c  eateMutexW(NULL,
a1e0: 20 46 41 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a   FALSE, zName);.
a1f0: 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d    if (!pFile->hM
a200: 75 74 65 78 29 7b 0a 20 20 20 20 70 46 69 6c 65  utex){.    pFile
a210: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
a220: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
a230: 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
a240: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 70 46  SQLITE_ERROR, pF
a250: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20  ile->lastErrno, 
a260: 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b  "winceCreateLock
a270: 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  1", zFilename);.
a280: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
a290: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  (zName);.    ret
a2a0: 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a  urn FALSE;.  }..
a2b0: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65    /* Acquire the
a2c0: 20 6d 75 74 65 78 20 62 65 66 6f 72 65 20 63 6f   mutex before co
a2d0: 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77 69  ntinuing */.  wi
a2e0: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
a2f0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
a300: 20 20 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74 68    .  /* Since th
a310: 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64  e names of named
a320: 20 6d 75 74 65 78 65 73 2c 20 73 65 6d 61 70 68   mutexes, semaph
a330: 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61 70 70 69  ores, file mappi
a340: 6e 67 73 20 65 74 63 20 61 72 65 20 0a 20 20 2a  ngs etc are .  *
a350: 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65  * case-sensitive
a360: 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65  , take advantage
a370: 20 6f 66 20 74 68 61 74 20 62 79 20 75 70 70 65   of that by uppe
a380: 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65  rcasing the mute
a390: 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20  x name.  ** and 
a3a0: 75 73 69 6e 67 20 74 68 61 74 20 61 73 20 74 68  using that as th
a3b0: 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d 61 70  e shared filemap
a3c0: 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a  ping name..  */.
a3d0: 20 20 6f 73 43 68 61 72 55 70 70 65 72 57 28 7a    osCharUpperW(z
a3e0: 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e  Name);.  pFile->
a3f0: 68 53 68 61 72 65 64 20 3d 20 6f 73 43 72 65 61  hShared = osCrea
a400: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 49  teFileMappingW(I
a410: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
a420: 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20  LUE, NULL,.     
a430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a450: 20 20 20 50 41 47 45 5f 52 45 41 44 57 52 49 54     PAGE_READWRIT
a460: 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e  E, 0, sizeof(win
a470: 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20  ceLock),.       
a480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4a0: 20 7a 4e 61 6d 65 29 3b 20 20 0a 0a 20 20 2f 2a   zName);  ..  /*
a4b0: 20 53 65 74 20 61 20 66 6c 61 67 20 74 68 61 74   Set a flag that
a4c0: 20 69 6e 64 69 63 61 74 65 73 20 77 65 27 72 65   indicates we're
a4d0: 20 74 68 65 20 66 69 72 73 74 20 74 6f 20 63 72   the first to cr
a4e0: 65 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  eate the memory 
a4f0: 73 6f 20 69 74 20 0a 20 20 2a 2a 20 6d 75 73 74  so it .  ** must
a500: 20 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c   be zero-initial
a510: 69 7a 65 64 20 2a 2f 0a 20 20 69 66 20 28 6f 73  ized */.  if (os
a520: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 3d  GetLastError() =
a530: 3d 20 45 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f  = ERROR_ALREADY_
a540: 45 58 49 53 54 53 29 7b 0a 20 20 20 20 62 49 6e  EXISTS){.    bIn
a550: 69 74 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a  it = FALSE;.  }.
a560: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
a570: 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66  zName);..  /* If
a580: 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e   we succeeded in
a590: 20 6d 61 6b 69 6e 67 20 74 68 65 20 73 68 61 72   making the shar
a5a0: 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65  ed memory handle
a5b0: 2c 20 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69  , map it. */.  i
a5c0: 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  f (pFile->hShare
a5d0: 64 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73  d){.    pFile->s
a5e0: 68 61 72 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f  hared = (winceLo
a5f0: 63 6b 2a 29 6f 73 4d 61 70 56 69 65 77 4f 66 46  ck*)osMapViewOfF
a600: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72  ile(pFile->hShar
a610: 65 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ed, .           
a620: 20 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c    FILE_MAP_READ|
a630: 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20  FILE_MAP_WRITE, 
a640: 30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e  0, 0, sizeof(win
a650: 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a  ceLock));.    /*
a660: 20 49 66 20 6d 61 70 70 69 6e 67 20 66 61 69 6c   If mapping fail
a670: 65 64 2c 20 63 6c 6f 73 65 20 74 68 65 20 73 68  ed, close the sh
a680: 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64  ared memory hand
a690: 6c 65 20 61 6e 64 20 65 72 61 73 65 20 69 74 20  le and erase it 
a6a0: 2a 2f 0a 20 20 20 20 69 66 20 28 21 70 46 69 6c  */.    if (!pFil
a6b0: 65 2d 3e 73 68 61 72 65 64 29 7b 0a 20 20 20 20  e->shared){.    
a6c0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
a6d0: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
a6e0: 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e  ror();.      win
a6f0: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
a700: 45 52 52 4f 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  ERROR, pFile->la
a710: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
a720: 20 20 20 20 20 20 20 20 22 77 69 6e 63 65 43 72          "winceCr
a730: 65 61 74 65 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c  eateLock2", zFil
a740: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6f 73  ename);.      os
a750: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
a760: 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20 20 20  e->hShared);.   
a770: 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65     pFile->hShare
a780: 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  d = NULL;.    }.
a790: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61    }..  /* If sha
a7a0: 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64  red memory could
a7b0: 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64 2c   not be created,
a7c0: 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20   then close the 
a7d0: 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c 20 2a  mutex and fail *
a7e0: 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68  /.  if (pFile->h
a7f0: 53 68 61 72 65 64 20 3d 3d 20 4e 55 4c 4c 29 7b  Shared == NULL){
a800: 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52  .    winceMutexR
a810: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
a820: 75 74 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f  utex);.    osClo
a830: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
a840: 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69  hMutex);.    pFi
a850: 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c  le->hMutex = NUL
a860: 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41  L;.    return FA
a870: 4c 53 45 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  LSE;.  }.  .  /*
a880: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
a890: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66  shared memory if
a8a0: 20 77 65 27 72 65 20 73 75 70 70 6f 73 65 64 20   we're supposed 
a8b0: 74 6f 20 2a 2f 0a 20 20 69 66 20 28 62 49 6e 69  to */.  if (bIni
a8c0: 74 29 20 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  t) {.    memset(
a8d0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30  pFile->shared, 0
a8e0: 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f  , sizeof(winceLo
a8f0: 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e  ck));.  }..  win
a900: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
a910: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
a920: 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 7d 0a   return TRUE;.}.
a930: 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74  ./*.** Destroy t
a940: 68 65 20 70 61 72 74 20 6f 66 20 77 69 6e 46 69  he part of winFi
a950: 6c 65 20 74 68 61 74 20 64 65 61 6c 73 20 77 69  le that deals wi
a960: 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a  th wince locks.*
a970: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
a980: 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77  nceDestroyLock(w
a990: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
a9a0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75    if (pFile->hMu
a9b0: 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71  tex){.    /* Acq
a9c0: 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20 2a  uire the mutex *
a9d0: 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78  /.    winceMutex
a9e0: 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
a9f0: 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20  Mutex);..    /* 
aa00: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
aa10: 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f 62  ocks should prob
aa20: 61 62 6c 79 20 61 73 73 65 72 74 20 69 6e 20 64  ably assert in d
aa30: 65 62 75 67 20 6d 6f 64 65 2c 20 62 75 74 20 74  ebug mode, but t
aa40: 68 65 79 0a 20 20 20 20 20 20 20 61 72 65 20 74  hey.       are t
aa50: 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20 63 61 73  o cleanup in cas
aa60: 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61  e any locks rema
aa70: 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20  ined open */.   
aa80: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
aa90: 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20  l.nReaders){.   
aaa0: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
aab0: 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20  ->nReaders --;. 
aac0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69     }.    if (pFi
aad0: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
aae0: 76 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ved){.      pFil
aaf0: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
ab00: 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  rved = FALSE;.  
ab10: 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c    }.    if (pFil
ab20: 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e  e->local.bPendin
ab30: 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  g){.      pFile-
ab40: 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
ab50: 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d  g = FALSE;.    }
ab60: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
ab70: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
ab80: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
ab90: 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
aba0: 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ve = FALSE;.    
abb0: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65 66  }..    /* De-ref
abc0: 65 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65  erence and close
abd0: 20 6f 75 72 20 63 6f 70 79 20 6f 66 20 74 68 65   our copy of the
abe0: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68   shared memory h
abf0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 6f 73 55  andle */.    osU
ac00: 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  nmapViewOfFile(p
ac10: 46 69 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20  File->shared);. 
ac20: 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
ac30: 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29  (pFile->hShared)
ac40: 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77  ;..    /* Done w
ac50: 69 74 68 20 74 68 65 20 6d 75 74 65 78 20 2a 2f  ith the mutex */
ac60: 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52  .    winceMutexR
ac70: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
ac80: 75 74 65 78 29 3b 20 20 20 20 0a 20 20 20 20 6f  utex);    .    o
ac90: 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
aca0: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20  le->hMutex);.   
acb0: 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d   pFile->hMutex =
acc0: 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   NULL;.  }.}../*
acd0: 20 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e   .** An implemen
ace0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f  tation of the Lo
acf0: 63 6b 46 69 6c 65 28 29 20 41 50 49 20 6f 66 20  ckFile() API of 
ad00: 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a  Windows for CE.*
ad10: 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  /.static BOOL wi
ad20: 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 48  nceLockFile(.  H
ad30: 41 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a 20  ANDLE *phFile,. 
ad40: 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66   DWORD dwFileOff
ad50: 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
ad60: 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
ad70: 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
ad80: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
ad90: 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62  w,.  DWORD nNumb
ada0: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48  erOfBytesToLockH
adb0: 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65  igh.){.  winFile
adc0: 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45   *pFile = HANDLE
add0: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69  _TO_WINFILE(phFi
ade0: 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74  le);.  BOOL bRet
adf0: 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20  urn = FALSE;..  
ae00: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
ae10: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67  (dwFileOffsetHig
ae20: 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  h);.  UNUSED_PAR
ae30: 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66  AMETER(nNumberOf
ae40: 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29  BytesToLockHigh)
ae50: 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d  ;..  if (!pFile-
ae60: 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20  >hMutex) return 
ae70: 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74  TRUE;.  winceMut
ae80: 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
ae90: 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  >hMutex);..  /* 
aea0: 57 61 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75  Wanting an exclu
aeb0: 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  sive lock? */.  
aec0: 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
aed0: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
aee0: 41 52 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20  ARED_FIRST.     
aef0: 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79    && nNumberOfBy
af00: 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
af10: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49  (DWORD)SHARED_SI
af20: 5a 45 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69  ZE){.    if (pFi
af30: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61  le->shared->nRea
af40: 64 65 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69  ders == 0 && pFi
af50: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63  le->shared->bExc
af60: 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20  lusive == 0){.  
af70: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
af80: 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
af90: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46   TRUE;.       pF
afa0: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
afb0: 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20  usive = TRUE;.  
afc0: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
afd0: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
afe0: 20 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64    /* Want a read
aff0: 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  -only lock? */. 
b000: 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
b010: 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
b020: 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54  ORD)SHARED_FIRST
b030: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e   &&.           n
b040: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
b050: 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
b060: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61    if (pFile->sha
b070: 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
b080: 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69  == 0){.      pFi
b090: 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
b0a0: 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20  rs ++;.      if 
b0b0: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
b0c0: 65 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20  eaders == 1){.  
b0d0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
b0e0: 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b  red->nReaders ++
b0f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b100: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
b110: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
b120: 57 61 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c  Want a pending l
b130: 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69  ock? */.  else i
b140: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
b150: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e  ow == (DWORD)PEN
b160: 44 49 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e 75  DING_BYTE && nNu
b170: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
b180: 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
b190: 2f 2a 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67  /* If no pending
b1a0: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61   lock has been a
b1b0: 63 71 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63  cquired, then ac
b1c0: 71 75 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20  quire it */.    
b1d0: 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
b1e0: 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30  d->bPending == 0
b1f0: 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
b200: 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
b210: 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  g = TRUE;.      
b220: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
b230: 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20  nding = TRUE;.  
b240: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
b250: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
b260: 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72   /* Want a reser
b270: 76 65 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65  ved lock? */.  e
b280: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
b290: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
b2a0: 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 20  D)RESERVED_BYTE 
b2b0: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
b2c0: 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  sToLockLow == 1)
b2d0: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
b2e0: 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
b2f0: 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20  ed == 0) {.     
b300: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
b310: 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45  bReserved = TRUE
b320: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
b330: 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d  ocal.bReserved =
b340: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65   TRUE;.      bRe
b350: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
b360: 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d   }.  }..  winceM
b370: 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
b380: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65  e->hMutex);.  re
b390: 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a  turn bReturn;.}.
b3a0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  ./*.** An implem
b3b0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
b3c0: 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f  UnlockFile API o
b3d0: 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45  f Windows for CE
b3e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
b3f0: 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28  winceUnlockFile(
b400: 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69 6c  .  HANDLE *phFil
b410: 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  e,.  DWORD dwFil
b420: 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57  eOffsetLow,.  DW
b430: 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
b440: 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  High,.  DWORD nN
b450: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
b460: 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  lockLow,.  DWORD
b470: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
b480: 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20  oUnlockHigh.){. 
b490: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
b4a0: 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46  = HANDLE_TO_WINF
b4b0: 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42  ILE(phFile);.  B
b4c0: 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41  OOL bReturn = FA
b4d0: 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  LSE;..  UNUSED_P
b4e0: 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65 4f  ARAMETER(dwFileO
b4f0: 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55 4e  ffsetHigh);.  UN
b500: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
b510: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
b520: 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69  nlockHigh);..  i
b530: 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65  f (!pFile->hMute
b540: 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a  x) return TRUE;.
b550: 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
b560: 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
b570: 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73  x);..  /* Releas
b580: 69 6e 67 20 61 20 72 65 61 64 65 72 20 6c 6f 63  ing a reader loc
b590: 6b 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76  k or an exclusiv
b5a0: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20 28  e lock */.  if (
b5b0: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
b5c0: 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
b5d0: 5f 46 49 52 53 54 29 7b 0a 20 20 20 20 2f 2a 20  _FIRST){.    /* 
b5e0: 44 69 64 20 77 65 20 68 61 76 65 20 61 6e 20 65  Did we have an e
b5f0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a  xclusive lock? *
b600: 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  /.    if (pFile-
b610: 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
b620: 65 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e){.      assert
b630: 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54  (nNumberOfBytesT
b640: 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44  oUnlockLow == (D
b650: 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45  WORD)SHARED_SIZE
b660: 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
b670: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
b680: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
b690: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
b6a0: 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53  Exclusive = FALS
b6b0: 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
b6c0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 0a   = TRUE;.    }..
b6d0: 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 6a 75      /* Did we ju
b6e0: 73 74 20 68 61 76 65 20 61 20 72 65 61 64 65 72  st have a reader
b6f0: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c   lock? */.    el
b700: 73 65 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f  se if (pFile->lo
b710: 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20  cal.nReaders){. 
b720: 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d       assert(nNum
b730: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
b740: 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  ckLow == (DWORD)
b750: 53 48 41 52 45 44 5f 53 49 5a 45 20 7c 7c 20 6e  SHARED_SIZE || n
b760: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
b770: 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b 0a  nlockLow == 1);.
b780: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
b790: 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a  al.nReaders --;.
b7a0: 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d        if (pFile-
b7b0: 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
b7c0: 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 20 20  == 0).      {.  
b7d0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
b7e0: 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d  red->nReaders --
b7f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b800: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
b810: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
b820: 52 65 6c 65 61 73 69 6e 67 20 61 20 70 65 6e 64  Releasing a pend
b830: 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c  ing lock */.  el
b840: 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
b850: 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
b860: 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 26 26  )PENDING_BYTE &&
b870: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
b880: 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  oUnlockLow == 1)
b890: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
b8a0: 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29  >local.bPending)
b8b0: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
b8c0: 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20  ocal.bPending = 
b8d0: 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69  FALSE;.      pFi
b8e0: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e  le->shared->bPen
b8f0: 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20  ding = FALSE;.  
b900: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
b910: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  UE;.    }.  }.  
b920: 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72  /* Releasing a r
b930: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a  eserved lock */.
b940: 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c    else if (dwFil
b950: 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44  eOffsetLow == (D
b960: 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f 42 59  WORD)RESERVED_BY
b970: 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42  TE && nNumberOfB
b980: 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
b990: 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
b9a0: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73  File->local.bRes
b9b0: 65 72 76 65 64 29 20 7b 0a 20 20 20 20 20 20 70  erved) {.      p
b9c0: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73  File->local.bRes
b9d0: 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  erved = FALSE;. 
b9e0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
b9f0: 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20  ed->bReserved = 
ba00: 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65  FALSE;.      bRe
ba10: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
ba20: 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d   }.  }..  winceM
ba30: 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
ba40: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65  e->hMutex);.  re
ba50: 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a  turn bReturn;.}.
ba60: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  ./*.** An implem
ba70: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
ba80: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49  LockFileEx() API
ba90: 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20   of Windows for 
baa0: 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  CE.*/.static BOO
bab0: 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45  L winceLockFileE
bac0: 78 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46  x(.  HANDLE *phF
bad0: 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  ile,.  DWORD dwF
bae0: 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 64 77  lags,.  DWORD dw
baf0: 52 65 73 65 72 76 65 64 2c 0a 20 20 44 57 4f 52  Reserved,.  DWOR
bb00: 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
bb10: 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f  ToLockLow,.  DWO
bb20: 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
bb30: 73 54 6f 4c 6f 63 6b 48 69 67 68 2c 0a 20 20 4c  sToLockHigh,.  L
bb40: 50 4f 56 45 52 4c 41 50 50 45 44 20 6c 70 4f 76  POVERLAPPED lpOv
bb50: 65 72 6c 61 70 70 65 64 0a 29 7b 0a 20 20 55 4e  erlapped.){.  UN
bb60: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
bb70: 77 52 65 73 65 72 76 65 64 29 3b 0a 20 20 55 4e  wReserved);.  UN
bb80: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
bb90: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
bba0: 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 2f 2a 20  ockHigh);..  /* 
bbb0: 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 77 61  If the caller wa
bbc0: 6e 74 73 20 61 20 73 68 61 72 65 64 20 72 65 61  nts a shared rea
bbd0: 64 20 6c 6f 63 6b 2c 20 66 6f 72 77 61 72 64 20  d lock, forward 
bbe0: 74 68 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20 74  this call.  ** t
bbf0: 6f 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 20  o winceLockFile 
bc00: 2a 2f 0a 20 20 69 66 20 28 6c 70 4f 76 65 72 6c  */.  if (lpOverl
bc10: 61 70 70 65 64 2d 3e 4f 66 66 73 65 74 20 3d 3d  apped->Offset ==
bc20: 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46   (DWORD)SHARED_F
bc30: 49 52 53 54 20 26 26 0a 20 20 20 20 20 20 64 77  IRST &&.      dw
bc40: 46 6c 61 67 73 20 3d 3d 20 31 20 26 26 0a 20 20  Flags == 1 &&.  
bc50: 20 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74      nNumberOfByt
bc60: 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  esToLockLow == (
bc70: 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
bc80: 45 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  E){.    return w
bc90: 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70 68 46  inceLockFile(phF
bca0: 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ile, SHARED_FIRS
bcb0: 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  T, 0, 1, 0);.  }
bcc0: 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b  .  return FALSE;
bcd0: 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20  .}./*.** End of 
bce0: 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f 64 65  the special code
bcf0: 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a   for wince.*****
bd00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bd10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bd20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bd30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bd40: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66  ********/.#endif
bd50: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   /* SQLITE_OS_WI
bd60: 4e 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  NCE */../*******
bd70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bd80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bd90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bda0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bdb0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ******.** The ne
bdc0: 78 74 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  xt group of rout
bdd0: 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74  ines implement t
bde0: 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 73  he I/O methods s
bdf0: 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 74  pecified.** by t
be00: 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
be10: 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a  thods object..**
be20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
be70: 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f 73  *.** Some Micros
be80: 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61  oft compilers la
be90: 63 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74 69  ck this definiti
bea0: 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49  on..*/.#ifndef I
beb0: 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
bec0: 50 4f 49 4e 54 45 52 0a 23 20 64 65 66 69 6e 65  POINTER.# define
bed0: 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c   INVALID_SET_FIL
bee0: 45 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 4f 52  E_POINTER ((DWOR
bef0: 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 23 69  D)-1).#endif..#i
bf00: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
bf10: 54 3d 3d 30 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  T==0./*.** Move 
bf20: 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
bf30: 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65  tion of the file
bf40: 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61   handle passed a
bf50: 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20  s the first .** 
bf60: 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73  argument to offs
bf70: 65 74 20 69 4f 66 66 73 65 74 20 77 69 74 68 69  et iOffset withi
bf80: 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73  n the file. If s
bf90: 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
bfa0: 6e 20 30 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  n 0. .** Otherwi
bfb0: 73 65 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c  se, set pFile->l
bfc0: 61 73 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74  astErrno and ret
bfd0: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f  urn non-zero..*/
bfe0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
bff0: 57 69 6e 46 69 6c 65 28 77 69 6e 46 69 6c 65 20  WinFile(winFile 
c000: 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f  *pFile, sqlite3_
c010: 69 6e 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a  int64 iOffset){.
c020: 20 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73    LONG upperBits
c030: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c040: 20 20 2f 2a 20 4d 6f 73 74 20 73 69 67 2e 20 33    /* Most sig. 3
c050: 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66  2 bits of new of
c060: 66 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20 6c  fset */.  LONG l
c070: 6f 77 65 72 42 69 74 73 3b 20 20 20 20 20 20 20  owerBits;       
c080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61            /* Lea
c090: 73 74 20 73 69 67 2e 20 33 32 20 62 69 74 73 20  st sig. 32 bits 
c0a0: 6f 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f  of new offset */
c0b0: 0a 20 20 44 57 4f 52 44 20 64 77 52 65 74 3b 20  .  DWORD dwRet; 
c0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0d0: 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
c0e0: 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65 50  rned by SetFileP
c0f0: 6f 69 6e 74 65 72 28 29 20 2a 2f 0a 20 20 44 57  ointer() */.  DW
c100: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  ORD lastErrno;  
c110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c120: 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
c130: 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28  by GetLastError(
c140: 29 20 2a 2f 0a 0a 20 20 75 70 70 65 72 42 69 74  ) */..  upperBit
c150: 73 20 3d 20 28 4c 4f 4e 47 29 28 28 69 4f 66 66  s = (LONG)((iOff
c160: 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66  set>>32) & 0x7ff
c170: 66 66 66 66 66 29 3b 0a 20 20 6c 6f 77 65 72 42  fffff);.  lowerB
c180: 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 69 4f 66  its = (LONG)(iOf
c190: 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66  fset & 0xfffffff
c1a0: 66 29 3b 0a 0a 20 20 2f 2a 20 41 50 49 20 6f 64  f);..  /* API od
c1b0: 64 69 74 79 3a 20 49 66 20 73 75 63 63 65 73 73  dity: If success
c1c0: 66 75 6c 2c 20 53 65 74 46 69 6c 65 50 6f 69 6e  ful, SetFilePoin
c1d0: 74 65 72 28 29 20 72 65 74 75 72 6e 73 20 61 20  ter() returns a 
c1e0: 64 77 6f 72 64 20 0a 20 20 2a 2a 20 63 6f 6e 74  dword .  ** cont
c1f0: 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 77 65 72  aining the lower
c200: 20 33 32 2d 62 69 74 73 20 6f 66 20 74 68 65 20   32-bits of the 
c210: 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73 65 74 2e  new file-offset.
c220: 20 4f 72 2c 20 69 66 20 69 74 20 66 61 69 6c 73   Or, if it fails
c230: 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74 75 72 6e  ,.  ** it return
c240: 73 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  s INVALID_SET_FI
c250: 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48 6f 77 65  LE_POINTER. Howe
c260: 76 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ver according to
c270: 20 4d 53 44 4e 2c 20 0a 20 20 2a 2a 20 49 4e 56   MSDN, .  ** INV
c280: 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f  ALID_SET_FILE_PO
c290: 49 4e 54 45 52 20 6d 61 79 20 61 6c 73 6f 20 62  INTER may also b
c2a0: 65 20 61 20 76 61 6c 69 64 20 6e 65 77 20 6f 66  e a valid new of
c2b0: 66 73 65 74 2e 20 53 6f 20 74 6f 20 64 65 74 65  fset. So to dete
c2c0: 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74  rmine .  ** whet
c2d0: 68 65 72 20 61 6e 20 65 72 72 6f 72 20 68 61 73  her an error has
c2e0: 20 61 63 74 75 61 6c 6c 79 20 6f 63 63 75 72 65   actually occure
c2f0: 64 2c 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 65  d, it is also ne
c300: 63 65 73 73 61 72 79 20 74 6f 20 63 61 6c 6c 20  cessary to call 
c310: 0a 20 20 2a 2a 20 47 65 74 4c 61 73 74 45 72 72  .  ** GetLastErr
c320: 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77 52  or()..  */.  dwR
c330: 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f  et = osSetFilePo
c340: 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20  inter(pFile->h, 
c350: 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70 70 65  lowerBits, &uppe
c360: 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49  rBits, FILE_BEGI
c370: 4e 29 3b 0a 0a 20 20 69 66 28 20 28 64 77 52 65  N);..  if( (dwRe
c380: 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  t==INVALID_SET_F
c390: 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 20 20 20 20  ILE_POINTER.    
c3a0: 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f    && ((lastErrno
c3b0: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
c3c0: 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 29  r())!=NO_ERROR))
c3d0: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
c3e0: 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
c3f0: 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
c400: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
c410: 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e  RR_SEEK, pFile->
c420: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
c430: 20 20 20 20 20 20 20 20 22 73 65 65 6b 57 69 6e          "seekWin
c440: 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  File", pFile->zP
c450: 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ath);.    return
c460: 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   1;.  }..  retur
c470: 6e 20 30 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20  n 0;.}.#else /* 
c480: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
c490: 52 54 3d 3d 31 20 2a 2f 0a 2f 2a 20 0a 2a 2a 20  RT==1 */./* .** 
c4a0: 53 61 6d 65 20 66 75 6e 63 74 69 6f 6e 20 61 73  Same function as
c4b0: 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74   above, except t
c4c0: 68 61 74 20 74 68 69 73 20 69 6d 70 6c 65 6d 65  hat this impleme
c4d0: 6e 74 61 74 69 6f 6e 20 77 6f 72 6b 73 20 66 6f  ntation works fo
c4e0: 72 0a 2a 2a 20 77 69 6e 64 6f 77 73 52 54 2e 0a  r.** windowsRT..
c4f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
c500: 65 6b 57 69 6e 46 69 6c 65 28 77 69 6e 46 69 6c  ekWinFile(winFil
c510: 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65  e *pFile, sqlite
c520: 33 5f 69 6e 74 36 34 20 69 4f 66 66 73 65 74 29  3_int64 iOffset)
c530: 7b 0a 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45  {.  LARGE_INTEGE
c540: 52 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  R x;            
c550: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f      /* The new o
c560: 66 66 73 65 74 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ffset */.  BOOL 
c570: 62 52 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  bRet;           
c580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
c590: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
c5a0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78  SetFilePointerEx
c5b0: 28 29 20 2a 2f 0a 0a 20 20 78 2e 51 75 61 64 50  () */..  x.QuadP
c5c0: 61 72 74 20 3d 20 69 4f 66 66 73 65 74 3b 0a 20  art = iOffset;. 
c5d0: 20 62 52 65 74 20 3d 20 6f 73 53 65 74 46 69 6c   bRet = osSetFil
c5e0: 65 50 6f 69 6e 74 65 72 45 78 28 70 46 69 6c 65  ePointerEx(pFile
c5f0: 2d 3e 68 2c 20 78 2c 20 30 2c 20 46 49 4c 45 5f  ->h, x, 0, FILE_
c600: 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 21 62  BEGIN);..  if(!b
c610: 52 65 74 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  Ret){.    pFile-
c620: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
c630: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
c640: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
c650: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b  QLITE_IOERR_SEEK
c660: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
c670: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
c680: 20 22 73 65 65 6b 57 69 6e 46 69 6c 65 22 2c 20   "seekWinFile", 
c690: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
c6a0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
c6b0: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
c6c0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c  #endif../*.** Cl
c6d0: 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  ose a file..**.*
c6e0: 2a 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64  * It is reported
c6f0: 20 74 68 61 74 20 61 6e 20 61 74 74 65 6d 70 74   that an attempt
c700: 20 74 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e 64   to close a hand
c710: 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65 74 69 6d  le might sometim
c720: 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68 69  es.** fail.  Thi
c730: 73 20 69 73 20 61 20 76 65 72 79 20 75 6e 72 65  s is a very unre
c740: 61 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74 2c  asonable result,
c750: 20 62 75 74 20 57 69 6e 64 6f 77 73 20 69 73 20   but Windows is 
c760: 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f 72  notorious.** for
c770: 20 62 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e 61   being unreasona
c780: 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74 20  ble so I do not 
c790: 64 6f 75 62 74 20 74 68 61 74 20 69 74 20 6d 69  doubt that it mi
c7a0: 67 68 74 20 68 61 70 70 65 6e 2e 20 20 49 66 0a  ght happen.  If.
c7b0: 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20 66 61 69  ** the close fai
c7c0: 6c 73 2c 20 77 65 20 70 61 75 73 65 20 66 6f 72  ls, we pause for
c7d0: 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64   100 millisecond
c7e0: 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e  s and try again.
c7f0: 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73 20    As.** many as 
c800: 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54  MX_CLOSE_ATTEMPT
c810: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c 6f   attempts to clo
c820: 73 65 20 74 68 65 20 68 61 6e 64 6c 65 20 61 72  se the handle ar
c830: 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a 2a  e made before.**
c840: 20 67 69 76 69 6e 67 20 75 70 20 61 6e 64 20 72   giving up and r
c850: 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
c860: 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58  r..*/.#define MX
c870: 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 33  _CLOSE_ATTEMPT 3
c880: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43  .static int winC
c890: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
c8a0: 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63  e *id){.  int rc
c8b0: 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69 6e  , cnt = 0;.  win
c8c0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
c8d0: 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61  inFile*)id;..  a
c8e0: 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
c8f0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
c900: 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 20 20 4f 53  >pShm==0 );.  OS
c910: 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64  TRACE(("CLOSE %d
c920: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
c930: 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d 20  .  do{.    rc = 
c940: 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
c950: 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a 20  ile->h);.    /* 
c960: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
c970: 20 72 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c   rc=0; cnt=MX_CL
c980: 4f 53 45 5f 41 54 54 45 4d 50 54 3b 20 29 3b 20  OSE_ATTEMPT; ); 
c990: 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  */.  }while( rc=
c9a0: 3d 30 20 26 26 20 2b 2b 63 6e 74 20 3c 20 4d 58  =0 && ++cnt < MX
c9b0: 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 26  _CLOSE_ATTEMPT &
c9c0: 26 20 28 70 6f 72 74 61 62 6c 65 53 6c 65 65 70  & (portableSleep
c9d0: 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23 69 66  (100), 1) );.#if
c9e0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
c9f0: 0a 23 64 65 66 69 6e 65 20 57 49 4e 43 45 5f 44  .#define WINCE_D
ca00: 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53  ELETION_ATTEMPTS
ca10: 20 33 0a 20 20 77 69 6e 63 65 44 65 73 74 72 6f   3.  winceDestro
ca20: 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  yLock(pFile);.  
ca30: 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  if( pFile->zDele
ca40: 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20  teOnClose ){.   
ca50: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
ca60: 20 20 77 68 69 6c 65 28 0a 20 20 20 20 20 20 20    while(.       
ca70: 20 20 20 20 6f 73 44 65 6c 65 74 65 46 69 6c 65      osDeleteFile
ca80: 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65  W(pFile->zDelete
ca90: 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20 20 20 20  OnClose)==0.    
caa0: 20 20 20 20 26 26 20 6f 73 47 65 74 46 69 6c 65      && osGetFile
cab0: 41 74 74 72 69 62 75 74 65 73 57 28 70 46 69 6c  AttributesW(pFil
cac0: 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
cad0: 65 29 21 3d 30 78 66 66 66 66 66 66 66 66 20 0a  e)!=0xffffffff .
cae0: 20 20 20 20 20 20 20 20 26 26 20 63 6e 74 2b 2b          && cnt++
caf0: 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f   < WINCE_DELETIO
cb00: 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20 20 20 29  N_ATTEMPTS.    )
cb10: 7b 0a 20 20 20 20 20 20 20 70 6f 72 74 61 62 6c  {.       portabl
cb20: 65 53 6c 65 65 70 28 31 30 30 29 3b 20 20 2f 2a  eSleep(100);  /*
cb30: 20 57 61 69 74 20 61 20 6c 69 74 74 6c 65 20 62   Wait a little b
cb40: 65 66 6f 72 65 20 74 72 79 69 6e 67 20 61 67 61  efore trying aga
cb50: 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  in */.    }.    
cb60: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69  sqlite3_free(pFi
cb70: 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
cb80: 73 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  se);.  }.#endif.
cb90: 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53    OSTRACE(("CLOS
cba0: 45 20 25 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c  E %d %s\n", pFil
cbb0: 65 2d 3e 68 2c 20 72 63 20 3f 20 22 6f 6b 22 20  e->h, rc ? "ok" 
cbc0: 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
cbd0: 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b  OpenCounter(-1);
cbe0: 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53  .  return rc ? S
cbf0: 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20  QLITE_OK.       
cc00: 20 20 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72 72       : winLogErr
cc10: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
cc20: 43 4c 4f 53 45 2c 20 6f 73 47 65 74 4c 61 73 74  CLOSE, osGetLast
cc30: 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
cc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc50: 20 20 20 22 77 69 6e 43 6c 6f 73 65 22 2c 20 70     "winClose", p
cc60: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a  File->zPath);.}.
cc70: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61  ./*.** Read data
cc80: 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74   from a file int
cc90: 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74  o a buffer.  Ret
cca0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
ccb0: 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65   all.** bytes we
ccc0: 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66  re read successf
ccd0: 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  ully and SQLITE_
cce0: 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e  IOERR if anythin
ccf0: 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
cd00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
cd10: 69 6e 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65  inRead(.  sqlite
cd20: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20  3_file *id,     
cd30: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20       /* File to 
cd40: 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 76  read from */.  v
cd50: 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
cd60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
cd70: 74 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20  te content into 
cd80: 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20  this buffer */. 
cd90: 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20   int amt,       
cda0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
cdb0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
cdc0: 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69  o read */.  sqli
cdd0: 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
cde0: 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
cdf0: 72 65 61 64 69 6e 67 20 61 74 20 74 68 69 73 20  reading at this 
ce00: 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 77  offset */.){.  w
ce10: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
ce20: 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f  (winFile*)id;  /
ce30: 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f  * file handle */
ce40: 0a 20 20 44 57 4f 52 44 20 6e 52 65 61 64 3b 20  .  DWORD nRead; 
ce50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ce70: 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
ce80: 65 61 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f  ead from file */
ce90: 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20  .  int nRetry = 
cea0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
ceb0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
cec0: 72 65 74 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73  retrys */..  ass
ced0: 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
cee0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
cef0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
cf00: 45 52 52 5f 52 45 41 44 29 3b 0a 20 20 4f 53 54  ERR_READ);.  OST
cf10: 52 41 43 45 28 28 22 52 45 41 44 20 25 64 20 6c  RACE(("READ %d l
cf20: 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ock=%d\n", pFile
cf30: 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
cf40: 74 79 70 65 29 29 3b 0a 0a 20 20 69 66 28 20 73  type));..  if( s
cf50: 65 65 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c 65  eekWinFile(pFile
cf60: 2c 20 6f 66 66 73 65 74 29 20 29 7b 0a 20 20 20  , offset) ){.   
cf70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
cf80: 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  ULL;.  }.  while
cf90: 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46  ( !osReadFile(pF
cfa0: 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  ile->h, pBuf, am
cfb0: 74 2c 20 26 6e 52 65 61 64 2c 20 30 29 20 29 7b  t, &nRead, 0) ){
cfc0: 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45  .    DWORD lastE
cfd0: 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 72 65  rrno;.    if( re
cfe0: 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79  tryIoerr(&nRetry
cff0: 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20  , &lastErrno) ) 
d000: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 46  continue;.    pF
d010: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
d020: 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
d030: 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
d040: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
d050: 52 45 41 44 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  READ, pFile->las
d060: 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
d070: 20 20 20 20 20 22 77 69 6e 52 65 61 64 22 2c 20       "winRead", 
d080: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
d090: 20 7d 0a 20 20 6c 6f 67 49 6f 65 72 72 28 6e 52   }.  logIoerr(nR
d0a0: 65 74 72 79 29 3b 0a 20 20 69 66 28 20 6e 52 65  etry);.  if( nRe
d0b0: 61 64 3c 28 44 57 4f 52 44 29 61 6d 74 20 29 7b  ad<(DWORD)amt ){
d0c0: 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70  .    /* Unread p
d0d0: 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 66  arts of the buff
d0e0: 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d  er must be zero-
d0f0: 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65  filled */.    me
d100: 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42  mset(&((char*)pB
d110: 75 66 29 5b 6e 52 65 61 64 5d 2c 20 30 2c 20 61  uf)[nRead], 0, a
d120: 6d 74 2d 6e 52 65 61 64 29 3b 0a 20 20 20 20 72  mt-nRead);.    r
d130: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
d140: 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20  RR_SHORT_READ;. 
d150: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
d160: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
d170: 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d   Write data from
d180: 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61   a buffer into a
d190: 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53   file.  Return S
d1a0: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
d1b0: 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ess.** or some o
d1c0: 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
d1d0: 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
d1e0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69  tatic int winWri
d1f0: 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  te(.  sqlite3_fi
d200: 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
d210: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f        /* File to
d220: 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20   write into */. 
d230: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
d240: 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
d250: 20 2f 2a 20 54 68 65 20 62 79 74 65 73 20 74 6f   /* The bytes to
d260: 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20   be written */. 
d270: 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20   int amt,       
d280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d290: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
d2a0: 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  tes to write */.
d2b0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
d2c0: 6f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20  offset          
d2d0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
d2e0: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67   the file to beg
d2f0: 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f  in writing at */
d300: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
d310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d320: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
d330: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
d340: 65 64 2c 20 65 6c 73 65 20 66 61 6c 73 65 20 2a  ed, else false *
d350: 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  /.  winFile *pFi
d360: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
d370: 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64  d;  /* File hand
d380: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74  le */.  int nRet
d390: 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ry = 0;         
d3a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
d3b0: 72 20 6f 66 20 72 65 74 72 69 65 73 20 2a 2f 0a  r of retries */.
d3c0: 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30  .  assert( amt>0
d3d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46   );.  assert( pF
d3e0: 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  ile );.  Simulat
d3f0: 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
d400: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
d410: 54 45 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44  TE);.  SimulateD
d420: 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65 74  iskfullError(ret
d430: 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29  urn SQLITE_FULL)
d440: 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57  ;..  OSTRACE(("W
d450: 52 49 54 45 20 25 64 20 6c 6f 63 6b 3d 25 64 5c  RITE %d lock=%d\
d460: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46  n", pFile->h, pF
d470: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b  ile->locktype));
d480: 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b 57 69 6e  ..  rc = seekWin
d490: 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73  File(pFile, offs
d4a0: 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30  et);.  if( rc==0
d4b0: 20 29 7b 0a 20 20 20 20 75 38 20 2a 61 52 65 6d   ){.    u8 *aRem
d4c0: 20 3d 20 28 75 38 20 2a 29 70 42 75 66 3b 20 20   = (u8 *)pBuf;  
d4d0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 79 65        /* Data ye
d4e0: 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  t to be written 
d4f0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d 20  */.    int nRem 
d500: 3d 20 61 6d 74 3b 20 20 20 20 20 20 20 20 20 20  = amt;          
d510: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d520: 66 20 62 79 74 65 73 20 79 65 74 20 74 6f 20 62  f bytes yet to b
d530: 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20  e written */.   
d540: 20 44 57 4f 52 44 20 6e 57 72 69 74 65 3b 20 20   DWORD nWrite;  
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d560: 2a 20 42 79 74 65 73 20 77 72 69 74 74 65 6e 20  * Bytes written 
d570: 62 79 20 65 61 63 68 20 57 72 69 74 65 46 69 6c  by each WriteFil
d580: 65 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 20 20  e() call */.    
d590: 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20  DWORD lastErrno 
d5a0: 3d 20 4e 4f 5f 45 52 52 4f 52 3b 20 20 20 2f 2a  = NO_ERROR;   /*
d5b0: 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
d5c0: 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28  by GetLastError(
d5d0: 29 20 2a 2f 0a 0a 20 20 20 20 77 68 69 6c 65 28  ) */..    while(
d5e0: 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20   nRem>0 ){.     
d5f0: 20 69 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c   if( !osWriteFil
d600: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d  e(pFile->h, aRem
d610: 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c  , nRem, &nWrite,
d620: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69   0) ){.        i
d630: 66 28 20 72 65 74 72 79 49 6f 65 72 72 28 26 6e  f( retryIoerr(&n
d640: 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e  Retry, &lastErrn
d650: 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  o) ) continue;. 
d660: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
d670: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
d680: 6e 57 72 69 74 65 3c 3d 30 20 29 20 62 72 65 61  nWrite<=0 ) brea
d690: 6b 3b 0a 20 20 20 20 20 20 61 52 65 6d 20 2b 3d  k;.      aRem +=
d6a0: 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6e   nWrite;.      n
d6b0: 52 65 6d 20 2d 3d 20 6e 57 72 69 74 65 3b 0a 20  Rem -= nWrite;. 
d6c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52 65     }.    if( nRe
d6d0: 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69  m>0 ){.      pFi
d6e0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
d6f0: 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
d700: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
d710: 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   }..  if( rc ){.
d720: 20 20 20 20 69 66 28 20 20 20 28 20 70 46 69 6c      if(   ( pFil
d730: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  e->lastErrno==ER
d740: 52 4f 52 5f 48 41 4e 44 4c 45 5f 44 49 53 4b 5f  ROR_HANDLE_DISK_
d750: 46 55 4c 4c 20 29 0a 20 20 20 20 20 20 20 7c 7c  FULL ).       ||
d760: 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   ( pFile->lastEr
d770: 72 6e 6f 3d 3d 45 52 52 4f 52 5f 44 49 53 4b 5f  rno==ERROR_DISK_
d780: 46 55 4c 4c 20 29 29 7b 0a 20 20 20 20 20 20 72  FULL )){.      r
d790: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
d7a0: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  L;.    }.    ret
d7b0: 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
d7c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
d7d0: 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  TE, pFile->lastE
d7e0: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
d7f0: 20 20 20 22 77 69 6e 57 72 69 74 65 22 2c 20 70     "winWrite", p
d800: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
d810: 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 67 49 6f  }else{.    logIo
d820: 65 72 72 28 6e 52 65 74 72 79 29 3b 0a 20 20 7d  err(nRetry);.  }
d830: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d840: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  _OK;.}../*.** Tr
d850: 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66  uncate an open f
d860: 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69  ile to a specifi
d870: 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69  ed size.*/.stati
d880: 63 20 69 6e 74 20 77 69 6e 54 72 75 6e 63 61 74  c int winTruncat
d890: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
d8a0: 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  id, sqlite3_int6
d8b0: 34 20 6e 42 79 74 65 29 7b 0a 20 20 77 69 6e 46  4 nByte){.  winF
d8c0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
d8d0: 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46  nFile*)id;  /* F
d8e0: 69 6c 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63  ile handle objec
d8f0: 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  t */.  int rc = 
d900: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
d910: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
d920: 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 66   code for this f
d930: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73  unction */..  as
d940: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a  sert( pFile );..
d950: 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e    OSTRACE(("TRUN
d960: 43 41 54 45 20 25 64 20 25 6c 6c 64 5c 6e 22 2c  CATE %d %lld\n",
d970: 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65   pFile->h, nByte
d980: 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  ));.  SimulateIO
d990: 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
d9a0: 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
d9b0: 54 45 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  TE);..  /* If th
d9c0: 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69  e user has confi
d9d0: 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69  gured a chunk-si
d9e0: 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ze for this file
d9f0: 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
da00: 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74   ** file so that
da10: 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20   it consists of 
da20: 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65  an integer numbe
da30: 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65  r of chunks (i.e
da40: 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61  . the.  ** actua
da50: 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65  l file size afte
da60: 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  r the operation 
da70: 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20 74 68  may be larger th
da80: 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
da90: 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a  .  ** size)..  *
daa0: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  /.  if( pFile->s
dab0: 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20  zChunk>0 ){.    
dac0: 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20  nByte = ((nByte 
dad0: 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  + pFile->szChunk
dae0: 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43   - 1)/pFile->szC
daf0: 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73  hunk) * pFile->s
db00: 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  zChunk;.  }..  /
db10: 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 29  * SetEndOfFile()
db20: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
db30: 6f 20 77 68 65 6e 20 73 75 63 63 65 73 73 66 75  o when successfu
db40: 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e 20  l, or zero when 
db50: 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 69  it fails. */.  i
db60: 66 28 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70  f( seekWinFile(p
db70: 46 69 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b 0a  File, nByte) ){.
db80: 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
db90: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
dba0: 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c  R_TRUNCATE, pFil
dbb0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
dbc0: 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 54             "winT
dbd0: 72 75 6e 63 61 74 65 31 22 2c 20 70 46 69 6c 65  runcate1", pFile
dbe0: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73  ->zPath);.  }els
dbf0: 65 20 69 66 28 20 30 3d 3d 6f 73 53 65 74 45 6e  e if( 0==osSetEn
dc00: 64 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  dOfFile(pFile->h
dc10: 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ) ){.    pFile->
dc20: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
dc30: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
dc40: 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
dc50: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
dc60: 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d  TRUNCATE, pFile-
dc70: 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
dc80: 20 20 20 20 20 20 20 20 20 22 77 69 6e 54 72 75           "winTru
dc90: 6e 63 61 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e  ncate2", pFile->
dca0: 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 4f  zPath);.  }..  O
dcb0: 53 54 52 41 43 45 28 28 22 54 52 55 4e 43 41 54  STRACE(("TRUNCAT
dcc0: 45 20 25 64 20 25 6c 6c 64 20 25 73 5c 6e 22 2c  E %d %lld %s\n",
dcd0: 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65   pFile->h, nByte
dce0: 2c 20 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20  , rc ? "failed" 
dcf0: 3a 20 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75  : "ok"));.  retu
dd00: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
dd10: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
dd20: 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
dd30: 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73  ber of fullsyncs
dd40: 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63   and normal sync
dd50: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
dd60: 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74   to test.** that
dd70: 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73   syncs and fulls
dd80: 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e  yncs are occurin
dd90: 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74  g at the right t
dda0: 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  imes..*/.int sql
ddb0: 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20  ite3_sync_count 
ddc0: 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  = 0;.int sqlite3
ddd0: 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20  _fullsync_count 
dde0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
ddf0: 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  ** Make sure all
de00: 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72   writes to a par
de10: 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65  ticular file are
de20: 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69   committed to di
de30: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  sk..*/.static in
de40: 74 20 77 69 6e 53 79 6e 63 28 73 71 6c 69 74 65  t winSync(sqlite
de50: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
de60: 66 6c 61 67 73 29 7b 0a 23 69 66 6e 64 65 66 20  flags){.#ifndef 
de70: 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
de80: 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20 6f 6e   /*.  ** Used on
de90: 6c 79 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e  ly when SQLITE_N
dea0: 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64 65  O_SYNC is not de
deb0: 66 69 6e 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 42  fined..   */.  B
dec0: 4f 4f 4c 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23  OOL rc;.#endif.#
ded0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
dee0: 55 47 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  UG) || !defined(
def0: 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20  SQLITE_NO_SYNC) 
df00: 7c 7c 20 5c 0a 20 20 20 20 28 64 65 66 69 6e 65  || \.    (define
df10: 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26  d(SQLITE_TEST) &
df20: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
df30: 5f 44 45 42 55 47 29 29 0a 20 20 2f 2a 0a 20 20  _DEBUG)).  /*.  
df40: 2a 2a 20 55 73 65 64 20 77 68 65 6e 20 53 51 4c  ** Used when SQL
df50: 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e  ITE_NO_SYNC is n
df60: 6f 74 20 64 65 66 69 6e 65 64 20 61 6e 64 20 62  ot defined and b
df70: 79 20 74 68 65 20 61 73 73 65 72 74 28 29 20 61  y the assert() a
df80: 6e 64 2f 6f 72 0a 20 20 2a 2a 20 4f 53 54 52 41  nd/or.  ** OSTRA
df90: 43 45 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 20  CE() macros..   
dfa0: 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  */.  winFile *pF
dfb0: 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
dfc0: 69 64 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53  id;.#else.  UNUS
dfd0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 29  ED_PARAMETER(id)
dfe0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
dff0: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 2f  rt( pFile );.  /
e000: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65  * Check that one
e010: 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f   of SQLITE_SYNC_
e020: 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77  NORMAL or FULL w
e030: 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61  as passed */.  a
e040: 73 73 65 72 74 28 28 66 6c 61 67 73 26 30 78 30  ssert((flags&0x0
e050: 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
e060: 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20  NORMAL.      || 
e070: 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
e080: 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20  LITE_SYNC_FULL. 
e090: 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   );..  OSTRACE((
e0a0: 22 53 59 4e 43 20 25 64 20 6c 6f 63 6b 3d 25 64  "SYNC %d lock=%d
e0b0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
e0c0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
e0d0: 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e  ;..  /* Unix can
e0e0: 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79  not, but some sy
e0f0: 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e  stems may return
e100: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f   SQLITE_FULL fro
e110: 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a  m here. This.  *
e120: 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73  * line is to tes
e130: 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20  t that doing so 
e140: 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61  does not cause a
e150: 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a  ny problems..  *
e160: 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b  /.  SimulateDisk
e170: 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72  fullError( retur
e180: 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b  n SQLITE_FULL );
e190: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
e1a0: 5f 54 45 53 54 0a 20 20 55 4e 55 53 45 44 5f 50  _TEST.  UNUSED_P
e1b0: 41 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b  ARAMETER(flags);
e1c0: 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 28 66 6c  .#else.  if( (fl
e1d0: 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
e1e0: 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20  E_SYNC_FULL ){. 
e1f0: 20 20 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73     sqlite3_fulls
e200: 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d  ync_count++;.  }
e210: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f  .  sqlite3_sync_
e220: 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
e230: 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70  .  /* If we comp
e240: 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51  iled with the SQ
e250: 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61  LITE_NO_SYNC fla
e260: 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20  g, then syncing 
e270: 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a  is a.  ** no-op.
e280: 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
e290: 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 65 74  TE_NO_SYNC.  ret
e2a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
e2b0: 65 6c 73 65 0a 20 20 72 63 20 3d 20 6f 73 46 6c  else.  rc = osFl
e2c0: 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 28 70  ushFileBuffers(p
e2d0: 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 53 69 6d 75  File->h);.  Simu
e2e0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
e2f0: 46 41 4c 53 45 20 29 3b 0a 20 20 69 66 28 20 72  FALSE );.  if( r
e300: 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
e310: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
e320: 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  se{.    pFile->l
e330: 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
e340: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
e350: 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
e360: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
e370: 5f 46 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c  _FSYNC, pFile->l
e380: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
e390: 20 20 20 20 20 20 20 22 77 69 6e 53 79 6e 63 22         "winSync"
e3a0: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
e3b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
e3c0: 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74  *.** Determine t
e3d0: 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
e3e0: 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74  of a file in byt
e3f0: 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es.*/.static int
e400: 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c   winFileSize(sql
e410: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73  ite3_file *id, s
e420: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 53  qlite3_int64 *pS
e430: 69 7a 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  ize){.  winFile 
e440: 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
e450: 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20  e*)id;.  int rc 
e460: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
e470: 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
e480: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
e490: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
e4a0: 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a 23  _IOERR_FSTAT);.#
e4b0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
e4c0: 52 54 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 5f  RT.  {.    FILE_
e4d0: 53 54 41 4e 44 41 52 44 5f 49 4e 46 4f 20 69 6e  STANDARD_INFO in
e4e0: 66 6f 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65  fo;.    if( osGe
e4f0: 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  tFileInformation
e500: 42 79 48 61 6e 64 6c 65 45 78 28 70 46 69 6c 65  ByHandleEx(pFile
e510: 2d 3e 68 2c 20 46 69 6c 65 53 74 61 6e 64 61 72  ->h, FileStandar
e520: 64 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20  dInfo,.         
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e540: 20 20 20 20 20 20 20 20 20 20 20 20 26 69 6e 66              &inf
e550: 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  o, sizeof(info))
e560: 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65   ){.      *pSize
e570: 20 3d 20 69 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c   = info.EndOfFil
e580: 65 2e 51 75 61 64 50 61 72 74 3b 0a 20 20 20 20  e.QuadPart;.    
e590: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
e5a0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
e5b0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
e5c0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
e5d0: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
e5e0: 49 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69  IOERR_FSTAT, pFi
e5f0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
e600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e610: 20 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69        "winFileSi
e620: 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ze", pFile->zPat
e630: 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  h);.    }.  }.#e
e640: 6c 73 65 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52  lse.  {.    DWOR
e650: 44 20 75 70 70 65 72 42 69 74 73 3b 0a 20 20 20  D upperBits;.   
e660: 20 44 57 4f 52 44 20 6c 6f 77 65 72 42 69 74 73   DWORD lowerBits
e670: 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74  ;.    DWORD last
e680: 45 72 72 6e 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65  Errno;..    lowe
e690: 72 42 69 74 73 20 3d 20 6f 73 47 65 74 46 69 6c  rBits = osGetFil
e6a0: 65 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20  eSize(pFile->h, 
e6b0: 26 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20 20  &upperBits);.   
e6c0: 20 2a 70 53 69 7a 65 20 3d 20 28 28 28 73 71 6c   *pSize = (((sql
e6d0: 69 74 65 33 5f 69 6e 74 36 34 29 75 70 70 65 72  ite3_int64)upper
e6e0: 42 69 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77  Bits)<<32) + low
e6f0: 65 72 42 69 74 73 3b 0a 20 20 20 20 69 66 28 20  erBits;.    if( 
e700: 20 20 28 6c 6f 77 65 72 42 69 74 73 20 3d 3d 20    (lowerBits == 
e710: 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 53 49 5a  INVALID_FILE_SIZ
e720: 45 29 0a 20 20 20 20 20 20 20 26 26 20 28 28 6c  E).       && ((l
e730: 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
e740: 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f  LastError())!=NO
e750: 5f 45 52 52 4f 52 29 20 29 7b 0a 20 20 20 20 20  _ERROR) ){.     
e760: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
e770: 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
e780: 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
e790: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
e7a0: 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d  RR_FSTAT, pFile-
e7b0: 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
e7c0: 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 69 6c           "winFil
e7d0: 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  eSize", pFile->z
e7e0: 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Path);.    }.  }
e7f0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
e800: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f   rc;.}../*.** LO
e810: 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
e820: 44 49 41 54 45 4c 59 20 69 73 20 75 6e 64 65 66  DIATELY is undef
e830: 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e  ined on some Win
e840: 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f  dows systems..*/
e850: 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c  .#ifndef LOCKFIL
e860: 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
e870: 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b  LY.# define LOCK
e880: 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
e890: 41 54 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a  ATELY 1.#endif..
e8a0: 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
e8b0: 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20  reader lock..** 
e8c0: 44 69 66 66 65 72 65 6e 74 20 41 50 49 20 72 6f  Different API ro
e8d0: 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c 6c 65  utines are calle
e8e0: 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  d depending on w
e8f0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
e900: 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39 78 20 6f  is.** is Win9x o
e910: 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74  r WinNT..*/.stat
e920: 69 63 20 69 6e 74 20 67 65 74 52 65 61 64 4c 6f  ic int getReadLo
e930: 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  ck(winFile *pFil
e940: 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  e){.  int res;. 
e950: 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20   if( isNT() ){. 
e960: 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76     OVERLAPPED ov
e970: 6c 70 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66  lp;.    ovlp.Off
e980: 73 65 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  set = SHARED_FIR
e990: 53 54 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66  ST;.    ovlp.Off
e9a0: 73 65 74 48 69 67 68 20 3d 20 30 3b 0a 20 20 20  setHigh = 0;.   
e9b0: 20 6f 76 6c 70 2e 68 45 76 65 6e 74 20 3d 20 30   ovlp.hEvent = 0
e9c0: 3b 0a 20 20 20 20 72 65 73 20 3d 20 6f 73 4c 6f  ;.    res = osLo
e9d0: 63 6b 46 69 6c 65 45 78 28 70 46 69 6c 65 2d 3e  ckFileEx(pFile->
e9e0: 68 2c 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  h, LOCKFILE_FAIL
e9f0: 5f 49 4d 4d 45 44 49 41 54 45 4c 59 2c 0a 20 20  _IMMEDIATELY,.  
ea00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea10: 20 20 20 20 20 30 2c 20 53 48 41 52 45 44 5f 53       0, SHARED_S
ea20: 49 5a 45 2c 20 30 2c 20 26 6f 76 6c 70 29 3b 0a  IZE, 0, &ovlp);.
ea30: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
ea40: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
ea50: 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74  .  else{.    int
ea60: 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   lk;.    sqlite3
ea70: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
ea80: 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20  of(lk), &lk);.  
ea90: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c    pFile->sharedL
eaa0: 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72 74  ockByte = (short
eab0: 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66  )((lk & 0x7fffff
eac0: 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45  ff)%(SHARED_SIZE
ead0: 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73 20   - 1));.    res 
eae0: 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 70 46 69  = osLockFile(pFi
eaf0: 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
eb00: 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65  RST+pFile->share
eb10: 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c  dLockByte, 0, 1,
eb20: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
eb30: 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29    if( res == 0 )
eb40: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
eb50: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
eb60: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f  stError();.    /
eb70: 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67  * No need to log
eb80: 20 61 20 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f   a failure to lo
eb90: 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  ck */.  }.  retu
eba0: 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
ebb0: 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b   Undo a readlock
ebc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
ebd0: 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77 69  nlockReadLock(wi
ebe0: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
ebf0: 20 69 6e 74 20 72 65 73 3b 0a 20 20 44 57 4f 52   int res;.  DWOR
ec00: 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 69  D lastErrno;.  i
ec10: 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
ec20: 20 72 65 73 20 3d 20 6f 73 55 6e 6c 6f 63 6b 46   res = osUnlockF
ec30: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48  ile(pFile->h, SH
ec40: 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53  ARED_FIRST, 0, S
ec50: 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
ec60: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
ec70: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
ec80: 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 72 65 73  .  else{.    res
ec90: 20 3d 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28   = osUnlockFile(
eca0: 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
ecb0: 5f 46 49 52 53 54 20 2b 20 70 46 69 6c 65 2d 3e  _FIRST + pFile->
ecc0: 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
ecd0: 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, 1, 0);.  }.#e
ece0: 6e 64 69 66 0a 20 20 69 66 28 20 72 65 73 3d 3d  ndif.  if( res==
ecf0: 30 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f  0 && ((lastErrno
ed00: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
ed10: 72 28 29 29 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f  r())!=ERROR_NOT_
ed20: 4c 4f 43 4b 45 44 29 20 29 7b 0a 20 20 20 20 70  LOCKED) ){.    p
ed30: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
ed40: 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
ed50: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
ed60: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
ed70: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
ed80: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
ed90: 20 22 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b   "unlockReadLock
eda0: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
edb0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
edc0: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  es;.}../*.** Loc
edd0: 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
ede0: 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
edf0: 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
ee00: 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a  locktype - one.*
ee10: 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
ee20: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
ee30: 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
ee40: 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
ee50: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
ee60: 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
ee70: 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
ee80: 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
ee90: 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
eea0: 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
eeb0: 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
eec0: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
eed0: 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
eee0: 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
eef0: 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
ef00: 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
ef10: 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
ef20: 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
ef30: 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
ef40: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
ef50: 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
ef60: 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
ef70: 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
ef80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
ef90: 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
efa0: 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
efb0: 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
efc0: 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
efd0: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
efe0: 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
eff0: 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
f000: 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
f010: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
f020: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
f030: 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
f040: 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
f050: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
f060: 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
f070: 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
f080: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
f090: 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
f0a0: 20 6c 6f 63 6b 2e 20 20 54 68 65 20 77 69 6e 55   lock.  The winU
f0b0: 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a  nlock() routine.
f0c0: 2a 2a 20 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f  ** erases all lo
f0d0: 63 6b 73 20 61 74 20 6f 6e 63 65 20 61 6e 64 20  cks at once and 
f0e0: 72 65 74 75 72 6e 73 20 75 73 20 69 6d 6d 65 64  returns us immed
f0f0: 69 61 74 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e  iately to lockin
f100: 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74  g level 0..** It
f110: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
f120: 20 74 6f 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f   to lower the lo
f130: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20  cking level one 
f140: 73 74 65 70 20 61 74 20 61 20 74 69 6d 65 2e 20  step at a time. 
f150: 20 59 6f 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20   You.** must go 
f160: 73 74 72 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b  straight to lock
f170: 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a  ing level 0..*/.
f180: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f  static int winLo
f190: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
f1a0: 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
f1b0: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
f1c0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20  QLITE_OK;    /* 
f1d0: 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
f1e0: 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a   subroutines */.
f1f0: 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20    int res = 1;  
f200: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
f210: 6c 74 20 6f 66 20 61 20 57 69 6e 64 6f 77 73 20  lt of a Windows 
f220: 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20 69  lock call */.  i
f230: 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 20  nt newLocktype; 
f240: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70 46 69        /* Set pFi
f250: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20  le->locktype to 
f260: 74 68 69 73 20 76 61 6c 75 65 20 62 65 66 6f 72  this value befor
f270: 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69  e exiting */.  i
f280: 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63  nt gotPendingLoc
f290: 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69 66  k = 0;/* True if
f2a0: 20 77 65 20 61 63 71 75 69 72 65 64 20 61 20 50   we acquired a P
f2b0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73  ENDING lock this
f2c0: 20 74 69 6d 65 20 2a 2f 0a 20 20 77 69 6e 46 69   time */.  winFi
f2d0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
f2e0: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52  File*)id;.  DWOR
f2f0: 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f  D lastErrno = NO
f300: 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73 73 65 72  _ERROR;..  asser
f310: 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53  t( id!=0 );.  OS
f320: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 64 20  TRACE(("LOCK %d 
f330: 25 64 20 77 61 73 20 25 64 28 25 64 29 5c 6e 22  %d was %d(%d)\n"
f340: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
f350: 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c  le->h, locktype,
f360: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
f370: 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  , pFile->sharedL
f380: 6f 63 6b 42 79 74 65 29 29 3b 0a 0a 20 20 2f 2a  ockByte));..  /*
f390: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
f3a0: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
f3b0: 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
f3c0: 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
f3d0: 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c  the.  ** OsFile,
f3e0: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
f3f0: 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c  't use the end_l
f400: 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20  ock: exit path, 
f410: 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f  as.  ** sqlite3O
f420: 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61  sEnterMutex() ha
f430: 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64  sn't been called
f440: 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   yet..  */.  if(
f450: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
f460: 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
f470: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f480: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  OK;.  }..  /* Ma
f490: 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
f4a0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
f4b0: 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61  correct.  */.  a
f4c0: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
f4d0: 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20  cktype!=NO_LOCK 
f4e0: 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  || locktype==SHA
f4f0: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
f500: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d  sert( locktype!=
f510: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a  PENDING_LOCK );.
f520: 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
f530: 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe!=RESERVED_LOC
f540: 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  K || pFile->lock
f550: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
f560: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20  K );..  /* Lock 
f570: 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  the PENDING_LOCK
f580: 20 62 79 74 65 20 69 66 20 77 65 20 6e 65 65 64   byte if we need
f590: 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 50 45   to acquire a PE
f5a0: 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20  NDING lock or.  
f5b0: 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ** a SHARED lock
f5c0: 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 63 71  .  If we are acq
f5d0: 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
f5e0: 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69 73  lock, the acquis
f5f0: 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68  ition of.  ** th
f600: 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62  e PENDING_LOCK b
f610: 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72 79  yte is temporary
f620: 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b  ..  */.  newLock
f630: 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f  type = pFile->lo
f640: 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 20 20  cktype;.  if(   
f650: 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
f660: 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ==NO_LOCK).     
f670: 7c 7c 20 28 20 20 20 28 6c 6f 63 6b 74 79 70 65  || (   (locktype
f680: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
f690: 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  ).         && (p
f6a0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
f6b0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 29 0a  RESERVED_LOCK)).
f6c0: 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74    ){.    int cnt
f6d0: 20 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 3;.    while(
f6e0: 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65 73   cnt-->0 && (res
f6f0: 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 70 46   = osLockFile(pF
f700: 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  ile->h, PENDING_
f710: 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d  BYTE, 0, 1, 0))=
f720: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
f730: 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67 65  ry 3 times to ge
f740: 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f  t the pending lo
f750: 63 6b 2e 20 20 54 68 69 73 20 69 73 20 6e 65 65  ck.  This is nee
f760: 64 65 64 20 74 6f 20 77 6f 72 6b 0a 20 20 20 20  ded to work.    
f770: 20 20 2a 2a 20 61 72 6f 75 6e 64 20 70 72 6f 62    ** around prob
f780: 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79 20 69  lems caused by i
f790: 6e 64 65 78 69 6e 67 20 61 6e 64 2f 6f 72 20 61  ndexing and/or a
f7a0: 6e 74 69 2d 76 69 72 75 73 20 73 6f 66 74 77 61  nti-virus softwa
f7b0: 72 65 20 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 57  re on.      ** W
f7c0: 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a  indows systems..
f7d0: 20 20 20 20 20 20 2a 2a 20 49 66 20 79 6f 75 20        ** If you 
f7e0: 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20 63  are using this c
f7f0: 6f 64 65 20 61 73 20 61 20 6d 6f 64 65 6c 20 66  ode as a model f
f800: 6f 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 56  or alternative V
f810: 46 53 65 73 2c 20 64 6f 20 6e 6f 74 0a 20 20 20  FSes, do not.   
f820: 20 20 20 2a 2a 20 63 6f 70 79 20 74 68 69 73 20     ** copy this 
f830: 72 65 74 72 79 20 6c 6f 67 69 63 2e 20 20 49 74  retry logic.  It
f840: 20 69 73 20 61 20 68 61 63 6b 20 69 6e 74 65 6e   is a hack inten
f850: 64 65 64 20 66 6f 72 20 57 69 6e 64 6f 77 73 20  ded for Windows 
f860: 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  only..      */. 
f870: 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 63       OSTRACE(("c
f880: 6f 75 6c 64 20 6e 6f 74 20 67 65 74 20 61 20 50  ould not get a P
f890: 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 20 63 6e 74  ENDING lock. cnt
f8a0: 3d 25 64 5c 6e 22 2c 20 63 6e 74 29 29 3b 0a 20  =%d\n", cnt));. 
f8b0: 20 20 20 20 20 69 66 28 20 63 6e 74 20 29 20 70       if( cnt ) p
f8c0: 6f 72 74 61 62 6c 65 53 6c 65 65 70 28 31 29 3b  ortableSleep(1);
f8d0: 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50 65  .    }.    gotPe
f8e0: 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73 3b  ndingLock = res;
f8f0: 0a 20 20 20 20 69 66 28 20 21 72 65 73 20 29 7b  .    if( !res ){
f900: 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
f910: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
f920: 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  r();.    }.  }..
f930: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 73    /* Acquire a s
f940: 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  hared lock.  */.
f950: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
f960: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 72  SHARED_LOCK && r
f970: 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
f980: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
f990: 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20  e==NO_LOCK );.  
f9a0: 20 20 72 65 73 20 3d 20 67 65 74 52 65 61 64 4c    res = getReadL
f9b0: 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ock(pFile);.    
f9c0: 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
f9d0: 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53   newLocktype = S
f9e0: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
f9f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73  }else{.      las
fa00: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
fa10: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d  stError();.    }
fa20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
fa30: 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  re a RESERVED lo
fa40: 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
fa50: 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44  cktype==RESERVED
fa60: 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
fa70: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
fa80: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  e->locktype==SHA
fa90: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
faa0: 72 65 73 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65  res = osLockFile
fab0: 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52  (pFile->h, RESER
fac0: 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  VED_BYTE, 0, 1, 
fad0: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20  0);.    if( res 
fae0: 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b  ){.      newLock
faf0: 74 79 70 65 20 3d 20 52 45 53 45 52 56 45 44 5f  type = RESERVED_
fb00: 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LOCK;.    }else{
fb10: 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
fb20: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
fb30: 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  r();.    }.  }..
fb40: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 50    /* Acquire a P
fb50: 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f  ENDING lock.  */
fb60: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
fb70: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
fb80: 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 6e 65  && res ){.    ne
fb90: 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44  wLocktype = PEND
fba0: 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f  ING_LOCK;.    go
fbb0: 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30  tPendingLock = 0
fbc0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75  ;.  }..  /* Acqu
fbd0: 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ire an EXCLUSIVE
fbe0: 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28   lock.  */.  if(
fbf0: 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
fc00: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73  SIVE_LOCK && res
fc10: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
fc20: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
fc30: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
fc40: 20 20 20 20 72 65 73 20 3d 20 75 6e 6c 6f 63 6b      res = unlock
fc50: 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  ReadLock(pFile);
fc60: 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75  .    OSTRACE(("u
fc70: 6e 72 65 61 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e  nreadlock = %d\n
fc80: 22 2c 20 72 65 73 29 29 3b 0a 20 20 20 20 72 65  ", res));.    re
fc90: 73 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 70  s = osLockFile(p
fca0: 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
fcb0: 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44  FIRST, 0, SHARED
fcc0: 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69  _SIZE, 0);.    i
fcd0: 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
fce0: 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58  newLocktype = EX
fcf0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20  CLUSIVE_LOCK;.  
fd00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
fd10: 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
fd20: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
fd30: 20 20 20 4f 53 54 52 41 43 45 28 28 22 65 72 72     OSTRACE(("err
fd40: 6f 72 2d 63 6f 64 65 20 3d 20 25 64 5c 6e 22 2c  or-code = %d\n",
fd50: 20 6c 61 73 74 45 72 72 6e 6f 29 29 3b 0a 20 20   lastErrno));.  
fd60: 20 20 20 20 67 65 74 52 65 61 64 4c 6f 63 6b 28      getReadLock(
fd70: 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pFile);.    }.  
fd80: 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  }..  /* If we ar
fd90: 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44  e holding a PEND
fda0: 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75  ING lock that ou
fdb0: 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73  ght to be releas
fdc0: 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65  ed, then.  ** re
fdd0: 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20  lease it now..  
fde0: 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64  */.  if( gotPend
fdf0: 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74  ingLock && lockt
fe00: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
fe10: 20 29 7b 0a 20 20 20 20 6f 73 55 6e 6c 6f 63 6b   ){.    osUnlock
fe20: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50  File(pFile->h, P
fe30: 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20  ENDING_BYTE, 0, 
fe40: 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  1, 0);.  }..  /*
fe50: 20 55 70 64 61 74 65 20 74 68 65 20 73 74 61 74   Update the stat
fe60: 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61  e of the lock ha
fe70: 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69  s held in the fi
fe80: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
fe90: 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74  en.  ** return t
fea0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72  he appropriate r
feb0: 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f  esult code..  */
fec0: 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20  .  if( res ){.  
fed0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
fee0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f  ;.  }else{.    O
fef0: 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 46 41  STRACE(("LOCK FA
ff00: 49 4c 45 44 20 25 64 20 74 72 79 69 6e 67 20 66  ILED %d trying f
ff10: 6f 72 20 25 64 20 62 75 74 20 67 6f 74 20 25 64  or %d but got %d
ff20: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
ff30: 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79            lockty
ff40: 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29  pe, newLocktype)
ff50: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  );.    pFile->la
ff60: 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
ff70: 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  rno;.    rc = SQ
ff80: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
ff90: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
ffa0: 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79   = (u8)newLockty
ffb0: 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  pe;.  return rc;
ffc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
ffd0: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
ffe0: 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
fff0: 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
10000 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
10010 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
10020 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
10030 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
10040 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65  lock is held, re
10050 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  turn.** non-zero
10060 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65 72 6f  , otherwise zero
10070 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10080 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64  winCheckReserved
10090 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
100a0 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
100b0 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Out){.  int rc;.
100c0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
100d0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
100e0 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
100f0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
10100 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
10110 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a  SERVEDLOCK; );..
10120 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
10130 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
10140 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56  locktype>=RESERV
10150 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
10160 63 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 41  c = 1;.    OSTRA
10170 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
10180 4b 20 25 64 20 25 64 20 28 6c 6f 63 61 6c 29 5c  K %d %d (local)\
10190 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
101a0 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
101b0 20 72 63 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65   rc = osLockFile
101c0 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52  (pFile->h, RESER
101d0 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  VED_BYTE, 0, 1, 
101e0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
101f0 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 6f 63 6b  {.      osUnlock
10200 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52  File(pFile->h, R
10210 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c  ESERVED_BYTE, 0,
10220 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 0);.    }.  
10230 20 20 72 63 20 3d 20 21 72 63 3b 0a 20 20 20 20    rc = !rc;.    
10240 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
10250 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 72 65  R-LOCK %d %d (re
10260 6d 6f 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  mote)\n", pFile-
10270 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d 0a 20 20  >h, rc));.  }.  
10280 2a 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20  *pResOut = rc;. 
10290 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
102a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  K;.}../*.** Lowe
102b0 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
102c0 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
102d0 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63  riptor id to loc
102e0 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65  ktype.  locktype
102f0 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
10300 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
10310 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
10320 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
10330 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
10340 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
10350 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
10360 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
10370 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
10380 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
10390 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
103a0 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  ** It is not pos
103b0 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72  sible for this r
103c0 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c 20 69  outine to fail i
103d0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
103e0 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c  ument.** is NO_L
103f0 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 73 65 63  OCK.  If the sec
10400 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
10410 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65 6e  SHARED_LOCK then
10420 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
10430 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 53 51   might return SQ
10440 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73  LITE_IOERR;.*/.s
10450 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c  tatic int winUnl
10460 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
10470 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
10480 70 65 29 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b  pe){.  int type;
10490 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
104a0 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
104b0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
104c0 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
104d0 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20  ( pFile!=0 );.  
104e0 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
104f0 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
10500 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
10510 4f 43 4b 20 25 64 20 74 6f 20 25 64 20 77 61 73  OCK %d to %d was
10520 20 25 64 28 25 64 29 5c 6e 22 2c 20 70 46 69 6c   %d(%d)\n", pFil
10530 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a  e->h, locktype,.
10540 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
10550 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65  >locktype, pFile
10560 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
10570 29 29 3b 0a 20 20 74 79 70 65 20 3d 20 70 46 69  ));.  type = pFi
10580 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  le->locktype;.  
10590 69 66 28 20 74 79 70 65 3e 3d 45 58 43 4c 55 53  if( type>=EXCLUS
105a0 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
105b0 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69  osUnlockFile(pFi
105c0 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
105d0 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53  RST, 0, SHARED_S
105e0 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  IZE, 0);.    if(
105f0 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
10600 44 5f 4c 4f 43 4b 20 26 26 20 21 67 65 74 52 65  D_LOCK && !getRe
10610 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 20 29 7b  adLock(pFile) ){
10620 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73  .      /* This s
10630 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70  hould never happ
10640 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c 64 20 61  en.  We should a
10650 6c 77 61 79 73 20 62 65 20 61 62 6c 65 20 74 6f  lways be able to
10660 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 63 71 75  .      ** reacqu
10670 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
10680 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  k */.      rc = 
10690 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
106a0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c  TE_IOERR_UNLOCK,
106b0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
106c0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
106d0 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70    "winUnlock", p
106e0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
106f0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74 79    }.  }.  if( ty
10700 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe>=RESERVED_LOC
10710 4b 20 29 7b 0a 20 20 20 20 6f 73 55 6e 6c 6f 63  K ){.    osUnloc
10720 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
10730 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
10740 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  , 1, 0);.  }.  i
10750 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  f( locktype==NO_
10760 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53 48  LOCK && type>=SH
10770 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
10780 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28   unlockReadLock(
10790 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pFile);.  }.  if
107a0 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f  ( type>=PENDING_
107b0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 6f 73 55 6e  LOCK ){.    osUn
107c0 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e  lockFile(pFile->
107d0 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  h, PENDING_BYTE,
107e0 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 1, 0);.  }. 
107f0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
10800 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b   = (u8)locktype;
10810 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10820 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20  ./*.** If *pArg 
10830 69 73 20 69 6e 69 74 69 74 69 61 6c 6c 79 20 6e  is inititially n
10840 65 67 61 74 69 76 65 20 74 68 65 6e 20 74 68 69  egative then thi
10850 73 20 69 73 20 61 20 71 75 65 72 79 2e 20 20 53  s is a query.  S
10860 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31  et *pArg to.** 1
10870 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20   or 0 depending 
10880 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
10890 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46  t bit mask of pF
108a0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69  ile->ctrlFlags i
108b0 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  s set..**.** If 
108c0 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c  *pArg is 0 or 1,
108d0 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73   then clear or s
108e0 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20  et the mask bit 
108f0 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  of pFile->ctrlFl
10900 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ags..*/.static v
10910 6f 69 64 20 77 69 6e 4d 6f 64 65 42 69 74 28 77  oid winModeBit(w
10920 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75  inFile *pFile, u
10930 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73  nsigned char mas
10940 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20  k, int *pArg){. 
10950 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a   if( *pArg<0 ){.
10960 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69      *pArg = (pFi
10970 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
10980 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73  mask)!=0;.  }els
10990 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30  e if( (*pArg)==0
109a0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63   ){.    pFile->c
109b0 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73  trlFlags &= ~mas
109c0 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  k;.  }else{.    
109d0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
109e0 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a   |= mask;.  }.}.
109f0 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61  ./*.** Control a
10a00 6e 64 20 71 75 65 72 79 20 6f 66 20 74 68 65 20  nd query of the 
10a10 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65  open file handle
10a20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10a30 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  winFileControl(s
10a40 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
10a50 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70   int op, void *p
10a60 41 72 67 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  Arg){.  winFile 
10a70 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
10a80 65 2a 29 69 64 3b 0a 20 20 73 77 69 74 63 68 28  e*)id;.  switch(
10a90 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
10aa0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
10ab0 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  KSTATE: {.      
10ac0 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46  *(int*)pArg = pF
10ad0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  ile->locktype;. 
10ae0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10af0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
10b00 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53   case SQLITE_LAS
10b10 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20  T_ERRNO: {.     
10b20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28   *(int*)pArg = (
10b30 69 6e 74 29 70 46 69 6c 65 2d 3e 6c 61 73 74 45  int)pFile->lastE
10b40 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75  rrno;.      retu
10b50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
10b60 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
10b70 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f  ITE_FCNTL_CHUNK_
10b80 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46  SIZE: {.      pF
10b90 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a  ile->szChunk = *
10ba0 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20  (int *)pArg;.   
10bb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10bc0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
10bd0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
10be0 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20  _SIZE_HINT: {.  
10bf0 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73      if( pFile->s
10c00 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20  zChunk>0 ){.    
10c10 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
10c20 34 20 6f 6c 64 53 7a 3b 0a 20 20 20 20 20 20 20  4 oldSz;.       
10c30 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 46 69 6c   int rc = winFil
10c40 65 53 69 7a 65 28 69 64 2c 20 26 6f 6c 64 53 7a  eSize(id, &oldSz
10c50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
10c60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10c70 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10c80 33 5f 69 6e 74 36 34 20 6e 65 77 53 7a 20 3d 20  3_int64 newSz = 
10c90 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a  *(sqlite3_int64*
10ca0 29 70 41 72 67 3b 0a 20 20 20 20 20 20 20 20 20  )pArg;.         
10cb0 20 69 66 28 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a   if( newSz>oldSz
10cc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
10cd0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
10ce0 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
10cf0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72        rc = winTr
10d00 75 6e 63 61 74 65 28 69 64 2c 20 6e 65 77 53 7a  uncate(id, newSz
10d10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  );.            S
10d20 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
10d30 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 20  nign(0);.       
10d40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
10d50 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
10d60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10d70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10d80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
10d90 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45   SQLITE_FCNTL_PE
10da0 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20  RSIST_WAL: {.   
10db0 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46     winModeBit(pF
10dc0 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 45 52  ile, WINFILE_PER
10dd0 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29  SIST_WAL, (int*)
10de0 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74  pArg);.      ret
10df0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10e00 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
10e10 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52  LITE_FCNTL_POWER
10e20 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20  SAFE_OVERWRITE: 
10e30 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42  {.      winModeB
10e40 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c  it(pFile, WINFIL
10e50 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41  E_PSOW, (int*)pA
10e60 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rg);.      retur
10e70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
10e80 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
10e90 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45  TE_FCNTL_VFSNAME
10ea0 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72  : {.      *(char
10eb0 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65  **)pArg = sqlite
10ec0 33 5f 6d 70 72 69 6e 74 66 28 22 77 69 6e 33 32  3_mprintf("win32
10ed0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
10ee0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
10ef0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
10f00 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 56  E_FCNTL_WIN32_AV
10f10 5f 52 45 54 52 59 3a 20 7b 0a 20 20 20 20 20 20  _RETRY: {.      
10f20 69 6e 74 20 2a 61 20 3d 20 28 69 6e 74 2a 29 70  int *a = (int*)p
10f30 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20 61  Arg;.      if( a
10f40 5b 30 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  [0]>0 ){.       
10f50 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79   win32IoerrRetry
10f60 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 7d   = a[0];.      }
10f70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b  else{.        a[
10f80 30 5d 20 3d 20 77 69 6e 33 32 49 6f 65 72 72 52  0] = win32IoerrR
10f90 65 74 72 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20  etry;.      }.  
10fa0 20 20 20 20 69 66 28 20 61 5b 31 5d 3e 30 20 29      if( a[1]>0 )
10fb0 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 33 32 49  {.        win32I
10fc0 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d  oerrRetryDelay =
10fd0 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c   a[1];.      }el
10fe0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 31 5d  se{.        a[1]
10ff0 20 3d 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74   = win32IoerrRet
11000 72 79 44 65 6c 61 79 3b 0a 20 20 20 20 20 20 7d  ryDelay;.      }
11010 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
11020 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
11030 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
11040 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a  TE_NOTFOUND;.}..
11050 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
11060 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20   sector size in 
11070 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64  bytes of the und
11080 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65  erlying block de
11090 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  vice for.** the 
110a0 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20  specified file. 
110b0 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61  This is almost a
110c0 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c  lways 512 bytes,
110d0 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c   but may be.** l
110e0 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64  arger for some d
110f0 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51  evices..**.** SQ
11100 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65  Lite code assume
11110 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
11120 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20  cannot fail. It 
11130 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61  also assumes tha
11140 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65  t.** if two file
11150 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e  s are created in
11160 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73   the same file-s
11170 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20  ystem directory 
11180 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62  (i.e..** a datab
11190 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72  ase and its jour
111a0 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74  nal file) that t
111b0 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77  he sector size w
111c0 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61  ill be the.** sa
111d0 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a  me for both..*/.
111e0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65  static int winSe
111f0 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
11200 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 28 76  _file *id){.  (v
11210 6f 69 64 29 69 64 3b 0a 20 20 72 65 74 75 72 6e  oid)id;.  return
11220 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
11230 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a  SECTOR_SIZE;.}..
11240 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76  /*.** Return a v
11250 65 63 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20  ector of device 
11260 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2e  characteristics.
11270 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
11280 69 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65  inDeviceCharacte
11290 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f  ristics(sqlite3_
112a0 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69 6e  file *id){.  win
112b0 46 69 6c 65 20 2a 70 20 3d 20 28 77 69 6e 46 69  File *p = (winFi
112c0 6c 65 2a 29 69 64 3b 0a 20 20 72 65 74 75 72 6e  le*)id;.  return
112d0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e   SQLITE_IOCAP_UN
112e0 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f  DELETABLE_WHEN_O
112f0 50 45 4e 20 7c 0a 20 20 20 20 20 20 20 20 20 28  PEN |.         (
11300 28 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  (p->ctrlFlags & 
11310 57 49 4e 46 49 4c 45 5f 50 53 4f 57 29 3f 53 51  WINFILE_PSOW)?SQ
11320 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
11330 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 30  SAFE_OVERWRITE:0
11340 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
11350 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f  LITE_OMIT_WAL../
11360 2a 20 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77 69  * .** Windows wi
11370 6c 6c 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75 20  ll only let you 
11380 63 72 65 61 74 65 20 66 69 6c 65 20 76 69 65 77  create file view
11390 20 6d 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20   mappings.** on 
113a0 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20  allocation size 
113b0 67 72 61 6e 75 6c 61 72 69 74 79 20 62 6f 75 6e  granularity boun
113c0 64 61 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69 6e  daries..** Durin
113d0 67 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69  g sqlite3_os_ini
113e0 74 28 29 20 77 65 20 64 6f 20 61 20 47 65 74 53  t() we do a GetS
113f0 79 73 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74  ystemInfo().** t
11400 6f 20 67 65 74 20 74 68 65 20 67 72 61 6e 75 6c  o get the granul
11410 61 72 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a 53  arity size..*/.S
11420 59 53 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53 79  YSTEM_INFO winSy
11430 73 49 6e 66 6f 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65  sInfo;../*.** He
11440 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74  lper functions t
11450 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c  o obtain and rel
11460 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62  inquish the glob
11470 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a  al mutex. The.**
11480 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73   global mutex is
11490 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74   used to protect
114a0 20 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f   the winLockInfo
114b0 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79   objects used by
114c0 20 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20   .** this file, 
114d0 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79  all of which may
114e0 20 62 65 20 73 68 61 72 65 64 20 62 79 20 6d 75   be shared by mu
114f0 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a  ltiple threads..
11500 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77  **.** Function w
11510 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
11520 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65   is used to asse
11530 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c  rt() that the gl
11540 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69  obal mutex .** i
11550 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75  s held when requ
11560 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  ired. This funct
11570 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
11580 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65   as part of asse
11590 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65  rt() .** stateme
115a0 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20  nts. e.g..**.** 
115b0 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74    winShmEnterMut
115c0 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65  ex().**     asse
115d0 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  rt( winShmMutexH
115e0 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69  eld() );.**   wi
115f0 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
11600 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11610 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
11620 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
11630 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71  3_mutex_enter(sq
11640 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
11650 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
11660 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a  TIC_MASTER));.}.
11670 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
11680 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69  hmLeaveMutex(voi
11690 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
116a0 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
116b0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
116c0 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
116d0 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64  MASTER));.}.#ifd
116e0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
116f0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
11700 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29  mMutexHeld(void)
11710 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   {.  return sqli
11720 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73  te3_mutex_held(s
11730 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
11740 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
11750 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
11760 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
11770 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65  bject used to re
11780 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65  present a single
11790 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64   file opened and
117a0 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76   mmapped to prov
117b0 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65  ide.** shared me
117c0 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74  mory.  When mult
117d0 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
117e0 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
117f0 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61  ame.** log-summa
11800 72 79 2c 20 65 61 63 68 20 74 68 72 65 61 64 20  ry, each thread 
11810 68 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46  has its own winF
11820 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20  ile object, but 
11830 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e  they all.** poin
11840 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e  t to a single in
11850 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f  stance of this o
11860 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72  bject.  In other
11870 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20   words, each.** 
11880 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f  log-summary is o
11890 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20  pened only once 
118a0 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  per process..**.
118b0 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  ** winShmMutexHe
118c0 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
118d0 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
118e0 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
118f0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
11900 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
11910 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
11920 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
11930 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
11940 2a 20 20 20 20 20 20 70 4e 65 78 74 20 0a 2a 2a  *      pNext .**
11950 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
11960 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  g fields are rea
11970 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65  d-only after the
11980 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
11990 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20  ed:.** .**      
119a0 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c  fid.**      zFil
119b0 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68  ename.**.** Eith
119c0 65 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75  er winShmNode.mu
119d0 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
119e0 20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e   or winShmNode.n
119f0 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69  Ref==0 and.** wi
11a00 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
11a10 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61  is true when rea
11a20 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
11a30 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a  any other field.
11a40 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ** in this struc
11a50 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75  ture..**.*/.stru
11a60 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a  ct winShmNode {.
11a70 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
11a80 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20  *mutex;      /* 
11a90 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20  Mutex to access 
11aa0 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  this object */. 
11ab0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
11ac0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
11ad0 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
11ae0 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69  */.  winFile hFi
11af0 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
11b00 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66  /* File handle f
11b10 72 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a  rom winOpen */..
11b20 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20    int szRegion; 
11b30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11b40 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d  Size of shared-m
11b50 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f  emory regions */
11b60 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20  .  int nRegion; 
11b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11b80 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61   Size of array a
11b90 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72  pRegion */.  str
11ba0 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a  uct ShmRegion {.
11bb0 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b      HANDLE hMap;
11bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11bd0 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d  File handle from
11be0 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69   CreateFileMappi
11bf0 6e 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a  ng */.    void *
11c00 70 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69  pMap;.  } *aRegi
11c10 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74  on;.  DWORD last
11c20 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  Errno;          
11c30 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20   /* The Windows 
11c40 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c  errno from the l
11c50 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f  ast I/O error */
11c60 0a 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  ..  int nRef;   
11c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11c80 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53  * Number of winS
11c90 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
11ca0 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20  ing to this */. 
11cb0 20 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b   winShm *pFirst;
11cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
11cd0 6c 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74  ll winShm object
11ce0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
11cf0 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f  is */.  winShmNo
11d00 64 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  de *pNext;      
11d10 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69     /* Next in li
11d20 73 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d  st of all winShm
11d30 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Node objects */.
11d40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
11d50 42 55 47 0a 20 20 75 38 20 6e 65 78 74 53 68 6d  BUG.  u8 nextShm
11d60 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
11d70 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62   /* Next availab
11d80 6c 65 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c  le winShm.id val
11d90 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  ue */.#endif.};.
11da0 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20  ./*.** A global 
11db0 61 72 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e  array of all win
11dc0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e  ShmNode objects.
11dd0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68  .**.** The winSh
11de0 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73  mMutexHeld() mus
11df0 74 20 62 65 20 74 72 75 65 20 77 68 69 6c 65 20  t be true while 
11e00 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
11e10 6e 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f  ng this list..*/
11e20 0a 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f  .static winShmNo
11e30 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69  de *winShmNodeLi
11e40 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53  st = 0;../*.** S
11e50 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e  tructure used in
11e60 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73  ternally by this
11e70 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74   VFS to record t
11e80 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a  he state of an.*
11e90 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65  * open shared me
11ea0 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  mory connection.
11eb0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
11ec0 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
11ed0 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
11ee0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
11ef0 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61  created and.** a
11f00 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  re read-only the
11f10 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20  reafter:.**.**  
11f20 20 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64    winShm.pShmNod
11f30 65 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69  e.**    winShm.i
11f40 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65  d.**.** All othe
11f50 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  r fields are rea
11f60 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 77 69  d/write.  The wi
11f70 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nShm.pShmNode->m
11f80 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
11f90 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73  d.** while acces
11fa0 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72  sing any read/wr
11fb0 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73  ite fields..*/.s
11fc0 74 72 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20  truct winShm {. 
11fd0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
11fe0 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 54  mNode;      /* T
11ff0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69  he underlying wi
12000 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  nShmNode object 
12010 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65  */.  winShm *pNe
12020 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  xt;             
12030 2f 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d 20 77  /* Next winShm w
12040 69 74 68 20 74 68 65 20 73 61 6d 65 20 77 69 6e  ith the same win
12050 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20  ShmNode */.  u8 
12060 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20  hasMutex;       
12070 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
12080 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 77  if holding the w
12090 69 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20  inShmNode mutex 
120a0 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d  */.  u16 sharedM
120b0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
120c0 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65  /* Mask of share
120d0 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  d locks held */.
120e0 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20    u16 exclMask; 
120f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12100 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76  Mask of exclusiv
12110 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  e locks held */.
12120 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
12130 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20 20 20  BUG.  u8 id;    
12140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12150 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63   /* Id of this c
12160 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 69  onnection with i
12170 74 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f  ts winShmNode */
12180 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
12190 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64  * Constants used
121a0 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a   for locking.*/.
121b0 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f  #define WIN_SHM_
121c0 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49  BASE   ((22+SQLI
121d0 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29  TE_SHM_NLOCK)*4)
121e0 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74          /* first
121f0 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64   lock byte */.#d
12200 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d  efine WIN_SHM_DM
12210 53 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41  S    (WIN_SHM_BA
12220 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  SE+SQLITE_SHM_NL
12230 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e  OCK)  /* deadman
12240 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a   switch */../*.*
12250 2a 20 41 70 70 6c 79 20 61 64 76 69 73 6f 72 79  * Apply advisory
12260 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e   locks for all n
12270 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
12280 20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65   at ofst..*/.#de
12290 66 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20  fine _SHM_UNLCK 
122a0 20 31 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f   1.#define _SHM_
122b0 52 44 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e 65  RDLCK  2.#define
122c0 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a 73   _SHM_WRLCK  3.s
122d0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
122e0 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77 69  SystemLock(.  wi
122f0 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65 2c  nShmNode *pFile,
12300 20 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63      /* Apply loc
12310 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20  ks to this open 
12320 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
12330 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  gment */.  int l
12340 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20  ockType,        
12350 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20   /* _SHM_UNLCK, 
12360 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f  _SHM_RDLCK, or _
12370 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69  SHM_WRLCK */.  i
12380 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20  nt ofst,        
12390 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
123a0 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20  o first byte to 
123b0 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b  be locked/unlock
123c0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ed */.  int nByt
123d0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
123e0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
123f0 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f   to lock or unlo
12400 63 6b 20 2a 2f 0a 29 7b 0a 20 20 4f 56 45 52 4c  ck */.){.  OVERL
12410 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 44 57  APPED ovlp;.  DW
12420 4f 52 44 20 64 77 46 6c 61 67 73 3b 0a 20 20 69  ORD dwFlags;.  i
12430 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20  nt rc = 0;      
12440 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
12450 6f 64 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e  ode form Lock/Un
12460 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20 2a 2f 0a  lockFileEx() */.
12470 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20  .  /* Access to 
12480 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f  the winShmNode o
12490 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69  bject is seriali
124a0 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  zed by the calle
124b0 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  r */.  assert( s
124c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
124d0 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20  d(pFile->mutex) 
124e0 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d  || pFile->nRef==
124f0 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  0 );..  /* Initi
12500 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e  alize the lockin
12510 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  g parameters */.
12520 20 20 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43 4b    dwFlags = LOCK
12530 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
12540 41 54 45 4c 59 3b 0a 20 20 69 66 28 20 6c 6f 63  ATELY;.  if( loc
12550 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 57 52  kType == _SHM_WR
12560 4c 43 4b 20 29 20 64 77 46 6c 61 67 73 20 7c 3d  LCK ) dwFlags |=
12570 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53   LOCKFILE_EXCLUS
12580 49 56 45 5f 4c 4f 43 4b 3b 0a 0a 20 20 6d 65 6d  IVE_LOCK;..  mem
12590 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69  set(&ovlp, 0, si
125a0 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29  zeof(OVERLAPPED)
125b0 29 3b 0a 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74  );.  ovlp.Offset
125c0 20 3d 20 6f 66 73 74 3b 0a 0a 20 20 2f 2a 20 52   = ofst;..  /* R
125d0 65 6c 65 61 73 65 2f 41 63 71 75 69 72 65 20 74  elease/Acquire t
125e0 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20  he system-level 
125f0 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  lock */.  if( lo
12600 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c  ckType==_SHM_UNL
12610 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f  CK ){.    rc = o
12620 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 70 46  sUnlockFileEx(pF
12630 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 30 2c  ile->hFile.h, 0,
12640 20 6e 42 79 74 65 2c 20 30 2c 20 26 6f 76 6c 70   nByte, 0, &ovlp
12650 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
12660 72 63 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65 45  rc = osLockFileE
12670 78 28 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68  x(pFile->hFile.h
12680 2c 20 64 77 46 6c 61 67 73 2c 20 30 2c 20 6e 42  , dwFlags, 0, nB
12690 79 74 65 2c 20 30 2c 20 26 6f 76 6c 70 29 3b 0a  yte, 0, &ovlp);.
126a0 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 21    }.  .  if( rc!
126b0 3d 20 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  = 0 ){.    rc = 
126c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
126d0 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  se{.    pFile->l
126e0 61 73 74 45 72 72 6e 6f 20 3d 20 20 6f 73 47 65  astErrno =  osGe
126f0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
12700 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
12710 53 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41  SY;.  }..  OSTRA
12720 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 25 64  CE(("SHM-LOCK %d
12730 20 25 73 20 25 73 20 30 78 25 30 38 6c 78 5c 6e   %s %s 0x%08lx\n
12740 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70  ", .           p
12750 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20  File->hFile.h,. 
12760 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51            rc==SQ
12770 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
12780 20 22 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 20   "failed",.     
12790 20 20 20 20 20 20 6c 6f 63 6b 54 79 70 65 3d 3d        lockType==
127a0 5f 53 48 4d 5f 55 4e 4c 43 4b 20 3f 20 22 55 6e  _SHM_UNLCK ? "Un
127b0 6c 6f 63 6b 46 69 6c 65 45 78 22 20 3a 20 22 4c  lockFileEx" : "L
127c0 6f 63 6b 46 69 6c 65 45 78 22 2c 0a 20 20 20 20  ockFileEx",.    
127d0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
127e0 73 74 45 72 72 6e 6f 29 29 3b 0a 0a 20 20 72 65  stErrno));..  re
127f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
12800 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
12810 73 20 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73  s to VFS methods
12820 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77   */.static int w
12830 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  inOpen(sqlite3_v
12840 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  fs*,const char*,
12850 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e  sqlite3_file*,in
12860 74 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20  t,int*);.static 
12870 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 73 71  int winDelete(sq
12880 6c 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73  lite3_vfs *,cons
12890 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f  t char*,int);../
128a0 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 77  *.** Purge the w
128b0 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69  inShmNodeList li
128c0 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65  st of all entrie
128d0 73 20 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64  s with winShmNod
128e0 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a  e.nRef==0..**.**
128f0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56   This is not a V
12900 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
12910 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61   method; it is a
12920 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f   utility functio
12930 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56  n called.** by V
12940 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
12950 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61   methods..*/.sta
12960 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 50  tic void winShmP
12970 75 72 67 65 28 73 71 6c 69 74 65 33 5f 76 66 73  urge(sqlite3_vfs
12980 20 2a 70 56 66 73 2c 20 69 6e 74 20 64 65 6c 65   *pVfs, int dele
12990 74 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68  teFlag){.  winSh
129a0 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69  mNode **pp;.  wi
129b0 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 42  nShmNode *p;.  B
129c0 4f 4f 4c 20 62 52 63 3b 0a 20 20 61 73 73 65 72  OOL bRc;.  asser
129d0 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  t( winShmMutexHe
129e0 6c 64 28 29 20 29 3b 0a 20 20 70 70 20 3d 20 26  ld() );.  pp = &
129f0 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a  winShmNodeList;.
12a00 20 20 77 68 69 6c 65 28 20 28 70 20 3d 20 2a 70    while( (p = *p
12a10 70 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  p)!=0 ){.    if(
12a20 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20   p->nRef==0 ){. 
12a30 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
12a40 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20 29    if( p->mutex )
12a50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
12a60 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20  ree(p->mutex);. 
12a70 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
12a80 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29  p->nRegion; i++)
12a90 7b 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d 20  {.        bRc = 
12aa0 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
12ab0 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e  e(p->aRegion[i].
12ac0 70 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f  pMap);.        O
12ad0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52  STRACE(("SHM-PUR
12ae0 47 45 20 70 69 64 2d 25 64 20 75 6e 6d 61 70 20  GE pid-%d unmap 
12af0 72 65 67 69 6f 6e 3d 25 64 20 25 73 5c 6e 22 2c  region=%d %s\n",
12b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12b10 20 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72    (int)osGetCurr
12b20 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
12b30 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i,.             
12b40 20 20 20 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a      bRc ? "ok" :
12b50 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
12b60 20 20 20 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f       bRc = osClo
12b70 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67  seHandle(p->aReg
12b80 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20  ion[i].hMap);.  
12b90 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
12ba0 53 48 4d 2d 50 55 52 47 45 20 70 69 64 2d 25 64  SHM-PURGE pid-%d
12bb0 20 63 6c 6f 73 65 20 72 65 67 69 6f 6e 3d 25 64   close region=%d
12bc0 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
12bd0 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73           (int)os
12be0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
12bf0 73 49 64 28 29 2c 20 69 2c 0a 20 20 20 20 20 20  sId(), i,.      
12c00 20 20 20 20 20 20 20 20 20 20 20 62 52 63 20 3f             bRc ?
12c10 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
12c20 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
12c30 20 20 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68    if( p->hFile.h
12c40 20 21 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44   != INVALID_HAND
12c50 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20  LE_VALUE ){.    
12c60 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
12c70 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
12c80 20 20 20 20 20 20 77 69 6e 43 6c 6f 73 65 28 28        winClose((
12c90 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
12ca0 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 20 20 20 20  p->hFile);.     
12cb0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
12cc0 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
12cd0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64     }.      if( d
12ce0 65 6c 65 74 65 46 6c 61 67 20 29 7b 0a 20 20 20  eleteFlag ){.   
12cf0 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
12d00 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
12d10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
12d20 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
12d30 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 44 65  );.        winDe
12d40 6c 65 74 65 28 70 56 66 73 2c 20 70 2d 3e 7a 46  lete(pVfs, p->zF
12d50 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ilename, 0);.   
12d60 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
12d70 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
12d80 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
12d90 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
12da0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
12db0 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  pp = p->pNext;. 
12dc0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
12dd0 65 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a 20  e(p->aRegion);. 
12de0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
12df0 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e(p);.    }else{
12e00 0a 20 20 20 20 20 20 70 70 20 3d 20 26 70 2d 3e  .      pp = &p->
12e10 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
12e20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
12e30 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
12e40 20 61 72 65 61 20 61 73 73 6f 63 69 61 74 65 64   area associated
12e50 20 77 69 74 68 20 64 61 74 61 62 61 73 65 20 66   with database f
12e60 69 6c 65 20 70 44 62 46 64 2e 0a 2a 2a 0a 2a 2a  ile pDbFd..**.**
12e70 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   When opening a 
12e80 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  new shared-memor
12e90 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74  y file, if no ot
12ea0 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  her instances of
12eb0 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72   that.** file ar
12ec0 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  e currently open
12ed0 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  , in this proces
12ee0 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72  s or in other pr
12ef0 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a  ocesses, then.**
12f00 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62   the file must b
12f10 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  e truncated to z
12f20 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61  ero length or ha
12f30 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63 6c  ve its header cl
12f40 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eared..*/.static
12f50 20 69 6e 74 20 77 69 6e 4f 70 65 6e 53 68 61 72   int winOpenShar
12f60 65 64 4d 65 6d 6f 72 79 28 77 69 6e 46 69 6c 65  edMemory(winFile
12f70 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75   *pDbFd){.  stru
12f80 63 74 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20  ct winShm *p;   
12f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12fa0 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
12fb0 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
12fc0 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  .  struct winShm
12fd0 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d  Node *pShmNode =
12fe0 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64   0;   /* The und
12ff0 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20  erlying mmapped 
13000 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  file */.  int rc
13010 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13030 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
13040 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f   struct winShmNo
13050 64 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  de *pNew;       
13060 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c      /* Newly all
13070 6f 63 61 74 65 64 20 77 69 6e 53 68 6d 4e 6f 64  ocated winShmNod
13080 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  e */.  int nName
13090 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
130a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
130b0 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20 62 79  e of zName in by
130c0 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  tes */..  assert
130d0 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30  ( pDbFd->pShm==0
130e0 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 70 72   );    /* Not pr
130f0 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20  eviously opened 
13100 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
13110 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
13120 6e 65 77 20 73 71 6c 69 74 65 33 5f 73 68 6d 20  new sqlite3_shm 
13130 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20 73 70  object.  Also sp
13140 65 63 75 6c 61 74 69 76 65 6c 79 0a 20 20 2a 2a  eculatively.  **
13150 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
13160 66 6f 72 20 61 20 6e 65 77 20 77 69 6e 53 68 6d  for a new winShm
13170 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e 61 6d  Node and filenam
13180 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71  e..  */.  p = sq
13190 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
131a0 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
131b0 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
131c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
131d0 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  EM;.  memset(p, 
131e0 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
131f0 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
13200 33 53 74 72 6c 65 6e 33 30 28 70 44 62 46 64 2d  3Strlen30(pDbFd-
13210 3e 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65 77 20  >zPath);.  pNew 
13220 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
13230 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f  ( sizeof(*pShmNo
13240 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 37  de) + nName + 17
13250 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
13260 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
13270 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 72 65  _free(p);.    re
13280 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
13290 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d  R_NOMEM;.  }.  m
132a0 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
132b0 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 6e  izeof(*pNew) + n
132c0 4e 61 6d 65 20 2b 20 31 37 29 3b 0a 20 20 70 4e  Name + 17);.  pN
132d0 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  ew->zFilename = 
132e0 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b  (char*)&pNew[1];
132f0 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
13300 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e  ntf(nName+15, pN
13310 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  ew->zFilename, "
13320 25 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e  %s-shm", pDbFd->
13330 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c 69 74 65  zPath);.  sqlite
13340 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62  3FileSuffix3(pDb
13350 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e 65 77 2d  Fd->zPath, pNew-
13360 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 20 0a 0a 20  >zFilename); .. 
13370 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20   /* Look to see 
13380 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 65  if there is an e
13390 78 69 73 74 69 6e 67 20 77 69 6e 53 68 6d 4e 6f  xisting winShmNo
133a0 64 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  de that can be u
133b0 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20  sed..  ** If no 
133c0 6d 61 74 63 68 69 6e 67 20 77 69 6e 53 68 6d 4e  matching winShmN
133d0 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ode currently ex
133e0 69 73 74 73 2c 20 63 72 65 61 74 65 20 61 20 6e  ists, create a n
133f0 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77  ew one..  */.  w
13400 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
13410 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d 4e 6f 64  );.  for(pShmNod
13420 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69  e = winShmNodeLi
13430 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b 20 70 53  st; pShmNode; pS
13440 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64 65 2d  hmNode=pShmNode-
13450 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20  >pNext){.    /* 
13460 54 42 44 20 6e 65 65 64 20 74 6f 20 63 6f 6d 65  TBD need to come
13470 20 75 70 20 77 69 74 68 20 62 65 74 74 65 72 20   up with better 
13480 6d 61 74 63 68 20 68 65 72 65 2e 20 20 50 65 72  match here.  Per
13490 68 61 70 73 0a 20 20 20 20 2a 2a 20 75 73 65 20  haps.    ** use 
134a0 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f 44 49 52  FILE_ID_BOTH_DIR
134b0 5f 49 4e 46 4f 20 53 74 72 75 63 74 75 72 65 2e  _INFO Structure.
134c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
134d0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
134e0 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
134f0 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e  me, pNew->zFilen
13500 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
13510 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e  .  }.  if( pShmN
13520 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ode ){.    sqlit
13530 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
13540 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 68 6d   }else{.    pShm
13550 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Node = pNew;.   
13560 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 28   pNew = 0;.    (
13570 28 77 69 6e 46 69 6c 65 2a 29 28 26 70 53 68 6d  (winFile*)(&pShm
13580 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29 2d 3e 68  Node->hFile))->h
13590 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c   = INVALID_HANDL
135a0 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20 70 53 68  E_VALUE;.    pSh
135b0 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 77  mNode->pNext = w
135c0 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20  inShmNodeList;. 
135d0 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73     winShmNodeLis
135e0 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20  t = pShmNode;.. 
135f0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74     pShmNode->mut
13600 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
13610 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
13620 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
13630 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d   if( pShmNode->m
13640 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
13650 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
13660 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
13670 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
13680 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  r;.    }..    rc
13690 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62 46 64   = winOpen(pDbFd
136a0 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20 20 20 20  ->pVfs,.        
136b0 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
136c0 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  e->zFilename,   
136d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
136e0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55  e of the file (U
136f0 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20 20 20 20  TF-8) */.       
13700 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
13710 65 33 5f 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f  e3_file*)&pShmNo
13720 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 46  de->hFile,  /* F
13730 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20  ile handle here 
13740 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
13750 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
13760 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  WAL | SQLITE_OPE
13770 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
13780 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
13790 2c 20 2f 2a 20 4d 6f 64 65 20 66 6c 61 67 73 20  , /* Mode flags 
137a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
137b0 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20      0);.    if( 
137c0 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
137d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
137e0 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
137f0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
13800 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20   see if another 
13810 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
13820 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20  ng the dead-man 
13830 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49  switch..    ** I
13840 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20  f not, truncate 
13850 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  the file to zero
13860 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f   length. .    */
13870 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68 6d 53  .    if( winShmS
13880 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
13890 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20  de, _SHM_WRLCK, 
138a0 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d  WIN_SHM_DMS, 1)=
138b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
138c0 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e      rc = winTrun
138d0 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69  cate((sqlite3_fi
138e0 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  le *)&pShmNode->
138f0 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  hFile, 0);.     
13900 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13910 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
13920 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
13930 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f  QLITE_IOERR_SHMO
13940 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  PEN, osGetLastEr
13950 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
13960 20 20 20 20 20 20 20 20 22 77 69 6e 4f 70 65 6e          "winOpen
13970 53 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  Shm", pDbFd->zPa
13980 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  th);.      }.   
13990 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
139a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
139b0 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f    winShmSystemLo
139c0 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
139d0 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d  M_UNLCK, WIN_SHM
139e0 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20  _DMS, 1);.      
139f0 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
13a00 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
13a10 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f  _SHM_RDLCK, WIN_
13a20 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20  SHM_DMS, 1);.   
13a30 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20   }.    if( rc ) 
13a40 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
13a50 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  r;.  }..  /* Mak
13a60 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63  e the new connec
13a70 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20  tion a child of 
13a80 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  the winShmNode *
13a90 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20  /.  p->pShmNode 
13aa0 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64  = pShmNode;.#ifd
13ab0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
13ac0 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f    p->id = pShmNo
13ad0 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b  de->nextShmId++;
13ae0 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f  .#endif.  pShmNo
13af0 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44  de->nRef++;.  pD
13b00 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20  bFd->pShm = p;. 
13b10 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
13b20 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72  x();..  /* The r
13b30 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
13b40 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61  n pShmNode has a
13b50 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
13b60 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20  emented under.  
13b70 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20  ** the cover of 
13b80 74 68 65 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  the winShmEnterM
13b90 75 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64  utex() mutex and
13ba0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f   the pointer fro
13bb0 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28  m the.  ** new (
13bc0 73 74 72 75 63 74 20 77 69 6e 53 68 6d 29 20 6f  struct winShm) o
13bd0 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53 68  bject to the pSh
13be0 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73  mNode has been s
13bf0 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a  et. All that is.
13c00 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20    ** left to do 
13c10 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e  is to link the n
13c20 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74  ew object into t
13c30 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
13c40 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20  tarting.  ** at 
13c50 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
13c60 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64  . This must be d
13c70 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e  one while holdin
13c80 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e  g the pShmNode->
13c90 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65  mutex .  ** mute
13ca0 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  x..  */.  sqlite
13cb0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
13cc0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
13cd0 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68    p->pNext = pSh
13ce0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20  mNode->pFirst;. 
13cf0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
13d00 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33  t = p;.  sqlite3
13d10 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
13d20 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
13d30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13d40 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  K;..  /* Jump he
13d50 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20  re on any error 
13d60 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a  */.shm_open_err:
13d70 0a 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c  .  winShmSystemL
13d80 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
13d90 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48  HM_UNLCK, WIN_SH
13da0 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 77 69 6e  M_DMS, 1);.  win
13db0 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e  ShmPurge(pDbFd->
13dc0 70 56 66 73 2c 20 30 29 3b 20 20 20 20 20 20 2f  pVfs, 0);      /
13dd0 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65  * This call free
13de0 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65  s pShmNode if re
13df0 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69  quired */.  sqli
13e00 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 73  te3_free(p);.  s
13e10 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
13e20 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65  );.  winShmLeave
13e30 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
13e40 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
13e50 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f  lose a connectio
13e60 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f  n to shared-memo
13e70 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20  ry.  Delete the 
13e80 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73  underlying .** s
13e90 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74 65  torage if delete
13ea0 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f  Flag is true..*/
13eb0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
13ec0 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74  hmUnmap(.  sqlit
13ed0 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
13ee0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
13ef0 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  e holding shared
13f00 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
13f10 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20   deleteFlag     
13f20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
13f30 65 20 61 66 74 65 72 20 63 6c 6f 73 69 6e 67 20  e after closing 
13f40 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
13f50 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 3b 20  winFile *pDbFd; 
13f60 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
13f70 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  e holding shared
13f80 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e  -memory */.  win
13f90 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Shm *p;         
13fa0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
13fb0 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65  tion to be close
13fc0 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  d */.  winShmNod
13fd0 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20  e *pShmNode; /* 
13fe0 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73  The underlying s
13ff0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
14000 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 2a  e */.  winShm **
14010 70 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pp;          /* 
14020 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
14030 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
14040 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44 62 46 64  ions */..  pDbFd
14050 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b   = (winFile*)fd;
14060 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  .  p = pDbFd->pS
14070 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  hm;.  if( p==0 )
14080 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14090 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  K;.  pShmNode = 
140a0 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20  p->pShmNode;..  
140b0 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63  /* Remove connec
140c0 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20  tion p from the 
140d0 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f  set of connectio
140e0 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  ns associated.  
140f0 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65  ** with pShmNode
14100 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
14110 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
14120 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f  de->mutex);.  fo
14130 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e  r(pp=&pShmNode->
14140 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70  pFirst; (*pp)!=p
14150 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70  ; pp = &(*pp)->p
14160 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20  Next){}.  *pp = 
14170 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20  p->pNext;..  /* 
14180 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  Free the connect
14190 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74  ion p */.  sqlit
141a0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44  e3_free(p);.  pD
141b0 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20  bFd->pShm = 0;. 
141c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
141d0 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
141e0 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  utex);..  /* If 
141f0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68  pShmNode->nRef h
14200 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74 68  as reached 0, th
14210 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64  en close the und
14220 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61  erlying.  ** sha
14230 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
14240 20 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53 68 6d   too */.  winShm
14250 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
14260 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
14270 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53  ->nRef>0 );.  pS
14280 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a  hmNode->nRef--;.
14290 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
142a0 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 77  nRef==0 ){.    w
142b0 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  inShmPurge(pDbFd
142c0 2d 3e 70 56 66 73 2c 20 64 65 6c 65 74 65 46 6c  ->pVfs, deleteFl
142d0 61 67 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 53 68  ag);.  }.  winSh
142e0 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  mLeaveMutex();..
142f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14300 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
14310 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  nge the lock sta
14320 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d  te for a shared-
14330 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a  memory segment..
14340 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
14350 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69  nShmLock(.  sqli
14360 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
14370 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
14380 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20  se file holding 
14390 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
143a0 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  y */.  int ofst,
143b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143c0 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20    /* First lock 
143d0 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
143e0 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lease */.  int n
143f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14400 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
14410 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75  of locks to acqu
14420 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
14430 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
14440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14450 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
14460 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  h the lock */.){
14470 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  .  winFile *pDbF
14480 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
14490 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  ;        /* Conn
144a0 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73  ection holding s
144b0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
144c0 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44    winShm *p = pD
144d0 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20  bFd->pShm;      
144e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
144f0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69  hared memory bei
14500 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 77  ng locked */.  w
14510 69 6e 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20  inShm *pX;      
14520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14530 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
14540 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62  ing over all sib
14550 6c 69 6e 67 73 20 2a 2f 0a 20 20 77 69 6e 53 68  lings */.  winSh
14560 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20  mNode *pShmNode 
14570 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  = p->pShmNode;. 
14580 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
14590 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
145a0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
145b0 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d   code */.  u16 m
145c0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
145d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145e0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
145f0 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c  s to take or rel
14600 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ease */..  asser
14610 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66  t( ofst>=0 && of
14620 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d  st+n<=SQLITE_SHM
14630 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  _NLOCK );.  asse
14640 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73  rt( n>=1 );.  as
14650 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51  sert( flags==(SQ
14660 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
14670 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
14680 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  D).       || fla
14690 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
146a0 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
146b0 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20  M_EXCLUSIVE).   
146c0 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
146d0 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
146e0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   | SQLITE_SHM_SH
146f0 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
14700 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
14710 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
14720 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
14730 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
14740 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==1 || (flags & 
14750 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
14760 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a 20 20 6d  SIVE)!=0 );..  m
14770 61 73 6b 20 3d 20 28 75 31 36 29 28 28 31 55 3c  ask = (u16)((1U<
14780 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 55  <(ofst+n)) - (1U
14790 3c 3c 6f 66 73 74 29 29 3b 0a 20 20 61 73 73 65  <<ofst));.  asse
147a0 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d  rt( n>1 || mask=
147b0 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20  =(1<<ofst) );.  
147c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
147d0 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
147e0 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67  tex);.  if( flag
147f0 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s & SQLITE_SHM_U
14800 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36  NLOCK ){.    u16
14810 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a   allMask = 0; /*
14820 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68   Mask of locks h
14830 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20  eld by siblings 
14840 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69  */..    /* See i
14850 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68  f any siblings h
14860 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f  old this same lo
14870 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58  ck */.    for(pX
14880 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
14890 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
148a0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
148b0 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65  pX==p ) continue
148c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
148d0 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
148e0 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e  (p->exclMask|p->
148f0 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20  sharedMask))==0 
14900 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b  );.      allMask
14910 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
14920 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
14930 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73  * Unlock the sys
14940 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20  tem-level locks 
14950 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b  */.    if( (mask
14960 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29   & allMask)==0 )
14970 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
14980 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
14990 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c  hmNode, _SHM_UNL
149a0 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d  CK, ofst+WIN_SHM
149b0 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d  _BASE, n);.    }
149c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
149d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
149e0 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74  }..    /* Undo t
149f0 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a  he local locks *
14a00 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
14a10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14a20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20   p->exclMask &= 
14a30 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e  ~mask;.      p->
14a40 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
14a50 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65  ask;.    } .  }e
14a60 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
14a70 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
14a80 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  D ){.    u16 all
14a90 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20  Shared = 0;  /* 
14aa0 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68  Union of locks h
14ab0 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f  eld by connectio
14ac0 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70  ns other than "p
14ad0 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  " */..    /* Fin
14ae0 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72  d out which shar
14af0 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72  ed locks are alr
14b00 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62  eady held by sib
14b10 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
14b20 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20  ..    ** If any 
14b30 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20  sibling already 
14b40 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69  holds an exclusi
14b50 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61  ve lock, go ahea
14b60 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20  d and return.   
14b70 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e   ** SQLITE_BUSY.
14b80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
14b90 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
14ba0 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
14bb0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
14bc0 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
14bd0 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
14be0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
14bf0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
14c00 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
14c10 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c       allShared |
14c20 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
14c30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
14c40 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  Get shared locks
14c50 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
14c60 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61  evel, if necessa
14c70 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ry */.    if( rc
14c80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14c90 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61       if( (allSha
14ca0 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  red & mask)==0 )
14cb0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
14cc0 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
14cd0 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52  pShmNode, _SHM_R
14ce0 44 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53  DLCK, ofst+WIN_S
14cf0 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
14d00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14d10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
14d20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14d30 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
14d40 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63  local shared loc
14d50 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
14d60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14d70 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
14d80 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
14d90 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
14da0 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73  * Make sure no s
14db0 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
14dc0 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68  ns hold locks th
14dd0 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68  at will block th
14de0 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20  is.    ** lock. 
14df0 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75   If any do, retu
14e00 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72  rn SQLITE_BUSY r
14e10 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a  ight away..    *
14e20 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
14e30 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
14e40 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
14e50 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
14e60 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
14e70 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61  )!=0 || (pX->sha
14e80 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  redMask & mask)!
14e90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
14ea0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
14eb0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
14ec0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
14ed0 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65      /* Get the e
14ee0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61  xclusive locks a
14ef0 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
14f00 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63  el.  Then if suc
14f10 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61  cessful.    ** a
14f20 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63  lso mark the loc
14f30 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73  al connection as
14f40 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20   being locked.. 
14f50 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
14f60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14f70 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d       rc = winShm
14f80 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
14f90 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c  ode, _SHM_WRLCK,
14fa0 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
14fb0 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66  SE, n);.      if
14fc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
14fd0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
14fe0 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73  t( (p->sharedMas
14ff0 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a  k & mask)==0 );.
15000 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d          p->exclM
15010 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
15020 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
15030 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
15040 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
15050 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45  utex);.  OSTRACE
15060 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69  (("SHM-LOCK shmi
15070 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74  d-%d, pid-%d got
15080 20 25 30 33 78 2c 25 30 33 78 20 25 73 5c 6e 22   %03x,%03x %s\n"
15090 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
150a0 69 64 2c 20 28 69 6e 74 29 6f 73 47 65 74 43 75  id, (int)osGetCu
150b0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
150c0 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c  , p->sharedMask,
150d0 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c 0a 20 20   p->exclMask,.  
150e0 20 20 20 20 20 20 20 20 20 72 63 20 3f 20 22 66           rc ? "f
150f0 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b  ailed" : "ok"));
15100 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15110 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
15120 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65   a memory barrie
15130 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63  r or memory fenc
15140 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  e on shared memo
15150 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ry.  .**.** All 
15160 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73  loads and stores
15170 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68   begun before th
15180 65 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63  e barrier must c
15190 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a  omplete before.*
151a0 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74  * any load or st
151b0 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20  ore begun after 
151c0 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a  the barrier..*/.
151d0 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
151e0 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c  hmBarrier(.  sql
151f0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20  ite3_file *fd   
15200 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
15210 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  se holding the s
15220 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
15230 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
15240 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 2f 2a 20  METER(fd);.  /* 
15250 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b  MemoryBarrier();
15260 20 2f 2f 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   // does not wor
15270 6b 20 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  k -- do not know
15280 20 77 68 79 20 6e 6f 74 20 2a 2f 0a 20 20 77 69   why not */.  wi
15290 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
152a0 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  ;.  winShmLeaveM
152b0 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  utex();.}../*.**
152c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
152d0 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
152e0 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
152f0 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f  region iRegion o
15300 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64  f the .** shared
15310 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74  -memory associat
15320 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
15330 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68  base file fd. Sh
15340 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
15350 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62  ons .** are numb
15360 65 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72  ered starting fr
15370 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68  om zero. Each sh
15380 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
15390 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a  on is szRegion .
153a0 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
153b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
153c0 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
153d0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
153e0 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73  urned and *pp is
153f0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
15400 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
15410 66 20 74 68 65 20 69 73 57 72 69 74 65 20 70 61  f the isWrite pa
15420 72 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64  rameter is 0 and
15430 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
15440 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  hared-memory.** 
15450 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62  region has not b
15460 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62  een allocated (b
15470 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e  y any client, in
15480 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e  cluding one runn
15490 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61  ing in a.** sepa
154a0 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74  rate process), t
154b0 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74  hen *pp is set t
154c0 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  o NULL and SQLIT
154d0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
154e0 66 20 0a 2a 2a 20 69 73 57 72 69 74 65 20 69 73  f .** isWrite is
154f0 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
15500 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
15510 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
15520 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a   has not yet .**
15530 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
15540 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   it is allocated
15550 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
15560 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
15570 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
15580 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  gion has already
15590 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
155a0 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  or is allocated 
155b0 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  by.** this call 
155c0 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
155d0 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d  ve, then it is m
155e0 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
155f0 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64  processes .** ad
15600 64 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20  dress space (if 
15610 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
15620 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74  y), *pp is set t
15630 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d  o point to the m
15640 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79  apped .** memory
15650 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
15660 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
15670 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70  ic int winShmMap
15680 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
15690 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20   *fd,           
156a0 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70      /* Handle op
156b0 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66  en on database f
156c0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ile */.  int iRe
156d0 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
156e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
156f0 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a  on to retrieve *
15700 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  /.  int szRegion
15710 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15720 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
15730 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
15740 69 73 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  isWrite,        
15750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15760 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69  rue to extend fi
15770 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  le if necessary 
15780 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69  */.  void volati
15790 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20  le **pp         
157a0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70       /* OUT: Map
157b0 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  ped memory */.){
157c0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  .  winFile *pDbF
157d0 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
157e0 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20  ;.  winShm *p = 
157f0 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77  pDbFd->pShm;.  w
15800 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
15810 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
15820 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
15830 28 20 21 70 20 29 7b 0a 20 20 20 20 72 63 20 3d  ( !p ){.    rc =
15840 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65   winOpenSharedMe
15850 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20  mory(pDbFd);.   
15860 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15870 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
15880 20 20 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70      p = pDbFd->p
15890 53 68 6d 3b 0a 20 20 7d 0a 20 20 70 53 68 6d 4e  Shm;.  }.  pShmN
158a0 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
158b0 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  e;..  sqlite3_mu
158c0 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
158d0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  de->mutex);.  as
158e0 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d  sert( szRegion==
158f0 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
15900 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e  on || pShmNode->
15910 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20  nRegion==0 );.. 
15920 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
15930 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20  Region<=iRegion 
15940 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 68  ){.    struct Sh
15950 6d 52 65 67 69 6f 6e 20 2a 61 70 4e 65 77 3b 20  mRegion *apNew; 
15960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
15970 20 61 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79   aRegion[] array
15980 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
15990 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  e = (iRegion+1)*
159a0 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69  szRegion;  /* Mi
159b0 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66  nimum required f
159c0 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
159d0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
159e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
159f0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69     /* Current si
15a00 7a 65 20 6f 66 20 77 61 6c 2d 69 6e 64 65 78 20  ze of wal-index 
15a10 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 70 53 68  file */..    pSh
15a20 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
15a30 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20  = szRegion;..   
15a40 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
15a50 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20  d region is not 
15a60 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73  mapped into this
15a70 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
15a80 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a  ss space..    **
15a90 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
15aa0 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c   it has been all
15ab0 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20  ocated (i.e. if 
15ac0 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69  the wal-index fi
15ad0 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72  le is.    ** lar
15ae0 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e  ge enough to con
15af0 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  tain the request
15b00 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20  ed region)..    
15b10 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46  */.    rc = winF
15b20 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33  ileSize((sqlite3
15b30 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64  _file *)&pShmNod
15b40 65 2d 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a  e->hFile, &sz);.
15b50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15b60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
15b70 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
15b80 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
15b90 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45  SIZE, osGetLastE
15ba0 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
15bb0 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61         "winShmMa
15bc0 70 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  p1", pDbFd->zPat
15bd0 68 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  h);.      goto s
15be0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
15bf0 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e 42  }..    if( sz<nB
15c00 79 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  yte ){.      /* 
15c10 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  The requested me
15c20 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73  mory region does
15c30 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 69   not exist. If i
15c40 73 57 72 69 74 65 20 69 73 20 73 65 74 20 74 6f  sWrite is set to
15c50 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20  .      ** zero, 
15c60 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20  exit early. *pp 
15c70 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e  will be set to N
15c80 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
15c90 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20  K returned..    
15ca0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c    **.      ** Al
15cb0 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20  ternatively, if 
15cc0 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a  isWrite is non-z
15cd0 65 72 6f 2c 20 75 73 65 20 66 74 72 75 6e 63 61  ero, use ftrunca
15ce0 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65  te() to allocate
15cf0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65  .      ** the re
15d00 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
15d10 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  egion..      */.
15d20 20 20 20 20 20 20 69 66 28 20 21 69 73 57 72 69        if( !isWri
15d30 74 65 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67  te ) goto shmpag
15d40 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72 63 20  e_out;.      rc 
15d50 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73  = winTruncate((s
15d60 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
15d70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
15d80 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66  nByte);.      if
15d90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15da0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
15db0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
15dc0 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
15dd0 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
15de0 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
15df0 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 32       "winShmMap2
15e00 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
15e10 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
15e20 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
15e30 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
15e40 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73  * Map the reques
15e50 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
15e60 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  n into this proc
15e70 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70  esses address sp
15e80 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65  ace. */.    apNe
15e90 77 20 3d 20 28 73 74 72 75 63 74 20 53 68 6d 52  w = (struct ShmR
15ea0 65 67 69 6f 6e 20 2a 29 73 71 6c 69 74 65 33 5f  egion *)sqlite3_
15eb0 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  realloc(.       
15ec0 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
15ed0 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  on, (iRegion+1)*
15ee0 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b 30 5d 29  sizeof(apNew[0])
15ef0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
15f00 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  !apNew ){.      
15f10 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
15f20 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  R_NOMEM;.      g
15f30 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
15f40 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e  .    }.    pShmN
15f50 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 20 3d 20 61  ode->aRegion = a
15f60 70 4e 65 77 3b 0a 0a 20 20 20 20 77 68 69 6c 65  pNew;..    while
15f70 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
15f80 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a  ion<=iRegion ){.
15f90 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61        HANDLE hMa
15fa0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
15fb0 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70 70 69 6e    /* file-mappin
15fc0 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  g handle */.    
15fd0 20 20 76 6f 69 64 20 2a 70 4d 61 70 20 3d 20 30    void *pMap = 0
15fe0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
15ff0 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 72   Mapped memory r
16000 65 67 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 0a 20  egion */.     . 
16010 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72       hMap = osCr
16020 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 28  eateFileMapping(
16030 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e  pShmNode->hFile.
16040 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 4e 55  h, .          NU
16050 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49  LL, PAGE_READWRI
16060 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55  TE, 0, nByte, NU
16070 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  LL.      );.    
16080 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
16090 4d 41 50 20 70 69 64 2d 25 64 20 63 72 65 61 74  MAP pid-%d creat
160a0 65 20 72 65 67 69 6f 6e 3d 25 64 20 6e 62 79 74  e region=%d nbyt
160b0 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  e=%d %s\n",.    
160c0 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
160d0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
160e0 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64  essId(), pShmNod
160f0 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 6e 42 79 74  e->nRegion, nByt
16100 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
16110 20 20 68 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20    hMap ? "ok" : 
16120 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20  "failed"));.    
16130 20 20 69 66 28 20 68 4d 61 70 20 29 7b 0a 20 20    if( hMap ){.  
16140 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65        int iOffse
16150 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  t = pShmNode->nR
16160 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a  egion*szRegion;.
16170 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66          int iOff
16180 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73  setShift = iOffs
16190 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e  et % winSysInfo.
161a0 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e  dwAllocationGran
161b0 75 6c 61 72 69 74 79 3b 0a 20 20 20 20 20 20 20  ularity;.       
161c0 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65   pMap = osMapVie
161d0 77 4f 66 46 69 6c 65 28 68 4d 61 70 2c 20 46 49  wOfFile(hMap, FI
161e0 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46  LE_MAP_WRITE | F
161f0 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20  ILE_MAP_READ,.  
16200 20 20 20 20 20 20 20 20 20 20 30 2c 20 69 4f 66            0, iOf
16210 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68  fset - iOffsetSh
16220 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20  ift, szRegion + 
16230 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20 20  iOffsetShift.   
16240 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
16250 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41  OSTRACE(("SHM-MA
16260 50 20 70 69 64 2d 25 64 20 6d 61 70 20 72 65 67  P pid-%d map reg
16270 69 6f 6e 3d 25 64 20 6f 66 66 73 65 74 3d 25 64  ion=%d offset=%d
16280 20 73 69 7a 65 3d 25 64 20 25 73 5c 6e 22 2c 0a   size=%d %s\n",.
16290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162a0 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65   (int)osGetCurre
162b0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
162c0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
162d0 2c 20 69 4f 66 66 73 65 74 2c 0a 20 20 20 20 20  , iOffset,.     
162e0 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 52 65              szRe
162f0 67 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22 6f 6b  gion, pMap ? "ok
16300 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
16310 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
16320 28 20 21 70 4d 61 70 20 29 7b 0a 20 20 20 20 20  ( !pMap ){.     
16330 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73     pShmNode->las
16340 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
16350 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
16360 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
16370 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
16380 5f 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f 64  _SHMMAP, pShmNod
16390 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
163b0 77 69 6e 53 68 6d 4d 61 70 33 22 2c 20 70 44 62  winShmMap3", pDb
163c0 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
163d0 20 20 20 20 69 66 28 20 68 4d 61 70 20 29 20 6f      if( hMap ) o
163e0 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 4d 61  sCloseHandle(hMa
163f0 70 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  p);.        goto
16400 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
16410 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 53 68      }..      pSh
16420 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70  mNode->aRegion[p
16430 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
16440 5d 2e 70 4d 61 70 20 3d 20 70 4d 61 70 3b 0a 20  ].pMap = pMap;. 
16450 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
16460 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d  Region[pShmNode-
16470 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d 61 70 20 3d  >nRegion].hMap =
16480 20 68 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68   hMap;.      pSh
16490 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b  mNode->nRegion++
164a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d  ;.    }.  }..shm
164b0 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
164c0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
164d0 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  n>iRegion ){.   
164e0 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 69   int iOffset = i
164f0 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b  Region*szRegion;
16500 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74  .    int iOffset
16510 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20  Shift = iOffset 
16520 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41  % winSysInfo.dwA
16530 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61  llocationGranula
16540 72 69 74 79 3b 0a 20 20 20 20 63 68 61 72 20 2a  rity;.    char *
16550 70 20 3d 20 28 63 68 61 72 20 2a 29 70 53 68 6d  p = (char *)pShm
16560 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 69 52  Node->aRegion[iR
16570 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a 20 20 20  egion].pMap;.   
16580 20 2a 70 70 20 3d 20 28 76 6f 69 64 20 2a 29 26   *pp = (void *)&
16590 70 5b 69 4f 66 66 73 65 74 53 68 69 66 74 5d 3b  p[iOffsetShift];
165a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
165b0 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  p = 0;.  }.  sql
165c0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
165d0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
165e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
165f0 7d 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  }..#else.# defin
16600 65 20 77 69 6e 53 68 6d 4d 61 70 20 20 20 20 20  e winShmMap     
16610 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68  0.# define winSh
16620 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66  mLock    0.# def
16630 69 6e 65 20 77 69 6e 53 68 6d 42 61 72 72 69 65  ine winShmBarrie
16640 72 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e  r 0.# define win
16650 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e  ShmUnmap   0.#en
16660 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
16670 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
16680 2f 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e  /../*.** Here en
16690 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ds the implement
166a0 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c  ation of all sql
166b0 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64  ite3_file method
166c0 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s..**.**********
166d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
166e0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65   sqlite3_file Me
166f0 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
16700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16710 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
16720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16760 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ****/../*.** Thi
16770 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73  s vector defines
16780 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73   all the methods
16790 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74   that can operat
167a0 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74  e on an.** sqlit
167b0 65 33 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e 33  e3_file for win3
167c0 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  2..*/.static con
167d0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
167e0 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74 68 6f  thods winIoMetho
167f0 64 20 3d 20 7b 0a 20 20 32 2c 20 20 20 20 20 20  d = {.  2,      
16800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16810 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
16820 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73  ion */.  winClos
16830 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
16840 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
16850 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61 64 2c  se */.  winRead,
16860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16870 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64          /* xRead
16880 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65 2c 20   */.  winWrite, 
16890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168a0 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20        /* xWrite 
168b0 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61 74 65  */.  winTruncate
168c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
168d0 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74       /* xTruncat
168e0 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63 2c 20  e */.  winSync, 
168f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16900 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
16910 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69 7a 65  */.  winFileSize
16920 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16930 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a       /* xFileSiz
16940 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20  e */.  winLock, 
16950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16960 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
16970 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20  */.  winUnlock, 
16980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16990 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
169a0 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b 52 65 73  */.  winCheckRes
169b0 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20  ervedLock,      
169c0 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
169d0 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20  servedLock */.  
169e0 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20  winFileControl, 
169f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a00 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  /* xFileControl 
16a10 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72 53 69  */.  winSectorSi
16a20 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
16a30 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53       /* xSectorS
16a40 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65 76 69  ize */.  winDevi
16a50 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
16a60 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 44 65 76  s,       /* xDev
16a70 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
16a80 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61  cs */.  winShmMa
16a90 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
16aa0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
16ab0 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f  ap */.  winShmLo
16ac0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
16ad0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c          /* xShmL
16ae0 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42  ock */.  winShmB
16af0 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20  arrier,         
16b00 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
16b10 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e  Barrier */.  win
16b20 53 68 6d 55 6e 6d 61 70 20 20 20 20 20 20 20 20  ShmUnmap        
16b30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16b40 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 7d 3b 0a  xShmUnmap */.};.
16b50 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
16b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
16ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69  *********** sqli
16bc0 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20  te3_vfs methods 
16bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
16bf0 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e  ** This division
16c00 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d   contains the im
16c10 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
16c20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a  methods on the.*
16c30 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62  * sqlite3_vfs ob
16c40 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ject..*/../*.** 
16c50 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20  Convert a UTF-8 
16c60 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 77 68  filename into wh
16c70 61 74 65 76 65 72 20 66 6f 72 6d 20 74 68 65 20  atever form the 
16c80 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70  underlying.** op
16c90 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 77  erating system w
16ca0 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73 20 69  ants filenames i
16cb0 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  n.  Space to hol
16cc0 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  d the result.** 
16cd0 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
16ce0 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74   malloc and must
16cf0 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
16d00 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
16d10 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
16d20 76 6f 69 64 20 2a 63 6f 6e 76 65 72 74 55 74 66  void *convertUtf
16d30 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20  8Filename(const 
16d40 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
16d50 7b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  {.  void *zConve
16d60 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  rted = 0;.  if( 
16d70 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43  isNT() ){.    zC
16d80 6f 6e 76 65 72 74 65 64 20 3d 20 75 74 66 38 54  onverted = utf8T
16d90 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
16da0 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  me);.  }.#ifdef 
16db0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
16dc0 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
16dd0 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73    zConverted = s
16de0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
16df0 38 5f 74 6f 5f 6d 62 63 73 28 7a 46 69 6c 65 6e  8_to_mbcs(zFilen
16e00 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ame);.  }.#endif
16e10 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c  .  /* caller wil
16e20 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20  l handle out of 
16e30 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75  memory */.  retu
16e40 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d  rn zConverted;.}
16e50 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
16e60 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
16e70 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a  name in zBuf.  z
16e80 42 75 66 20 6d 75 73 74 20 62 65 20 62 69 67 20  Buf must be big 
16e90 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c  enough to.** hol
16ea0 64 20 61 74 20 70 56 66 73 2d 3e 6d 78 50 61 74  d at pVfs->mxPat
16eb0 68 6e 61 6d 65 20 63 68 61 72 61 63 74 65 72 73  hname characters
16ec0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16ed0 67 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20  getTempname(int 
16ee0 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
16ef0 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  ){.  static char
16f00 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20   zChars[] =.    
16f10 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
16f20 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20  pqrstuvwxyz".   
16f30 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
16f40 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20  OPQRSTUVWXYZ".  
16f50 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a    "0123456789";.
16f60 20 20 73 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20    size_t i, j;. 
16f70 20 63 68 61 72 20 7a 54 65 6d 70 50 61 74 68 5b   char zTempPath[
16f80 4d 41 58 5f 50 41 54 48 2b 32 5d 3b 0a 0a 20 20  MAX_PATH+2];..  
16f90 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
16fa0 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
16fb0 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
16fc0 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
16fd0 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
16fe0 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
16ff0 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
17000 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
17010 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
17020 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
17030 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74   .  */.  Simulat
17040 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
17050 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b   SQLITE_IOERR );
17060 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ..  if( sqlite3_
17070 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29  temp_directory )
17080 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
17090 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d  printf(MAX_PATH-
170a0 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22  30, zTempPath, "
170b0 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d  %s", sqlite3_tem
170c0 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  p_directory);.  
170d0 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 54 28 29  }else if( isNT()
170e0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d   ){.    char *zM
170f0 75 6c 74 69 3b 0a 20 20 20 20 57 43 48 41 52 20  ulti;.    WCHAR 
17100 7a 57 69 64 65 50 61 74 68 5b 4d 41 58 5f 50 41  zWidePath[MAX_PA
17110 54 48 5d 3b 0a 20 20 20 20 6f 73 47 65 74 54 65  TH];.    osGetTe
17120 6d 70 50 61 74 68 57 28 4d 41 58 5f 50 41 54 48  mpPathW(MAX_PATH
17130 2d 33 30 2c 20 7a 57 69 64 65 50 61 74 68 29 3b  -30, zWidePath);
17140 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20 75 6e  .    zMulti = un
17150 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 57 69 64  icodeToUtf8(zWid
17160 65 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  ePath);.    if( 
17170 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20 20 20  zMulti ){.      
17180 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
17190 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54  (MAX_PATH-30, zT
171a0 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20 7a  empPath, "%s", z
171b0 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71  Multi);.      sq
171c0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74  lite3_free(zMult
171d0 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i);.    }else{. 
171e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
171f0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
17200 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66      }.  }.#ifdef
17210 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
17220 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
17230 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a     char *zUtf8;.
17240 20 20 20 20 63 68 61 72 20 7a 4d 62 63 73 50 61      char zMbcsPa
17250 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20  th[MAX_PATH];.  
17260 20 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41    osGetTempPathA
17270 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 4d  (MAX_PATH-30, zM
17280 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20 7a 55  bcsPath);.    zU
17290 74 66 38 20 3d 20 73 71 6c 69 74 65 33 5f 77 69  tf8 = sqlite3_wi
172a0 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
172b0 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20  (zMbcsPath);.   
172c0 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20   if( zUtf8 ){.  
172d0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
172e0 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30  intf(MAX_PATH-30
172f0 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73  , zTempPath, "%s
17300 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ", zUtf8);.     
17310 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55   sqlite3_free(zU
17320 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tf8);.    }else{
17330 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
17340 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
17350 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
17360 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  if..  /* Check t
17370 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62  hat the output b
17380 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65  uffer is large e
17390 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65  nough for the te
173a0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20  mporary file .  
173b0 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69  ** name. If it i
173c0 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51  s not, return SQ
173d0 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f  LITE_ERROR..  */
173e0 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 53  .  if( (sqlite3S
173f0 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 50 61 74  trlen30(zTempPat
17400 68 29 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c  h) + sqlite3Strl
17410 65 6e 33 30 28 53 51 4c 49 54 45 5f 54 45 4d 50  en30(SQLITE_TEMP
17420 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20 2b 20  _FILE_PREFIX) + 
17430 31 38 29 20 3e 3d 20 6e 42 75 66 20 29 7b 0a 20  18) >= nBuf ){. 
17440 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17450 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 66  _ERROR;.  }..  f
17460 6f 72 28 69 3d 73 71 6c 69 74 65 33 53 74 72 6c  or(i=sqlite3Strl
17470 65 6e 33 30 28 7a 54 65 6d 70 50 61 74 68 29 3b  en30(zTempPath);
17480 20 69 3e 30 20 26 26 20 7a 54 65 6d 70 50 61 74   i>0 && zTempPat
17490 68 5b 69 2d 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d  h[i-1]=='\\'; i-
174a0 2d 29 7b 7d 0a 20 20 7a 54 65 6d 70 50 61 74 68  -){}.  zTempPath
174b0 5b 69 5d 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69  [i] = 0;..  sqli
174c0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
174d0 66 2d 31 38 2c 20 7a 42 75 66 2c 0a 20 20 20 20  f-18, zBuf,.    
174e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
174f0 25 73 5c 5c 22 53 51 4c 49 54 45 5f 54 45 4d 50  %s\\"SQLITE_TEMP
17500 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 54  _FILE_PREFIX, zT
17510 65 6d 70 50 61 74 68 29 3b 0a 20 20 6a 20 3d 20  empPath);.  j = 
17520 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
17530 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  zBuf);.  sqlite3
17540 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20  _randomness(15, 
17550 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72  &zBuf[j]);.  for
17560 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c  (i=0; i<15; i++,
17570 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b   j++){.    zBuf[
17580 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72  j] = (char)zChar
17590 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68  s[ ((unsigned ch
175a0 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a  ar)zBuf[j])%(siz
175b0 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d  eof(zChars)-1) ]
175c0 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20  ;.  }.  zBuf[j] 
175d0 3d 20 30 3b 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d  = 0;.  zBuf[j+1]
175e0 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45   = 0;..  OSTRACE
175f0 28 28 22 54 45 4d 50 20 46 49 4c 45 4e 41 4d 45  (("TEMP FILENAME
17600 3a 20 25 73 5c 6e 22 2c 20 7a 42 75 66 29 29 3b  : %s\n", zBuf));
17610 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17620 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  _OK; .}../*.** O
17630 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  pen a file..*/.s
17640 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65  tatic int winOpe
17650 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
17660 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 2f   *pVfs,        /
17670 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20  * Not used */.  
17680 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
17690 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  e,        /* Nam
176a0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55  e of the file (U
176b0 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74  TF-8) */.  sqlit
176c0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20  e3_file *id,    
176d0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
176e0 65 20 53 51 4c 69 74 65 20 66 69 6c 65 20 68 61  e SQLite file ha
176f0 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  ndle here */.  i
17700 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
17710 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
17720 20 6d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20   mode flags */. 
17730 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20   int *pOutFlags 
17740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
17750 61 74 75 73 20 72 65 74 75 72 6e 20 66 6c 61 67  atus return flag
17760 73 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c 45  s */.){.  HANDLE
17770 20 68 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   h;.  DWORD last
17780 45 72 72 6e 6f 3b 0a 20 20 44 57 4f 52 44 20 64  Errno;.  DWORD d
17790 77 44 65 73 69 72 65 64 41 63 63 65 73 73 3b 0a  wDesiredAccess;.
177a0 20 20 44 57 4f 52 44 20 64 77 53 68 61 72 65 4d    DWORD dwShareM
177b0 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20 64 77 43  ode;.  DWORD dwC
177c0 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
177d0 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64 77 46 6c  on;.  DWORD dwFl
177e0 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
177f0 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c 49 54 45   = 0;.#if SQLITE
17800 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20  _OS_WINCE.  int 
17810 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23 65 6e 64  isTemp = 0;.#end
17820 69 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  if.  winFile *pF
17830 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
17840 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  id;.  void *zCon
17850 76 65 72 74 65 64 3b 20 20 20 20 20 20 20 20 20  verted;         
17860 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65       /* Filename
17870 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69 6e 67 20   in OS encoding 
17880 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
17890 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 4e 61  *zUtf8Name = zNa
178a0 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20  me; /* Filename 
178b0 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 69 6e  in UTF-8 encodin
178c0 67 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d  g */.  int cnt =
178d0 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67   0;..  /* If arg
178e0 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61  ument zPath is a
178f0 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74   NULL pointer, t
17900 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
17910 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e  required to open
17920 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  .  ** a temporar
17930 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73  y file. Use this
17940 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65   buffer to store
17950 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69   the file name i
17960 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a  n..  */.  char z
17970 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  Tmpname[MAX_PATH
17980 2b 32 5d 3b 20 20 20 20 20 2f 2a 20 42 75 66 66  +2];     /* Buff
17990 65 72 20 75 73 65 64 20 74 6f 20 63 72 65 61 74  er used to creat
179a0 65 20 74 65 6d 70 20 66 69 6c 65 6e 61 6d 65 20  e temp filename 
179b0 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  */..  int rc = S
179c0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
179d0 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
179e0 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
179f0 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
17a00 42 55 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  BUG) || SQLITE_O
17a10 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 54  S_WINCE.  int eT
17a20 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46  ype = flags&0xFF
17a30 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65  FFFF00;  /* Type
17a40 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e   of file to open
17a50 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e   */.#endif..  in
17a60 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d  t isExclusive  =
17a70 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
17a80 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29  _OPEN_EXCLUSIVE)
17a90 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  ;.  int isDelete
17aa0 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
17ab0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
17ac0 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e  TEONCLOSE);.  in
17ad0 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d  t isCreate     =
17ae0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
17af0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 23  _OPEN_CREATE);.#
17b00 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
17b10 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20  int isReadonly  
17b20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
17b30 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
17b40 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20  );.#endif.  int 
17b50 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28  isReadWrite  = (
17b60 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
17b70 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a  PEN_READWRITE);.
17b80 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
17b90 20 20 69 6e 74 20 69 73 4f 70 65 6e 4a 6f 75 72    int isOpenJour
17ba0 6e 61 6c 20 3d 20 28 69 73 43 72 65 61 74 65 20  nal = (isCreate 
17bb0 26 26 20 28 0a 20 20 20 20 20 20 20 20 65 54 79  && (.        eTy
17bc0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
17bd0 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a  MASTER_JOURNAL .
17be0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
17bf0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
17c00 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c  JOURNAL .     ||
17c10 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
17c20 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 23 65  PEN_WAL.  ));.#e
17c30 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ndif..  /* Check
17c40 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
17c50 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72  tatements are tr
17c60 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ue: .  **.  **  
17c70 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65   (a) Exactly one
17c80 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54   of the READWRIT
17c90 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66  E and READONLY f
17ca0 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74  lags must be set
17cb0 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62  , and .  **   (b
17cc0 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73  ) if CREATE is s
17cd0 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49  et, then READWRI
17ce0 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
17cf0 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20  set, and.  **   
17d00 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45  (c) if EXCLUSIVE
17d10 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
17d20 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
17d30 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64  e set..  **   (d
17d40 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f  ) if DELETEONCLO
17d50 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  SE is set, then 
17d60 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f  CREATE must also
17d70 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20   be set..  */.  
17d80 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e  assert((isReadon
17d90 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  ly==0 || isReadW
17da0 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52  rite==0) && (isR
17db0 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65  eadWrite || isRe
17dc0 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65  adonly));.  asse
17dd0 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c  rt(isCreate==0 |
17de0 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a  | isReadWrite);.
17df0 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75    assert(isExclu
17e00 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65  sive==0 || isCre
17e10 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ate);.  assert(i
17e20 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73  sDelete==0 || is
17e30 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54  Create);..  /* T
17e40 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e  he main DB, main
17e50 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69   journal, WAL fi
17e60 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f  le and master jo
17e70 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20  urnal are never 
17e80 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  .  ** automatica
17e90 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72  lly deleted. Nor
17ea0 20 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74   are they ever t
17eb0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
17ec0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21   */.  assert( (!
17ed0 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
17ee0 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
17ef0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
17f00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
17f10 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
17f20 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
17f30 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
17f40 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  URNAL );.  asser
17f50 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
17f60 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
17f70 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
17f80 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  STER_JOURNAL );.
17f90 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
17fa0 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
17fb0 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
17fc0 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f  OPEN_WAL );..  /
17fd0 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
17fe0 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61  e upper layer ha
17ff0 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65  s set one of the
18000 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61   "file-type" fla
18010 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  gs. */.  assert(
18020 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
18030 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20  PEN_MAIN_DB     
18040 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
18050 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a  E_OPEN_TEMP_DB .
18060 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
18070 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
18080 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79  N_JOURNAL || eTy
18090 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
180a0 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  TEMP_JOURNAL .  
180b0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
180c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
180d0 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65  URNAL   || eType
180e0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
180f0 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
18100 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
18110 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
18120 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65  IENT_DB || eType
18130 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
18140 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  L.  );..  assert
18150 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 55 4e 55  ( id!=0 );.  UNU
18160 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
18170 66 73 29 3b 0a 0a 20 20 70 46 69 6c 65 2d 3e 68  fs);..  pFile->h
18180 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c   = INVALID_HANDL
18190 45 5f 56 41 4c 55 45 3b 0a 0a 20 20 2f 2a 20 49  E_VALUE;..  /* I
181a0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
181b0 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
181c0 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20  nction is NULL, 
181d0 67 65 6e 65 72 61 74 65 20 61 20 0a 20 20 2a 2a  generate a .  **
181e0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
181f0 6e 61 6d 65 20 74 6f 20 75 73 65 20 0a 20 20 2a  name to use .  *
18200 2f 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61  /.  if( !zUtf8Na
18210 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  me ){.    assert
18220 28 69 73 44 65 6c 65 74 65 20 26 26 20 21 69 73  (isDelete && !is
18230 4f 70 65 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  OpenJournal);.  
18240 20 20 72 63 20 3d 20 67 65 74 54 65 6d 70 6e 61    rc = getTempna
18250 6d 65 28 4d 41 58 5f 50 41 54 48 2b 32 2c 20 7a  me(MAX_PATH+2, z
18260 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  Tmpname);.    if
18270 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18280 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
18290 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55  rc;.    }.    zU
182a0 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61  tf8Name = zTmpna
182b0 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 61  me;.  }..  /* Da
182c0 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73  tabase filenames
182d0 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f   are double-zero
182e0 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74   terminated if t
182f0 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 2a 2a  hey are not.  **
18300 20 55 52 49 73 20 77 69 74 68 20 70 61 72 61 6d   URIs with param
18310 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74  eters.  Hence, t
18320 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62  hey can always b
18330 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20  e passed into.  
18340 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70  ** sqlite3_uri_p
18350 61 72 61 6d 65 74 65 72 28 29 2e 0a 20 20 2a 2f  arameter()..  */
18360 0a 20 20 61 73 73 65 72 74 28 20 28 65 54 79 70  .  assert( (eTyp
18370 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
18380 41 49 4e 5f 44 42 29 20 7c 7c 20 28 66 6c 61 67  AIN_DB) || (flag
18390 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
183a0 55 52 49 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  URI) ||.        
183b0 7a 55 74 66 38 4e 61 6d 65 5b 73 74 72 6c 65 6e  zUtf8Name[strlen
183c0 28 7a 55 74 66 38 4e 61 6d 65 29 2b 31 5d 3d 3d  (zUtf8Name)+1]==
183d0 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65  0 );..  /* Conve
183e0 72 74 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  rt the filename 
183f0 74 6f 20 74 68 65 20 73 79 73 74 65 6d 20 65 6e  to the system en
18400 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f  coding. */.  zCo
18410 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72  nverted = conver
18420 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 55  tUtf8Filename(zU
18430 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  tf8Name);.  if( 
18440 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
18450 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
18460 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
18470 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 65 61    }..  if( isRea
18480 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 64 77  dWrite ){.    dw
18490 44 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20  DesiredAccess = 
184a0 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 47  GENERIC_READ | G
184b0 45 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a 20 20  ENERIC_WRITE;.  
184c0 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 44 65 73  }else{.    dwDes
184d0 69 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e  iredAccess = GEN
184e0 45 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a  ERIC_READ;.  }..
184f0 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e    /* SQLITE_OPEN
18500 5f 45 58 43 4c 55 53 49 56 45 20 69 73 20 75 73  _EXCLUSIVE is us
18510 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
18520 74 68 61 74 20 61 20 6e 65 77 20 66 69 6c 65 20  that a new file 
18530 69 73 20 0a 20 20 2a 2a 20 63 72 65 61 74 65 64  is .  ** created
18540 2e 20 53 51 4c 69 74 65 20 64 6f 65 73 6e 27 74  . SQLite doesn't
18550 20 75 73 65 20 69 74 20 74 6f 20 69 6e 64 69 63   use it to indic
18560 61 74 65 20 22 65 78 63 6c 75 73 69 76 65 20 61  ate "exclusive a
18570 63 63 65 73 73 22 20 0a 20 20 2a 2a 20 61 73 20  ccess" .  ** as 
18580 69 74 20 69 73 20 75 73 75 61 6c 6c 79 20 75 6e  it is usually un
18590 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20  derstood..  */. 
185a0 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65   if( isExclusive
185b0 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   ){.    /* Creat
185c0 65 73 20 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f  es a new file, o
185d0 6e 6c 79 20 69 66 20 69 74 20 64 6f 65 73 20 6e  nly if it does n
185e0 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
185f0 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74  . */.    /* If t
18600 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  he file exists, 
18610 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20  it fails. */.   
18620 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
18630 73 69 74 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f  sition = CREATE_
18640 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NEW;.  }else if(
18650 20 69 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20   isCreate ){.   
18660 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74 69 6e   /* Open existin
18670 67 20 66 69 6c 65 2c 20 6f 72 20 63 72 65 61 74  g file, or creat
18680 65 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20  e if it doesn't 
18690 65 78 69 73 74 20 2a 2f 0a 20 20 20 20 64 77 43  exist */.    dwC
186a0 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
186b0 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53  on = OPEN_ALWAYS
186c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
186d0 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c 20  * Opens a file, 
186e0 6f 6e 6c 79 20 69 66 20 69 74 20 65 78 69 73 74  only if it exist
186f0 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61  s. */.    dwCrea
18700 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20  tionDisposition 
18710 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b  = OPEN_EXISTING;
18720 0a 20 20 7d 0a 0a 20 20 64 77 53 68 61 72 65 4d  .  }..  dwShareM
18730 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48 41 52 45  ode = FILE_SHARE
18740 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48 41  _READ | FILE_SHA
18750 52 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69 66 28  RE_WRITE;..  if(
18760 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66   isDelete ){.#if
18770 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
18780 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41  .    dwFlagsAndA
18790 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45  ttributes = FILE
187a0 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 45  _ATTRIBUTE_HIDDE
187b0 4e 3b 0a 20 20 20 20 69 73 54 65 6d 70 20 3d 20  N;.    isTemp = 
187c0 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 77 46  1;.#else.    dwF
187d0 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
187e0 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s = FILE_ATTRIBU
187f0 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20 20  TE_TEMPORARY.   
18800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18810 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49              | FI
18820 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44  LE_ATTRIBUTE_HID
18830 44 45 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20  DEN.            
18840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18850 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44     | FILE_FLAG_D
18860 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a  ELETE_ON_CLOSE;.
18870 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
18880 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
18890 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f  tributes = FILE_
188a0 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c  ATTRIBUTE_NORMAL
188b0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70 6f 72  ;.  }.  /* Repor
188c0 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65  ts from the inte
188d0 72 6e 65 74 20 61 72 65 20 74 68 61 74 20 70 65  rnet are that pe
188e0 72 66 6f 72 6d 61 6e 63 65 20 69 73 20 61 6c 77  rformance is alw
188f0 61 79 73 0a 20 20 2a 2a 20 62 65 74 74 65 72 20  ays.  ** better 
18900 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e  if FILE_FLAG_RAN
18910 44 4f 4d 5f 41 43 43 45 53 53 20 69 73 20 75 73  DOM_ACCESS is us
18920 65 64 2e 20 20 54 69 63 6b 65 74 20 23 32 36 39  ed.  Ticket #269
18930 39 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  9. */.#if SQLITE
18940 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77 46 6c  _OS_WINCE.  dwFl
18950 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
18960 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41   |= FILE_FLAG_RA
18970 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23 65 6e  NDOM_ACCESS;.#en
18980 64 69 66 0a 0a 20 20 69 66 28 20 69 73 4e 54 28  dif..  if( isNT(
18990 29 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  ) ){.    while( 
189a0 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  (h = osCreateFil
189b0 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  eW((LPCWSTR)zCon
189c0 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
189d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189e0 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
189f0 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20  ccess,.         
18a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a10 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65       dwShareMode
18a20 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  , NULL,.        
18a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a40 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e        dwCreation
18a50 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20  Disposition,.   
18a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a70 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61             dwFla
18a80 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c  gsAndAttributes,
18a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
18ab0 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48  ULL))==INVALID_H
18ac0 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20  ANDLE_VALUE &&. 
18ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
18af0 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
18b00 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20  astErrno) ){}.  
18b10 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
18b20 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
18b30 20 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65   else{.    while
18b40 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46  ( (h = osCreateF
18b50 69 6c 65 41 28 28 4c 50 43 53 54 52 29 7a 43 6f  ileA((LPCSTR)zCo
18b60 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
18b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b80 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
18b90 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bb0 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
18bc0 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  e, NULL,.       
18bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18be0 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f         dwCreatio
18bf0 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20  nDisposition,.  
18c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c10 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c              dwFl
18c20 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
18c30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c50 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f  NULL))==INVALID_
18c60 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a  HANDLE_VALUE &&.
18c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
18c90 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
18ca0 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20  lastErrno) ){}. 
18cb0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 6c 6f 67 49   }.#endif.  logI
18cc0 6f 65 72 72 28 63 6e 74 29 3b 0a 0a 20 20 4f 53  oerr(cnt);..  OS
18cd0 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20  TRACE(("OPEN %d 
18ce0 25 73 20 30 78 25 6c 78 20 25 73 5c 6e 22 2c 20  %s 0x%lx %s\n", 
18cf0 0a 20 20 20 20 20 20 20 20 20 20 20 68 2c 20 7a  .           h, z
18d00 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64 41  Name, dwDesiredA
18d10 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20 20 20  ccess, .        
18d20 20 20 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41     h==INVALID_HA
18d30 4e 44 4c 45 5f 56 41 4c 55 45 20 3f 20 22 66 61  NDLE_VALUE ? "fa
18d40 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a  iled" : "ok"));.
18d50 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49  .  if( h==INVALI
18d60 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
18d70 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
18d80 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
18d90 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  no;.    winLogEr
18da0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
18db0 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  PEN, pFile->last
18dc0 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 65 6e 22  Errno, "winOpen"
18dd0 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20  , zUtf8Name);.  
18de0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
18df0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
18e00 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
18e10 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65 20  && !isExclusive 
18e20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
18e30 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e  winOpen(pVfs, zN
18e40 61 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20 20 20  ame, id, .      
18e50 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53         ((flags|S
18e60 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
18e70 4e 4c 59 29 26 7e 28 53 51 4c 49 54 45 5f 4f 50  NLY)&~(SQLITE_OP
18e80 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45  EN_CREATE|SQLITE
18e90 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
18ea0 29 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20  ), pOutFlags);. 
18eb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18ec0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
18ed0 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
18ee0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f   }.  }..  if( pO
18ef0 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 69  utFlags ){.    i
18f00 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29  f( isReadWrite )
18f10 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61  {.      *pOutFla
18f20 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
18f30 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20  _READWRITE;.    
18f40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f  }else{.      *pO
18f50 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  utFlags = SQLITE
18f60 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
18f70 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6d 65 6d      }.  }..  mem
18f80 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69  set(pFile, 0, si
18f90 7a 65 6f 66 28 2a 70 46 69 6c 65 29 29 3b 0a 20  zeof(*pFile));. 
18fa0 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20   pFile->pMethod 
18fb0 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a  = &winIoMethod;.
18fc0 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a    pFile->h = h;.
18fd0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
18fe0 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20  no = NO_ERROR;. 
18ff0 20 70 46 69 6c 65 2d 3e 70 56 66 73 20 3d 20 70   pFile->pVfs = p
19000 56 66 73 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 53  Vfs;.  pFile->pS
19010 68 6d 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d  hm = 0;.  pFile-
19020 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a  >zPath = zName;.
19030 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72    if( sqlite3_ur
19040 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c  i_boolean(zName,
19050 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f   "psow", SQLITE_
19060 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
19070 49 54 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  ITE) ){.    pFil
19080 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  e->ctrlFlags |= 
19090 57 49 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20  WINFILE_PSOW;.  
190a0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  }..#if SQLITE_OS
190b0 5f 57 49 4e 43 45 0a 20 20 69 66 28 20 69 73 52  _WINCE.  if( isR
190c0 65 61 64 57 72 69 74 65 20 26 26 20 65 54 79 70  eadWrite && eTyp
190d0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
190e0 41 49 4e 5f 44 42 0a 20 20 20 20 20 20 20 26 26  AIN_DB.       &&
190f0 20 21 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63   !winceCreateLoc
19100 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 6c 65 29 0a  k(zName, pFile).
19110 20 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65    ){.    osClose
19120 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20 20 73  Handle(h);.    s
19130 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
19140 76 65 72 74 65 64 29 3b 0a 20 20 20 20 72 65 74  verted);.    ret
19150 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
19160 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  PEN_BKPT;.  }.  
19170 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20  if( isTemp ){.  
19180 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65    pFile->zDelete
19190 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65  OnClose = zConve
191a0 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  rted;.  }else.#e
191b0 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ndif.  {.    sql
191c0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
191d0 72 74 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 4f 70  rted);.  }..  Op
191e0 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20  enCounter(+1);. 
191f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19200 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
19210 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  named file..**.*
19220 2a 20 4e 6f 74 65 20 74 68 61 74 20 57 69 6e 64  * Note that Wind
19230 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c  ows does not all
19240 6f 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65 20  ow a file to be 
19250 64 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 20  deleted if some 
19260 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73  other.** process
19270 20 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 53   has it open.  S
19280 6f 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75 73  ometimes a virus
19290 20 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65   scanner or inde
192a0 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  xing program.** 
192b0 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72  will open a jour
192c0 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c 79  nal file shortly
192d0 20 61 66 74 65 72 20 69 74 20 69 73 20 63 72 65   after it is cre
192e0 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  ated in order to
192f0 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 20   do.** whatever 
19300 69 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20  it does.  While 
19310 74 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65  this other proce
19320 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  ss is holding th
19330 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20  e.** file open, 
19340 77 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c  we will be unabl
19350 65 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20  e to delete it. 
19360 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
19370 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c  this.** problem,
19380 20 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69   we delay 100 mi
19390 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74  lliseconds and t
193a0 72 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61  ry to delete aga
193b0 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58  in.  Up.** to MX
193c0 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
193d0 54 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65  Ts deletion atte
193e0 6d 70 74 73 20 61 72 65 20 72 75 6e 20 62 65 66  mpts are run bef
193f0 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70  ore giving.** up
19400 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
19410 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  n error..*/.stat
19420 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65  ic int winDelete
19430 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
19440 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
19450 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
19460 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  in32 */.  const 
19470 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
19480 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
19490 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20   file to delete 
194a0 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72  */.  int syncDir
194b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194c0 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20   /* Not used on 
194d0 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e  win32 */.){.  in
194e0 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74  t cnt = 0;.  int
194f0 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73   rc;.  DWORD las
19500 74 45 72 72 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a  tErrno;.  void *
19510 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e  zConverted;.  UN
19520 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
19530 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Vfs);.  UNUSED_P
19540 41 52 41 4d 45 54 45 52 28 73 79 6e 63 44 69 72  ARAMETER(syncDir
19550 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  );..  SimulateIO
19560 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
19570 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
19580 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  );.  zConverted 
19590 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c  = convertUtf8Fil
195a0 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  ename(zFilename)
195b0 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
195c0 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ed==0 ){.    ret
195d0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
195e0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
195f0 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
19600 72 63 20 3d 20 31 3b 0a 20 20 20 20 77 68 69 6c  rc = 1;.    whil
19610 65 28 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72  e( osGetFileAttr
19620 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74  ibutesW(zConvert
19630 65 64 29 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ed)!=INVALID_FIL
19640 45 5f 41 54 54 52 49 42 55 54 45 53 20 26 26 0a  E_ATTRIBUTES &&.
19650 20 20 20 20 20 20 20 20 20 28 72 63 20 3d 20 6f           (rc = o
19660 73 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f  sDeleteFileW(zCo
19670 6e 76 65 72 74 65 64 29 29 3d 3d 30 20 26 26 20  nverted))==0 && 
19680 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  retryIoerr(&cnt,
19690 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d   &lastErrno) ){}
196a0 0a 20 20 20 20 72 63 20 3d 20 72 63 20 3f 20 53  .    rc = rc ? S
196b0 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54  QLITE_OK : SQLIT
196c0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 69 66  E_ERROR;.  }.#if
196d0 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
196e0 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
196f0 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  {.    rc = 1;.  
19700 20 20 77 68 69 6c 65 28 20 6f 73 47 65 74 46 69    while( osGetFi
19710 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 7a 43  leAttributesA(zC
19720 6f 6e 76 65 72 74 65 64 29 21 3d 49 4e 56 41 4c  onverted)!=INVAL
19730 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
19740 45 53 20 26 26 0a 20 20 20 20 20 20 20 20 20 28  ES &&.         (
19750 72 63 20 3d 20 6f 73 44 65 6c 65 74 65 46 69 6c  rc = osDeleteFil
19760 65 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 29 3d  eA(zConverted))=
19770 3d 30 20 26 26 20 72 65 74 72 79 49 6f 65 72 72  =0 && retryIoerr
19780 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
19790 6f 29 20 29 7b 7d 0a 20 20 20 20 72 63 20 3d 20  o) ){}.    rc = 
197a0 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  rc ? SQLITE_OK :
197b0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
197c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
197d0 72 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  rc ){.    rc = w
197e0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
197f0 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20  E_IOERR_DELETE, 
19800 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
19810 20 20 20 20 20 20 20 20 22 77 69 6e 44 65 6c 65          "winDele
19820 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  te", zFilename);
19830 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f  .  }else{.    lo
19840 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20 20 7d  gIoerr(cnt);.  }
19850 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
19860 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 4f  zConverted);.  O
19870 53 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 20  STRACE(("DELETE 
19880 5c 22 25 73 5c 22 20 25 73 5c 6e 22 2c 20 7a 46  \"%s\" %s\n", zF
19890 69 6c 65 6e 61 6d 65 2c 20 28 72 63 20 3f 20 22  ilename, (rc ? "
198a0 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 20 29  failed" : "ok" )
198b0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
198c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
198d0 74 68 65 20 65 78 69 73 74 61 6e 63 65 20 61 6e  the existance an
198e0 64 20 73 74 61 74 75 73 20 6f 66 20 61 20 66 69  d status of a fi
198f0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
19900 74 20 77 69 6e 41 63 63 65 73 73 28 0a 20 20 73  t winAccess(.  s
19910 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
19920 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74  ,         /* Not
19930 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a   used on win32 *
19940 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
19950 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f  zFilename,     /
19960 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
19970 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74  o check */.  int
19980 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
19990 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
199a0 6f 66 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20  of test to make 
199b0 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
199c0 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20    int *pResOut  
199d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
199e0 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 29  OUT: Result */.)
199f0 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a  {.  DWORD attr;.
19a00 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
19a10 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
19a20 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
19a30 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ted;.  UNUSED_PA
19a40 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a  RAMETER(pVfs);..
19a50 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
19a60 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
19a70 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29  _IOERR_ACCESS; )
19a80 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d  ;.  zConverted =
19a90 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65   convertUtf8File
19aa0 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
19ab0 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
19ac0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d==0 ){.    retu
19ad0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
19ae0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
19af0 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69   isNT() ){.    i
19b00 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
19b10 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49  WIN32_FILE_ATTRI
19b20 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44  BUTE_DATA sAttrD
19b30 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ata;.    memset(
19b40 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73  &sAttrData, 0, s
19b50 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29  izeof(sAttrData)
19b60 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28  );.    while( !(
19b70 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  rc = osGetFileAt
19b80 74 72 69 62 75 74 65 73 45 78 57 28 28 4c 50 43  tributesExW((LPC
19b90 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
19ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 47 65                Ge
19bc0 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64  tFileExInfoStand
19bd0 61 72 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ard, .          
19be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bf0 20 20 20 26 73 41 74 74 72 44 61 74 61 29 29 20     &sAttrData)) 
19c00 26 26 20 72 65 74 72 79 49 6f 65 72 72 28 26 63  && retryIoerr(&c
19c10 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
19c20 29 7b 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29  ){}.    if( rc )
19c30 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61  {.      /* For a
19c40 6e 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  n SQLITE_ACCESS_
19c50 45 58 49 53 54 53 20 71 75 65 72 79 2c 20 74 72  EXISTS query, tr
19c60 65 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74  eat a zero-lengt
19c70 68 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  h file.      ** 
19c80 61 73 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  as if it does no
19c90 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a  t exist..      *
19ca0 2f 0a 20 20 20 20 20 20 69 66 28 20 20 20 20 66  /.      if(    f
19cb0 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43  lags==SQLITE_ACC
19cc0 45 53 53 5f 45 58 49 53 54 53 0a 20 20 20 20 20  ESS_EXISTS.     
19cd0 20 20 20 20 20 26 26 20 73 41 74 74 72 44 61 74       && sAttrDat
19ce0 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67 68 3d  a.nFileSizeHigh=
19cf0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  =0 .          &&
19d00 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65   sAttrData.nFile
19d10 53 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20 20  SizeLow==0 ){.  
19d20 20 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56        attr = INV
19d30 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
19d40 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73  UTES;.      }els
19d50 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20  e{.        attr 
19d60 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69  = sAttrData.dwFi
19d70 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20 20  leAttributes;.  
19d80 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
19d90 0a 20 20 20 20 20 20 6c 6f 67 49 6f 65 72 72 28  .      logIoerr(
19da0 63 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  cnt);.      if( 
19db0 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52  lastErrno!=ERROR
19dc0 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20  _FILE_NOT_FOUND 
19dd0 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 4c 6f  ){.        winLo
19de0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
19df0 45 52 52 5f 41 43 43 45 53 53 2c 20 6c 61 73 74  ERR_ACCESS, last
19e00 45 72 72 6e 6f 2c 20 22 77 69 6e 41 63 63 65 73  Errno, "winAcces
19e10 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  s", zFilename);.
19e20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
19e30 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
19e40 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
19e50 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
19e60 43 45 53 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73  CESS;.      }els
19e70 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20  e{.        attr 
19e80 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  = INVALID_FILE_A
19e90 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20  TTRIBUTES;.     
19ea0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66   }.    }.  }.#if
19eb0 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
19ec0 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
19ed0 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47  {.    attr = osG
19ee0 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
19ef0 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
19f00 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ted);.  }.#endif
19f10 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
19f20 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 73  zConverted);.  s
19f30 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a  witch( flags ){.
19f40 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
19f50 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20  ACCESS_READ:.   
19f60 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
19f70 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20  ESS_EXISTS:.    
19f80 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56    rc = attr!=INV
19f90 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
19fa0 55 54 45 53 3b 0a 20 20 20 20 20 20 62 72 65 61  UTES;.      brea
19fb0 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
19fc0 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  TE_ACCESS_READWR
19fd0 49 54 45 3a 0a 20 20 20 20 20 20 72 63 20 3d 20  ITE:.      rc = 
19fe0 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49  attr!=INVALID_FI
19ff0 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 26 26  LE_ATTRIBUTES &&
1a000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 61  .             (a
1a010 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49  ttr & FILE_ATTRI
1a020 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d  BUTE_READONLY)==
1a030 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
1a040 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
1a050 20 20 20 61 73 73 65 72 74 28 21 22 49 6e 76 61     assert(!"Inva
1a060 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65  lid flags argume
1a070 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  nt");.  }.  *pRe
1a080 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 72 65 74  sOut = rc;.  ret
1a090 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1a0a0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20  .../*.** Turn a 
1a0b0 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
1a0c0 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61  e into a full pa
1a0d0 74 68 6e 61 6d 65 2e 20 20 57 72 69 74 65 20 74  thname.  Write t
1a0e0 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e  he full.** pathn
1a0f0 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e  ame into zOut[].
1a100 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65    zOut[] will be
1a110 20 61 74 20 6c 65 61 73 74 20 70 56 66 73 2d 3e   at least pVfs->
1a120 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a 20 62 79  mxPathname.** by
1a130 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a  tes in size..*/.
1a140 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 75  static int winFu
1a150 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71  llPathname(.  sq
1a160 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
1a170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1a180 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
1a190 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
1a1a0 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c  char *zRelative,
1a1b0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69          /* Possi
1a1c0 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70  bly relative inp
1a1d0 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74  ut path */.  int
1a1e0 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20 20 20 20   nFull,         
1a1f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1a200 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66  ze of output buf
1a210 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  fer in bytes */.
1a220 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 20 20    char *zFull   
1a230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a240 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72  /* Output buffer
1a250 20 2a 2f 0a 29 7b 0a 20 20 0a 23 69 66 20 64 65   */.){.  .#if de
1a260 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
1a270 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ).  SimulateIOEr
1a280 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
1a290 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e  TE_ERROR );.  UN
1a2a0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
1a2b0 46 75 6c 6c 29 3b 0a 20 20 63 79 67 77 69 6e 5f  Full);.  cygwin_
1a2c0 63 6f 6e 76 5f 74 6f 5f 66 75 6c 6c 5f 77 69 6e  conv_to_full_win
1a2d0 33 32 5f 70 61 74 68 28 7a 52 65 6c 61 74 69 76  32_path(zRelativ
1a2e0 65 2c 20 7a 46 75 6c 6c 29 3b 0a 20 20 72 65 74  e, zFull);.  ret
1a2f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
1a300 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
1a310 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53 69 6d  E_OS_WINCE.  Sim
1a320 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
1a330 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1a340 52 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  R );.  UNUSED_PA
1a350 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a  RAMETER(nFull);.
1a360 20 20 2f 2a 20 57 69 6e 43 45 20 68 61 73 20 6e    /* WinCE has n
1a370 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20 61 20 72  o concept of a r
1a380 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
1a390 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c  , or so I am tol
1a3a0 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  d. */.  sqlite3_
1a3b0 73 6e 70 72 69 6e 74 66 28 70 56 66 73 2d 3e 6d  snprintf(pVfs->m
1a3c0 78 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c  xPathname, zFull
1a3d0 2c 20 22 25 73 22 2c 20 7a 52 65 6c 61 74 69 76  , "%s", zRelativ
1a3e0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
1a3f0 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a  ITE_OK;.#endif..
1a400 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
1a410 49 4e 43 45 20 26 26 20 21 64 65 66 69 6e 65 64  INCE && !defined
1a420 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 69  (__CYGWIN__).  i
1a430 6e 74 20 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64  nt nByte;.  void
1a440 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20   *zConverted;.  
1a450 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a 20 20 2f  char *zOut;..  /
1a460 2a 20 49 66 20 74 68 69 73 20 70 61 74 68 20 6e  * If this path n
1a470 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  ame begins with 
1a480 22 2f 58 3a 22 2c 20 77 68 65 72 65 20 22 58 22  "/X:", where "X"
1a490 20 69 73 20 61 6e 79 20 61 6c 70 68 61 62 65 74   is any alphabet
1a4a0 69 63 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65  ic.  ** characte
1a4b0 72 2c 20 64 69 73 63 61 72 64 20 74 68 65 20 69  r, discard the i
1a4c0 6e 69 74 69 61 6c 20 22 2f 22 20 66 72 6f 6d 20  nitial "/" from 
1a4d0 74 68 65 20 70 61 74 68 6e 61 6d 65 2e 0a 20 20  the pathname..  
1a4e0 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6c 61 74 69  */.  if( zRelati
1a4f0 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 73 71  ve[0]=='/' && sq
1a500 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a 52 65  lite3Isalpha(zRe
1a510 6c 61 74 69 76 65 5b 31 5d 29 20 26 26 20 7a 52  lative[1]) && zR
1a520 65 6c 61 74 69 76 65 5b 32 5d 3d 3d 27 3a 27 20  elative[2]==':' 
1a530 29 7b 0a 20 20 20 20 7a 52 65 6c 61 74 69 76 65  ){.    zRelative
1a540 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74  ++;.  }..  /* It
1a550 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61  's odd to simula
1a560 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68  te an io-error h
1a570 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20  ere, but really 
1a580 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a  this is just.  *
1a590 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65  * using the io-e
1a5a0 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74  rror infrastruct
1a5b0 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  ure to test that
1a5c0 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20   SQLite handles 
1a5d0 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
1a5e0 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73  on failing. This
1a5f0 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20   function could 
1a600 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61  fail if, for exa
1a610 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63  mple, the.  ** c
1a620 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64  urrent working d
1a630 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
1a640 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f  n unlinked..  */
1a650 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1a660 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
1a670 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55  E_ERROR );.  UNU
1a680 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46  SED_PARAMETER(nF
1a690 75 6c 6c 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74  ull);.  zConvert
1a6a0 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38  ed = convertUtf8
1a6b0 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74 69  Filename(zRelati
1a6c0 76 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  ve);.  if( zConv
1a6d0 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
1a6e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1a6f0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ERR_NOMEM;.  }. 
1a700 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20   if( isNT() ){. 
1a710 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 3b     LPWSTR zTemp;
1a720 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47  .    nByte = osG
1a730 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28  etFullPathNameW(
1a740 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
1a750 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 20 2b 20  ted, 0, 0, 0) + 
1a760 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73  3;.    zTemp = s
1a770 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e  qlite3_malloc( n
1a780 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d  Byte*sizeof(zTem
1a790 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  p[0]) );.    if(
1a7a0 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20   zTemp==0 ){.   
1a7b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1a7c0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
1a7d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a7e0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
1a7f0 20 20 7d 0a 20 20 20 20 6f 73 47 65 74 46 75 6c    }.    osGetFul
1a800 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57  lPathNameW((LPCW
1a810 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  STR)zConverted, 
1a820 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29  nByte, zTemp, 0)
1a830 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1a840 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
1a850 20 20 20 20 7a 4f 75 74 20 3d 20 75 6e 69 63 6f      zOut = unico
1a860 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 29 3b  deToUtf8(zTemp);
1a870 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1a880 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 69  e(zTemp);.  }.#i
1a890 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
1a8a0 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
1a8b0 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65  e{.    char *zTe
1a8c0 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  mp;.    nByte = 
1a8d0 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
1a8e0 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  eA((char*)zConve
1a8f0 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 20 2b  rted, 0, 0, 0) +
1a900 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20   3;.    zTemp = 
1a910 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
1a920 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65  nByte*sizeof(zTe
1a930 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  mp[0]) );.    if
1a940 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  ( zTemp==0 ){.  
1a950 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1a960 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
1a970 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a980 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
1a990 20 20 20 7d 0a 20 20 20 20 6f 73 47 65 74 46 75     }.    osGetFu
1a9a0 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61  llPathNameA((cha
1a9b0 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e  r*)zConverted, n
1a9c0 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b  Byte, zTemp, 0);
1a9d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1a9e0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
1a9f0 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65     zOut = sqlite
1aa00 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
1aa10 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20  utf8(zTemp);.   
1aa20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
1aa30 65 6d 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  emp);.  }.#endif
1aa40 0a 20 20 69 66 28 20 7a 4f 75 74 20 29 7b 0a 20  .  if( zOut ){. 
1aa50 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1aa60 6e 74 66 28 70 56 66 73 2d 3e 6d 78 50 61 74 68  ntf(pVfs->mxPath
1aa70 6e 61 6d 65 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  name, zFull, "%s
1aa80 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71  ", zOut);.    sq
1aa90 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
1aaa0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1aab0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
1aac0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1aad0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
1aae0 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69    }.#endif.}..#i
1aaf0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ab00 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
1ab10 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
1ab20 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20  s for opening a 
1ab30 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
1ab40 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f  finding entry po
1ab50 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ints.** within t
1ab60 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
1ab70 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74  y, and closing t
1ab80 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
1ab90 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  y..*/./*.** Inte
1aba0 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69  rfaces for openi
1abb0 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72  ng a shared libr
1abc0 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74  ary, finding ent
1abd0 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74  ry points.** wit
1abe0 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  hin the shared l
1abf0 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73  ibrary, and clos
1ac00 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
1ac10 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ibrary..*/.stati
1ac20 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65  c void *winDlOpe
1ac30 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  n(sqlite3_vfs *p
1ac40 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Vfs, const char 
1ac50 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48  *zFilename){.  H
1ac60 41 4e 44 4c 45 20 68 3b 0a 20 20 76 6f 69 64 20  ANDLE h;.  void 
1ac70 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f  *zConverted = co
1ac80 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d  nvertUtf8Filenam
1ac90 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
1aca0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1acb0 28 70 56 66 73 29 3b 0a 20 20 69 66 28 20 7a 43  (pVfs);.  if( zC
1acc0 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
1acd0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1ace0 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
1acf0 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c  .    h = osLoadL
1ad00 69 62 72 61 72 79 57 28 28 4c 50 43 57 53 54 52  ibraryW((LPCWSTR
1ad10 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  )zConverted);.  
1ad20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
1ad30 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
1ad40 20 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20 6f   else{.    h = o
1ad50 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28 63  sLoadLibraryA((c
1ad60 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29  har*)zConverted)
1ad70 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
1ad80 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
1ad90 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72  verted);.  retur
1ada0 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74  n (void*)h;.}.st
1adb0 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 45  atic void winDlE
1adc0 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
1add0 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
1ade0 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29  , char *zBufOut)
1adf0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
1ae00 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 67 65  ETER(pVfs);.  ge
1ae10 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73  tLastErrorMsg(os
1ae20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
1ae30 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b 0a  nBuf, zBufOut);.
1ae40 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a  }.static void (*
1ae50 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65 33  winDlSym(sqlite3
1ae60 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64  _vfs *pVfs, void
1ae70 20 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e 73 74   *pHandle, const
1ae80 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c 29 29   char *zSymbol))
1ae90 28 76 6f 69 64 29 7b 0a 20 20 55 4e 55 53 45 44  (void){.  UNUSED
1aea0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
1aeb0 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64  ;.  return (void
1aec0 28 2a 29 28 76 6f 69 64 29 29 6f 73 47 65 74 50  (*)(void))osGetP
1aed0 72 6f 63 41 64 64 72 65 73 73 41 28 28 48 41 4e  rocAddressA((HAN
1aee0 44 4c 45 29 70 48 61 6e 64 6c 65 2c 20 7a 53 79  DLE)pHandle, zSy
1aef0 6d 62 6f 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20  mbol);.}.static 
1af00 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28  void winDlClose(
1af10 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1af20 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65  s, void *pHandle
1af30 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
1af40 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 6f  METER(pVfs);.  o
1af50 73 46 72 65 65 4c 69 62 72 61 72 79 28 28 48 41  sFreeLibrary((HA
1af60 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a 7d  NDLE)pHandle);.}
1af70 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c  .#else /* if SQL
1af80 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
1af90 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e  TENSION is defin
1afa0 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ed: */.  #define
1afb0 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a 20 20   winDlOpen  0.  
1afc0 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 45 72 72  #define winDlErr
1afd0 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77  or 0.  #define w
1afe0 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64  inDlSym   0.  #d
1aff0 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f 73 65  efine winDlClose
1b000 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a   0.#endif.../*.*
1b010 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20 6e 42  * Write up to nB
1b020 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64  uf bytes of rand
1b030 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75 66  omness into zBuf
1b040 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b050 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71  winRandomness(sq
1b060 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
1b070 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
1b080 2a 7a 42 75 66 29 7b 0a 20 20 69 6e 74 20 6e 20  *zBuf){.  int n 
1b090 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  = 0;.  UNUSED_PA
1b0a0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23  RAMETER(pVfs);.#
1b0b0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1b0c0 45 5f 54 45 53 54 29 0a 20 20 6e 20 3d 20 6e 42  E_TEST).  n = nB
1b0d0 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75  uf;.  memset(zBu
1b0e0 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 65 6c  f, 0, nBuf);.#el
1b0f0 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28  se.  if( sizeof(
1b100 53 59 53 54 45 4d 54 49 4d 45 29 3c 3d 6e 42 75  SYSTEMTIME)<=nBu
1b110 66 2d 6e 20 29 7b 0a 20 20 20 20 53 59 53 54 45  f-n ){.    SYSTE
1b120 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20 6f 73 47  MTIME x;.    osG
1b130 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26 78 29  etSystemTime(&x)
1b140 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
1b150 75 66 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a 65 6f  uf[n], &x, sizeo
1b160 66 28 78 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  f(x));.    n += 
1b170 73 69 7a 65 6f 66 28 78 29 3b 0a 20 20 7d 0a 20  sizeof(x);.  }. 
1b180 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52   if( sizeof(DWOR
1b190 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20  D)<=nBuf-n ){.  
1b1a0 20 20 44 57 4f 52 44 20 70 69 64 20 3d 20 6f 73    DWORD pid = os
1b1b0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1b1c0 73 49 64 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70  sId();.    memcp
1b1d0 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 70 69 64  y(&zBuf[n], &pid
1b1e0 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a  , sizeof(pid));.
1b1f0 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
1b200 70 69 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pid);.  }.  if( 
1b210 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e  sizeof(DWORD)<=n
1b220 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f  Buf-n ){.    DWO
1b230 52 44 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69  RD cnt = osGetTi
1b240 63 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20 6d  ckCount();.    m
1b250 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
1b260 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74  &cnt, sizeof(cnt
1b270 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ));.    n += siz
1b280 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 20 20  eof(cnt);.  }.  
1b290 69 66 28 20 73 69 7a 65 6f 66 28 4c 41 52 47 45  if( sizeof(LARGE
1b2a0 5f 49 4e 54 45 47 45 52 29 3c 3d 6e 42 75 66 2d  _INTEGER)<=nBuf-
1b2b0 6e 20 29 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49  n ){.    LARGE_I
1b2c0 4e 54 45 47 45 52 20 69 3b 0a 20 20 20 20 6f 73  NTEGER i;.    os
1b2d0 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65  QueryPerformance
1b2e0 43 6f 75 6e 74 65 72 28 26 69 29 3b 0a 20 20 20  Counter(&i);.   
1b2f0 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d   memcpy(&zBuf[n]
1b300 2c 20 26 69 2c 20 73 69 7a 65 6f 66 28 69 29 29  , &i, sizeof(i))
1b310 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
1b320 66 28 69 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  f(i);.  }.#endif
1b330 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
1b340 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72  ./*.** Sleep for
1b350 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e   a little while.
1b360 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f    Return the amo
1b370 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70  unt of time slep
1b380 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1b390 20 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 74 65   winSleep(sqlite
1b3a0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
1b3b0 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 70 6f   microsec){.  po
1b3c0 72 74 61 62 6c 65 53 6c 65 65 70 28 28 6d 69 63  rtableSleep((mic
1b3d0 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29  rosec+999)/1000)
1b3e0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1b3f0 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65  ETER(pVfs);.  re
1b400 74 75 72 6e 20 28 28 6d 69 63 72 6f 73 65 63 2b  turn ((microsec+
1b410 39 39 39 29 2f 31 30 30 30 29 2a 31 30 30 30 3b  999)/1000)*1000;
1b420 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
1b430 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
1b440 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f  , if set to a no
1b450 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73  n-zero value, is
1b460 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a   interpreted as.
1b470 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
1b480 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
1b490 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20  970 and is used 
1b4a0 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c  to set the resul
1b4b0 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f  t of.** sqlite3O
1b4c0 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64  sCurrentTime() d
1b4d0 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a  uring testing..*
1b4e0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1b4f0 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
1b500 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20  _current_time = 
1b510 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74  0;  /* Fake syst
1b520 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e  em time in secon
1b530 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a  ds since 1970. *
1b540 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
1b550 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
1b560 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
1b570 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
1b580 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e  Time).  Write in
1b590 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65  to *piNow.** the
1b5a0 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
1b5b0 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
1b5c0 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69  an Day number ti
1b5d0 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20  mes 86_400_000. 
1b5e0 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72   In.** other wor
1b5f0 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a  ds, write into *
1b600 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72  piNow the number
1b610 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
1b620 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61   since the Julia
1b630 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f  n.** epoch of no
1b640 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20  on in Greenwich 
1b650 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20  on November 24, 
1b660 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69  4714 B.C accordi
1b670 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f  ng to the.** pro
1b680 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e  leptic Gregorian
1b690 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a   calendar..**.**
1b6a0 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   On success, ret
1b6b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20  urn SQLITE_OK.  
1b6c0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  Return SQLITE_ER
1b6d0 52 4f 52 20 69 66 20 74 68 65 20 74 69 6d 65 20  ROR if the time 
1b6e0 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e  and date .** can
1b6f0 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
1b700 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43  .static int winC
1b710 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
1b720 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1b730 73 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  s, sqlite3_int64
1b740 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46   *piNow){.  /* F
1b750 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74 75 72  ILETIME structur
1b760 65 20 69 73 20 61 20 36 34 2d 62 69 74 20 76 61  e is a 64-bit va
1b770 6c 75 65 20 72 65 70 72 65 73 65 6e 74 69 6e 67  lue representing
1b780 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a   the number of .
1b790 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65 63       100-nanosec
1b7a0 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 20 73 69  ond intervals si
1b7b0 6e 63 65 20 4a 61 6e 75 61 72 79 20 31 2c 20 31  nce January 1, 1
1b7c0 36 30 31 20 28 3d 20 4a 44 20 32 33 30 35 38 31  601 (= JD 230581
1b7d0 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20 20 46 49  3.5). .  */.  FI
1b7e0 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 73 74 61  LETIME ft;.  sta
1b7f0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
1b800 33 5f 69 6e 74 36 34 20 77 69 6e 46 69 6c 65 74  3_int64 winFilet
1b810 69 6d 65 45 70 6f 63 68 20 3d 20 32 33 30 35 38  imeEpoch = 23058
1b820 31 33 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  135*(sqlite3_int
1b830 36 34 29 38 36 34 30 30 30 30 3b 0a 23 69 66 64  64)8640000;.#ifd
1b840 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1b850 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
1b860 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78  lite3_int64 unix
1b870 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35  Epoch = 24405875
1b880 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
1b890 38 36 34 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a  8640000;.#endif.
1b8a0 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74 6f 20 61    /* 2^32 - to a
1b8b0 76 6f 69 64 20 75 73 65 20 6f 66 20 4c 4c 20 61  void use of LL a
1b8c0 6e 64 20 77 61 72 6e 69 6e 67 73 20 69 6e 20 67  nd warnings in g
1b8d0 63 63 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63  cc */.  static c
1b8e0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
1b8f0 36 34 20 6d 61 78 33 32 42 69 74 56 61 6c 75 65  64 max32BitValue
1b900 20 3d 20 0a 20 20 20 20 20 20 28 73 71 6c 69 74   = .      (sqlit
1b910 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30  e3_int64)2000000
1b920 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 69  000 + (sqlite3_i
1b930 6e 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20  nt64)2000000000 
1b940 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  + (sqlite3_int64
1b950 29 32 39 34 39 36 37 32 39 36 3b 0a 0a 23 69 66  )294967296;..#if
1b960 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
1b970 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69  .  SYSTEMTIME ti
1b980 6d 65 3b 0a 20 20 6f 73 47 65 74 53 79 73 74 65  me;.  osGetSyste
1b990 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20  mTime(&time);.  
1b9a0 2f 2a 20 69 66 20 53 79 73 74 65 6d 54 69 6d 65  /* if SystemTime
1b9b0 54 6f 46 69 6c 65 54 69 6d 65 28 29 20 66 61 69  ToFileTime() fai
1b9c0 6c 73 2c 20 69 74 20 72 65 74 75 72 6e 73 20 7a  ls, it returns z
1b9d0 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21 6f  ero. */.  if (!o
1b9e0 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c  sSystemTimeToFil
1b9f0 65 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74 29  eTime(&time,&ft)
1ba00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1ba10 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
1ba20 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73  #else.  osGetSys
1ba30 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
1ba40 65 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66  e( &ft );.#endif
1ba50 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e  ..  *piNow = win
1ba60 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a  FiletimeEpoch +.
1ba70 20 20 20 20 20 20 20 20 20 20 20 20 28 28 28 28              ((((
1ba80 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74  sqlite3_int64)ft
1ba90 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 29  .dwHighDateTime)
1baa0 2a 6d 61 78 33 32 42 69 74 56 61 6c 75 65 29 20  *max32BitValue) 
1bab0 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  + .             
1bac0 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34    (sqlite3_int64
1bad0 29 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d  )ft.dwLowDateTim
1bae0 65 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  e)/(sqlite3_int6
1baf0 34 29 31 30 30 30 30 3b 0a 0a 23 69 66 64 65 66  4)10000;..#ifdef
1bb00 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
1bb10 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  f( sqlite3_curre
1bb20 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a  nt_time ){.    *
1bb30 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71  piNow = 1000*(sq
1bb40 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69  lite3_int64)sqli
1bb50 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
1bb60 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20   + unixEpoch;.  
1bb70 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45  }.#endif.  UNUSE
1bb80 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
1bb90 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1bba0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1bbb0 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
1bbc0 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
1bbd0 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
1bbe0 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68  Time).  Write th
1bbf0 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d  e.** current tim
1bc00 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
1bc10 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
1bc20 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e  r into *prNow an
1bc30 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20  d.** return 0.  
1bc40 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
1bc50 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61  time and date ca
1bc60 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
1bc70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1bc80 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69  CurrentTime(sqli
1bc90 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64  te3_vfs *pVfs, d
1bca0 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20  ouble *prNow){. 
1bcb0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
1bcc0 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72 63  e3_int64 i;.  rc
1bcd0 20 3d 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d   = winCurrentTim
1bce0 65 49 6e 74 36 34 28 70 56 66 73 2c 20 26 69 29  eInt64(pVfs, &i)
1bcf0 3b 0a 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20  ;.  if( !rc ){. 
1bd00 20 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36     *prNow = i/86
1bd10 34 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20  400000.0;.  }.  
1bd20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1bd30 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20  .** The idea is 
1bd40 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69  that this functi
1bd50 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20  on works like a 
1bd60 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a  combination of.*
1bd70 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  * GetLastError()
1bd80 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73 61   and FormatMessa
1bd90 67 65 28 29 20 6f 6e 20 57 69 6e 64 6f 77 73 20  ge() on Windows 
1bda0 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a  (or errno and.**
1bdb0 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e   strerror_r() on
1bdc0 20 55 6e 69 78 29 2e 20 41 66 74 65 72 20 61 6e   Unix). After an
1bdd0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
1bde0 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66  ed by an OS.** f
1bdf0 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20  unction, SQLite 
1be00 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
1be10 69 6f 6e 20 77 69 74 68 20 7a 42 75 66 20 70 6f  ion with zBuf po
1be20 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62  inting to.** a b
1be30 75 66 66 65 72 20 6f 66 20 6e 42 75 66 20 62 79  uffer of nBuf by
1be40 74 65 73 2e 20 54 68 65 20 4f 53 20 6c 61 79 65  tes. The OS laye
1be50 72 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74  r should populat
1be60 65 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 20  e the.** buffer 
1be70 77 69 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69  with a nul-termi
1be80 6e 61 74 65 64 20 55 54 46 2d 38 20 65 6e 63 6f  nated UTF-8 enco
1be90 64 65 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ded error messag
1bea0 65 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20  e.** describing 
1beb0 74 68 65 20 6c 61 73 74 20 49 4f 20 65 72 72 6f  the last IO erro
1bec0 72 20 74 6f 20 68 61 76 65 20 6f 63 63 75 72 72  r to have occurr
1bed0 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61  ed within the ca
1bee0 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e  lling.** thread.
1bef0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72  .**.** If the er
1bf00 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 74  ror message is t
1bf10 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20 74 68 65  oo large for the
1bf20 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72   supplied buffer
1bf30 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20 62  ,.** it should b
1bf40 65 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65  e truncated. The
1bf50 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
1bf60 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a   xGetLastError.*
1bf70 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65  * is zero if the
1bf80 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
1bf90 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65  its in the buffe
1bfa0 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a  r, or non-zero.*
1bfb0 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20  * otherwise (if 
1bfc0 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20  the message was 
1bfd0 74 72 75 6e 63 61 74 65 64 29 2e 20 49 66 20 6e  truncated). If n
1bfe0 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72  on-zero is retur
1bff0 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20  ned,.** then it 
1c000 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
1c010 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20   to include the 
1c020 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63  nul-terminator c
1c030 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74  haracter.** in t
1c040 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
1c050 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70  ..**.** Not supp
1c060 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d  lying an error m
1c070 65 73 73 61 67 65 20 77 69 6c 6c 20 68 61 76 65  essage will have
1c080 20 6e 6f 20 61 64 76 65 72 73 65 20 65 66 66 65   no adverse effe
1c090 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e  ct.** on SQLite.
1c0a0 20 49 74 20 69 73 20 66 69 6e 65 20 74 6f 20 68   It is fine to h
1c0b0 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74  ave an implement
1c0c0 61 74 69 6f 6e 20 74 68 61 74 20 6e 65 76 65 72  ation that never
1c0d0 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65  .** returns an e
1c0e0 72 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a  rror message:.**
1c0f0 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65 74 4c 61  .**   int xGetLa
1c100 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  stError(sqlite3_
1c110 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
1c120 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
1c130 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28  {.**     assert(
1c140 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a  zBuf[0]=='\0');.
1c150 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  **     return 0;
1c160 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f  .**   }.**.** Ho
1c170 77 65 76 65 72 20 69 66 20 61 6e 20 65 72 72 6f  wever if an erro
1c180 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 75 70  r message is sup
1c190 70 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c 20 62  plied, it will b
1c1a0 65 20 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a  e incorporated.*
1c1b0 2a 20 62 79 20 73 71 6c 69 74 65 20 69 6e 74 6f  * by sqlite into
1c1c0 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
1c1d0 67 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ge available to 
1c1e0 74 68 65 20 75 73 65 72 20 75 73 69 6e 67 0a 2a  the user using.*
1c1f0 2a 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  * sqlite3_errmsg
1c200 28 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b  (), possibly mak
1c210 69 6e 67 20 49 4f 20 65 72 72 6f 72 73 20 65 61  ing IO errors ea
1c220 73 69 65 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a  sier to debug..*
1c230 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1c240 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c  GetLastError(sql
1c250 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
1c260 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
1c270 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f  zBuf){.  UNUSED_
1c280 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
1c290 0a 20 20 72 65 74 75 72 6e 20 67 65 74 4c 61 73  .  return getLas
1c2a0 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c  tErrorMsg(osGetL
1c2b0 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 66  astError(), nBuf
1c2c0 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , zBuf);.}../*.*
1c2d0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64  * Initialize and
1c2e0 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68   deinitialize th
1c2f0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
1c300 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  em interface..*/
1c310 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
1c320 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73 74  init(void){.  st
1c330 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
1c340 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20   winVfs = {.    
1c350 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3,              
1c360 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
1c370 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77   */.    sizeof(w
1c380 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20  inFile),     /* 
1c390 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20  szOsFile */.    
1c3a0 4d 41 58 5f 50 41 54 48 2c 20 20 20 20 20 20 20  MAX_PATH,       
1c3b0 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61       /* mxPathna
1c3c0 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  me */.    0,    
1c3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c3e0 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22  * pNext */.    "
1c3f0 77 69 6e 33 32 22 2c 20 20 20 20 20 20 20 20 20  win32",         
1c400 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a      /* zName */.
1c410 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
1c420 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70           /* pApp
1c430 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f  Data */.    winO
1c440 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pen,            
1c450 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20   /* xOpen */.   
1c460 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20   winDelete,     
1c470 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65        /* xDelete
1c480 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73   */.    winAcces
1c490 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
1c4a0 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77  xAccess */.    w
1c4b0 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  inFullPathname, 
1c4c0 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68      /* xFullPath
1c4d0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44  name */.    winD
1c4e0 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  lOpen,          
1c4f0 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20   /* xDlOpen */. 
1c500 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20     winDlError,  
1c510 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72          /* xDlEr
1c520 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ror */.    winDl
1c530 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sym,            
1c540 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20  /* xDlSym */.   
1c550 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20   winDlClose,    
1c560 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
1c570 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64  e */.    winRand
1c580 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a  omness,       /*
1c590 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a   xRandomness */.
1c5a0 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20      winSleep,   
1c5b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65           /* xSle
1c5c0 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  ep */.    winCur
1c5d0 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f  rentTime,      /
1c5e0 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a  * xCurrentTime *
1c5f0 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74  /.    winGetLast
1c600 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47  Error,     /* xG
1c610 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20  etLastError */. 
1c620 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d     winCurrentTim
1c630 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72  eInt64, /* xCurr
1c640 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a  entTimeInt64 */.
1c650 20 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d      winSetSystem
1c660 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74  Call,    /* xSet
1c670 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
1c680 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61    winGetSystemCa
1c690 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79  ll,    /* xGetSy
1c6a0 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
1c6b0 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  winNextSystemCal
1c6c0 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73  l,   /* xNextSys
1c6d0 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a  temCall */.  };.
1c6e0 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63 68 65  .  /* Double-che
1c6f0 63 6b 20 74 68 61 74 20 74 68 65 20 61 53 79 73  ck that the aSys
1c700 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68 61 73  call[] array has
1c710 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65   been constructe
1c720 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79  d.  ** correctly
1c730 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b 62  .  See ticket [b
1c740 62 33 61 38 36 65 38 39 30 63 38 65 39 36 61 62  b3a86e890c8e96ab
1c750 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 41  ] */.  assert( A
1c760 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c  rraySize(aSyscal
1c770 6c 29 3d 3d 36 35 20 29 3b 0a 0a 23 69 66 20 53  l)==65 );..#if S
1c780 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
1c790 20 73 6c 65 65 70 4f 62 6a 20 3d 20 6f 73 43 72   sleepObj = osCr
1c7a0 65 61 74 65 45 76 65 6e 74 45 78 28 4e 55 4c 4c  eateEventEx(NULL
1c7b0 2c 20 4e 55 4c 4c 2c 20 43 52 45 41 54 45 5f 45  , NULL, CREATE_E
1c7c0 56 45 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45 53 45  VENT_MANUAL_RESE
1c7d0 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  T, .            
1c7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7f0 20 20 20 20 20 20 45 56 45 4e 54 5f 41 4c 4c 5f        EVENT_ALL_
1c800 41 43 43 45 53 53 29 3b 0a 23 65 6e 64 69 66 0a  ACCESS);.#endif.
1c810 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1c820 4f 4d 49 54 5f 57 41 4c 0a 20 20 2f 2a 20 67 65  OMIT_WAL.  /* ge
1c830 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61 6c 6c  t memory map all
1c840 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c 61 72  ocation granular
1c850 69 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ity */.  memset(
1c860 26 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30 2c 20  &winSysInfo, 0, 
1c870 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f 49 4e  sizeof(SYSTEM_IN
1c880 46 4f 29 29 3b 0a 20 20 6f 73 47 65 74 53 79 73  FO));.  osGetSys
1c890 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49  temInfo(&winSysI
1c8a0 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 77  nfo);.  assert(w
1c8b0 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f  inSysInfo.dwAllo
1c8c0 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74  cationGranularit
1c8d0 79 20 3e 20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a  y > 0);.#endif..
1c8e0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
1c8f0 67 69 73 74 65 72 28 26 77 69 6e 56 66 73 2c 20  gister(&winVfs, 
1c900 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  1);.  return SQL
1c910 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 69 6e 74 20  ITE_OK; .}..int 
1c920 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76  sqlite3_os_end(v
1c930 6f 69 64 29 7b 20 0a 23 69 66 20 53 51 4c 49 54  oid){ .#if SQLIT
1c940 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 6f 73 43  E_OS_WINRT.  osC
1c950 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c 65 65 70  loseHandle(sleep
1c960 4f 62 6a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  Obj);.#endif.  r
1c970 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c980 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
1c990 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a     LITE_OS_WIN */.