/ Hex Artifact Content
Login

Artifact c7b26b78c5e62de7355ad79e0ce79d7b0f5fccc4:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59   */..#ifdef __CY
0220: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0230: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0240: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
0250: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
0260: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
0270: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
0280: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
0290: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 53  mmon.h"../*.** S
02a0: 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f  ome Microsoft co
02b0: 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69  mpilers lack thi
02c0: 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f  s definition..*/
02d0: 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44  .#ifndef INVALID
02e0: 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
02f0: 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49  .# define INVALI
0300: 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
0310: 53 20 28 28 44 57 4f 52 44 29 2d 31 29 20 0a 23  S ((DWORD)-1) .#
0320: 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72  endif../* Forwar
0330: 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a  d references */.
0340: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
0350: 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20 20 20  inShm winShm;   
0360: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6e          /* A con
0370: 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65  nection to share
0380: 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65  d-memory */.type
0390: 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 53 68  def struct winSh
03a0: 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f 64 65  mNode winShmNode
03b0: 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f 6e 20  ;   /* A region 
03c0: 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
03d0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 43 45   */../*.** WinCE
03e0: 20 6c 61 63 6b 73 20 6e 61 74 69 76 65 20 73 75   lacks native su
03f0: 70 70 6f 72 74 20 66 6f 72 20 66 69 6c 65 20 6c  pport for file l
0400: 6f 63 6b 69 6e 67 20 73 6f 20 77 65 20 68 61 76  ocking so we hav
0410: 65 20 74 6f 20 66 61 6b 65 20 69 74 0a 2a 2a 20  e to fake it.** 
0420: 77 69 74 68 20 73 6f 6d 65 20 63 6f 64 65 20 6f  with some code o
0430: 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a 23 69  f our own..*/.#i
0440: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
0450: 45 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  E.typedef struct
0460: 20 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20 20 69   winceLock {.  i
0470: 6e 74 20 6e 52 65 61 64 65 72 73 3b 20 20 20 20  nt nReaders;    
0480: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0490: 72 65 61 64 65 72 20 6c 6f 63 6b 73 20 6f 62 74  reader locks obt
04a0: 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ained */.  BOOL 
04b0: 62 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 2f  bPending;      /
04c0: 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20 70 65  * Indicates a pe
04d0: 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62  nding lock has b
04e0: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a  een obtained */.
04f0: 20 20 42 4f 4f 4c 20 62 52 65 73 65 72 76 65 64    BOOL bReserved
0500: 3b 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74  ;     /* Indicat
0510: 65 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  es a reserved lo
0520: 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61  ck has been obta
0530: 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  ined */.  BOOL b
0540: 45 78 63 6c 75 73 69 76 65 3b 20 20 20 20 2f 2a  Exclusive;    /*
0550: 20 49 6e 64 69 63 61 74 65 73 20 61 6e 20 65 78   Indicates an ex
0560: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 68 61 73  clusive lock has
0570: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a   been obtained *
0580: 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b 0a 23  /.} winceLock;.#
0590: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
05a0: 20 77 69 6e 46 69 6c 65 20 73 74 72 75 63 74 75   winFile structu
05b0: 72 65 20 69 73 20 61 20 73 75 62 63 6c 61 73 73  re is a subclass
05c0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   of sqlite3_file
05d0: 2a 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68  * specific to th
05e0: 65 20 77 69 6e 33 32 0a 2a 2a 20 70 6f 72 74 61  e win32.** porta
05f0: 62 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a 2f  bility layer..*/
0600: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0610: 77 69 6e 46 69 6c 65 20 77 69 6e 46 69 6c 65 3b  winFile winFile;
0620: 0a 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20  .struct winFile 
0630: 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  {.  const sqlite
0640: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d  3_io_methods *pM
0650: 65 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75 73 74  ethod; /*** Must
0660: 20 62 65 20 66 69 72 73 74 20 2a 2a 2a 2f 0a 20   be first ***/. 
0670: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
0680: 66 73 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  fs;      /* The 
0690: 56 46 53 20 75 73 65 64 20 74 6f 20 6f 70 65 6e  VFS used to open
06a0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
06b0: 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20 20  HANDLE h;       
06c0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
06d0: 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20  e for accessing 
06e0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  the file */.  u8
06f0: 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20   locktype;      
0700: 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
0710: 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79 20   lock currently 
0720: 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 69 6c  held on this fil
0730: 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73 68 61  e */.  short sha
0740: 72 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20 20 2f  redLockByte;   /
0750: 2a 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f 73 65  * Randomly chose
0760: 6e 20 62 79 74 65 20 75 73 65 64 20 61 73 20 61  n byte used as a
0770: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a   shared lock */.
0780: 20 20 75 38 20 63 74 72 6c 46 6c 61 67 73 3b 20    u8 ctrlFlags; 
0790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
07a0: 67 73 2e 20 20 53 65 65 20 57 49 4e 46 49 4c 45  gs.  See WINFILE
07b0: 5f 2a 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 44 57  _* below */.  DW
07c0: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  ORD lastErrno;  
07d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e        /* The Win
07e0: 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20  dows errno from 
07f0: 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72  the last I/O err
0800: 6f 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  or */.  winShm *
0810: 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pShm;           
0820: 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20 73  /* Instance of s
0830: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e 20  hared memory on 
0840: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 63  this file */.  c
0850: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
0860: 3b 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70  ;      /* Full p
0870: 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 69 73 20  athname of this 
0880: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  file */.  int sz
0890: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
08a0: 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65 20    /* Chunk size 
08b0: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46 43  configured by FC
08c0: 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2a  NTL_CHUNK_SIZE *
08d0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
08e0: 57 49 4e 43 45 0a 20 20 4c 50 57 53 54 52 20 7a  WINCE.  LPWSTR z
08f0: 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20 20  DeleteOnClose;  
0900: 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
0910: 74 6f 20 64 65 6c 65 74 65 20 77 68 65 6e 20 63  to delete when c
0920: 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e 44  losing */.  HAND
0930: 4c 45 20 68 4d 75 74 65 78 3b 20 20 20 20 20 20  LE hMutex;      
0940: 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 75 73 65      /* Mutex use
0950: 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63  d to control acc
0960: 65 73 73 20 74 6f 20 73 68 61 72 65 64 20 6c 6f  ess to shared lo
0970: 63 6b 20 2a 2f 20 20 0a 20 20 48 41 4e 44 4c 45  ck */  .  HANDLE
0980: 20 68 53 68 61 72 65 64 3b 20 20 20 20 20 20 20   hShared;       
0990: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
09a0: 72 79 20 73 65 67 6d 65 6e 74 20 75 73 65 64 20  ry segment used 
09b0: 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20  for locking */. 
09c0: 20 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c   winceLock local
09d0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b  ;        /* Lock
09e0: 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68  s obtained by th
09f0: 69 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 77  is instance of w
0a00: 69 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 63  inFile */.  winc
0a10: 65 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20 20  eLock *shared;  
0a20: 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 68      /* Global sh
0a30: 61 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79  ared lock memory
0a40: 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 20 2a   for the file  *
0a50: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
0a60: 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  ** Allowed value
0a70: 73 20 66 6f 72 20 77 69 6e 46 69 6c 65 2e 63 74  s for winFile.ct
0a80: 72 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69  rlFlags.*/.#defi
0a90: 6e 65 20 57 49 4e 46 49 4c 45 5f 50 45 52 53 49  ne WINFILE_PERSI
0aa0: 53 54 5f 57 41 4c 20 20 20 20 20 30 78 30 34 20  ST_WAL     0x04 
0ab0: 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74 20    /* Persistent 
0ac0: 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 64 65 66  WAL mode */.#def
0ad0: 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57  ine WINFILE_PSOW
0ae0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31 30              0x10
0af0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43     /* SQLITE_IOC
0b00: 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
0b10: 52 57 52 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 20 2a  RWRITE */../*. *
0b20: 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   If compiled wit
0b30: 68 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  h SQLITE_WIN32_M
0b40: 41 4c 4c 4f 43 20 6f 6e 20 57 69 6e 64 6f 77 73  ALLOC on Windows
0b50: 2c 20 77 65 20 77 69 6c 6c 20 75 73 65 20 74 68  , we will use th
0b60: 65 0a 20 2a 20 76 61 72 69 6f 75 73 20 57 69 6e  e. * various Win
0b70: 33 32 20 41 50 49 20 68 65 61 70 20 66 75 6e 63  32 API heap func
0b80: 74 69 6f 6e 73 20 69 6e 73 74 65 61 64 20 6f 66  tions instead of
0b90: 20 6f 75 72 20 6f 77 6e 2e 0a 20 2a 2f 0a 23 69   our own.. */.#i
0ba0: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
0bb0: 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 20 2a 20 54  2_MALLOC./*. * T
0bc0: 68 65 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20  he initial size 
0bd0: 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  of the Win32-spe
0be0: 63 69 66 69 63 20 68 65 61 70 2e 20 20 54 68 69  cific heap.  Thi
0bf0: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  s value may be z
0c00: 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ero.. */.#ifndef
0c10: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
0c20: 41 50 5f 49 4e 49 54 5f 53 49 5a 45 0a 23 20 20  AP_INIT_SIZE.#  
0c30: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
0c40: 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49  N32_HEAP_INIT_SI
0c50: 5a 45 20 28 28 53 51 4c 49 54 45 5f 44 45 46 41  ZE ((SQLITE_DEFA
0c60: 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 20  ULT_CACHE_SIZE) 
0c70: 2a 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  * \.            
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c90: 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49             (SQLI
0ca0: 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
0cb0: 53 49 5a 45 29 20 2b 20 34 31 39 34 33 30 34 29  SIZE) + 4194304)
0cc0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
0cd0: 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20  he maximum size 
0ce0: 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  of the Win32-spe
0cf0: 63 69 66 69 63 20 68 65 61 70 2e 20 20 54 68 69  cific heap.  Thi
0d00: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  s value may be z
0d10: 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ero.. */.#ifndef
0d20: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
0d30: 41 50 5f 4d 41 58 5f 53 49 5a 45 0a 23 20 20 64  AP_MAX_SIZE.#  d
0d40: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
0d50: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45  32_HEAP_MAX_SIZE
0d60: 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a    (0).#endif../*
0d70: 0a 20 2a 20 54 68 65 20 65 78 74 72 61 20 66 6c  . * The extra fl
0d80: 61 67 73 20 74 6f 20 75 73 65 20 69 6e 20 63 61  ags to use in ca
0d90: 6c 6c 73 20 74 6f 20 74 68 65 20 57 69 6e 33 32  lls to the Win32
0da0: 20 68 65 61 70 20 41 50 49 73 2e 20 20 54 68 69   heap APIs.  Thi
0db0: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 0a 20  s value may be. 
0dc0: 2a 20 7a 65 72 6f 20 66 6f 72 20 74 68 65 20 64  * zero for the d
0dd0: 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f 72 2e  efault behavior.
0de0: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
0df0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
0e00: 4c 41 47 53 0a 23 20 20 64 65 66 69 6e 65 20 53  LAGS.#  define S
0e10: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
0e20: 5f 46 4c 41 47 53 20 20 20 20 20 28 30 29 0a 23  _FLAGS     (0).#
0e30: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
0e40: 20 77 69 6e 4d 65 6d 44 61 74 61 20 73 74 72 75   winMemData stru
0e50: 63 74 75 72 65 20 73 74 6f 72 65 73 20 69 6e 66  cture stores inf
0e60: 6f 72 6d 61 74 69 6f 6e 20 72 65 71 75 69 72 65  ormation require
0e70: 64 20 62 79 20 74 68 65 20 57 69 6e 33 32 2d 73  d by the Win32-s
0e80: 70 65 63 69 66 69 63 0a 2a 2a 20 73 71 6c 69 74  pecific.** sqlit
0e90: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 69  e3_mem_methods i
0ea0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a  mplementation..*
0eb0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0ec0: 20 77 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 4d   winMemData winM
0ed0: 65 6d 44 61 74 61 3b 0a 73 74 72 75 63 74 20 77  emData;.struct w
0ee0: 69 6e 4d 65 6d 44 61 74 61 20 7b 0a 23 69 66 6e  inMemData {.#ifn
0ef0: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 75 33 32  def NDEBUG.  u32
0f00: 20 6d 61 67 69 63 3b 20 20 20 20 2f 2a 20 4d 61   magic;    /* Ma
0f10: 67 69 63 20 6e 75 6d 62 65 72 20 74 6f 20 64 65  gic number to de
0f20: 74 65 63 74 20 73 74 72 75 63 74 75 72 65 20 63  tect structure c
0f30: 6f 72 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65  orruption. */.#e
0f40: 6e 64 69 66 0a 20 20 48 41 4e 44 4c 45 20 68 48  ndif.  HANDLE hH
0f50: 65 61 70 3b 20 2f 2a 20 54 68 65 20 68 61 6e 64  eap; /* The hand
0f60: 6c 65 20 74 6f 20 6f 75 72 20 68 65 61 70 2e 20  le to our heap. 
0f70: 2a 2f 0a 20 20 42 4f 4f 4c 20 62 4f 77 6e 65 64  */.  BOOL bOwned
0f80: 3b 20 20 2f 2a 20 44 6f 20 77 65 20 6f 77 6e 20  ;  /* Do we own 
0f90: 74 68 65 20 68 65 61 70 20 28 69 2e 65 2e 20 64  the heap (i.e. d
0fa0: 65 73 74 72 6f 79 20 69 74 20 6f 6e 20 73 68 75  estroy it on shu
0fb0: 74 64 6f 77 6e 29 3f 20 2a 2f 0a 7d 3b 0a 0a 23  tdown)? */.};..#
0fc0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64  ifndef NDEBUG.#d
0fd0: 65 66 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47  efine WINMEM_MAG
0fe0: 49 43 20 20 20 20 20 30 78 34 32 62 32 38 33 30  IC     0x42b2830
0ff0: 62 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63  b.#endif..static
1000: 20 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61   struct winMemDa
1010: 74 61 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 20  ta win_mem_data 
1020: 3d 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  = {.#ifndef NDEB
1030: 55 47 0a 20 20 57 49 4e 4d 45 4d 5f 4d 41 47 49  UG.  WINMEM_MAGI
1040: 43 2c 0a 23 65 6e 64 69 66 0a 20 20 4e 55 4c 4c  C,.#endif.  NULL
1050: 2c 20 46 41 4c 53 45 0a 7d 3b 0a 0a 23 69 66 6e  , FALSE.};..#ifn
1060: 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66 69  def NDEBUG.#defi
1070: 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  ne winMemAssertM
1080: 61 67 69 63 28 29 20 61 73 73 65 72 74 28 20 77  agic() assert( w
1090: 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69  in_mem_data.magi
10a0: 63 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20  c==WINMEM_MAGIC 
10b0: 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ).#else.#define 
10c0: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
10d0: 63 28 29 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66  c().#endif..#def
10e0: 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  ine winMemGetHea
10f0: 70 28 29 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61  p() win_mem_data
1100: 2e 68 48 65 61 70 0a 0a 73 74 61 74 69 63 20 76  .hHeap..static v
1110: 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f  oid *winMemMallo
1120: 63 28 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73  c(int nBytes);.s
1130: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65  tatic void winMe
1140: 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69  mFree(void *pPri
1150: 6f 72 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  or);.static void
1160: 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28   *winMemRealloc(
1170: 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e  void *pPrior, in
1180: 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69  t nBytes);.stati
1190: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65  c int winMemSize
11a0: 28 76 6f 69 64 20 2a 70 29 3b 0a 73 74 61 74 69  (void *p);.stati
11b0: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e  c int winMemRoun
11c0: 64 75 70 28 69 6e 74 20 6e 29 3b 0a 73 74 61 74  dup(int n);.stat
11d0: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69  ic int winMemIni
11e0: 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  t(void *pAppData
11f0: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  );.static void w
1200: 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f  inMemShutdown(vo
1210: 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 0a  id *pAppData);..
1220: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65  const sqlite3_me
1230: 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74  m_methods *sqlit
1240: 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f  e3MemGetWin32(vo
1250: 69 64 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  id);.#endif /* S
1260: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
1270: 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OC */../*.** The
1280: 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
1290: 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c 79  ble is (normally
12a0: 29 20 73 65 74 20 6f 6e 63 65 20 61 6e 64 20 6e  ) set once and n
12b0: 65 76 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a 20  ever changes.** 
12c0: 74 68 65 72 65 61 66 74 65 72 2e 20 20 49 74 20  thereafter.  It 
12d0: 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72 20  records whether 
12e0: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
12f0: 73 74 65 6d 20 69 73 20 57 69 6e 39 78 0a 2a 2a  stem is Win9x.**
1300: 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a   or WinNT..**.**
1310: 20 30 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20   0:   Operating 
1320: 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a  system unknown..
1330: 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61 74 69 6e  ** 1:   Operatin
1340: 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39  g system is Win9
1350: 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72 61  x..** 2:   Opera
1360: 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57  ting system is W
1370: 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  inNT..**.** In o
1380: 72 64 65 72 20 74 6f 20 66 61 63 69 6c 69 74 61  rder to facilita
1390: 74 65 20 74 65 73 74 69 6e 67 20 6f 6e 20 61 20  te testing on a 
13a0: 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74 68  WinNT system, th
13b0: 65 20 74 65 73 74 20 66 69 78 74 75 72 65 0a 2a  e test fixture.*
13c0: 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20 73  * can manually s
13d0: 65 74 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f  et this value to
13e0: 20 31 20 74 6f 20 65 6d 75 6c 61 74 65 20 57 69   1 to emulate Wi
13f0: 6e 39 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  n98 behavior..*/
1400: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1410: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
1420: 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6c  os_type = 0;.#el
1430: 73 65 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  se.static int sq
1440: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20  lite3_os_type = 
1450: 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
1460: 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61 6c   Many system cal
1470: 6c 73 20 61 72 65 20 61 63 63 65 73 73 65 64 20  ls are accessed 
1480: 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d  through pointer-
1490: 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20  to-functions so 
14a0: 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79  that.** they may
14b0: 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 61   be overridden a
14c0: 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61 63  t runtime to fac
14d0: 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69 6e  ilitate fault in
14e0: 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a  jection during.*
14f0: 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73 61  * testing and sa
1500: 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20 66  ndboxing.  The f
1510: 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68  ollowing array h
1520: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20 61  olds the names a
1530: 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74  nd pointers.** t
1540: 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61 62  o all overrideab
1550: 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e  le system calls.
1560: 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  .*/.#if !SQLITE_
1570: 4f 53 5f 57 49 4e 43 45 0a 23 20 20 64 65 66 69  OS_WINCE.#  defi
1580: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
1590: 48 41 53 5f 41 4e 53 49 0a 23 65 6e 64 69 66 0a  HAS_ANSI.#endif.
15a0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
15b0: 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  INCE || SQLITE_O
15c0: 53 5f 57 49 4e 4e 54 0a 23 20 20 64 65 66 69 6e  S_WINNT.#  defin
15d0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e SQLITE_WIN32_H
15e0: 41 53 5f 57 49 44 45 0a 23 65 6e 64 69 66 0a 0a  AS_WIDE.#endif..
15f0: 23 69 66 6e 64 65 66 20 53 59 53 43 41 4c 4c 0a  #ifndef SYSCALL.
1600: 23 20 20 64 65 66 69 6e 65 20 53 59 53 43 41 4c  #  define SYSCAL
1610: 4c 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c  L sqlite3_syscal
1620: 6c 5f 70 74 72 0a 23 65 6e 64 69 66 0a 0a 23 69  l_ptr.#endif..#i
1630: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
1640: 45 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 6d 61  E./*.** These ma
1650: 63 72 6f 73 20 61 72 65 20 6e 65 63 65 73 73 61  cros are necessa
1660: 72 79 20 62 65 63 61 75 73 65 20 57 69 6e 64 6f  ry because Windo
1670: 77 73 20 43 45 20 64 6f 65 73 20 6e 6f 74 20 6e  ws CE does not n
1680: 61 74 69 76 65 6c 79 20 73 75 70 70 6f 72 74 20  atively support 
1690: 74 68 65 0a 2a 2a 20 57 69 6e 33 32 20 41 50 49  the.** Win32 API
16a0: 73 20 4c 6f 63 6b 46 69 6c 65 2c 20 55 6e 6c 6f  s LockFile, Unlo
16b0: 63 6b 46 69 6c 65 2c 20 61 6e 64 20 4c 6f 63 6b  ckFile, and Lock
16c0: 46 69 6c 65 45 78 2e 0a 20 2a 2f 0a 0a 23 20 20  FileEx.. */..#  
16d0: 64 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 28  define LockFile(
16e0: 61 2c 62 2c 63 2c 64 2c 65 29 20 20 20 20 20 20  a,b,c,d,e)      
16f0: 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26   winceLockFile(&
1700: 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23  a, b, c, d, e).#
1710: 20 20 64 65 66 69 6e 65 20 55 6e 6c 6f 63 6b 46    define UnlockF
1720: 69 6c 65 28 61 2c 62 2c 63 2c 64 2c 65 29 20 20  ile(a,b,c,d,e)  
1730: 20 20 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69     winceUnlockFi
1740: 6c 65 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20  le(&a, b, c, d, 
1750: 65 29 0a 23 20 20 64 65 66 69 6e 65 20 4c 6f 63  e).#  define Loc
1760: 6b 46 69 6c 65 45 78 28 61 2c 62 2c 63 2c 64 2c  kFileEx(a,b,c,d,
1770: 65 2c 66 29 20 20 20 77 69 6e 63 65 4c 6f 63 6b  e,f)   winceLock
1780: 46 69 6c 65 45 78 28 26 61 2c 20 62 2c 20 63 2c  FileEx(&a, b, c,
1790: 20 64 2c 20 65 2c 20 66 29 0a 0a 2f 2a 0a 2a 2a   d, e, f)../*.**
17a0: 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20 73   These are the s
17b0: 70 65 63 69 61 6c 20 73 79 73 63 61 6c 6c 20 68  pecial syscall h
17c0: 61 63 6b 73 20 66 6f 72 20 57 69 6e 64 6f 77 73  acks for Windows
17d0: 20 43 45 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e   CE.  The lockin
17e0: 67 20 72 65 6c 61 74 65 64 0a 2a 2a 20 64 65 66  g related.** def
17f0: 69 6e 65 73 20 68 65 72 65 20 72 65 66 65 72 20  ines here refer 
1800: 74 6f 20 74 68 65 20 6d 61 63 72 6f 73 20 64 65  to the macros de
1810: 66 69 6e 65 64 20 6a 75 73 74 20 61 62 6f 76 65  fined just above
1820: 2e 0a 20 2a 2f 0a 0a 23 20 20 64 65 66 69 6e 65  .. */..#  define
1830: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
1840: 53 49 28 29 20 20 20 20 20 20 20 31 0a 23 20 20  SI()       1.#  
1850: 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c  define osLockFil
1860: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1870: 20 4c 6f 63 6b 46 69 6c 65 0a 23 20 20 64 65 66   LockFile.#  def
1880: 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65  ine osUnlockFile
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55 6e                Un
18a0: 6c 6f 63 6b 46 69 6c 65 0a 23 20 20 64 65 66 69  lockFile.#  defi
18b0: 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20  ne osLockFileEx 
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 6f 63               Loc
18d0: 6b 46 69 6c 65 45 78 0a 23 65 6e 64 69 66 0a 0a  kFileEx.#endif..
18e0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69  static struct wi
18f0: 6e 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f  n_syscall {.  co
1900: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
1910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1920: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 74 65 6d  ame of the sytem
1930: 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74   call */.  sqlit
1940: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70  e3_syscall_ptr p
1950: 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72  Current; /* Curr
1960: 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65  ent value of the
1970: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a   system call */.
1980: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
1990: 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b 20  l_ptr pDefault; 
19a0: 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65  /* Default value
19b0: 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d   */.} aSyscall[]
19c0: 20 3d 20 7b 0a 23 69 66 20 21 53 51 4c 49 54 45   = {.#if !SQLITE
19d0: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 41  _OS_WINCE.  { "A
19e0: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c  reFileApisANSI",
19f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
1a00: 4c 29 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  L)AreFileApisANS
1a10: 49 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  I,         0 },.
1a20: 0a 23 64 65 66 69 6e 65 20 6f 73 41 72 65 46 69  .#define osAreFi
1a30: 6c 65 41 70 69 73 41 4e 53 49 20 28 28 42 4f 4f  leApisANSI ((BOO
1a40: 4c 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  L(WINAPI*)(VOID)
1a50: 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75  )aSyscall[0].pCu
1a60: 72 72 65 6e 74 29 0a 23 65 6c 73 65 0a 20 20 7b  rrent).#else.  {
1a70: 20 22 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53   "AreFileApisANS
1a80: 49 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  I",         (SYS
1a90: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
1ab0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53  },.#endif..#if S
1ac0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
1ad0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
1ae0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
1af0: 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57  .  { "CharLowerW
1b00: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
1b10: 28 53 59 53 43 41 4c 4c 29 43 68 61 72 4c 6f 77  (SYSCALL)CharLow
1b20: 65 72 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  erW,            
1b30: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
1b40: 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20   "CharLowerW",  
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
1b60: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
1b80: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
1b90: 6e 65 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 20  ne osCharLowerW 
1ba0: 28 28 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a  ((LPWSTR(WINAPI*
1bb0: 29 28 4c 50 57 53 54 52 29 29 61 53 79 73 63 61  )(LPWSTR))aSysca
1bc0: 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[1].pCurrent).
1bd0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1be0: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
1bf0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
1c00: 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72  _WIDE).  { "Char
1c10: 55 70 70 65 72 57 22 2c 20 20 20 20 20 20 20 20  UpperW",        
1c20: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
1c30: 68 61 72 55 70 70 65 72 57 2c 20 20 20 20 20 20  harUpperW,      
1c40: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
1c50: 73 65 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65  se.  { "CharUppe
1c60: 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rW",            
1c70: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c90: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
1ca0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72 55  .#define osCharU
1cb0: 70 70 65 72 57 20 28 28 4c 50 57 53 54 52 28 57  pperW ((LPWSTR(W
1cc0: 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29  INAPI*)(LPWSTR))
1cd0: 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72  aSyscall[2].pCur
1ce0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 43 6c 6f 73  rent)..  { "Clos
1cf0: 65 48 61 6e 64 6c 65 22 2c 20 20 20 20 20 20 20  eHandle",       
1d00: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
1d10: 6c 6f 73 65 48 61 6e 64 6c 65 2c 20 20 20 20 20  loseHandle,     
1d20: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
1d30: 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 48 61 6e  efine osCloseHan
1d40: 64 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  dle ((BOOL(WINAP
1d50: 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73  I*)(HANDLE))aSys
1d60: 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74  call[3].pCurrent
1d70: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
1d80: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1d90: 41 4e 53 49 29 0a 20 20 7b 20 22 43 72 65 61 74  ANSI).  { "Creat
1da0: 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20  eFileA",        
1db0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
1dc0: 65 61 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20  eateFileA,      
1dd0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
1de0: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
1df0: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eA",            
1e00: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e20: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
1e30: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
1e40: 46 69 6c 65 41 20 28 28 48 41 4e 44 4c 45 28 57  FileA ((HANDLE(W
1e50: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44  INAPI*)(LPCSTR,D
1e60: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
1e70: 20 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59        LPSECURITY
1e80: 5f 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52  _ATTRIBUTES,DWOR
1e90: 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29  D,DWORD,HANDLE))
1ea0: 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72  aSyscall[4].pCur
1eb0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
1ec0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
1ed0: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43  HAS_WIDE).  { "C
1ee0: 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20  reateFileW",    
1ef0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
1f00: 4c 29 43 72 65 61 74 65 46 69 6c 65 57 2c 20 20  L)CreateFileW,  
1f10: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
1f20: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74  #else.  { "Creat
1f30: 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20  eFileW",        
1f40: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f60: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
1f70: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72  if..#define osCr
1f80: 65 61 74 65 46 69 6c 65 57 20 28 28 48 41 4e 44  eateFileW ((HAND
1f90: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  LE(WINAPI*)(LPCW
1fa0: 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  STR,DWORD,DWORD,
1fb0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43   \.        LPSEC
1fc0: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
1fd0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e  ,DWORD,DWORD,HAN
1fe0: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d  DLE))aSyscall[5]
1ff0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
2000: 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  "CreateFileMappi
2010: 6e 67 22 2c 20 20 20 20 20 20 20 28 53 59 53 43  ng",       (SYSC
2020: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61  ALL)CreateFileMa
2030: 70 70 69 6e 67 2c 20 20 20 20 20 20 20 30 20 7d  pping,       0 }
2040: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  ,..#define osCre
2050: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 20 28  ateFileMapping (
2060: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
2070: 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49  (HANDLE,LPSECURI
2080: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c  TY_ATTRIBUTES, \
2090: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44  .        DWORD,D
20a0: 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 54 53  WORD,DWORD,LPCTS
20b0: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e  TR))aSyscall[6].
20c0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
20d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
20e0: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
20f0: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70  { "CreateFileMap
2100: 70 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59  pingW",      (SY
2110: 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65  SCALL)CreateFile
2120: 4d 61 70 70 69 6e 67 57 2c 20 20 20 20 20 20 30  MappingW,      0
2130: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
2140: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
2150: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
2160: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
2170: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2180: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
2190: 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
21a0: 69 6e 67 57 20 28 28 48 41 4e 44 4c 45 28 57 49  ingW ((HANDLE(WI
21b0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
21c0: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
21d0: 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  TES, \.        D
21e0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
21f0: 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  ,LPCWSTR))aSysca
2200: 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[7].pCurrent).
2210: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
2220: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
2230: 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65 4d  DE).  { "CreateM
2240: 75 74 65 78 57 22 2c 20 20 20 20 20 20 20 20 20  utexW",         
2250: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
2260: 74 65 4d 75 74 65 78 57 2c 20 20 20 20 20 20 20  teMutexW,       
2270: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
2280: 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78    { "CreateMutex
2290: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
22a0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
22d0: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 4d 75  efine osCreateMu
22e0: 74 65 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49  texW ((HANDLE(WI
22f0: 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54  NAPI*)(LPSECURIT
2300: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 42 4f 4f  Y_ATTRIBUTES,BOO
2310: 4c 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  L, \.        LPC
2320: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 38  WSTR))aSyscall[8
2330: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
2340: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2350: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
2360: 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41    { "DeleteFileA
2370: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
2380: 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69  SYSCALL)DeleteFi
2390: 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20 20 20  leA,            
23a0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
23b0: 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20  "DeleteFileA",  
23c0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
23d0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
23f0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
2400: 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41 20  e osDeleteFileA 
2410: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
2420: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
2430: 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [9].pCurrent)..#
2440: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
2450: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
2460: 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c  ).  { "DeleteFil
2470: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eW",            
2480: 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65   (SYSCALL)Delete
2490: 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20  FileW,          
24a0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
24b0: 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c  { "DeleteFileW",
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
24d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
24f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
2500: 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65  ine osDeleteFile
2510: 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  W ((BOOL(WINAPI*
2520: 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63  )(LPCWSTR))aSysc
2530: 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74  all[10].pCurrent
2540: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
2550: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65  _WINCE.  { "File
2560: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
2570: 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 46  ime", (SYSCALL)F
2580: 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69  ileTimeToLocalFi
2590: 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c  leTime, 0 },.#el
25a0: 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65  se.  { "FileTime
25b0: 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22  ToLocalFileTime"
25c0: 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20  , (SYSCALL)0,   
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
25f0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54  .#define osFileT
2600: 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69  imeToLocalFileTi
2610: 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  me ((BOOL(WINAPI
2620: 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d  *)(CONST FILETIM
2630: 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  E*, \.        LP
2640: 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61  FILETIME))aSysca
2650: 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[11].pCurrent)
2660: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
2670: 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54  WINCE.  { "FileT
2680: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22  imeToSystemTime"
2690: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 69  ,    (SYSCALL)Fi
26a0: 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69  leTimeToSystemTi
26b0: 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  me,    0 },.#els
26c0: 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54  e.  { "FileTimeT
26d0: 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20  oSystemTime",   
26e0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2700: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
2710: 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69  #define osFileTi
2720: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 20 28  meToSystemTime (
2730: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43  (BOOL(WINAPI*)(C
2740: 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20  ONST FILETIME*, 
2750: 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59 53 54  \.        LPSYST
2760: 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  EMTIME))aSyscall
2770: 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [12].pCurrent)..
2780: 20 20 7b 20 22 46 6c 75 73 68 46 69 6c 65 42 75    { "FlushFileBu
2790: 66 66 65 72 73 22 2c 20 20 20 20 20 20 20 20 28  ffers",        (
27a0: 53 59 53 43 41 4c 4c 29 46 6c 75 73 68 46 69 6c  SYSCALL)FlushFil
27b0: 65 42 75 66 66 65 72 73 2c 20 20 20 20 20 20 20  eBuffers,       
27c0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
27d0: 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72  sFlushFileBuffer
27e0: 73 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  s ((BOOL(WINAPI*
27f0: 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61  )(HANDLE))aSysca
2800: 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[13].pCurrent)
2810: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
2820: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
2830: 4e 53 49 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74  NSI).  { "Format
2840: 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20 20 20  MessageA",      
2850: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72      (SYSCALL)For
2860: 6d 61 74 4d 65 73 73 61 67 65 41 2c 20 20 20 20  matMessageA,    
2870: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
2880: 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73  .  { "FormatMess
2890: 61 67 65 41 22 2c 20 20 20 20 20 20 20 20 20 20  ageA",          
28a0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
28d0: 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d  define osFormatM
28e0: 65 73 73 61 67 65 41 20 28 28 44 57 4f 52 44 28  essageA ((DWORD(
28f0: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c  WINAPI*)(DWORD,L
2900: 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f  PCVOID,DWORD,DWO
2910: 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20  RD,LPSTR, \.    
2920: 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73      DWORD,va_lis
2930: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d  t*))aSyscall[14]
2940: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
2950: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
2960: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
2970: 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67   { "FormatMessag
2980: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  eW",          (S
2990: 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73  YSCALL)FormatMes
29a0: 73 61 67 65 57 2c 20 20 20 20 20 20 20 20 20 20  sageW,          
29b0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
29c0: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c  FormatMessageW",
29d0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
29e0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
2a00: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
2a10: 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65   osFormatMessage
2a20: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
2a30: 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44  *)(DWORD,LPCVOID
2a40: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 57  ,DWORD,DWORD,LPW
2a50: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
2a60: 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61  WORD,va_list*))a
2a70: 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72  Syscall[15].pCur
2a80: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 46 72 65 65  rent)..  { "Free
2a90: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 20 20  Library",       
2aa0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46        (SYSCALL)F
2ab0: 72 65 65 4c 69 62 72 61 72 79 2c 20 20 20 20 20  reeLibrary,     
2ac0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
2ad0: 65 66 69 6e 65 20 6f 73 46 72 65 65 4c 69 62 72  efine osFreeLibr
2ae0: 61 72 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ary ((BOOL(WINAP
2af0: 49 2a 29 28 48 4d 4f 44 55 4c 45 29 29 61 53 79  I*)(HMODULE))aSy
2b00: 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65  scall[16].pCurre
2b10: 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 43 75 72  nt)..  { "GetCur
2b20: 72 65 6e 74 50 72 6f 63 65 73 73 49 64 22 2c 20  rentProcessId", 
2b30: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
2b40: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
2b50: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
2b60: 69 6e 65 20 6f 73 47 65 74 43 75 72 72 65 6e 74  ine osGetCurrent
2b70: 50 72 6f 63 65 73 73 49 64 20 28 28 44 57 4f 52  ProcessId ((DWOR
2b80: 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  D(WINAPI*)(VOID)
2b90: 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43  )aSyscall[17].pC
2ba0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
2bb0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
2bc0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2bd0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
2be0: 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65    { "GetDiskFree
2bf0: 53 70 61 63 65 41 22 2c 20 20 20 20 20 20 20 28  SpaceA",       (
2c00: 53 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46  SYSCALL)GetDiskF
2c10: 72 65 65 53 70 61 63 65 41 2c 20 20 20 20 20 20  reeSpaceA,      
2c20: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
2c30: 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  "GetDiskFreeSpac
2c40: 65 41 22 2c 20 20 20 20 20 20 20 28 53 59 53 43  eA",       (SYSC
2c50: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
2c70: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
2c80: 65 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53  e osGetDiskFreeS
2c90: 70 61 63 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e  paceA ((BOOL(WIN
2ca0: 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 4c 50 44  API*)(LPCSTR,LPD
2cb0: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44  WORD,LPDWORD,LPD
2cc0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
2cd0: 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  LPDWORD))aSyscal
2ce0: 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[18].pCurrent).
2cf0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
2d00: 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64  WINCE && defined
2d10: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
2d20: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74  S_WIDE).  { "Get
2d30: 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c  DiskFreeSpaceW",
2d40: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
2d50: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
2d60: 57 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  W,       0 },.#e
2d70: 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b  lse.  { "GetDisk
2d80: 46 72 65 65 53 70 61 63 65 57 22 2c 20 20 20 20  FreeSpaceW",    
2d90: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
2dc0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44  ..#define osGetD
2dd0: 69 73 6b 46 72 65 65 53 70 61 63 65 57 20 28 28  iskFreeSpaceW ((
2de0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
2df0: 43 57 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50  CWSTR,LPDWORD,LP
2e00: 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c  DWORD,LPDWORD, \
2e10: 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44  .        LPDWORD
2e20: 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70  ))aSyscall[19].p
2e30: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
2e40: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
2e50: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
2e60: 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75   "GetFileAttribu
2e70: 74 65 73 41 22 2c 20 20 20 20 20 20 28 53 59 53  tesA",      (SYS
2e80: 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72  CALL)GetFileAttr
2e90: 69 62 75 74 65 73 41 2c 20 20 20 20 20 20 30 20  ibutesA,      0 
2ea0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
2eb0: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
2ec0: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
2ed0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
2ee0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
2ef0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
2f00: 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
2f10: 65 73 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41  esA ((DWORD(WINA
2f20: 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79  PI*)(LPCSTR))aSy
2f30: 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65  scall[20].pCurre
2f40: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
2f50: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
2f60: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74  S_WIDE).  { "Get
2f70: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 22  FileAttributesW"
2f80: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
2f90: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
2fa0: 73 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  sW,      0 },.#e
2fb0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  lse.  { "GetFile
2fc0: 41 74 74 72 69 62 75 74 65 73 57 22 2c 20 20 20  AttributesW",   
2fd0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3000: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46  ..#define osGetF
3010: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 20 28  ileAttributesW (
3020: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
3030: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
3040: 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[21].pCurrent).
3050: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
3060: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
3070: 44 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  DE).  { "GetFile
3080: 41 74 74 72 69 62 75 74 65 73 45 78 57 22 2c 20  AttributesExW", 
3090: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
30a0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
30b0: 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ,    0 },.#else.
30c0: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
30d0: 69 62 75 74 65 73 45 78 57 22 2c 20 20 20 20 28  ibutesExW",    (
30e0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3100: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3110: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41  efine osGetFileA
3120: 74 74 72 69 62 75 74 65 73 45 78 57 20 28 28 42  ttributesExW ((B
3130: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
3140: 57 53 54 52 2c 47 45 54 5f 46 49 4c 45 45 58 5f  WSTR,GET_FILEEX_
3150: 49 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c 0a 20  INFO_LEVELS, \. 
3160: 20 20 20 20 20 20 20 4c 50 56 4f 49 44 29 29 61         LPVOID))a
3170: 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72  Syscall[22].pCur
3180: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 46  rent)..  { "GetF
3190: 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20 20 20  ileSize",       
31a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
31b0: 65 74 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20  etFileSize,     
31c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
31d0: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 53  efine osGetFileS
31e0: 69 7a 65 20 28 28 44 57 4f 52 44 28 57 49 4e 41  ize ((DWORD(WINA
31f0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57  PI*)(HANDLE,LPDW
3200: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 33  ORD))aSyscall[23
3210: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3220: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
3230: 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  E && defined(SQL
3240: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
3250: 53 49 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c  SI).  { "GetFull
3260: 50 61 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20  PathNameA",     
3270: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
3280: 75 6c 6c 50 61 74 68 4e 61 6d 65 41 2c 20 20 20  ullPathNameA,   
3290: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
32a0: 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68    { "GetFullPath
32b0: 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28  NameA",        (
32c0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
32f0: 65 66 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50  efine osGetFullP
3300: 61 74 68 4e 61 6d 65 41 20 28 28 44 57 4f 52 44  athNameA ((DWORD
3310: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
3320: 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a  ,DWORD,LPSTR, \.
3330: 20 20 20 20 20 20 20 20 4c 50 53 54 52 2a 29 29          LPSTR*))
3340: 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75  aSyscall[24].pCu
3350: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
3360: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
3370: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
3380: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
3390: 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e   { "GetFullPathN
33a0: 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28 53  ameW",        (S
33b0: 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61  YSCALL)GetFullPa
33c0: 74 68 4e 61 6d 65 57 2c 20 20 20 20 20 20 20 20  thNameW,        
33d0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
33e0: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
33f0: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
3400: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3410: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3420: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3430: 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
3440: 6d 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41  meW ((DWORD(WINA
3450: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f  PI*)(LPCWSTR,DWO
3460: 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20  RD,LPWSTR, \.   
3470: 20 20 20 20 20 4c 50 57 53 54 52 2a 29 29 61 53       LPWSTR*))aS
3480: 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72  yscall[25].pCurr
3490: 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 4c 61  ent)..  { "GetLa
34a0: 73 74 45 72 72 6f 72 22 2c 20 20 20 20 20 20 20  stError",       
34b0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
34c0: 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
34d0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
34e0: 66 69 6e 65 20 6f 73 47 65 74 4c 61 73 74 45 72  fine osGetLastEr
34f0: 72 6f 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41  ror ((DWORD(WINA
3500: 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63  PI*)(VOID))aSysc
3510: 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74  all[26].pCurrent
3520: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
3530: 5f 57 49 4e 43 45 0a 20 20 2f 2a 20 54 68 65 20  _WINCE.  /* The 
3540: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 28  GetProcAddressA(
3550: 29 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  ) routine is onl
3560: 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57  y available on W
3570: 69 6e 64 6f 77 73 20 43 45 2e 20 2a 2f 0a 20 20  indows CE. */.  
3580: 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65 73  { "GetProcAddres
3590: 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53 59  sA",         (SY
35a0: 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41 64 64  SCALL)GetProcAdd
35b0: 72 65 73 73 41 2c 20 20 20 20 20 20 20 20 20 30  ressA,         0
35c0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 41   },.#else.  /* A
35d0: 6c 6c 20 6f 74 68 65 72 20 57 69 6e 64 6f 77 73  ll other Windows
35e0: 20 70 6c 61 74 66 6f 72 6d 73 20 65 78 70 65 63   platforms expec
35f0: 74 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  t GetProcAddress
3600: 28 29 20 74 6f 20 74 61 6b 65 0a 20 20 2a 2a 20  () to take.  ** 
3610: 61 6e 20 41 4e 53 49 20 73 74 72 69 6e 67 20 72  an ANSI string r
3620: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
3630: 20 5f 55 4e 49 43 4f 44 45 20 73 65 74 74 69 6e   _UNICODE settin
3640: 67 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f  g */.  { "GetPro
3650: 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20  cAddressA",     
3660: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
3670: 50 72 6f 63 41 64 64 72 65 73 73 2c 20 20 20 20  ProcAddress,    
3680: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3690: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
36a0: 50 72 6f 63 41 64 64 72 65 73 73 41 20 28 28 46  ProcAddressA ((F
36b0: 41 52 50 52 4f 43 28 57 49 4e 41 50 49 2a 29 28  ARPROC(WINAPI*)(
36c0: 48 4d 4f 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20  HMODULE, \.     
36d0: 20 20 20 4c 50 43 53 54 52 29 29 61 53 79 73 63     LPCSTR))aSysc
36e0: 61 6c 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74  all[27].pCurrent
36f0: 29 0a 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65  )..  { "GetSyste
3700: 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20  mInfo",         
3710: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79    (SYSCALL)GetSy
3720: 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20  stemInfo,       
3730: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
3740: 65 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66  e osGetSystemInf
3750: 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  o ((VOID(WINAPI*
3760: 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29  )(LPSYSTEM_INFO)
3770: 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70 43  )aSyscall[28].pC
3780: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65  urrent)..  { "Ge
3790: 74 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20  tSystemTime",   
37a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
37b0: 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 2c 20  )GetSystemTime, 
37c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
37d0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73  #define osGetSys
37e0: 74 65 6d 54 69 6d 65 20 28 28 56 4f 49 44 28 57  temTime ((VOID(W
37f0: 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d  INAPI*)(LPSYSTEM
3800: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 32  TIME))aSyscall[2
3810: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
3820: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
3830: 43 45 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65  CE.  { "GetSyste
3840: 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22  mTimeAsFileTime"
3850: 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79  , (SYSCALL)GetSy
3860: 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69  stemTimeAsFileTi
3870: 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  me, 0 },.#else. 
3880: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d   { "GetSystemTim
3890: 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53  eAsFileTime", (S
38a0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
38b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38c0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
38d0: 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d  fine osGetSystem
38e0: 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 20 28  TimeAsFileTime (
38f0: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20  (VOID(WINAPI*)( 
3900: 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45  \.        LPFILE
3910: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 33  TIME))aSyscall[3
3920: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
3930: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
3940: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
3950: 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74  .  { "GetTempPat
3960: 68 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  hA",            
3970: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70  (SYSCALL)GetTemp
3980: 50 61 74 68 41 2c 20 20 20 20 20 20 20 20 20 20  PathA,          
3990: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
39a0: 20 22 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c   "GetTempPathA",
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
39c0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
39e0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
39f0: 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68  ne osGetTempPath
3a00: 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  A ((DWORD(WINAPI
3a10: 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54 52 29 29  *)(DWORD,LPSTR))
3a20: 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70 43 75  aSyscall[31].pCu
3a30: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
3a40: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3a50: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
3a60: 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20 20  GetTempPathW",  
3a70: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3a80: 4c 4c 29 47 65 74 54 65 6d 70 50 61 74 68 57 2c  LL)GetTempPathW,
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3aa0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54  .#else.  { "GetT
3ab0: 65 6d 70 50 61 74 68 57 22 2c 20 20 20 20 20 20  empPathW",      
3ac0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
3ad0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3ae0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3af0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
3b00: 65 74 54 65 6d 70 50 61 74 68 57 20 28 28 44 57  etTempPathW ((DW
3b10: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f  ORD(WINAPI*)(DWO
3b20: 52 44 2c 4c 50 57 53 54 52 29 29 61 53 79 73 63  RD,LPWSTR))aSysc
3b30: 61 6c 6c 5b 33 32 5d 2e 70 43 75 72 72 65 6e 74  all[32].pCurrent
3b40: 29 0a 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43  )..  { "GetTickC
3b50: 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  ount",          
3b60: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69    (SYSCALL)GetTi
3b70: 63 6b 43 6f 75 6e 74 2c 20 20 20 20 20 20 20 20  ckCount,        
3b80: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
3b90: 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74  e osGetTickCount
3ba0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
3bb0: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  )(VOID))aSyscall
3bc0: 5b 33 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [33].pCurrent)..
3bd0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3be0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
3bf0: 49 29 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69  I).  { "GetVersi
3c00: 6f 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20 20  onExA",         
3c10: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65    (SYSCALL)GetVe
3c20: 72 73 69 6f 6e 45 78 41 2c 20 20 20 20 20 20 20  rsionExA,       
3c30: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3c40: 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78   { "GetVersionEx
3c50: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  A",           (S
3c60: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c80: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
3c90: 66 69 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f  fine osGetVersio
3ca0: 6e 45 78 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41  nExA ((BOOL(WINA
3cb0: 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20  PI*)( \.        
3cc0: 4c 50 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41  LPOSVERSIONINFOA
3cd0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 34 5d 2e 70  ))aSyscall[34].p
3ce0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48  Current)..  { "H
3cf0: 65 61 70 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20  eapAlloc",      
3d00: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3d10: 4c 29 48 65 61 70 41 6c 6c 6f 63 2c 20 20 20 20  L)HeapAlloc,    
3d20: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3d30: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 41  .#define osHeapA
3d40: 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49  lloc ((LPVOID(WI
3d50: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
3d60: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53  ORD, \.        S
3d70: 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b  IZE_T))aSyscall[
3d80: 33 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  35].pCurrent).. 
3d90: 20 7b 20 22 48 65 61 70 43 72 65 61 74 65 22 2c   { "HeapCreate",
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
3db0: 59 53 43 41 4c 4c 29 48 65 61 70 43 72 65 61 74  YSCALL)HeapCreat
3dc0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
3dd0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
3de0: 48 65 61 70 43 72 65 61 74 65 20 28 28 48 41 4e  HeapCreate ((HAN
3df0: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 44 57 4f  DLE(WINAPI*)(DWO
3e00: 52 44 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20 20 20  RD,SIZE_T, \.   
3e10: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
3e20: 73 63 61 6c 6c 5b 33 36 5d 2e 70 43 75 72 72 65  scall[36].pCurre
3e30: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 44 65  nt)..  { "HeapDe
3e40: 73 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20  stroy",         
3e50: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
3e60: 70 44 65 73 74 72 6f 79 2c 20 20 20 20 20 20 20  pDestroy,       
3e70: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
3e80: 69 6e 65 20 6f 73 48 65 61 70 44 65 73 74 72 6f  ine osHeapDestro
3e90: 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  y ((BOOL(WINAPI*
3ea0: 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61  )(HANDLE))aSysca
3eb0: 6c 6c 5b 33 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[37].pCurrent)
3ec0: 0a 0a 20 20 7b 20 22 48 65 61 70 46 72 65 65 22  ..  { "HeapFree"
3ed0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3ee0: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 46 72   (SYSCALL)HeapFr
3ef0: 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ee,             
3f00: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
3f10: 20 6f 73 48 65 61 70 46 72 65 65 20 28 28 42 4f   osHeapFree ((BO
3f20: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
3f30: 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 29  LE,DWORD,LPVOID)
3f40: 29 61 53 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43  )aSyscall[38].pC
3f50: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65  urrent)..  { "He
3f60: 61 70 52 65 41 6c 6c 6f 63 22 2c 20 20 20 20 20  apReAlloc",     
3f70: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3f80: 29 48 65 61 70 52 65 41 6c 6c 6f 63 2c 20 20 20  )HeapReAlloc,   
3f90: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
3fa0: 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 52 65  #define osHeapRe
3fb0: 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57  Alloc ((LPVOID(W
3fc0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
3fd0: 57 4f 52 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a 20  WORD,LPVOID, \. 
3fe0: 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61         SIZE_T))a
3ff0: 53 79 73 63 61 6c 6c 5b 33 39 5d 2e 70 43 75 72  Syscall[39].pCur
4000: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70  rent)..  { "Heap
4010: 53 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20  Size",          
4020: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
4030: 65 61 70 53 69 7a 65 2c 20 20 20 20 20 20 20 20  eapSize,        
4040: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
4050: 65 66 69 6e 65 20 6f 73 48 65 61 70 53 69 7a 65  efine osHeapSize
4060: 20 28 28 53 49 5a 45 5f 54 28 57 49 4e 41 50 49   ((SIZE_T(WINAPI
4070: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
4080: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 56 4f   \.        LPCVO
4090: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 30 5d  ID))aSyscall[40]
40a0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
40b0: 22 48 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20  "HeapValidate", 
40c0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
40d0: 41 4c 4c 29 48 65 61 70 56 61 6c 69 64 61 74 65  ALL)HeapValidate
40e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
40f0: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  ,..#define osHea
4100: 70 56 61 6c 69 64 61 74 65 20 28 28 42 4f 4f 4c  pValidate ((BOOL
4110: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
4120: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
4130: 20 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63    LPCVOID))aSysc
4140: 61 6c 6c 5b 34 31 5d 2e 70 43 75 72 72 65 6e 74  all[41].pCurrent
4150: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
4160: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4170: 41 4e 53 49 29 0a 20 20 7b 20 22 4c 6f 61 64 4c  ANSI).  { "LoadL
4180: 69 62 72 61 72 79 41 22 2c 20 20 20 20 20 20 20  ibraryA",       
4190: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f       (SYSCALL)Lo
41a0: 61 64 4c 69 62 72 61 72 79 41 2c 20 20 20 20 20  adLibraryA,     
41b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
41c0: 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61  e.  { "LoadLibra
41d0: 72 79 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  ryA",           
41e0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4200: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4210: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69  #define osLoadLi
4220: 62 72 61 72 79 41 20 28 28 48 4d 4f 44 55 4c 45  braryA ((HMODULE
4230: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
4240: 29 29 61 53 79 73 63 61 6c 6c 5b 34 32 5d 2e 70  ))aSyscall[42].p
4250: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
4260: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
4270: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
4280: 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c   "LoadLibraryW",
4290: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
42a0: 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79  CALL)LoadLibrary
42b0: 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  W,            0 
42c0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f  },.#else.  { "Lo
42d0: 61 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20  adLibraryW",    
42e0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
42f0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4300: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4310: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4320: 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 20 28 28  sLoadLibraryW ((
4330: 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29  HMODULE(WINAPI*)
4340: 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  (LPCWSTR))aSysca
4350: 6c 6c 5b 34 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[43].pCurrent)
4360: 0a 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65  ..  { "LocalFree
4370: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
4380: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46   (SYSCALL)LocalF
4390: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ree,            
43a0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
43b0: 20 6f 73 4c 6f 63 61 6c 46 72 65 65 20 28 28 48   osLocalFree ((H
43c0: 4c 4f 43 41 4c 28 57 49 4e 41 50 49 2a 29 28 48  LOCAL(WINAPI*)(H
43d0: 4c 4f 43 41 4c 29 29 61 53 79 73 63 61 6c 6c 5b  LOCAL))aSyscall[
43e0: 34 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  44].pCurrent)..#
43f0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4400: 4e 43 45 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c  NCE.  { "LockFil
4410: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
4420: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b     (SYSCALL)Lock
4430: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
4440: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
4450: 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 20 28 28  ne osLockFile ((
4460: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
4470: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
4480: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
4490: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
44a0: 6c 5b 34 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[45].pCurrent).
44b0: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46  #else.  { "LockF
44c0: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
44d0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44f0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4500: 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  if..#if !SQLITE_
4510: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c 6f  OS_WINCE.  { "Lo
4520: 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20  ckFileEx",      
4530: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4540: 29 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20  )LockFileEx,    
4550: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
4560: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69  #define osLockFi
4570: 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41  leEx ((BOOL(WINA
4580: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
4590: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  D,DWORD,DWORD,DW
45a0: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
45b0: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
45c0: 73 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65  scall[46].pCurre
45d0: 6e 74 29 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c  nt).#else.  { "L
45e0: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
45f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4600: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4610: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4620: 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 4d 61 70  #endif..  { "Map
4630: 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20  ViewOfFile",    
4640: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4650: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c 20 20  MapViewOfFile,  
4660: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
4670: 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77  define osMapView
4680: 4f 66 46 69 6c 65 20 28 28 4c 50 56 4f 49 44 28  OfFile ((LPVOID(
4690: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
46a0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
46b0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  D, \.        SIZ
46c0: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 37  E_T))aSyscall[47
46d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
46e0: 20 22 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64   "MultiByteToWid
46f0: 65 43 68 61 72 22 2c 20 20 20 20 20 28 53 59 53  eChar",     (SYS
4700: 43 41 4c 4c 29 4d 75 6c 74 69 42 79 74 65 54 6f  CALL)MultiByteTo
4710: 57 69 64 65 43 68 61 72 2c 20 20 20 20 20 30 20  WideChar,     0 
4720: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75  },..#define osMu
4730: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
4740: 72 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29  r ((int(WINAPI*)
4750: 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 53  (UINT,DWORD,LPCS
4760: 54 52 2c 69 6e 74 2c 4c 50 57 53 54 52 2c 20 5c  TR,int,LPWSTR, \
4770: 0a 20 20 20 20 20 20 20 20 69 6e 74 29 29 61 53  .        int))aS
4780: 79 73 63 61 6c 6c 5b 34 38 5d 2e 70 43 75 72 72  yscall[48].pCurr
4790: 65 6e 74 29 0a 0a 20 20 7b 20 22 51 75 65 72 79  ent)..  { "Query
47a0: 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
47b0: 65 72 22 2c 20 28 53 59 53 43 41 4c 4c 29 51 75  er", (SYSCALL)Qu
47c0: 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  eryPerformanceCo
47d0: 75 6e 74 65 72 2c 20 30 20 7d 2c 0a 0a 23 64 65  unter, 0 },..#de
47e0: 66 69 6e 65 20 6f 73 51 75 65 72 79 50 65 72 66  fine osQueryPerf
47f0: 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 28  ormanceCounter (
4800: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20  (BOOL(WINAPI*)( 
4810: 5c 0a 20 20 20 20 20 20 20 20 4c 41 52 47 45 5f  \.        LARGE_
4820: 49 4e 54 45 47 45 52 2a 29 29 61 53 79 73 63 61  INTEGER*))aSysca
4830: 6c 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[49].pCurrent)
4840: 0a 0a 20 20 7b 20 22 52 65 61 64 46 69 6c 65 22  ..  { "ReadFile"
4850: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4860: 20 28 53 59 53 43 41 4c 4c 29 52 65 61 64 46 69   (SYSCALL)ReadFi
4870: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
4880: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
4890: 20 6f 73 52 65 61 64 46 69 6c 65 20 28 28 42 4f   osReadFile ((BO
48a0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
48b0: 4c 45 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 2c  LE,LPVOID,DWORD,
48c0: 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  LPDWORD, \.     
48d0: 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29     LPOVERLAPPED)
48e0: 29 61 53 79 73 63 61 6c 6c 5b 35 30 5d 2e 70 43  )aSyscall[50].pC
48f0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 65  urrent)..  { "Se
4900: 74 45 6e 64 4f 66 46 69 6c 65 22 2c 20 20 20 20  tEndOfFile",    
4910: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4920: 29 53 65 74 45 6e 64 4f 66 46 69 6c 65 2c 20 20  )SetEndOfFile,  
4930: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
4940: 23 64 65 66 69 6e 65 20 6f 73 53 65 74 45 6e 64  #define osSetEnd
4950: 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  OfFile ((BOOL(WI
4960: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61  NAPI*)(HANDLE))a
4970: 53 79 73 63 61 6c 6c 5b 35 31 5d 2e 70 43 75 72  Syscall[51].pCur
4980: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 65 74 46  rent)..  { "SetF
4990: 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20  ilePointer",    
49a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53        (SYSCALL)S
49b0: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 2c 20 20  etFilePointer,  
49c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
49d0: 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50  efine osSetFileP
49e0: 6f 69 6e 74 65 72 20 28 28 44 57 4f 52 44 28 57  ointer ((DWORD(W
49f0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
4a00: 4f 4e 47 2c 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20  ONG,PLONG, \.   
4a10: 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73       DWORD))aSys
4a20: 63 61 6c 6c 5b 35 32 5d 2e 70 43 75 72 72 65 6e  call[52].pCurren
4a30: 74 29 0a 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c  t)..  { "Sleep",
4a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a50: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 6c 65 65     (SYSCALL)Slee
4a60: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
4a70: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
4a80: 6e 65 20 6f 73 53 6c 65 65 70 20 28 28 56 4f 49  ne osSleep ((VOI
4a90: 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  D(WINAPI*)(DWORD
4aa0: 29 29 61 53 79 73 63 61 6c 6c 5b 35 33 5d 2e 70  ))aSyscall[53].p
4ab0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53  Current)..  { "S
4ac0: 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
4ad0: 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c  ime",    (SYSCAL
4ae0: 4c 29 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  L)SystemTimeToFi
4af0: 6c 65 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a  leTime,    0 },.
4b00: 0a 23 64 65 66 69 6e 65 20 6f 73 53 79 73 74 65  .#define osSyste
4b10: 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 20  mTimeToFileTime 
4b20: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4b30: 43 4f 4e 53 54 20 53 59 53 54 45 4d 54 49 4d 45  CONST SYSTEMTIME
4b40: 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46  *, \.        LPF
4b50: 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c  ILETIME))aSyscal
4b60: 6c 5b 35 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[54].pCurrent).
4b70: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
4b80: 57 49 4e 43 45 0a 20 20 7b 20 22 55 6e 6c 6f 63  WINCE.  { "Unloc
4b90: 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  kFile",         
4ba0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e       (SYSCALL)Un
4bb0: 6c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20 20  lockFile,       
4bc0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
4bd0: 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c  fine osUnlockFil
4be0: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
4bf0: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44  )(HANDLE,DWORD,D
4c00: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
4c10: 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79        DWORD))aSy
4c20: 73 63 61 6c 6c 5b 35 35 5d 2e 70 43 75 72 72 65  scall[55].pCurre
4c30: 6e 74 29 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55  nt).#else.  { "U
4c40: 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20  nlockFile",     
4c50: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4c60: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4c70: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4c80: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c  #endif..#if !SQL
4c90: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b  ITE_OS_WINCE.  {
4ca0: 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c   "UnlockFileEx",
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4cc0: 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 45  CALL)UnlockFileE
4cd0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  x,            0 
4ce0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e  },..#define osUn
4cf0: 6c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f  lockFileEx ((BOO
4d00: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
4d10: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
4d20: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
4d30: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
4d40: 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75 72 72 65  scall[56].pCurre
4d50: 6e 74 29 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55  nt).#else.  { "U
4d60: 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20  nlockFileEx",   
4d70: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4d80: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4d90: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4da0: 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 55 6e 6d  #endif..  { "Unm
4db0: 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20  apViewOfFile",  
4dc0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4dd0: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c  UnmapViewOfFile,
4de0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
4df0: 64 65 66 69 6e 65 20 6f 73 55 6e 6d 61 70 56 69  define osUnmapVi
4e00: 65 77 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28  ewOfFile ((BOOL(
4e10: 57 49 4e 41 50 49 2a 29 28 4c 50 43 56 4f 49 44  WINAPI*)(LPCVOID
4e20: 29 29 61 53 79 73 63 61 6c 6c 5b 35 37 5d 2e 70  ))aSyscall[57].p
4e30: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57  Current)..  { "W
4e40: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
4e50: 74 65 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  te",     (SYSCAL
4e60: 4c 29 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  L)WideCharToMult
4e70: 69 42 79 74 65 2c 20 20 20 20 20 30 20 7d 2c 0a  iByte,     0 },.
4e80: 0a 23 64 65 66 69 6e 65 20 6f 73 57 69 64 65 43  .#define osWideC
4e90: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 20 28  harToMultiByte (
4ea0: 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49  (int(WINAPI*)(UI
4eb0: 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52  NT,DWORD,LPCWSTR
4ec0: 2c 69 6e 74 2c 4c 50 53 54 52 2c 69 6e 74 2c 20  ,int,LPSTR,int, 
4ed0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53 54 52  \.        LPCSTR
4ee0: 2c 4c 50 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c  ,LPBOOL))aSyscal
4ef0: 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[58].pCurrent).
4f00: 0a 20 20 7b 20 22 57 72 69 74 65 46 69 6c 65 22  .  { "WriteFile"
4f10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4f20: 28 53 59 53 43 41 4c 4c 29 57 72 69 74 65 46 69  (SYSCALL)WriteFi
4f30: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
4f40: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
4f50: 6f 73 57 72 69 74 65 46 69 6c 65 20 28 28 42 4f  osWriteFile ((BO
4f60: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
4f70: 4c 45 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44  LE,LPCVOID,DWORD
4f80: 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  ,LPDWORD, \.    
4f90: 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44      LPOVERLAPPED
4fa0: 29 29 61 53 79 73 63 61 6c 6c 5b 35 39 5d 2e 70  ))aSyscall[59].p
4fb0: 43 75 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20  Current)..}; /* 
4fc0: 45 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72  End of the overr
4fd0: 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63  ideable system c
4fe0: 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  alls */../*.** T
4ff0: 68 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53  his is the xSetS
5000: 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68  ystemCall() meth
5010: 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66  od of sqlite3_vf
5020: 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  s for all of the
5030: 0a 2a 2a 20 22 77 69 6e 33 32 22 20 56 46 53 65  .** "win32" VFSe
5040: 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s.  Return SQLIT
5050: 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73  E_OK opon succes
5060: 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20  sfully updating 
5070: 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61  the.** system ca
5080: 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53  ll pointer, or S
5090: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69  QLITE_NOTFOUND i
50a0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f  f there is no co
50b0: 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79  nfigurable.** sy
50c0: 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20  stem call named 
50d0: 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  zName..*/.static
50e0: 20 69 6e 74 20 77 69 6e 53 65 74 53 79 73 74 65   int winSetSyste
50f0: 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33  mCall(.  sqlite3
5100: 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20  _vfs *pNotUsed, 
5110: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
5120: 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20  S pointer.  Not 
5130: 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  used */.  const 
5140: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
5150: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
5160: 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  of system call t
5170: 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20  o override */.  
5180: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5190: 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a  ptr pNewFunc  /*
51a0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
51b0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75  system call valu
51c0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
51d0: 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  ed int i;.  int 
51e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46  rc = SQLITE_NOTF
51f0: 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  OUND;..  UNUSED_
5200: 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73  PARAMETER(pNotUs
5210: 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ed);.  if( zName
5220: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
5230: 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76   no zName is giv
5240: 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20  en, restore all 
5250: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20  system calls to 
5260: 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20  their default.  
5270: 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e    ** settings an
5280: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20  d return NULL.  
5290: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51    */.    rc = SQ
52a0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72  LITE_OK;.    for
52b0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
52c0: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
52d0: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
52e0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53  +){.      if( aS
52f0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
5300: 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53  lt ){.        aS
5310: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
5320: 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nt = aSyscall[i]
5330: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
5340: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
5350: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  {.    /* If zNam
5360: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
5370: 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20  operate on only 
5380: 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63  the one system c
5390: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69  all.    ** speci
53a0: 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  fied..    */.   
53b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
53c0: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
53d0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
53e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
53f0: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
5400: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
5410: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
5420: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
5430: 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a  .pDefault==0 ){.
5440: 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61            aSysca
5450: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d  ll[i].pDefault =
5460: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
5470: 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d  rrent;.        }
5480: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
5490: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
54a0: 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30   if( pNewFunc==0
54b0: 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53   ) pNewFunc = aS
54c0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
54d0: 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73  lt;.        aSys
54e0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
54f0: 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20   = pNewFunc;.   
5500: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5510: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
5520: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5530: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
5540: 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d  alue of a system
5550: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
5560: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20  ULL if zName is 
5570: 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69  not a.** recogni
5580: 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  zed system call 
5590: 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61  name.  NULL is a
55a0: 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
55b0: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  the system call.
55c0: 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
55d0: 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
55e0: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73  atic sqlite3_sys
55f0: 63 61 6c 6c 5f 70 74 72 20 77 69 6e 47 65 74 53  call_ptr winGetS
5600: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
5610: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
5620: 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ed,.  const char
5630: 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73   *zName.){.  uns
5640: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20  igned int i;..  
5650: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
5660: 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f  (pNotUsed);.  fo
5670: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
5680: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
5690: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
56a0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
56b0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
56c0: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
56d0: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
56e0: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a  ll[i].pCurrent;.
56f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
5700: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5710: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
5720: 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c  first system cal
5730: 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20  l after zName.  
5740: 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a  If zName==NULL.*
5750: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  * then return th
5760: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
5770: 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  rst system call.
5780: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
5790: 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65   zName.** is the
57a0: 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c   last system cal
57b0: 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73  l or if zName is
57c0: 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   not the name of
57d0: 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74   a valid.** syst
57e0: 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  em call..*/.stat
57f0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77  ic const char *w
5800: 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c  inNextSystemCall
5810: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c  (sqlite3_vfs *p,
5820: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
5830: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d  me){.  int i = -
5840: 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  1;..  UNUSED_PAR
5850: 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28  AMETER(p);.  if(
5860: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f   zName ){.    fo
5870: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
5880: 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20  ze(aSyscall)-1; 
5890: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
58a0: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
58b0: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
58c0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
58d0: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b   }.  }.  for(i++
58e0: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53  ; i<ArraySize(aS
58f0: 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20  yscall); i++){. 
5900: 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b     if( aSyscall[
5910: 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29  i].pCurrent!=0 )
5920: 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c   return aSyscall
5930: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  [i].zName;.  }. 
5940: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
5950: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
5960: 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77 65  (non-zero) if we
5970: 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e 64   are running und
5980: 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c  er WinNT, Win2K,
5990: 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57 69   WinXP,.** or Wi
59a0: 6e 43 45 2e 20 20 52 65 74 75 72 6e 20 66 61 6c  nCE.  Return fal
59b0: 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 20 57 69  se (zero) for Wi
59c0: 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20 57  n95, Win98, or W
59d0: 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65  inME..**.** Here
59e0: 20 69 73 20 61 6e 20 69 6e 74 65 72 65 73 74 69   is an interesti
59f0: 6e 67 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a 20  ng observation: 
5a00: 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 61   Win95, Win98, a
5a10: 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a  nd WinME lack.**
5a20: 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28   the LockFileEx(
5a30: 29 20 41 50 49 2e 20 20 42 75 74 20 77 65 20 63  ) API.  But we c
5a40: 61 6e 20 73 74 69 6c 6c 20 73 74 61 74 69 63 61  an still statica
5a50: 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73 74  lly link against
5a60: 20 74 68 61 74 0a 2a 2a 20 41 50 49 20 61 73 20   that.** API as 
5a70: 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e 27 74  long as we don't
5a80: 20 63 61 6c 6c 20 69 74 20 77 68 65 6e 20 72 75   call it when ru
5a90: 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f 4d  nning Win95/98/M
5aa0: 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a  E.  A call to.**
5ab0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
5ac0: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
5ad0: 6e 65 20 69 66 20 74 68 65 20 68 6f 73 74 20 69  ne if the host i
5ae0: 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f 72  s Win95/98/ME or
5af0: 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50 20  .** WinNT/2K/XP 
5b00: 73 6f 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  so that we will 
5b10: 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20  know whether or 
5b20: 6e 6f 74 20 77 65 20 63 61 6e 20 73 61 66 65 6c  not we can safel
5b30: 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f  y call.** the Lo
5b40: 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 0a  ckFileEx() API..
5b50: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
5b60: 5f 57 49 4e 43 45 0a 23 20 64 65 66 69 6e 65 20  _WINCE.# define 
5b70: 69 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 73  isNT()  (1).#els
5b80: 65 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 69  e.  static int i
5b90: 73 4e 54 28 76 6f 69 64 29 7b 0a 20 20 20 20 69  sNT(void){.    i
5ba0: 66 28 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  f( sqlite3_os_ty
5bb0: 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f  pe==0 ){.      O
5bc0: 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 20 73 49  SVERSIONINFOA sI
5bd0: 6e 66 6f 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f  nfo;.      sInfo
5be0: 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f  .dwOSVersionInfo
5bf0: 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49  Size = sizeof(sI
5c00: 6e 66 6f 29 3b 0a 20 20 20 20 20 20 6f 73 47 65  nfo);.      osGe
5c10: 74 56 65 72 73 69 6f 6e 45 78 41 28 26 73 49 6e  tVersionExA(&sIn
5c20: 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
5c30: 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 73 49 6e  e3_os_type = sIn
5c40: 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64 3d  fo.dwPlatformId=
5c50: 3d 56 45 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49  =VER_PLATFORM_WI
5c60: 4e 33 32 5f 4e 54 20 3f 20 32 20 3a 20 31 3b 0a  N32_NT ? 2 : 1;.
5c70: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
5c80: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
5c90: 3d 3d 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  ==2;.  }.#endif 
5ca0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  /* SQLITE_OS_WIN
5cb0: 43 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  CE */..#ifdef SQ
5cc0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
5cd0: 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  C./*.** Allocate
5ce0: 20 6e 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72   nBytes of memor
5cf0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
5d00: 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28  d *winMemMalloc(
5d10: 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48  int nBytes){.  H
5d20: 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76  ANDLE hHeap;.  v
5d30: 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65  oid *p;..  winMe
5d40: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a  mAssertMagic();.
5d50: 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d    hHeap = winMem
5d60: 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73  GetHeap();.  ass
5d70: 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b  ert( hHeap!=0 );
5d80: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
5d90: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
5da0: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66  _VALUE );.#ifdef
5db0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
5dc0: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20  LLOC_VALIDATE.  
5dd0: 61 73 73 65 72 74 20 28 20 6f 73 48 65 61 70 56  assert ( osHeapV
5de0: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
5df0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
5e00: 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b  _FLAGS, NULL) );
5e10: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
5e20: 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20  ( nBytes>=0 );. 
5e30: 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63   p = osHeapAlloc
5e40: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
5e50: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
5e60: 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29   (SIZE_T)nBytes)
5e70: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
5e80: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
5e90: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
5ea0: 6c 65 64 20 74 6f 20 48 65 61 70 41 6c 6c 6f 63  led to HeapAlloc
5eb0: 20 25 75 20 62 79 74 65 73 20 28 25 64 29 2c 20   %u bytes (%d), 
5ec0: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
5ed0: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 73            nBytes
5ee0: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
5ef0: 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70  (), (void*)hHeap
5f00: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
5f10: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  p;.}../*.** Free
5f20: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
5f30: 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72  ic void winMemFr
5f40: 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 29  ee(void *pPrior)
5f50: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  {.  HANDLE hHeap
5f60: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
5f70: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
5f80: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
5f90: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
5fa0: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
5fb0: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
5fc0: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
5fd0: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
5fe0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
5ff0: 41 4c 49 44 41 54 45 0a 20 20 61 73 73 65 72 74  ALIDATE.  assert
6000: 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74   ( osHeapValidat
6010: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
6020: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
6030: 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e  , pPrior) );.#en
6040: 64 69 66 0a 20 20 69 66 28 20 21 70 50 72 69 6f  dif.  if( !pPrio
6050: 72 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 50  r ) return; /* P
6060: 61 73 73 69 6e 67 20 4e 55 4c 4c 20 74 6f 20 48  assing NULL to H
6070: 65 61 70 46 72 65 65 20 69 73 20 75 6e 64 65 66  eapFree is undef
6080: 69 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 21  ined. */.  if( !
6090: 6f 73 48 65 61 70 46 72 65 65 28 68 48 65 61 70  osHeapFree(hHeap
60a0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
60b0: 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f  EAP_FLAGS, pPrio
60c0: 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r) ){.    sqlite
60d0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
60e0: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48  EM, "failed to H
60f0: 65 61 70 46 72 65 65 20 62 6c 6f 63 6b 20 25 70  eapFree block %p
6100: 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c   (%d), heap=%p",
6110: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6120: 20 70 50 72 69 6f 72 2c 20 6f 73 47 65 74 4c 61   pPrior, osGetLa
6130: 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64  stError(), (void
6140: 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 7d 0a  *)hHeap);.  }.}.
6150: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
6160: 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 65 78 69  e size of an exi
6170: 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c  sting memory all
6180: 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
6190: 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65  c void *winMemRe
61a0: 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69  alloc(void *pPri
61b0: 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 7b  or, int nBytes){
61c0: 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b  .  HANDLE hHeap;
61d0: 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77  .  void *p;..  w
61e0: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
61f0: 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69  ();.  hHeap = wi
6200: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20  nMemGetHeap();. 
6210: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
6220: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  0 );.  assert( h
6230: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
6240: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
6250: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
6260: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
6270: 45 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73 48  E.  assert ( osH
6280: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
6290: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
62a0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69  HEAP_FLAGS, pPri
62b0: 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  or) );.#endif.  
62c0: 61 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d  assert( nBytes>=
62d0: 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50 72 69  0 );.  if( !pPri
62e0: 6f 72 20 29 7b 0a 20 20 20 20 70 20 3d 20 6f 73  or ){.    p = os
62f0: 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c  HeapAlloc(hHeap,
6300: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
6310: 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f  AP_FLAGS, (SIZE_
6320: 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d 65 6c  T)nBytes);.  }el
6330: 73 65 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65  se{.    p = osHe
6340: 61 70 52 65 41 6c 6c 6f 63 28 68 48 65 61 70 2c  apReAlloc(hHeap,
6350: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
6360: 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72  AP_FLAGS, pPrior
6370: 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73  , (SIZE_T)nBytes
6380: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 20  );.  }.  if( !p 
6390: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
63a0: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
63b0: 20 22 66 61 69 6c 65 64 20 74 6f 20 25 73 20 25   "failed to %s %
63c0: 75 20 62 79 74 65 73 20 28 25 64 29 2c 20 68 65  u bytes (%d), he
63d0: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
63e0: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 20 3f          pPrior ?
63f0: 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 20 3a   "HeapReAlloc" :
6400: 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 6e 42   "HeapAlloc", nB
6410: 79 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74 45  ytes, osGetLastE
6420: 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
6430: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68          (void*)h
6440: 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Heap);.  }.  ret
6450: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
6460: 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
6470: 6f 66 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  of an outstandin
6480: 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e  g allocation, in
6490: 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   bytes..*/.stati
64a0: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65  c int winMemSize
64b0: 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 48 41 4e  (void *p){.  HAN
64c0: 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 53 49 5a  DLE hHeap;.  SIZ
64d0: 45 5f 54 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65 6d  E_T n;..  winMem
64e0: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
64f0: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47   hHeap = winMemG
6500: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65  etHeap();.  asse
6510: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a  rt( hHeap!=0 );.
6520: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
6530: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
6540: 56 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66 20  VALUE );.#ifdef 
6550: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
6560: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20 61  LOC_VALIDATE.  a
6570: 73 73 65 72 74 20 28 20 6f 73 48 65 61 70 56 61  ssert ( osHeapVa
6580: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
6590: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
65a0: 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a  FLAGS, NULL) );.
65b0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 20  #endif.  if( !p 
65c0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20  ) return 0;.  n 
65d0: 3d 20 6f 73 48 65 61 70 53 69 7a 65 28 68 48 65  = osHeapSize(hHe
65e0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
65f0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29 3b  _HEAP_FLAGS, p);
6600: 0a 20 20 69 66 28 20 6e 3d 3d 28 53 49 5a 45 5f  .  if( n==(SIZE_
6610: 54 29 2d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  T)-1 ){.    sqli
6620: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
6630: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
6640: 20 48 65 61 70 53 69 7a 65 20 62 6c 6f 63 6b 20   HeapSize block 
6650: 25 70 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70  %p (%d), heap=%p
6660: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
6670: 20 20 20 70 2c 20 6f 73 47 65 74 4c 61 73 74 45     p, osGetLastE
6680: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68  rror(), (void*)h
6690: 48 65 61 70 29 3b 0a 20 20 20 20 72 65 74 75 72  Heap);.    retur
66a0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
66b0: 6e 20 28 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a  n (int)n;.}../*.
66c0: 2a 2a 20 52 6f 75 6e 64 20 75 70 20 61 20 72 65  ** Round up a re
66d0: 71 75 65 73 74 20 73 69 7a 65 20 74 6f 20 74 68  quest size to th
66e0: 65 20 6e 65 78 74 20 76 61 6c 69 64 20 61 6c 6c  e next valid all
66f0: 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 2a 2f  ocation size..*/
6700: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
6710: 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29  emRoundup(int n)
6720: 7b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  {.  return n;.}.
6730: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
6740: 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a  e this module..*
6750: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
6760: 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41  MemInit(void *pA
6770: 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65  ppData){.  winMe
6780: 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61  mData *pWinMemDa
6790: 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61  ta = (winMemData
67a0: 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20   *)pAppData;..  
67b0: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
67c0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
67d0: 5f 45 52 52 4f 52 3b 0a 20 20 61 73 73 65 72 74  _ERROR;.  assert
67e0: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d  ( pWinMemData->m
67f0: 61 67 69 63 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47  agic==WINMEM_MAG
6800: 49 43 20 29 3b 0a 20 20 69 66 28 20 21 70 57 69  IC );.  if( !pWi
6810: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20  nMemData->hHeap 
6820: 29 7b 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61  ){.    pWinMemDa
6830: 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 48 65  ta->hHeap = osHe
6840: 61 70 43 72 65 61 74 65 28 53 51 4c 49 54 45 5f  apCreate(SQLITE_
6850: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
6860: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6880: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57          SQLITE_W
6890: 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53  IN32_HEAP_INIT_S
68a0: 49 5a 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  IZE,.           
68b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68c0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
68d0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58  E_WIN32_HEAP_MAX
68e0: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 69 66 28 20  _SIZE);.    if( 
68f0: 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  !pWinMemData->hH
6900: 65 61 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  eap ){.      sql
6910: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
6920: 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 20  NOMEM,.         
6930: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
6940: 43 72 65 61 74 65 20 28 25 64 29 2c 20 66 6c 61  Create (%d), fla
6950: 67 73 3d 25 75 2c 20 69 6e 69 74 53 69 7a 65 3d  gs=%u, initSize=
6960: 25 75 2c 20 6d 61 78 53 69 7a 65 3d 25 75 22 2c  %u, maxSize=%u",
6970: 0a 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74  .          osGet
6980: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 53 51 4c  LastError(), SQL
6990: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
69a0: 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20  LAGS,.          
69b0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
69c0: 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 20 53 51 4c  P_INIT_SIZE, SQL
69d0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d  ITE_WIN32_HEAP_M
69e0: 41 58 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  AX_SIZE);.      
69f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6a00: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
6a10: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e  WinMemData->bOwn
6a20: 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 7d 0a 20  ed = TRUE;.  }. 
6a30: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
6a40: 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 30 20 29  Data->hHeap!=0 )
6a50: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  ;.  assert( pWin
6a60: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d  MemData->hHeap!=
6a70: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
6a80: 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66 20 53  ALUE );.#ifdef S
6a90: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
6aa0: 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20 61 73  OC_VALIDATE.  as
6ab0: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
6ac0: 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61  date(pWinMemData
6ad0: 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  ->hHeap, SQLITE_
6ae0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
6af0: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
6b00: 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
6b10: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
6b20: 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73  einitialize this
6b30: 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74   module..*/.stat
6b40: 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68  ic void winMemSh
6b50: 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70  utdown(void *pAp
6b60: 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d  pData){.  winMem
6b70: 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74  Data *pWinMemDat
6b80: 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61 20  a = (winMemData 
6b90: 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20 69  *)pAppData;..  i
6ba0: 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 20  f( !pWinMemData 
6bb0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
6bc0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
6bd0: 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ap ){.    assert
6be0: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  ( pWinMemData->h
6bf0: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
6c00: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
6c10: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
6c20: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
6c30: 45 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 73  E.    assert( os
6c40: 48 65 61 70 56 61 6c 69 64 61 74 65 28 70 57 69  HeapValidate(pWi
6c50: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c  nMemData->hHeap,
6c60: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
6c70: 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20  AP_FLAGS, NULL) 
6c80: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
6c90: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62  ( pWinMemData->b
6ca0: 4f 77 6e 65 64 20 29 7b 0a 20 20 20 20 20 20 69  Owned ){.      i
6cb0: 66 28 20 21 6f 73 48 65 61 70 44 65 73 74 72 6f  f( !osHeapDestro
6cc0: 79 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  y(pWinMemData->h
6cd0: 48 65 61 70 29 20 29 7b 0a 20 20 20 20 20 20 20  Heap) ){.       
6ce0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
6cf0: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
6d00: 65 64 20 74 6f 20 48 65 61 70 44 65 73 74 72 6f  ed to HeapDestro
6d10: 79 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22  y (%d), heap=%p"
6d20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6d30: 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
6d40: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 70  rror(), (void*)p
6d50: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
6d60: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
6d70: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62    pWinMemData->b
6d80: 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  Owned = FALSE;. 
6d90: 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d     }.    pWinMem
6da0: 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55  Data->hHeap = NU
6db0: 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  LL;.  }.}../*.**
6dc0: 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f   Populate the lo
6dd0: 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61  w-level memory a
6de0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74 69  llocation functi
6df0: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a  on pointers in.*
6e00: 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  * sqlite3GlobalC
6e10: 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20 70 6f 69  onfig.m with poi
6e20: 6e 74 65 72 73 20 74 6f 20 74 68 65 20 72 6f 75  nters to the rou
6e30: 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69  tines in this fi
6e40: 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d  le. The.** argum
6e50: 65 6e 74 73 20 73 70 65 63 69 66 79 20 74 68 65  ents specify the
6e60: 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79   block of memory
6e70: 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a   to manage..**.*
6e80: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
6e90: 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  s only called by
6ea0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
6eb0: 29 2c 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65  ), and therefore
6ec0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69  .** is not requi
6ed0: 72 65 64 20 74 6f 20 62 65 20 74 68 72 65 61 64  red to be thread
6ee0: 73 61 66 65 20 28 69 74 20 69 73 20 6e 6f 74 29  safe (it is not)
6ef0: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74  ..*/.const sqlit
6f00: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a  e3_mem_methods *
6f10: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e  sqlite3MemGetWin
6f20: 33 32 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  32(void){.  stat
6f30: 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
6f40: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69 6e  _mem_methods win
6f50: 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20  MemMethods = {. 
6f60: 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c     winMemMalloc,
6f70: 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c  .    winMemFree,
6f80: 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c  .    winMemReall
6f90: 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69  oc,.    winMemSi
6fa0: 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f  ze,.    winMemRo
6fb0: 75 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d 65  undup,.    winMe
6fc0: 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d 65  mInit,.    winMe
6fd0: 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20 26  mShutdown,.    &
6fe0: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20 7d  win_mem_data.  }
6ff0: 3b 0a 20 20 72 65 74 75 72 6e 20 26 77 69 6e 4d  ;.  return &winM
7000: 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f  emMethods;.}..vo
7010: 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74  id sqlite3MemSet
7020: 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20  Default(void){. 
7030: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
7040: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41  SQLITE_CONFIG_MA
7050: 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d  LLOC, sqlite3Mem
7060: 47 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a 23  GetWin32());.}.#
7070: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7080: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a  WIN32_MALLOC */.
7090: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
70a0: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f   UTF-8 string to
70b0: 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f   Microsoft Unico
70c0: 64 65 20 28 55 54 46 2d 31 36 3f 29 2e 20 0a 2a  de (UTF-16?). .*
70d0: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
70e0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
70f0: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
7100: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a  ed from malloc..
7110: 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52  */.static LPWSTR
7120: 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 63   utf8ToUnicode(c
7130: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
7140: 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43 68  name){.  int nCh
7150: 61 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57 69  ar;.  LPWSTR zWi
7160: 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e  deFilename;..  n
7170: 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79  Char = osMultiBy
7180: 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f  teToWideChar(CP_
7190: 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61  UTF8, 0, zFilena
71a0: 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29  me, -1, NULL, 0)
71b0: 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30  ;.  if( nChar==0
71c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
71d0: 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65 46 69 6c  ;.  }.  zWideFil
71e0: 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f  ename = sqlite3_
71f0: 6d 61 6c 6c 6f 63 28 20 6e 43 68 61 72 2a 73 69  malloc( nChar*si
7200: 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c 65 6e 61  zeof(zWideFilena
7210: 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  me[0]) );.  if( 
7220: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3d 3d 30  zWideFilename==0
7230: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
7240: 3b 0a 20 20 7d 0a 20 20 6e 43 68 61 72 20 3d 20  ;.  }.  nChar = 
7250: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  osMultiByteToWid
7260: 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30  eChar(CP_UTF8, 0
7270: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
7280: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 0a   zWideFilename,.
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72b0: 6e 43 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43  nChar);.  if( nC
72c0: 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  har==0 ){.    sq
72d0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65  lite3_free(zWide
72e0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Filename);.    z
72f0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 30  WideFilename = 0
7300: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
7310: 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  WideFilename;.}.
7320: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d  ./*.** Convert M
7330: 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65  icrosoft Unicode
7340: 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63   to UTF-8.  Spac
7350: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
7360: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
7370: 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  .** obtained fro
7380: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
7390: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ()..*/.static ch
73a0: 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 55 74 66  ar *unicodeToUtf
73b0: 38 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65 46  8(LPCWSTR zWideF
73c0: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ilename){.  int 
73d0: 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a  nByte;.  char *z
73e0: 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42 79  Filename;..  nBy
73f0: 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54  te = osWideCharT
7400: 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54  oMultiByte(CP_UT
7410: 46 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65  F8, 0, zWideFile
7420: 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20  name, -1, 0, 0, 
7430: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79  0, 0);.  if( nBy
7440: 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72  te == 0 ){.    r
7450: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
7460: 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Filename = sqlit
7470: 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65  e3_malloc( nByte
7480: 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   );.  if( zFilen
7490: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
74a0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42  turn 0;.  }.  nB
74b0: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
74c0: 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55  ToMultiByte(CP_U
74d0: 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c  TF8, 0, zWideFil
74e0: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65  ename, -1, zFile
74f0: 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20  name, nByte,.   
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7510: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
7520: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
7530: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  == 0 ){.    sqli
7540: 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61  te3_free(zFilena
7550: 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  me);.    zFilena
7560: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
7570: 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  turn zFilename;.
7580: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
7590: 20 61 6e 20 41 4e 53 49 20 73 74 72 69 6e 67 20   an ANSI string 
75a0: 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69  to Microsoft Uni
75b0: 63 6f 64 65 2c 20 62 61 73 65 64 20 6f 6e 20 74  code, based on t
75c0: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 63 6f  he.** current co
75d0: 64 65 70 61 67 65 20 73 65 74 74 69 6e 67 73 20  depage settings 
75e0: 66 6f 72 20 66 69 6c 65 20 61 70 69 73 2e 0a 2a  for file apis..*
75f0: 2a 20 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  * .** Space to h
7600: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
7610: 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69   string is obtai
7620: 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69  ned.** from sqli
7630: 74 65 33 5f 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73  te3_malloc..*/.s
7640: 74 61 74 69 63 20 4c 50 57 53 54 52 20 6d 62 63  tatic LPWSTR mbc
7650: 73 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74  sToUnicode(const
7660: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
7670: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ){.  int nByte;.
7680: 20 20 4c 50 57 53 54 52 20 7a 4d 62 63 73 46 69    LPWSTR zMbcsFi
7690: 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f  lename;.  int co
76a0: 64 65 70 61 67 65 20 3d 20 6f 73 41 72 65 46 69  depage = osAreFi
76b0: 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43  leApisANSI() ? C
76c0: 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50  P_ACP : CP_OEMCP
76d0: 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d  ;..  nByte = osM
76e0: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
76f0: 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20  ar(codepage, 0, 
7700: 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e  zFilename, -1, N
7710: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 20 20 20 20 20 30 29 2a 73 69 7a 65 6f 66 28 57       0)*sizeof(W
7740: 43 48 41 52 29 3b 0a 20 20 69 66 28 20 6e 42 79  CHAR);.  if( nBy
7750: 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  te==0 ){.    ret
7760: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62  urn 0;.  }.  zMb
7770: 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c  csFilename = sql
7780: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79  ite3_malloc( nBy
7790: 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62 63 73 46  te*sizeof(zMbcsF
77a0: 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20  ilename[0]) );. 
77b0: 20 69 66 28 20 7a 4d 62 63 73 46 69 6c 65 6e 61   if( zMbcsFilena
77c0: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
77d0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
77e0: 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65  te = osMultiByte
77f0: 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65 70  ToWideChar(codep
7800: 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  age, 0, zFilenam
7810: 65 2c 20 2d 31 2c 20 7a 4d 62 63 73 46 69 6c 65  e, -1, zMbcsFile
7820: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
7830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7840: 20 20 20 20 20 20 6e 42 79 74 65 29 3b 0a 20 20        nByte);.  
7850: 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a  if( nByte==0 ){.
7860: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
7870: 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 29 3b  (zMbcsFilename);
7880: 0a 20 20 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61  .    zMbcsFilena
7890: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
78a0: 74 75 72 6e 20 7a 4d 62 63 73 46 69 6c 65 6e 61  turn zMbcsFilena
78b0: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
78c0: 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55  vert Microsoft U
78d0: 6e 69 63 6f 64 65 20 74 6f 20 6d 75 6c 74 69 2d  nicode to multi-
78e0: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
78f0: 74 72 69 6e 67 2c 20 62 61 73 65 64 20 6f 6e 20  tring, based on 
7900: 74 68 65 0a 2a 2a 20 75 73 65 72 27 73 20 41 4e  the.** user's AN
7910: 53 49 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a 0a  SI codepage..**.
7920: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
7930: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
7940: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
7950: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
7960: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74  _malloc()..*/.st
7970: 61 74 69 63 20 63 68 61 72 20 2a 75 6e 69 63 6f  atic char *unico
7980: 64 65 54 6f 4d 62 63 73 28 4c 50 43 57 53 54 52  deToMbcs(LPCWSTR
7990: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b   zWideFilename){
79a0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
79b0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
79c0: 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20  .  int codepage 
79d0: 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41  = osAreFileApisA
79e0: 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a  NSI() ? CP_ACP :
79f0: 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42   CP_OEMCP;..  nB
7a00: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
7a10: 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65  ToMultiByte(code
7a20: 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69  page, 0, zWideFi
7a30: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30  lename, -1, 0, 0
7a40: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  , 0, 0);.  if( n
7a50: 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Byte == 0 ){.   
7a60: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
7a70: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   zFilename = sql
7a80: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79  ite3_malloc( nBy
7a90: 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c  te );.  if( zFil
7aa0: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ename==0 ){.    
7ab0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
7ac0: 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68  nByte = osWideCh
7ad0: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f  arToMultiByte(co
7ae0: 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65  depage, 0, zWide
7af0: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46  Filename, -1, zF
7b00: 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b20: 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 2c 20           nByte, 
7b30: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79  0, 0);.  if( nBy
7b40: 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73  te == 0 ){.    s
7b50: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c  qlite3_free(zFil
7b60: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c  ename);.    zFil
7b70: 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  ename = 0;.  }. 
7b80: 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d   return zFilenam
7b90: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  e;.}../*.** Conv
7ba0: 65 72 74 20 6d 75 6c 74 69 62 79 74 65 20 63 68  ert multibyte ch
7bb0: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 20 74  aracter string t
7bc0: 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20  o UTF-8.  Space 
7bd0: 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72  to hold the.** r
7be0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
7bf0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
7c00: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
7c10: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
7c20: 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
7c30: 5f 75 74 66 38 28 63 6f 6e 73 74 20 63 68 61 72  _utf8(const char
7c40: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
7c50: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 55  char *zFilenameU
7c60: 74 66 38 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54  tf8;.  LPWSTR zT
7c70: 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57  mpWide;..  zTmpW
7c80: 69 64 65 20 3d 20 6d 62 63 73 54 6f 55 6e 69 63  ide = mbcsToUnic
7c90: 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
7ca0: 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d    if( zTmpWide==
7cb0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
7cc0: 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61  0;.  }.  zFilena
7cd0: 6d 65 55 74 66 38 20 3d 20 75 6e 69 63 6f 64 65  meUtf8 = unicode
7ce0: 54 6f 55 74 66 38 28 7a 54 6d 70 57 69 64 65 29  ToUtf8(zTmpWide)
7cf0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
7d00: 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65  (zTmpWide);.  re
7d10: 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74  turn zFilenameUt
7d20: 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  f8;.}../*.** Con
7d30: 76 65 72 74 20 55 54 46 2d 38 20 74 6f 20 6d 75  vert UTF-8 to mu
7d40: 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74 65  ltibyte characte
7d50: 72 20 73 74 72 69 6e 67 2e 20 20 53 70 61 63 65  r string.  Space
7d60: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a   to hold the .**
7d70: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
7d80: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
7d90: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
7da0: 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  ()..*/.char *sql
7db0: 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f  ite3_win32_utf8_
7dc0: 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74 20 63 68  to_mbcs(const ch
7dd0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
7de0: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
7df0: 65 4d 62 63 73 3b 0a 20 20 4c 50 57 53 54 52 20  eMbcs;.  LPWSTR 
7e00: 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d  zTmpWide;..  zTm
7e10: 70 57 69 64 65 20 3d 20 75 74 66 38 54 6f 55 6e  pWide = utf8ToUn
7e20: 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
7e30: 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65  ;.  if( zTmpWide
7e40: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
7e50: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  n 0;.  }.  zFile
7e60: 6e 61 6d 65 4d 62 63 73 20 3d 20 75 6e 69 63 6f  nameMbcs = unico
7e70: 64 65 54 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64  deToMbcs(zTmpWid
7e80: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
7e90: 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  ee(zTmpWide);.  
7ea0: 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65  return zFilename
7eb0: 4d 62 63 73 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Mbcs;.}.../*.** 
7ec0: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
7ed0: 20 6f 66 20 67 65 74 4c 61 73 74 45 72 72 6f 72   of getLastError
7ee0: 4d 73 67 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69  Msg.** is zero i
7ef0: 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
7f00: 61 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20  age fits in the 
7f10: 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a  buffer, or non-z
7f20: 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ero.** otherwise
7f30: 20 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65   (if the message
7f40: 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e   was truncated).
7f50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
7f60: 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 44  etLastErrorMsg(D
7f70: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20  WORD lastErrno, 
7f80: 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
7f90: 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d  zBuf){.  /* Form
7fa0: 61 74 4d 65 73 73 61 67 65 20 72 65 74 75 72 6e  atMessage return
7fb0: 73 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20  s 0 on failure. 
7fc0: 20 4f 74 68 65 72 77 69 73 65 20 69 74 0a 20 20   Otherwise it.  
7fd0: 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ** returns the n
7fe0: 75 6d 62 65 72 20 6f 66 20 54 43 48 41 52 73 20  umber of TCHARs 
7ff0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f  written to the o
8000: 75 74 70 75 74 0a 20 20 2a 2a 20 62 75 66 66 65  utput.  ** buffe
8010: 72 2c 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65  r, excluding the
8020: 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c   terminating nul
8030: 6c 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44  l char..  */.  D
8040: 57 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a  WORD dwLen = 0;.
8050: 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30    char *zOut = 0
8060: 3b 0a 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  ;..  if( isNT() 
8070: 29 7b 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54  ){.    LPWSTR zT
8080: 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a  empWide = NULL;.
8090: 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f      dwLen = osFo
80a0: 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52  rmatMessageW(FOR
80b0: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f  MAT_MESSAGE_ALLO
80c0: 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20  CATE_BUFFER |.  
80d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80e0: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
80f0: 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53  T_MESSAGE_FROM_S
8100: 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20  YSTEM |.        
8110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8120: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
8130: 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52  AGE_IGNORE_INSER
8140: 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TS,.            
8150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8160: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
8170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8180: 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20      lastErrno,. 
8190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 28 4c 50 57              (LPW
81d0: 53 54 52 29 20 26 7a 54 65 6d 70 57 69 64 65 2c  STR) &zTempWide,
81e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
8200: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
8220: 3b 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20  ;.    if( dwLen 
8230: 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  > 0 ){.      /* 
8240: 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65  allocate a buffe
8250: 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f  r and convert to
8260: 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73   UTF8 */.      s
8270: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
8280: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
8290: 20 7a 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65 54   zOut = unicodeT
82a0: 6f 55 74 66 38 28 7a 54 65 6d 70 57 69 64 65 29  oUtf8(zTempWide)
82b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
82c0: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
82d0: 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20  ;.      /* free 
82e0: 74 68 65 20 73 79 73 74 65 6d 20 62 75 66 66 65  the system buffe
82f0: 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46  r allocated by F
8300: 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a  ormatMessage */.
8310: 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65        osLocalFre
8320: 65 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20  e(zTempWide);.  
8330: 20 20 7d 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73    }./* isNT() is
8340: 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f   1 if SQLITE_OS_
8350: 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69  WINCE==1, so thi
8360: 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20  s else is never 
8370: 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69  executed. .** Si
8380: 6e 63 65 20 74 68 65 20 41 4e 53 49 20 76 65 72  nce the ANSI ver
8390: 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69  sion of these Wi
83a0: 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74  ndows API do not
83b0: 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45   exist for WINCE
83c0: 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74  ,.** it's import
83d0: 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72  ant to not refer
83e0: 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49  ence them for WI
83f0: 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23  NCE builds..*/.#
8400: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
8410: 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20  CE==0.  }else{. 
8420: 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 20 3d     char *zTemp =
8430: 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e   NULL;.    dwLen
8440: 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61   = osFormatMessa
8450: 67 65 41 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41  geA(FORMAT_MESSA
8460: 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46  GE_ALLOCATE_BUFF
8470: 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ER |.           
8480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8490: 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45    FORMAT_MESSAGE
84a0: 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20  _FROM_SYSTEM |. 
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d              FORM
84d0: 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52  AT_MESSAGE_IGNOR
84e0: 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20  E_INSERTS,.     
84f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8500: 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20          NULL,.  
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8520: 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 45             lastE
8530: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8550: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20     0,.          
8560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8570: 20 20 20 28 4c 50 53 54 52 29 20 26 7a 54 65 6d     (LPSTR) &zTem
8580: 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
8590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85a0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85c0: 30 29 3b 0a 20 20 20 20 69 66 28 20 64 77 4c 65  0);.    if( dwLe
85d0: 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f  n > 0 ){.      /
85e0: 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66  * allocate a buf
85f0: 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20  fer and convert 
8600: 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20  to UTF8 */.     
8610: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
8620: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
8630: 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65     zOut = sqlite
8640: 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
8650: 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20  utf8(zTemp);.   
8660: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
8670: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
8680: 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73     /* free the s
8690: 79 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c  ystem buffer all
86a0: 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74  ocated by Format
86b0: 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20  Message */.     
86c0: 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65   osLocalFree(zTe
86d0: 6d 70 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  mp);.    }.#endi
86e0: 66 0a 20 20 7d 0a 20 20 69 66 28 20 30 20 3d 3d  f.  }.  if( 0 ==
86f0: 20 64 77 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71   dwLen ){.    sq
8700: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
8710: 42 75 66 2c 20 7a 42 75 66 2c 20 22 4f 73 45 72  Buf, zBuf, "OsEr
8720: 72 6f 72 20 30 78 25 78 20 28 25 75 29 22 2c 20  ror 0x%x (%u)", 
8730: 6c 61 73 74 45 72 72 6e 6f 2c 20 6c 61 73 74 45  lastErrno, lastE
8740: 72 72 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rrno);.  }else{.
8750: 20 20 20 20 2f 2a 20 63 6f 70 79 20 61 20 6d 61      /* copy a ma
8760: 78 69 6d 75 6d 20 6f 66 20 6e 42 75 66 20 63 68  ximum of nBuf ch
8770: 61 72 73 20 74 6f 20 6f 75 74 70 75 74 20 62 75  ars to output bu
8780: 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ffer */.    sqli
8790: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
87a0: 66 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a  f, zBuf, "%s", z
87b0: 4f 75 74 29 3b 0a 20 20 20 20 2f 2a 20 66 72 65  Out);.    /* fre
87c0: 65 20 74 68 65 20 55 54 46 38 20 62 75 66 66 65  e the UTF8 buffe
87d0: 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  r */.    sqlite3
87e0: 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d  _free(zOut);.  }
87f0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
8800: 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /*.**.** This fu
8810: 6e 63 74 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45  nction - winLogE
8820: 72 72 6f 72 41 74 4c 69 6e 65 28 29 20 2d 20 69  rrorAtLine() - i
8830: 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c  s only ever call
8840: 65 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f  ed via the macro
8850: 0a 2a 2a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  .** winLogError(
8860: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
8870: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
8880: 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20   after an error 
8890: 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20  occurs in an OS 
88a0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20  function..** It 
88b0: 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75  logs a message u
88c0: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67  sing sqlite3_log
88d0: 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  () containing th
88e0: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
88f0: 6f 66 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  of.** error code
8900: 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c   and, if possibl
8910: 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61  e, the human-rea
8920: 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74  dable equivalent
8930: 20 66 72 6f 6d 20 0a 2a 2a 20 46 6f 72 6d 61 74   from .** Format
8940: 4d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  Message..**.** T
8950: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
8960: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
8970: 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20  macro should be 
8980: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
8990: 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72  hat.** will be r
89a0: 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74  eturned to SQLit
89b0: 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49  e (e.g. SQLITE_I
89c0: 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c  OERR_DELETE, SQL
89d0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a  ITE_CANTOPEN). .
89e0: 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73 65  ** The two subse
89f0: 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20  quent arguments 
8a00: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61  should be the na
8a10: 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e  me of the OS fun
8a20: 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61  ction that.** fa
8a30: 69 6c 65 64 20 61 6e 64 20 74 68 65 20 74 68 65  iled and the the
8a40: 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
8a50: 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 20 69 66  -system path, if
8a60: 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65   any..*/.#define
8a70: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 61 2c 62   winLogError(a,b
8a80: 2c 63 2c 64 29 20 20 20 77 69 6e 4c 6f 67 45 72  ,c,d)   winLogEr
8a90: 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c  rorAtLine(a,b,c,
8aa0: 64 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74  d,__LINE__).stat
8ab0: 69 63 20 69 6e 74 20 77 69 6e 4c 6f 67 45 72 72  ic int winLogErr
8ac0: 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20  orAtLine(.  int 
8ad0: 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20  errcode,        
8ae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8af0: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
8b00: 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   */.  DWORD last
8b10: 45 72 72 6e 6f 2c 20 20 20 20 20 20 20 20 20 20  Errno,          
8b20: 20 20 20 20 20 20 2f 2a 20 57 69 6e 33 32 20 6c        /* Win32 l
8b30: 61 73 74 20 65 72 72 6f 72 20 2a 2f 0a 20 20 63  ast error */.  c
8b40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
8b50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
8b60: 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e  * Name of OS fun
8b70: 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65  ction that faile
8b80: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
8b90: 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
8ba0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70         /* File p
8bb0: 61 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 77  ath associated w
8bc0: 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69  ith error */.  i
8bd0: 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20  nt iLine        
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8bf0: 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75  * Source line nu
8c00: 6d 62 65 72 20 77 68 65 72 65 20 65 72 72 6f 72  mber where error
8c10: 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a   occurred */.){.
8c20: 20 20 63 68 61 72 20 7a 4d 73 67 5b 35 30 30 5d    char zMsg[500]
8c30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8c40: 20 20 2f 2a 20 48 75 6d 61 6e 20 72 65 61 64 61    /* Human reada
8c50: 62 6c 65 20 65 72 72 6f 72 20 74 65 78 74 20 2a  ble error text *
8c60: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
8c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c80: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
8c90: 74 65 72 20 2a 2f 0a 0a 20 20 7a 4d 73 67 5b 30  ter */..  zMsg[0
8ca0: 5d 20 3d 20 30 3b 0a 20 20 67 65 74 4c 61 73 74  ] = 0;.  getLast
8cb0: 45 72 72 6f 72 4d 73 67 28 6c 61 73 74 45 72 72  ErrorMsg(lastErr
8cc0: 6e 6f 2c 20 73 69 7a 65 6f 66 28 7a 4d 73 67 29  no, sizeof(zMsg)
8cd0: 2c 20 7a 4d 73 67 29 3b 0a 20 20 61 73 73 65 72  , zMsg);.  asser
8ce0: 74 28 20 65 72 72 63 6f 64 65 21 3d 53 51 4c 49  t( errcode!=SQLI
8cf0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a  TE_OK );.  if( z
8d00: 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20  Path==0 ) zPath 
8d10: 3d 20 22 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = "";.  for(i=0;
8d20: 20 7a 4d 73 67 5b 69 5d 20 26 26 20 7a 4d 73 67   zMsg[i] && zMsg
8d30: 5b 69 5d 21 3d 27 5c 72 27 20 26 26 20 7a 4d 73  [i]!='\r' && zMs
8d40: 67 5b 69 5d 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29  g[i]!='\n'; i++)
8d50: 7b 7d 0a 20 20 7a 4d 73 67 5b 69 5d 20 3d 20 30  {}.  zMsg[i] = 0
8d60: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ;.  sqlite3_log(
8d70: 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20 22  errcode,.      "
8d80: 6f 73 5f 77 69 6e 2e 63 3a 25 64 3a 20 28 25 64  os_win.c:%d: (%d
8d90: 29 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a  ) %s(%s) - %s",.
8da0: 20 20 20 20 20 20 69 4c 69 6e 65 2c 20 6c 61 73        iLine, las
8db0: 74 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a  tErrno, zFunc, z
8dc0: 50 61 74 68 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a  Path, zMsg.  );.
8dd0: 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64  .  return errcod
8de0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  e;.}../*.** The 
8df0: 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  number of times 
8e00: 74 68 61 74 20 61 20 52 65 61 64 46 69 6c 65 28  that a ReadFile(
8e10: 29 2c 20 57 72 69 74 65 46 69 6c 65 28 29 2c 20  ), WriteFile(), 
8e20: 61 6e 64 20 44 65 6c 65 74 65 46 69 6c 65 28 29  and DeleteFile()
8e30: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 72  .** will be retr
8e40: 69 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20  ied following a 
8e50: 6c 6f 63 6b 69 6e 67 20 65 72 72 6f 72 20 2d 20  locking error - 
8e60: 70 72 6f 62 61 62 6c 79 20 63 61 75 73 65 64 20  probably caused 
8e70: 62 79 20 0a 2a 2a 20 61 6e 74 69 76 69 72 75 73  by .** antivirus
8e80: 20 73 6f 66 74 77 61 72 65 2e 20 20 41 6c 73 6f   software.  Also
8e90: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 64 65 6c   the initial del
8ea0: 61 79 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  ay before the fi
8eb0: 72 73 74 20 72 65 74 72 79 2e 0a 2a 2a 20 54 68  rst retry..** Th
8ec0: 65 20 64 65 6c 61 79 20 69 6e 63 72 65 61 73 65  e delay increase
8ed0: 73 20 6c 69 6e 65 61 72 6c 79 20 77 69 74 68 20  s linearly with 
8ee0: 65 61 63 68 20 72 65 74 72 79 2e 0a 2a 2f 0a 23  each retry..*/.#
8ef0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
8f00: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 0a  N32_IOERR_RETRY.
8f10: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
8f20: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
8f30: 59 20 31 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  Y 10.#endif.#ifn
8f40: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
8f50: 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c  _IOERR_RETRY_DEL
8f60: 41 59 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  AY.# define SQLI
8f70: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
8f80: 45 54 52 59 5f 44 45 4c 41 59 20 32 35 0a 23 65  ETRY_DELAY 25.#e
8f90: 6e 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20  ndif.static int 
8fa0: 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 20  win32IoerrRetry 
8fb0: 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  = SQLITE_WIN32_I
8fc0: 4f 45 52 52 5f 52 45 54 52 59 3b 0a 73 74 61 74  OERR_RETRY;.stat
8fd0: 69 63 20 69 6e 74 20 77 69 6e 33 32 49 6f 65 72  ic int win32Ioer
8fe0: 72 52 65 74 72 79 44 65 6c 61 79 20 3d 20 53 51  rRetryDelay = SQ
8ff0: 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52  LITE_WIN32_IOERR
9000: 5f 52 45 54 52 59 5f 44 45 4c 41 59 3b 0a 0a 2f  _RETRY_DELAY;../
9010: 2a 0a 2a 2a 20 49 66 20 61 20 52 65 61 64 46 69  *.** If a ReadFi
9020: 6c 65 28 29 20 6f 72 20 57 72 69 74 65 46 69 6c  le() or WriteFil
9030: 65 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73  e() error occurs
9040: 2c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  , invoke this ro
9050: 75 74 69 6e 65 0a 2a 2a 20 74 6f 20 73 65 65 20  utine.** to see 
9060: 69 66 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20  if it should be 
9070: 72 65 74 72 69 65 64 2e 20 20 52 65 74 75 72 6e  retried.  Return
9080: 20 54 52 55 45 20 74 6f 20 72 65 74 72 79 2e 20   TRUE to retry. 
9090: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
90a0: 20 74 6f 20 67 69 76 65 20 75 70 20 77 69 74 68   to give up with
90b0: 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74   an error..*/.st
90c0: 61 74 69 63 20 69 6e 74 20 72 65 74 72 79 49 6f  atic int retryIo
90d0: 65 72 72 28 69 6e 74 20 2a 70 6e 52 65 74 72 79  err(int *pnRetry
90e0: 2c 20 44 57 4f 52 44 20 2a 70 45 72 72 6f 72 29  , DWORD *pError)
90f0: 7b 0a 20 20 44 57 4f 52 44 20 65 20 3d 20 6f 73  {.  DWORD e = os
9100: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
9110: 20 20 69 66 28 20 2a 70 6e 52 65 74 72 79 3e 3d    if( *pnRetry>=
9120: 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 20  win32IoerrRetry 
9130: 29 7b 0a 20 20 20 20 69 66 28 20 70 45 72 72 6f  ){.    if( pErro
9140: 72 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 72 72  r ){.      *pErr
9150: 6f 72 20 3d 20 65 3b 0a 20 20 20 20 7d 0a 20 20  or = e;.    }.  
9160: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
9170: 20 20 69 66 28 20 65 3d 3d 45 52 52 4f 52 5f 41    if( e==ERROR_A
9180: 43 43 45 53 53 5f 44 45 4e 49 45 44 20 7c 7c 0a  CCESS_DENIED ||.
9190: 20 20 20 20 20 20 65 3d 3d 45 52 52 4f 52 5f 4c        e==ERROR_L
91a0: 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f 4e 20 7c 7c  OCK_VIOLATION ||
91b0: 0a 20 20 20 20 20 20 65 3d 3d 45 52 52 4f 52 5f  .      e==ERROR_
91c0: 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f  SHARING_VIOLATIO
91d0: 4e 20 29 7b 0a 20 20 20 20 6f 73 53 6c 65 65 70  N ){.    osSleep
91e0: 28 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79  (win32IoerrRetry
91f0: 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72  Delay*(1+*pnRetr
9200: 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65  y));.    ++*pnRe
9210: 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  try;.    return 
9220: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 72  1;.  }.  if( pEr
9230: 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72 72  ror ){.    *pErr
9240: 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65  or = e;.  }.  re
9250: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
9260: 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72   Log a I/O error
9270: 20 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a   retry episode..
9280: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
9290: 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e 52 65 74  ogIoerr(int nRet
92a0: 72 79 29 7b 0a 20 20 69 66 28 20 6e 52 65 74 72  ry){.  if( nRetr
92b0: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
92c0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 49 4f 45 52  _log(SQLITE_IOER
92d0: 52 2c 20 0a 20 20 20 20 20 20 22 64 65 6c 61 79  R, .      "delay
92e0: 65 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b  ed %dms for lock
92f0: 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63  /sharing conflic
9300: 74 22 2c 0a 20 20 20 20 20 20 77 69 6e 33 32 49  t",.      win32I
9310: 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 6e  oerrRetryDelay*n
9320: 52 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31 29  Retry*(nRetry+1)
9330: 2f 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a  /2.    );.  }.}.
9340: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
9350: 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  INCE./**********
9360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
93a0: 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
93b0: 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66 6f  contains code fo
93c0: 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f  r WinCE only..*/
93d0: 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 43  ./*.** Windows C
93e0: 45 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  E does not have 
93f0: 61 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 66 75  a localtime() fu
9400: 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 63 72 65 61  nction.  So crea
9410: 74 65 20 61 0a 2a 2a 20 73 75 62 73 74 69 74 75  te a.** substitu
9420: 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  te..*/.#include 
9430: 3c 74 69 6d 65 2e 68 3e 0a 73 74 72 75 63 74 20  <time.h>.struct 
9440: 74 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f 63 61  tm *__cdecl loca
9450: 6c 74 69 6d 65 28 63 6f 6e 73 74 20 74 69 6d 65  ltime(const time
9460: 5f 74 20 2a 74 29 0a 7b 0a 20 20 73 74 61 74 69  _t *t).{.  stati
9470: 63 20 73 74 72 75 63 74 20 74 6d 20 79 3b 0a 20  c struct tm y;. 
9480: 20 46 49 4c 45 54 49 4d 45 20 75 54 6d 2c 20 6c   FILETIME uTm, l
9490: 54 6d 3b 0a 20 20 53 59 53 54 45 4d 54 49 4d 45  Tm;.  SYSTEMTIME
94a0: 20 70 54 6d 3b 0a 20 20 73 71 6c 69 74 65 33 5f   pTm;.  sqlite3_
94b0: 69 6e 74 36 34 20 74 36 34 3b 0a 20 20 74 36 34  int64 t64;.  t64
94c0: 20 3d 20 2a 74 3b 0a 20 20 74 36 34 20 3d 20 28   = *t;.  t64 = (
94d0: 74 36 34 20 2b 20 31 31 36 34 34 34 37 33 36 30  t64 + 1164447360
94e0: 30 29 2a 31 30 30 30 30 30 30 30 3b 0a 20 20 75  0)*10000000;.  u
94f0: 54 6d 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65  Tm.dwLowDateTime
9500: 20 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20 26   = (DWORD)(t64 &
9510: 20 30 78 46 46 46 46 46 46 46 46 29 3b 0a 20 20   0xFFFFFFFF);.  
9520: 75 54 6d 2e 64 77 48 69 67 68 44 61 74 65 54 69  uTm.dwHighDateTi
9530: 6d 65 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20  me= (DWORD)(t64 
9540: 3e 3e 20 33 32 29 3b 0a 20 20 6f 73 46 69 6c 65  >> 32);.  osFile
9550: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
9560: 69 6d 65 28 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a  ime(&uTm,&lTm);.
9570: 20 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53 79    osFileTimeToSy
9580: 73 74 65 6d 54 69 6d 65 28 26 6c 54 6d 2c 26 70  stemTime(&lTm,&p
9590: 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f 79 65 61 72  Tm);.  y.tm_year
95a0: 20 3d 20 70 54 6d 2e 77 59 65 61 72 20 2d 20 31   = pTm.wYear - 1
95b0: 39 30 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20  900;.  y.tm_mon 
95c0: 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31  = pTm.wMonth - 1
95d0: 3b 0a 20 20 79 2e 74 6d 5f 77 64 61 79 20 3d 20  ;.  y.tm_wday = 
95e0: 70 54 6d 2e 77 44 61 79 4f 66 57 65 65 6b 3b 0a  pTm.wDayOfWeek;.
95f0: 20 20 79 2e 74 6d 5f 6d 64 61 79 20 3d 20 70 54    y.tm_mday = pT
9600: 6d 2e 77 44 61 79 3b 0a 20 20 79 2e 74 6d 5f 68  m.wDay;.  y.tm_h
9610: 6f 75 72 20 3d 20 70 54 6d 2e 77 48 6f 75 72 3b  our = pTm.wHour;
9620: 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54  .  y.tm_min = pT
9630: 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20 20 79 2e 74  m.wMinute;.  y.t
9640: 6d 5f 73 65 63 20 3d 20 70 54 6d 2e 77 53 65 63  m_sec = pTm.wSec
9650: 6f 6e 64 3b 0a 20 20 72 65 74 75 72 6e 20 26 79  ond;.  return &y
9660: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e  ;.}..#define HAN
9670: 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61  DLE_TO_WINFILE(a
9680: 29 20 28 77 69 6e 46 69 6c 65 2a 29 26 28 28 63  ) (winFile*)&((c
9690: 68 61 72 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66  har*)a)[-(int)of
96a0: 66 73 65 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68  fsetof(winFile,h
96b0: 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  )]../*.** Acquir
96c0: 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  e a lock on the 
96d0: 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74  handle h.*/.stat
96e0: 69 63 20 76 6f 69 64 20 77 69 6e 63 65 4d 75 74  ic void winceMut
96f0: 65 78 41 63 71 75 69 72 65 28 48 41 4e 44 4c 45  exAcquire(HANDLE
9700: 20 68 29 7b 0a 20 20 20 44 57 4f 52 44 20 64 77   h){.   DWORD dw
9710: 45 72 72 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20  Err;.   do {.   
9720: 20 20 64 77 45 72 72 20 3d 20 57 61 69 74 46 6f    dwErr = WaitFo
9730: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c  rSingleObject(h,
9740: 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d   INFINITE);.   }
9750: 20 77 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d   while (dwErr !=
9760: 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26   WAIT_OBJECT_0 &
9770: 26 20 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f  & dwErr != WAIT_
9780: 41 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a  ABANDONED);.}./*
9790: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f  .** Release a lo
97a0: 63 6b 20 61 63 71 75 69 72 65 64 20 62 79 20 77  ck acquired by w
97b0: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
97c0: 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69  ().*/.#define wi
97d0: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
97e0: 68 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28  h) ReleaseMutex(
97f0: 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  h)../*.** Create
9800: 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73   the mutex and s
9810: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65  hared memory use
9820: 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e  d for locking in
9830: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73   the file.** des
9840: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f  criptor pFile.*/
9850: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
9860: 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e  ceCreateLock(con
9870: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
9880: 6d 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  me, winFile *pFi
9890: 6c 65 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54  le){.  LPWSTR zT
98a0: 6f 6b 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61  ok;.  LPWSTR zNa
98b0: 6d 65 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74  me;.  BOOL bInit
98c0: 20 3d 20 54 52 55 45 3b 0a 0a 20 20 7a 4e 61 6d   = TRUE;..  zNam
98d0: 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64  e = utf8ToUnicod
98e0: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
98f0: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  if( zName==0 ){.
9900: 20 20 20 20 2f 2a 20 6f 75 74 20 6f 66 20 6d 65      /* out of me
9910: 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 72 65 74 75  mory */.    retu
9920: 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20  rn FALSE;.  }.. 
9930: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
9940: 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74  he local lockdat
9950: 61 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70  a */.  memset(&p
9960: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2c 20 30 2c 20  File->local, 0, 
9970: 73 69 7a 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f  sizeof(pFile->lo
9980: 63 61 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70  cal));..  /* Rep
9990: 6c 61 63 65 20 74 68 65 20 62 61 63 6b 73 6c 61  lace the backsla
99a0: 73 68 65 73 20 66 72 6f 6d 20 74 68 65 20 66 69  shes from the fi
99b0: 6c 65 6e 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72  lename and lower
99c0: 63 61 73 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20  case it.  ** to 
99d0: 64 65 72 69 76 65 20 61 20 6d 75 74 65 78 20 6e  derive a mutex n
99e0: 61 6d 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d  ame. */.  zTok =
99f0: 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e   osCharLowerW(zN
9a00: 61 6d 65 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a  ame);.  for (;*z
9a10: 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20  Tok;zTok++){.   
9a20: 20 69 66 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c   if (*zTok == '\
9a30: 5c 27 29 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b  \') *zTok = '_';
9a40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74  .  }..  /* Creat
9a50: 65 2f 6f 70 65 6e 20 74 68 65 20 6e 61 6d 65 64  e/open the named
9a60: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c   mutex */.  pFil
9a70: 65 2d 3e 68 4d 75 74 65 78 20 3d 20 6f 73 43 72  e->hMutex = osCr
9a80: 65 61 74 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c  eateMutexW(NULL,
9a90: 20 46 41 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a   FALSE, zName);.
9aa0: 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d    if (!pFile->hM
9ab0: 75 74 65 78 29 7b 0a 20 20 20 20 70 46 69 6c 65  utex){.    pFile
9ac0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
9ad0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
9ae0: 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
9af0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 70 46  SQLITE_ERROR, pF
9b00: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20  ile->lastErrno, 
9b10: 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b  "winceCreateLock
9b20: 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  1", zFilename);.
9b30: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9b40: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  (zName);.    ret
9b50: 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a  urn FALSE;.  }..
9b60: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65    /* Acquire the
9b70: 20 6d 75 74 65 78 20 62 65 66 6f 72 65 20 63 6f   mutex before co
9b80: 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77 69  ntinuing */.  wi
9b90: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
9ba0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
9bb0: 20 20 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74 68    .  /* Since th
9bc0: 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64  e names of named
9bd0: 20 6d 75 74 65 78 65 73 2c 20 73 65 6d 61 70 68   mutexes, semaph
9be0: 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61 70 70 69  ores, file mappi
9bf0: 6e 67 73 20 65 74 63 20 61 72 65 20 0a 20 20 2a  ngs etc are .  *
9c00: 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65  * case-sensitive
9c10: 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65  , take advantage
9c20: 20 6f 66 20 74 68 61 74 20 62 79 20 75 70 70 65   of that by uppe
9c30: 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65  rcasing the mute
9c40: 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20  x name.  ** and 
9c50: 75 73 69 6e 67 20 74 68 61 74 20 61 73 20 74 68  using that as th
9c60: 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d 61 70  e shared filemap
9c70: 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a  ping name..  */.
9c80: 20 20 6f 73 43 68 61 72 55 70 70 65 72 57 28 7a    osCharUpperW(z
9c90: 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e  Name);.  pFile->
9ca0: 68 53 68 61 72 65 64 20 3d 20 6f 73 43 72 65 61  hShared = osCrea
9cb0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 49  teFileMappingW(I
9cc0: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
9cd0: 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20  LUE, NULL,.     
9ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d00: 20 20 20 50 41 47 45 5f 52 45 41 44 57 52 49 54     PAGE_READWRIT
9d10: 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e  E, 0, sizeof(win
9d20: 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20  ceLock),.       
9d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d50: 20 7a 4e 61 6d 65 29 3b 20 20 0a 0a 20 20 2f 2a   zName);  ..  /*
9d60: 20 53 65 74 20 61 20 66 6c 61 67 20 74 68 61 74   Set a flag that
9d70: 20 69 6e 64 69 63 61 74 65 73 20 77 65 27 72 65   indicates we're
9d80: 20 74 68 65 20 66 69 72 73 74 20 74 6f 20 63 72   the first to cr
9d90: 65 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  eate the memory 
9da0: 73 6f 20 69 74 20 0a 20 20 2a 2a 20 6d 75 73 74  so it .  ** must
9db0: 20 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c   be zero-initial
9dc0: 69 7a 65 64 20 2a 2f 0a 20 20 69 66 20 28 6f 73  ized */.  if (os
9dd0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 3d  GetLastError() =
9de0: 3d 20 45 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f  = ERROR_ALREADY_
9df0: 45 58 49 53 54 53 29 7b 0a 20 20 20 20 62 49 6e  EXISTS){.    bIn
9e00: 69 74 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a  it = FALSE;.  }.
9e10: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
9e20: 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66  zName);..  /* If
9e30: 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e   we succeeded in
9e40: 20 6d 61 6b 69 6e 67 20 74 68 65 20 73 68 61 72   making the shar
9e50: 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65  ed memory handle
9e60: 2c 20 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69  , map it. */.  i
9e70: 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  f (pFile->hShare
9e80: 64 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73  d){.    pFile->s
9e90: 68 61 72 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f  hared = (winceLo
9ea0: 63 6b 2a 29 6f 73 4d 61 70 56 69 65 77 4f 66 46  ck*)osMapViewOfF
9eb0: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72  ile(pFile->hShar
9ec0: 65 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ed, .           
9ed0: 20 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c    FILE_MAP_READ|
9ee0: 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20  FILE_MAP_WRITE, 
9ef0: 30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e  0, 0, sizeof(win
9f00: 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a  ceLock));.    /*
9f10: 20 49 66 20 6d 61 70 70 69 6e 67 20 66 61 69 6c   If mapping fail
9f20: 65 64 2c 20 63 6c 6f 73 65 20 74 68 65 20 73 68  ed, close the sh
9f30: 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64  ared memory hand
9f40: 6c 65 20 61 6e 64 20 65 72 61 73 65 20 69 74 20  le and erase it 
9f50: 2a 2f 0a 20 20 20 20 69 66 20 28 21 70 46 69 6c  */.    if (!pFil
9f60: 65 2d 3e 73 68 61 72 65 64 29 7b 0a 20 20 20 20  e->shared){.    
9f70: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
9f80: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
9f90: 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e  ror();.      win
9fa0: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
9fb0: 45 52 52 4f 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  ERROR, pFile->la
9fc0: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
9fd0: 20 20 20 20 20 20 20 20 22 77 69 6e 63 65 43 72          "winceCr
9fe0: 65 61 74 65 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c  eateLock2", zFil
9ff0: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6f 73  ename);.      os
a000: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
a010: 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20 20 20  e->hShared);.   
a020: 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65     pFile->hShare
a030: 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  d = NULL;.    }.
a040: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61    }..  /* If sha
a050: 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64  red memory could
a060: 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64 2c   not be created,
a070: 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20   then close the 
a080: 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c 20 2a  mutex and fail *
a090: 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68  /.  if (pFile->h
a0a0: 53 68 61 72 65 64 20 3d 3d 20 4e 55 4c 4c 29 7b  Shared == NULL){
a0b0: 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52  .    winceMutexR
a0c0: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
a0d0: 75 74 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f  utex);.    osClo
a0e0: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
a0f0: 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69  hMutex);.    pFi
a100: 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c  le->hMutex = NUL
a110: 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41  L;.    return FA
a120: 4c 53 45 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  LSE;.  }.  .  /*
a130: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
a140: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66  shared memory if
a150: 20 77 65 27 72 65 20 73 75 70 70 6f 73 65 64 20   we're supposed 
a160: 74 6f 20 2a 2f 0a 20 20 69 66 20 28 62 49 6e 69  to */.  if (bIni
a170: 74 29 20 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  t) {.    memset(
a180: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30  pFile->shared, 0
a190: 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f  , sizeof(winceLo
a1a0: 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e  ck));.  }..  win
a1b0: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
a1c0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
a1d0: 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 7d 0a   return TRUE;.}.
a1e0: 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74  ./*.** Destroy t
a1f0: 68 65 20 70 61 72 74 20 6f 66 20 77 69 6e 46 69  he part of winFi
a200: 6c 65 20 74 68 61 74 20 64 65 61 6c 73 20 77 69  le that deals wi
a210: 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a  th wince locks.*
a220: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
a230: 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77  nceDestroyLock(w
a240: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
a250: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75    if (pFile->hMu
a260: 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71  tex){.    /* Acq
a270: 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20 2a  uire the mutex *
a280: 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78  /.    winceMutex
a290: 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
a2a0: 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20  Mutex);..    /* 
a2b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
a2c0: 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f 62  ocks should prob
a2d0: 61 62 6c 79 20 61 73 73 65 72 74 20 69 6e 20 64  ably assert in d
a2e0: 65 62 75 67 20 6d 6f 64 65 2c 20 62 75 74 20 74  ebug mode, but t
a2f0: 68 65 79 0a 20 20 20 20 20 20 20 61 72 65 20 74  hey.       are t
a300: 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20 63 61 73  o cleanup in cas
a310: 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61  e any locks rema
a320: 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20  ined open */.   
a330: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
a340: 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20  l.nReaders){.   
a350: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
a360: 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20  ->nReaders --;. 
a370: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69     }.    if (pFi
a380: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
a390: 76 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ved){.      pFil
a3a0: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
a3b0: 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  rved = FALSE;.  
a3c0: 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c    }.    if (pFil
a3d0: 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e  e->local.bPendin
a3e0: 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  g){.      pFile-
a3f0: 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
a400: 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d  g = FALSE;.    }
a410: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
a420: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
a430: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
a440: 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
a450: 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ve = FALSE;.    
a460: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65 66  }..    /* De-ref
a470: 65 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65  erence and close
a480: 20 6f 75 72 20 63 6f 70 79 20 6f 66 20 74 68 65   our copy of the
a490: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68   shared memory h
a4a0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 6f 73 55  andle */.    osU
a4b0: 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  nmapViewOfFile(p
a4c0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20  File->shared);. 
a4d0: 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
a4e0: 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29  (pFile->hShared)
a4f0: 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77  ;..    /* Done w
a500: 69 74 68 20 74 68 65 20 6d 75 74 65 78 20 2a 2f  ith the mutex */
a510: 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52  .    winceMutexR
a520: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
a530: 75 74 65 78 29 3b 20 20 20 20 0a 20 20 20 20 6f  utex);    .    o
a540: 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
a550: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20  le->hMutex);.   
a560: 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d   pFile->hMutex =
a570: 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   NULL;.  }.}../*
a580: 20 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e   .** An implemen
a590: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f  tation of the Lo
a5a0: 63 6b 46 69 6c 65 28 29 20 41 50 49 20 6f 66 20  ckFile() API of 
a5b0: 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a  Windows for CE.*
a5c0: 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  /.static BOOL wi
a5d0: 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 48  nceLockFile(.  H
a5e0: 41 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a 20  ANDLE *phFile,. 
a5f0: 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66   DWORD dwFileOff
a600: 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
a610: 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
a620: 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
a630: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
a640: 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62  w,.  DWORD nNumb
a650: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48  erOfBytesToLockH
a660: 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65  igh.){.  winFile
a670: 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45   *pFile = HANDLE
a680: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69  _TO_WINFILE(phFi
a690: 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74  le);.  BOOL bRet
a6a0: 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20  urn = FALSE;..  
a6b0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
a6c0: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67  (dwFileOffsetHig
a6d0: 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  h);.  UNUSED_PAR
a6e0: 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66  AMETER(nNumberOf
a6f0: 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29  BytesToLockHigh)
a700: 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d  ;..  if (!pFile-
a710: 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20  >hMutex) return 
a720: 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74  TRUE;.  winceMut
a730: 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
a740: 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  >hMutex);..  /* 
a750: 57 61 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75  Wanting an exclu
a760: 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  sive lock? */.  
a770: 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
a780: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
a790: 41 52 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20  ARED_FIRST.     
a7a0: 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79    && nNumberOfBy
a7b0: 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
a7c0: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49  (DWORD)SHARED_SI
a7d0: 5a 45 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69  ZE){.    if (pFi
a7e0: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61  le->shared->nRea
a7f0: 64 65 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69  ders == 0 && pFi
a800: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63  le->shared->bExc
a810: 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20  lusive == 0){.  
a820: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
a830: 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
a840: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46   TRUE;.       pF
a850: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
a860: 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20  usive = TRUE;.  
a870: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
a880: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
a890: 20 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64    /* Want a read
a8a0: 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  -only lock? */. 
a8b0: 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
a8c0: 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
a8d0: 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54  ORD)SHARED_FIRST
a8e0: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e   &&.           n
a8f0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
a900: 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
a910: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61    if (pFile->sha
a920: 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
a930: 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69  == 0){.      pFi
a940: 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
a950: 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20  rs ++;.      if 
a960: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
a970: 65 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20  eaders == 1){.  
a980: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
a990: 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b  red->nReaders ++
a9a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a9b0: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
a9c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
a9d0: 57 61 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c  Want a pending l
a9e0: 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69  ock? */.  else i
a9f0: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
aa00: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e  ow == (DWORD)PEN
aa10: 44 49 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e 75  DING_BYTE && nNu
aa20: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
aa30: 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
aa40: 2f 2a 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67  /* If no pending
aa50: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61   lock has been a
aa60: 63 71 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63  cquired, then ac
aa70: 71 75 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20  quire it */.    
aa80: 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
aa90: 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30  d->bPending == 0
aaa0: 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
aab0: 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
aac0: 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  g = TRUE;.      
aad0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
aae0: 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20  nding = TRUE;.  
aaf0: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
ab00: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
ab10: 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72   /* Want a reser
ab20: 76 65 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65  ved lock? */.  e
ab30: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
ab40: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
ab50: 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 20  D)RESERVED_BYTE 
ab60: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
ab70: 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  sToLockLow == 1)
ab80: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
ab90: 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
aba0: 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20  ed == 0) {.     
abb0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
abc0: 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45  bReserved = TRUE
abd0: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
abe0: 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d  ocal.bReserved =
abf0: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65   TRUE;.      bRe
ac00: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
ac10: 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d   }.  }..  winceM
ac20: 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
ac30: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65  e->hMutex);.  re
ac40: 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a  turn bReturn;.}.
ac50: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  ./*.** An implem
ac60: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
ac70: 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f  UnlockFile API o
ac80: 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45  f Windows for CE
ac90: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
aca0: 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28  winceUnlockFile(
acb0: 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69 6c  .  HANDLE *phFil
acc0: 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  e,.  DWORD dwFil
acd0: 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57  eOffsetLow,.  DW
ace0: 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
acf0: 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  High,.  DWORD nN
ad00: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
ad10: 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  lockLow,.  DWORD
ad20: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
ad30: 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20  oUnlockHigh.){. 
ad40: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
ad50: 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46  = HANDLE_TO_WINF
ad60: 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42  ILE(phFile);.  B
ad70: 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41  OOL bReturn = FA
ad80: 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  LSE;..  UNUSED_P
ad90: 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65 4f  ARAMETER(dwFileO
ada0: 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55 4e  ffsetHigh);.  UN
adb0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
adc0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
add0: 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69  nlockHigh);..  i
ade0: 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65  f (!pFile->hMute
adf0: 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a  x) return TRUE;.
ae00: 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
ae10: 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
ae20: 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73  x);..  /* Releas
ae30: 69 6e 67 20 61 20 72 65 61 64 65 72 20 6c 6f 63  ing a reader loc
ae40: 6b 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76  k or an exclusiv
ae50: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20 28  e lock */.  if (
ae60: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
ae70: 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
ae80: 5f 46 49 52 53 54 29 7b 0a 20 20 20 20 2f 2a 20  _FIRST){.    /* 
ae90: 44 69 64 20 77 65 20 68 61 76 65 20 61 6e 20 65  Did we have an e
aea0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a  xclusive lock? *
aeb0: 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  /.    if (pFile-
aec0: 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
aed0: 65 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e){.      assert
aee0: 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54  (nNumberOfBytesT
aef0: 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44  oUnlockLow == (D
af00: 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45  WORD)SHARED_SIZE
af10: 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
af20: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
af30: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
af40: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
af50: 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53  Exclusive = FALS
af60: 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
af70: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 0a   = TRUE;.    }..
af80: 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 6a 75      /* Did we ju
af90: 73 74 20 68 61 76 65 20 61 20 72 65 61 64 65 72  st have a reader
afa0: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c   lock? */.    el
afb0: 73 65 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f  se if (pFile->lo
afc0: 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20  cal.nReaders){. 
afd0: 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d       assert(nNum
afe0: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
aff0: 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  ckLow == (DWORD)
b000: 53 48 41 52 45 44 5f 53 49 5a 45 20 7c 7c 20 6e  SHARED_SIZE || n
b010: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
b020: 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b 0a  nlockLow == 1);.
b030: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
b040: 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a  al.nReaders --;.
b050: 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d        if (pFile-
b060: 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
b070: 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 20 20  == 0).      {.  
b080: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
b090: 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d  red->nReaders --
b0a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b0b0: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
b0c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
b0d0: 52 65 6c 65 61 73 69 6e 67 20 61 20 70 65 6e 64  Releasing a pend
b0e0: 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c  ing lock */.  el
b0f0: 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
b100: 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
b110: 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 26 26  )PENDING_BYTE &&
b120: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
b130: 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  oUnlockLow == 1)
b140: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
b150: 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29  >local.bPending)
b160: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
b170: 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20  ocal.bPending = 
b180: 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69  FALSE;.      pFi
b190: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e  le->shared->bPen
b1a0: 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20  ding = FALSE;.  
b1b0: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
b1c0: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  UE;.    }.  }.  
b1d0: 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72  /* Releasing a r
b1e0: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a  eserved lock */.
b1f0: 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c    else if (dwFil
b200: 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44  eOffsetLow == (D
b210: 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f 42 59  WORD)RESERVED_BY
b220: 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42  TE && nNumberOfB
b230: 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
b240: 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
b250: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73  File->local.bRes
b260: 65 72 76 65 64 29 20 7b 0a 20 20 20 20 20 20 70  erved) {.      p
b270: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73  File->local.bRes
b280: 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  erved = FALSE;. 
b290: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
b2a0: 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20  ed->bReserved = 
b2b0: 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65  FALSE;.      bRe
b2c0: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
b2d0: 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d   }.  }..  winceM
b2e0: 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
b2f0: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65  e->hMutex);.  re
b300: 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a  turn bReturn;.}.
b310: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  ./*.** An implem
b320: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
b330: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49  LockFileEx() API
b340: 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20   of Windows for 
b350: 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  CE.*/.static BOO
b360: 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45  L winceLockFileE
b370: 78 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46  x(.  HANDLE *phF
b380: 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  ile,.  DWORD dwF
b390: 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 64 77  lags,.  DWORD dw
b3a0: 52 65 73 65 72 76 65 64 2c 0a 20 20 44 57 4f 52  Reserved,.  DWOR
b3b0: 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
b3c0: 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f  ToLockLow,.  DWO
b3d0: 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
b3e0: 73 54 6f 4c 6f 63 6b 48 69 67 68 2c 0a 20 20 4c  sToLockHigh,.  L
b3f0: 50 4f 56 45 52 4c 41 50 50 45 44 20 6c 70 4f 76  POVERLAPPED lpOv
b400: 65 72 6c 61 70 70 65 64 0a 29 7b 0a 20 20 55 4e  erlapped.){.  UN
b410: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
b420: 77 52 65 73 65 72 76 65 64 29 3b 0a 20 20 55 4e  wReserved);.  UN
b430: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
b440: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
b450: 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 2f 2a 20  ockHigh);..  /* 
b460: 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 77 61  If the caller wa
b470: 6e 74 73 20 61 20 73 68 61 72 65 64 20 72 65 61  nts a shared rea
b480: 64 20 6c 6f 63 6b 2c 20 66 6f 72 77 61 72 64 20  d lock, forward 
b490: 74 68 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20 74  this call.  ** t
b4a0: 6f 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 20  o winceLockFile 
b4b0: 2a 2f 0a 20 20 69 66 20 28 6c 70 4f 76 65 72 6c  */.  if (lpOverl
b4c0: 61 70 70 65 64 2d 3e 4f 66 66 73 65 74 20 3d 3d  apped->Offset ==
b4d0: 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46   (DWORD)SHARED_F
b4e0: 49 52 53 54 20 26 26 0a 20 20 20 20 20 20 64 77  IRST &&.      dw
b4f0: 46 6c 61 67 73 20 3d 3d 20 31 20 26 26 0a 20 20  Flags == 1 &&.  
b500: 20 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74      nNumberOfByt
b510: 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  esToLockLow == (
b520: 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
b530: 45 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  E){.    return w
b540: 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70 68 46  inceLockFile(phF
b550: 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ile, SHARED_FIRS
b560: 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  T, 0, 1, 0);.  }
b570: 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b  .  return FALSE;
b580: 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20  .}./*.** End of 
b590: 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f 64 65  the special code
b5a0: 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a   for wince.*****
b5b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b5c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b5d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b5e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b5f0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66  ********/.#endif
b600: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   /* SQLITE_OS_WI
b610: 4e 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  NCE */../*******
b620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b660: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ******.** The ne
b670: 78 74 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  xt group of rout
b680: 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74  ines implement t
b690: 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 73  he I/O methods s
b6a0: 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 74  pecified.** by t
b6b0: 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
b6c0: 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a  thods object..**
b6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
b720: 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f 73  *.** Some Micros
b730: 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61  oft compilers la
b740: 63 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74 69  ck this definiti
b750: 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49  on..*/.#ifndef I
b760: 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
b770: 50 4f 49 4e 54 45 52 0a 23 20 64 65 66 69 6e 65  POINTER.# define
b780: 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c   INVALID_SET_FIL
b790: 45 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 4f 52  E_POINTER ((DWOR
b7a0: 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  D)-1).#endif../*
b7b0: 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
b7c0: 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66  rent position of
b7d0: 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65   the file handle
b7e0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
b7f0: 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  irst .** argumen
b800: 74 20 74 6f 20 6f 66 66 73 65 74 20 69 4f 66 66  t to offset iOff
b810: 73 65 74 20 77 69 74 68 69 6e 20 74 68 65 20 66  set within the f
b820: 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66  ile. If successf
b830: 75 6c 2c 20 72 65 74 75 72 6e 20 30 2e 20 0a 2a  ul, return 0. .*
b840: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74  * Otherwise, set
b850: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
b860: 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e  o and return non
b870: 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  -zero..*/.static
b880: 20 69 6e 74 20 73 65 65 6b 57 69 6e 46 69 6c 65   int seekWinFile
b890: 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c  (winFile *pFile,
b8a0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
b8b0: 4f 66 66 73 65 74 29 7b 0a 20 20 4c 4f 4e 47 20  Offset){.  LONG 
b8c0: 75 70 70 65 72 42 69 74 73 3b 20 20 20 20 20 20  upperBits;      
b8d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f             /* Mo
b8e0: 73 74 20 73 69 67 2e 20 33 32 20 62 69 74 73 20  st sig. 32 bits 
b8f0: 6f 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f  of new offset */
b900: 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74  .  LONG lowerBit
b910: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
b920: 20 20 20 2f 2a 20 4c 65 61 73 74 20 73 69 67 2e     /* Least sig.
b930: 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20   32 bits of new 
b940: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 44 57 4f 52  offset */.  DWOR
b950: 44 20 64 77 52 65 74 3b 20 20 20 20 20 20 20 20  D dwRet;        
b960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
b970: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
b980: 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28   SetFilePointer(
b990: 29 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73  ) */.  DWORD las
b9a0: 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20  tErrno;         
b9b0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
b9c0: 72 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c  returned by GetL
b9d0: 61 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20  astError() */.. 
b9e0: 20 75 70 70 65 72 42 69 74 73 20 3d 20 28 4c 4f   upperBits = (LO
b9f0: 4e 47 29 28 28 69 4f 66 66 73 65 74 3e 3e 33 32  NG)((iOffset>>32
ba00: 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) & 0x7fffffff);
ba10: 0a 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 28  .  lowerBits = (
ba20: 4c 4f 4e 47 29 28 69 4f 66 66 73 65 74 20 26 20  LONG)(iOffset & 
ba30: 30 78 66 66 66 66 66 66 66 66 29 3b 0a 0a 20 20  0xffffffff);..  
ba40: 2f 2a 20 41 50 49 20 6f 64 64 69 74 79 3a 20 49  /* API oddity: I
ba50: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 65  f successful, Se
ba60: 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 72  tFilePointer() r
ba70: 65 74 75 72 6e 73 20 61 20 64 77 6f 72 64 20 0a  eturns a dword .
ba80: 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20    ** containing 
ba90: 74 68 65 20 6c 6f 77 65 72 20 33 32 2d 62 69 74  the lower 32-bit
baa0: 73 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c  s of the new fil
bab0: 65 2d 6f 66 66 73 65 74 2e 20 4f 72 2c 20 69 66  e-offset. Or, if
bac0: 20 69 74 20 66 61 69 6c 73 2c 0a 20 20 2a 2a 20   it fails,.  ** 
bad0: 69 74 20 72 65 74 75 72 6e 73 20 49 4e 56 41 4c  it returns INVAL
bae0: 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e  ID_SET_FILE_POIN
baf0: 54 45 52 2e 20 48 6f 77 65 76 65 72 20 61 63 63  TER. However acc
bb00: 6f 72 64 69 6e 67 20 74 6f 20 4d 53 44 4e 2c 20  ording to MSDN, 
bb10: 0a 20 20 2a 2a 20 49 4e 56 41 4c 49 44 5f 53 45  .  ** INVALID_SE
bb20: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 6d  T_FILE_POINTER m
bb30: 61 79 20 61 6c 73 6f 20 62 65 20 61 20 76 61 6c  ay also be a val
bb40: 69 64 20 6e 65 77 20 6f 66 66 73 65 74 2e 20 53  id new offset. S
bb50: 6f 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a  o to determine .
bb60: 20 20 2a 2a 20 77 68 65 74 68 65 72 20 61 6e 20    ** whether an 
bb70: 65 72 72 6f 72 20 68 61 73 20 61 63 74 75 61 6c  error has actual
bb80: 6c 79 20 6f 63 63 75 72 65 64 2c 20 69 74 20 69  ly occured, it i
bb90: 73 20 61 6c 73 6f 20 6e 65 63 65 73 73 61 72 79  s also necessary
bba0: 20 74 6f 20 63 61 6c 6c 20 0a 20 20 2a 2a 20 47   to call .  ** G
bbb0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2e 0a 20  etLastError().. 
bbc0: 20 2a 2f 0a 20 20 64 77 52 65 74 20 3d 20 6f 73   */.  dwRet = os
bbd0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 70  SetFilePointer(p
bbe0: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69  File->h, lowerBi
bbf0: 74 73 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20  ts, &upperBits, 
bc00: 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20  FILE_BEGIN);..  
bc10: 69 66 28 20 28 64 77 52 65 74 3d 3d 49 4e 56 41  if( (dwRet==INVA
bc20: 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
bc30: 4e 54 45 52 0a 20 20 20 20 20 20 26 26 20 28 28  NTER.      && ((
bc40: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
bc50: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e  tLastError())!=N
bc60: 4f 5f 45 52 52 4f 52 29 29 20 29 7b 0a 20 20 20  O_ERROR)) ){.   
bc70: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
bc80: 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
bc90: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
bca0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b  QLITE_IOERR_SEEK
bcb0: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
bcc0: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
bcd0: 20 22 73 65 65 6b 57 69 6e 46 69 6c 65 22 2c 20   "seekWinFile", 
bce0: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
bcf0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
bd00: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
bd10: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
bd20: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  ile..**.** It is
bd30: 20 72 65 70 6f 72 74 65 64 20 74 68 61 74 20 61   reported that a
bd40: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f  n attempt to clo
bd50: 73 65 20 61 20 68 61 6e 64 6c 65 20 6d 69 67 68  se a handle migh
bd60: 74 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 66  t sometimes.** f
bd70: 61 69 6c 2e 20 20 54 68 69 73 20 69 73 20 61 20  ail.  This is a 
bd80: 76 65 72 79 20 75 6e 72 65 61 73 6f 6e 61 62 6c  very unreasonabl
bd90: 65 20 72 65 73 75 6c 74 2c 20 62 75 74 20 57 69  e result, but Wi
bda0: 6e 64 6f 77 73 20 69 73 20 6e 6f 74 6f 72 69 6f  ndows is notorio
bdb0: 75 73 0a 2a 2a 20 66 6f 72 20 62 65 69 6e 67 20  us.** for being 
bdc0: 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 73 6f 20  unreasonable so 
bdd0: 49 20 64 6f 20 6e 6f 74 20 64 6f 75 62 74 20 74  I do not doubt t
bde0: 68 61 74 20 69 74 20 6d 69 67 68 74 20 68 61 70  hat it might hap
bdf0: 70 65 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20  pen.  If.** the 
be00: 63 6c 6f 73 65 20 66 61 69 6c 73 2c 20 77 65 20  close fails, we 
be10: 70 61 75 73 65 20 66 6f 72 20 31 30 30 20 6d 69  pause for 100 mi
be20: 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74  lliseconds and t
be30: 72 79 20 61 67 61 69 6e 2e 20 20 41 73 0a 2a 2a  ry again.  As.**
be40: 20 6d 61 6e 79 20 61 73 20 4d 58 5f 43 4c 4f 53   many as MX_CLOS
be50: 45 5f 41 54 54 45 4d 50 54 20 61 74 74 65 6d 70  E_ATTEMPT attemp
be60: 74 73 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20  ts to close the 
be70: 68 61 6e 64 6c 65 20 61 72 65 20 6d 61 64 65 20  handle are made 
be80: 62 65 66 6f 72 65 0a 2a 2a 20 67 69 76 69 6e 67  before.** giving
be90: 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e   up and returnin
bea0: 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23  g an error..*/.#
beb0: 64 65 66 69 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f  define MX_CLOSE_
bec0: 41 54 54 45 4d 50 54 20 33 0a 73 74 61 74 69 63  ATTEMPT 3.static
bed0: 20 69 6e 74 20 77 69 6e 43 6c 6f 73 65 28 73 71   int winClose(sq
bee0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
bef0: 0a 20 20 69 6e 74 20 72 63 2c 20 63 6e 74 20 3d  .  int rc, cnt =
bf00: 20 30 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70   0;.  winFile *p
bf10: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
bf20: 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )id;..  assert( 
bf30: 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  id!=0 );.  asser
bf40: 74 28 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d  t( pFile->pShm==
bf50: 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  0 );.  OSTRACE((
bf60: 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 70 46  "CLOSE %d\n", pF
bf70: 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 64 6f 7b 0a  ile->h));.  do{.
bf80: 20 20 20 20 72 63 20 3d 20 6f 73 43 6c 6f 73 65      rc = osClose
bf90: 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29  Handle(pFile->h)
bfa0: 3b 0a 20 20 20 20 2f 2a 20 53 69 6d 75 6c 61 74  ;.    /* Simulat
bfb0: 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 30 3b 20  eIOError( rc=0; 
bfc0: 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54 54  cnt=MX_CLOSE_ATT
bfd0: 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d 77  EMPT; ); */.  }w
bfe0: 68 69 6c 65 28 20 72 63 3d 3d 30 20 26 26 20 2b  hile( rc==0 && +
bff0: 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f  +cnt < MX_CLOSE_
c000: 41 54 54 45 4d 50 54 20 26 26 20 28 6f 73 53 6c  ATTEMPT && (osSl
c010: 65 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a  eep(100), 1) );.
c020: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
c030: 4e 43 45 0a 23 64 65 66 69 6e 65 20 57 49 4e 43  NCE.#define WINC
c040: 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d  E_DELETION_ATTEM
c050: 50 54 53 20 33 0a 20 20 77 69 6e 63 65 44 65 73  PTS 3.  winceDes
c060: 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  troyLock(pFile);
c070: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44  .  if( pFile->zD
c080: 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a  eleteOnClose ){.
c090: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
c0a0: 0a 20 20 20 20 77 68 69 6c 65 28 0a 20 20 20 20  .    while(.    
c0b0: 20 20 20 20 20 20 20 6f 73 44 65 6c 65 74 65 46         osDeleteF
c0c0: 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c  ileW(pFile->zDel
c0d0: 65 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20  eteOnClose)==0. 
c0e0: 20 20 20 20 20 20 20 26 26 20 6f 73 47 65 74 46         && osGetF
c0f0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 70  ileAttributesW(p
c100: 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
c110: 6c 6f 73 65 29 21 3d 30 78 66 66 66 66 66 66 66  lose)!=0xfffffff
c120: 66 20 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e  f .        && cn
c130: 74 2b 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45  t++ < WINCE_DELE
c140: 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20  TION_ATTEMPTS.  
c150: 20 20 29 7b 0a 20 20 20 20 20 20 20 6f 73 53 6c    ){.       osSl
c160: 65 65 70 28 31 30 30 29 3b 20 20 2f 2a 20 57 61  eep(100);  /* Wa
c170: 69 74 20 61 20 6c 69 74 74 6c 65 20 62 65 66 6f  it a little befo
c180: 72 65 20 74 72 79 69 6e 67 20 61 67 61 69 6e 20  re trying again 
c190: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  */.    }.    sql
c1a0: 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
c1b0: 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29  >zDeleteOnClose)
c1c0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f  ;.  }.#endif.  O
c1d0: 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  STRACE(("CLOSE %
c1e0: 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d %s\n", pFile->
c1f0: 68 2c 20 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22  h, rc ? "ok" : "
c200: 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 69 66 28  failed"));.  if(
c210: 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65   rc ){.    pFile
c220: 2d 3e 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  ->h = NULL;.  }.
c230: 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31    OpenCounter(-1
c240: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f  );.  return rc ?
c250: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20   SQLITE_OK.     
c260: 20 20 20 20 20 20 20 3a 20 77 69 6e 4c 6f 67 45         : winLogE
c270: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
c280: 52 5f 43 4c 4f 53 45 2c 20 6f 73 47 65 74 4c 61  R_CLOSE, osGetLa
c290: 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
c2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2b0: 20 20 20 20 20 22 77 69 6e 43 6c 6f 73 65 22 2c       "winClose",
c2c0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
c2d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61  }../*.** Read da
c2e0: 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69  ta from a file i
c2f0: 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52  nto a buffer.  R
c300: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
c310: 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20  if all.** bytes 
c320: 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73  were read succes
c330: 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54  sfully and SQLIT
c340: 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68  E_IOERR if anyth
c350: 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
c360: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
c370: 20 77 69 6e 52 65 61 64 28 0a 20 20 73 71 6c 69   winRead(.  sqli
c380: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20  te3_file *id,   
c390: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74         /* File t
c3a0: 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
c3b0: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
c3d0: 72 69 74 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74  rite content int
c3e0: 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
c3f0: 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20  .  int amt,     
c400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c410: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
c420: 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73 71   to read */.  sq
c430: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
c440: 65 74 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69  et       /* Begi
c450: 6e 20 72 65 61 64 69 6e 67 20 61 74 20 74 68 69  n reading at thi
c460: 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20  s offset */.){. 
c470: 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72   OVERLAPPED over
c480: 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20 20 20  lapped;         
c490: 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66   /* The offset f
c4a0: 6f 72 20 52 65 61 64 46 69 6c 65 2e 20 2a 2f 0a  or ReadFile. */.
c4b0: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
c4c0: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
c4d0: 20 20 2f 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65    /* file handle
c4e0: 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6e 52 65 61   */.  DWORD nRea
c4f0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
c500: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c510: 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
c520: 79 20 72 65 61 64 20 66 72 6f 6d 20 66 69 6c 65  y read from file
c530: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79   */.  int nRetry
c540: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
c550: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c560: 6f 66 20 72 65 74 72 79 73 20 2a 2f 0a 0a 20 20  of retrys */..  
c570: 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
c580: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
c590: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
c5a0: 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b 0a 20 20  _IOERR_READ);.  
c5b0: 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 25  OSTRACE(("READ %
c5c0: 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46  d lock=%d\n", pF
c5d0: 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
c5e0: 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 6d 65  ocktype));..  me
c5f0: 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64  mset(&overlapped
c600: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52  , 0, sizeof(OVER
c610: 4c 41 50 50 45 44 29 29 3b 0a 20 20 6f 76 65 72  LAPPED));.  over
c620: 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20  lapped.Offset = 
c630: 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20  (LONG)(offset & 
c640: 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 6f  0xffffffff);.  o
c650: 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
c660: 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f  High = (LONG)((o
c670: 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37  ffset>>32) & 0x7
c680: 66 66 66 66 66 66 66 29 3b 0a 20 20 77 68 69 6c  fffffff);.  whil
c690: 65 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70  e( !osReadFile(p
c6a0: 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61  File->h, pBuf, a
c6b0: 6d 74 2c 20 26 6e 52 65 61 64 2c 20 26 6f 76 65  mt, &nRead, &ove
c6c0: 72 6c 61 70 70 65 64 29 20 26 26 0a 20 20 20 20  rlapped) &&.    
c6d0: 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72       osGetLastEr
c6e0: 72 6f 72 28 29 21 3d 45 52 52 4f 52 5f 48 41 4e  ror()!=ERROR_HAN
c6f0: 44 4c 45 5f 45 4f 46 20 29 7b 0a 20 20 20 20 44  DLE_EOF ){.    D
c700: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
c710: 20 20 20 20 69 66 28 20 72 65 74 72 79 49 6f 65      if( retryIoe
c720: 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73  rr(&nRetry, &las
c730: 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e  tErrno) ) contin
c740: 75 65 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ue;.    pFile->l
c750: 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
c760: 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
c770: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
c780: 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c 20  ITE_IOERR_READ, 
c790: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
c7a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
c7b0: 77 69 6e 52 65 61 64 22 2c 20 70 46 69 6c 65 2d  winRead", pFile-
c7c0: 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 6c  >zPath);.  }.  l
c7d0: 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79 29 3b  ogIoerr(nRetry);
c7e0: 0a 20 20 69 66 28 20 6e 52 65 61 64 3c 28 44 57  .  if( nRead<(DW
c7f0: 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20 20 20 2f  ORD)amt ){.    /
c800: 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f  * Unread parts o
c810: 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75 73  f the buffer mus
c820: 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64  t be zero-filled
c830: 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
c840: 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 6e 52  ((char*)pBuf)[nR
c850: 65 61 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52 65  ead], 0, amt-nRe
c860: 61 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ad);.    return 
c870: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
c880: 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20  RT_READ;.  }..  
c890: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c8a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
c8b0: 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
c8c0: 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e  fer into a file.
c8d0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
c8e0: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a  OK on success.**
c8f0: 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
c900: 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69  rror code on fai
c910: 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
c920: 69 6e 74 20 77 69 6e 57 72 69 74 65 28 0a 20 20  int winWrite(.  
c930: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
c940: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c950: 2f 2a 20 46 69 6c 65 20 74 6f 20 77 72 69 74 65  /* File to write
c960: 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74   into */.  const
c970: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
c980: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
c990: 65 20 62 79 74 65 73 20 74 6f 20 62 65 20 77 72  e bytes to be wr
c9a0: 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  itten */.  int a
c9b0: 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
c9c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c9d0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
c9e0: 20 77 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69   write */.  sqli
c9f0: 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
ca00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
ca10: 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66  ffset into the f
ca20: 69 6c 65 20 74 6f 20 62 65 67 69 6e 20 77 72 69  ile to begin wri
ca30: 74 69 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20  ting at */.){.  
ca40: 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20  int rc = 0;     
ca50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca60: 2f 2a 20 54 72 75 65 20 69 66 20 65 72 72 6f 72  /* True if error
ca70: 20 68 61 73 20 6f 63 63 75 72 65 64 2c 20 65 6c   has occured, el
ca80: 73 65 20 66 61 6c 73 65 20 2a 2f 0a 20 20 77 69  se false */.  wi
ca90: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
caa0: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a  winFile*)id;  /*
cab0: 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a   File handle */.
cac0: 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30    int nRetry = 0
cad0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cae0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
caf0: 65 74 72 69 65 73 20 2a 2f 0a 0a 20 20 61 73 73  etries */..  ass
cb00: 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20  ert( amt>0 );.  
cb10: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
cb20: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
cb30: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
cb40: 5f 49 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a 20  _IOERR_WRITE);. 
cb50: 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
cb60: 6c 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  lError(return SQ
cb70: 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f  LITE_FULL);..  O
cb80: 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20 25  STRACE(("WRITE %
cb90: 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46  d lock=%d\n", pF
cba0: 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
cbb0: 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 7b 0a  ocktype));..  {.
cbc0: 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f      OVERLAPPED o
cbd0: 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20  verlapped;      
cbe0: 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20    /* The offset 
cbf0: 66 6f 72 20 57 72 69 74 65 46 69 6c 65 2e 20 2a  for WriteFile. *
cc00: 2f 0a 20 20 20 20 75 38 20 2a 61 52 65 6d 20 3d  /.    u8 *aRem =
cc10: 20 28 75 38 20 2a 29 70 42 75 66 3b 20 20 20 20   (u8 *)pBuf;    
cc20: 20 20 20 20 2f 2a 20 44 61 74 61 20 79 65 74 20      /* Data yet 
cc30: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f  to be written */
cc40: 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20  .    int nRem = 
cc50: 61 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  amt;            
cc60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
cc70: 62 79 74 65 73 20 79 65 74 20 74 6f 20 62 65 20  bytes yet to be 
cc80: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 44  written */.    D
cc90: 57 4f 52 44 20 6e 57 72 69 74 65 3b 20 20 20 20  WORD nWrite;    
cca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ccb0: 42 79 74 65 73 20 77 72 69 74 74 65 6e 20 62 79  Bytes written by
ccc0: 20 65 61 63 68 20 57 72 69 74 65 46 69 6c 65 28   each WriteFile(
ccd0: 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 20 20 44 57  ) call */.    DW
cce0: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
ccf0: 4e 4f 5f 45 52 52 4f 52 3b 20 20 20 2f 2a 20 56  NO_ERROR;   /* V
cd00: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
cd10: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20   GetLastError() 
cd20: 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  */..    memset(&
cd30: 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73  overlapped, 0, s
cd40: 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44  izeof(OVERLAPPED
cd50: 29 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70  ));.    overlapp
cd60: 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e  ed.Offset = (LON
cd70: 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66  G)(offset & 0xff
cd80: 66 66 66 66 66 66 29 3b 0a 20 20 20 20 6f 76 65  ffffff);.    ove
cd90: 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69  rlapped.OffsetHi
cda0: 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66  gh = (LONG)((off
cdb0: 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66  set>>32) & 0x7ff
cdc0: 66 66 66 66 66 29 3b 0a 0a 20 20 20 20 77 68 69  fffff);..    whi
cdd0: 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20  le( nRem>0 ){.  
cde0: 20 20 20 20 69 66 28 20 21 6f 73 57 72 69 74 65      if( !osWrite
cdf0: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61  File(pFile->h, a
ce00: 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69  Rem, nRem, &nWri
ce10: 74 65 2c 20 26 6f 76 65 72 6c 61 70 70 65 64 29  te, &overlapped)
ce20: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
ce30: 72 65 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74  retryIoerr(&nRet
ce40: 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  ry, &lastErrno) 
ce50: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
ce60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ce70: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 57 72   }.      if( nWr
ce80: 69 74 65 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  ite<=0 ){.      
ce90: 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
cea0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
ceb0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
cec0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 66 66       }.      off
ced0: 73 65 74 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20  set += nWrite;. 
cee0: 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e       overlapped.
cef0: 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28  Offset = (LONG)(
cf00: 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66  offset & 0xfffff
cf10: 66 66 66 29 3b 0a 20 20 20 20 20 20 6f 76 65 72  fff);.      over
cf20: 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67  lapped.OffsetHig
cf30: 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73  h = (LONG)((offs
cf40: 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66  et>>32) & 0x7fff
cf50: 66 66 66 66 29 3b 0a 20 20 20 20 20 20 61 52 65  ffff);.      aRe
cf60: 6d 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20  m += nWrite;.   
cf70: 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 57 72 69 74     nRem -= nWrit
cf80: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
cf90: 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20   nRem>0 ){.     
cfa0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
cfb0: 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
cfc0: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
cfd0: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
cfe0: 20 29 7b 0a 20 20 20 20 69 66 28 20 20 20 28 20   ){.    if(   ( 
cff0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
d000: 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 44  ==ERROR_HANDLE_D
d010: 49 53 4b 5f 46 55 4c 4c 20 29 0a 20 20 20 20 20  ISK_FULL ).     
d020: 20 20 7c 7c 20 28 20 70 46 69 6c 65 2d 3e 6c 61    || ( pFile->la
d030: 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 44  stErrno==ERROR_D
d040: 49 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a 20 20 20  ISK_FULL )){.   
d050: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d060: 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20  _FULL;.    }.   
d070: 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
d080: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
d090: 5f 57 52 49 54 45 2c 20 70 46 69 6c 65 2d 3e 6c  _WRITE, pFile->l
d0a0: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
d0b0: 20 20 20 20 20 20 20 22 77 69 6e 57 72 69 74 65         "winWrite
d0c0: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
d0d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c  ;.  }else{.    l
d0e0: 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79 29 3b  ogIoerr(nRetry);
d0f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
d100: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
d110: 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
d120: 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
d130: 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
d140: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 54 72 75  tatic int winTru
d150: 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69  ncate(sqlite3_fi
d160: 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f  le *id, sqlite3_
d170: 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  int64 nByte){.  
d180: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
d190: 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20   (winFile*)id;  
d1a0: 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f  /* File handle o
d1b0: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  bject */.  int r
d1c0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
d1d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
d1e0: 74 75 72 6e 20 63 6f 64 65 20 66 6f 72 20 74 68  turn code for th
d1f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  is function */..
d200: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
d210: 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
d220: 54 52 55 4e 43 41 54 45 20 25 64 20 25 6c 6c 64  TRUNCATE %d %lld
d230: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e  \n", pFile->h, n
d240: 42 79 74 65 29 29 3b 0a 20 20 53 69 6d 75 6c 61  Byte));.  Simula
d250: 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
d260: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52   SQLITE_IOERR_TR
d270: 55 4e 43 41 54 45 29 3b 0a 0a 20 20 2f 2a 20 49  UNCATE);..  /* I
d280: 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63  f the user has c
d290: 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e  onfigured a chun
d2a0: 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  k-size for this 
d2b0: 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74  file, truncate t
d2c0: 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20  he.  ** file so 
d2d0: 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73  that it consists
d2e0: 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e   of an integer n
d2f0: 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20  umber of chunks 
d300: 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61  (i.e. the.  ** a
d310: 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20  ctual file size 
d320: 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74  after the operat
d330: 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65  ion may be large
d340: 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
d350: 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e  sted.  ** size).
d360: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
d370: 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a  e->szChunk>0 ){.
d380: 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42      nByte = ((nB
d390: 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43  yte + pFile->szC
d3a0: 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d  hunk - 1)/pFile-
d3b0: 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c  >szChunk) * pFil
d3c0: 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a  e->szChunk;.  }.
d3d0: 0a 20 20 2f 2a 20 53 65 74 45 6e 64 4f 66 46 69  .  /* SetEndOfFi
d3e0: 6c 65 28 29 20 72 65 74 75 72 6e 73 20 6e 6f 6e  le() returns non
d3f0: 2d 7a 65 72 6f 20 77 68 65 6e 20 73 75 63 63 65  -zero when succe
d400: 73 73 66 75 6c 2c 20 6f 72 20 7a 65 72 6f 20 77  ssful, or zero w
d410: 68 65 6e 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f  hen it fails. */
d420: 0a 20 20 69 66 28 20 73 65 65 6b 57 69 6e 46 69  .  if( seekWinFi
d430: 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 74 65 29  le(pFile, nByte)
d440: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   ){.    rc = win
d450: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
d460: 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
d470: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
d480: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
d490: 77 69 6e 54 72 75 6e 63 61 74 65 31 22 2c 20 70  winTruncate1", p
d4a0: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
d4b0: 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d 6f 73 53  }else if( 0==osS
d4c0: 65 74 45 6e 64 4f 66 46 69 6c 65 28 70 46 69 6c  etEndOfFile(pFil
d4d0: 65 2d 3e 68 29 20 29 7b 0a 20 20 20 20 70 46 69  e->h) ){.    pFi
d4e0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
d4f0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
d500: 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f  ;.    rc = winLo
d510: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
d520: 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46  ERR_TRUNCATE, pF
d530: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
d540: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
d550: 6e 54 72 75 6e 63 61 74 65 32 22 2c 20 70 46 69  nTruncate2", pFi
d560: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
d570: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 55  .  OSTRACE(("TRU
d580: 4e 43 41 54 45 20 25 64 20 25 6c 6c 64 20 25 73  NCATE %d %lld %s
d590: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e  \n", pFile->h, n
d5a0: 42 79 74 65 2c 20 72 63 20 3f 20 22 66 61 69 6c  Byte, rc ? "fail
d5b0: 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 20 20  ed" : "ok"));.  
d5c0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
d5d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
d5e0: 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
d5f0: 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73   number of fulls
d600: 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20  yncs and normal 
d610: 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20  syncs.  This is 
d620: 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20  used to test.** 
d630: 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66  that syncs and f
d640: 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63  ullsyncs are occ
d650: 75 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67  uring at the rig
d660: 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74  ht times..*/.int
d670: 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
d680: 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c  unt = 0;.int sql
d690: 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
d6a0: 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
d6b0: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
d6c0: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61   all writes to a
d6d0: 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65   particular file
d6e0: 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74   are committed t
d6f0: 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  o disk..*/.stati
d700: 63 20 69 6e 74 20 77 69 6e 53 79 6e 63 28 73 71  c int winSync(sq
d710: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
d720: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 23 69 66 6e  int flags){.#ifn
d730: 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
d740: 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65  NC.  /*.  ** Use
d750: 64 20 6f 6e 6c 79 20 77 68 65 6e 20 53 51 4c 49  d only when SQLI
d760: 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f  TE_NO_SYNC is no
d770: 74 20 64 65 66 69 6e 65 64 2e 0a 20 20 20 2a 2f  t defined..   */
d780: 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e 64  .  BOOL rc;.#end
d790: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
d7a0: 4e 44 45 42 55 47 29 20 7c 7c 20 21 64 65 66 69  NDEBUG) || !defi
d7b0: 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ned(SQLITE_NO_SY
d7c0: 4e 43 29 20 7c 7c 20 5c 0a 20 20 20 20 28 64 65  NC) || \.    (de
d7d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
d7e0: 54 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  T) && defined(SQ
d7f0: 4c 49 54 45 5f 44 45 42 55 47 29 29 0a 20 20 2f  LITE_DEBUG)).  /
d800: 2a 0a 20 20 2a 2a 20 55 73 65 64 20 77 68 65 6e  *.  ** Used when
d810: 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
d820: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 61  is not defined a
d830: 6e 64 20 62 79 20 74 68 65 20 61 73 73 65 72 74  nd by the assert
d840: 28 29 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 4f  () and/or.  ** O
d850: 53 54 52 41 43 45 28 29 20 6d 61 63 72 6f 73 2e  STRACE() macros.
d860: 0a 20 20 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  .   */.  winFile
d870: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
d880: 6c 65 2a 29 69 64 3b 0a 23 65 6c 73 65 0a 20 20  le*)id;.#else.  
d890: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
d8a0: 28 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  (id);.#endif..  
d8b0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
d8c0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
d8d0: 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53   one of SQLITE_S
d8e0: 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55  YNC_NORMAL or FU
d8f0: 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f  LL was passed */
d900: 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73  .  assert((flags
d910: 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
d920: 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  YNC_NORMAL.     
d930: 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29   || (flags&0x0F)
d940: 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
d950: 4c 4c 0a 20 20 29 3b 0a 0a 20 20 4f 53 54 52 41  LL.  );..  OSTRA
d960: 43 45 28 28 22 53 59 4e 43 20 25 64 20 6c 6f 63  CE(("SYNC %d loc
d970: 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  k=%d\n", pFile->
d980: 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
d990: 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78  pe));..  /* Unix
d9a0: 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d   cannot, but som
d9b0: 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65  e systems may re
d9c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
d9d0: 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73   from here. This
d9e0: 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f  .  ** line is to
d9f0: 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67   test that doing
da00: 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75   so does not cau
da10: 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e  se any problems.
da20: 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
da30: 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72  DiskfullError( r
da40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
da50: 4c 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  L );..#ifndef SQ
da60: 4c 49 54 45 5f 54 45 53 54 0a 20 20 55 4e 55 53  LITE_TEST.  UNUS
da70: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 6c 61  ED_PARAMETER(fla
da80: 67 73 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  gs);.#else.  if(
da90: 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
daa0: 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20  QLITE_SYNC_FULL 
dab0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
dac0: 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  ullsync_count++;
dad0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
dae0: 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  ync_count++;.#en
daf0: 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  dif..  /* If we 
db00: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68  compiled with th
db10: 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
db20: 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63   flag, then sync
db30: 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f  ing is a.  ** no
db40: 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  -op.  */.#ifdef 
db50: 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
db60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
db70: 4b 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20  K;.#else.  rc = 
db80: 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65  osFlushFileBuffe
db90: 72 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  rs(pFile->h);.  
dba0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
dbb0: 20 72 63 3d 46 41 4c 53 45 20 29 3b 0a 20 20 69   rc=FALSE );.  i
dbc0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
dbd0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
dbe0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
dbf0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
dc00: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
dc10: 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
dc20: 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
dc30: 4f 45 52 52 5f 46 53 59 4e 43 2c 20 70 46 69 6c  OERR_FSYNC, pFil
dc40: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
dc50: 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
dc60: 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ync", pFile->zPa
dc70: 74 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  th);.  }.#endif.
dc80: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
dc90: 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ne the current s
dca0: 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e  ize of a file in
dcb0: 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63   bytes.*/.static
dcc0: 20 69 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a 65   int winFileSize
dcd0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
dce0: 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
dcf0: 20 2a 70 53 69 7a 65 29 7b 0a 20 20 44 57 4f 52   *pSize){.  DWOR
dd00: 44 20 75 70 70 65 72 42 69 74 73 3b 0a 20 20 44  D upperBits;.  D
dd10: 57 4f 52 44 20 6c 6f 77 65 72 42 69 74 73 3b 0a  WORD lowerBits;.
dd20: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
dd30: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
dd40: 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
dd50: 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  no;..  assert( i
dd60: 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61  d!=0 );.  Simula
dd70: 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
dd80: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
dd90: 54 41 54 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74  TAT);.  lowerBit
dda0: 73 20 3d 20 6f 73 47 65 74 46 69 6c 65 53 69 7a  s = osGetFileSiz
ddb0: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70  e(pFile->h, &upp
ddc0: 65 72 42 69 74 73 29 3b 0a 20 20 69 66 28 20 20  erBits);.  if(  
ddd0: 20 28 6c 6f 77 65 72 42 69 74 73 20 3d 3d 20 49   (lowerBits == I
dde0: 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 53 49 5a 45  NVALID_FILE_SIZE
ddf0: 29 0a 20 20 20 20 20 26 26 20 28 28 6c 61 73 74  ).     && ((last
de00: 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
de10: 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52  tError())!=NO_ER
de20: 52 4f 52 29 20 29 0a 20 20 7b 0a 20 20 20 20 70  ROR) ).  {.    p
de30: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
de40: 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
de50: 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
de60: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
de70: 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c  _FSTAT, pFile->l
de80: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
de90: 20 20 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53         "winFileS
dea0: 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ize", pFile->zPa
deb0: 74 68 29 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a  th);.  }.  *pSiz
dec0: 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33 5f 69  e = (((sqlite3_i
ded0: 6e 74 36 34 29 75 70 70 65 72 42 69 74 73 29 3c  nt64)upperBits)<
dee0: 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73  <32) + lowerBits
def0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
df00: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  E_OK;.}../*.** L
df10: 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
df20: 45 44 49 41 54 45 4c 59 20 69 73 20 75 6e 64 65  EDIATELY is unde
df30: 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69  fined on some Wi
df40: 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a  ndows systems..*
df50: 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49  /.#ifndef LOCKFI
df60: 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
df70: 45 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43  ELY.# define LOC
df80: 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
df90: 49 41 54 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a  IATELY 1.#endif.
dfa0: 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
dfb0: 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a   reader lock..**
dfc0: 20 44 69 66 66 65 72 65 6e 74 20 41 50 49 20 72   Different API r
dfd0: 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c 6c  outines are call
dfe0: 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ed depending on 
dff0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
e000: 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39 78 20  his.** is Win9x 
e010: 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61  or WinNT..*/.sta
e020: 74 69 63 20 69 6e 74 20 67 65 74 52 65 61 64 4c  tic int getReadL
e030: 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ock(winFile *pFi
e040: 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  le){.  int res;.
e050: 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
e060: 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f      OVERLAPPED o
e070: 76 6c 70 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66  vlp;.    ovlp.Of
e080: 66 73 65 74 20 3d 20 53 48 41 52 45 44 5f 46 49  fset = SHARED_FI
e090: 52 53 54 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66  RST;.    ovlp.Of
e0a0: 66 73 65 74 48 69 67 68 20 3d 20 30 3b 0a 20 20  fsetHigh = 0;.  
e0b0: 20 20 6f 76 6c 70 2e 68 45 76 65 6e 74 20 3d 20    ovlp.hEvent = 
e0c0: 30 3b 0a 20 20 20 20 72 65 73 20 3d 20 6f 73 4c  0;.    res = osL
e0d0: 6f 63 6b 46 69 6c 65 45 78 28 70 46 69 6c 65 2d  ockFileEx(pFile-
e0e0: 3e 68 2c 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  >h, LOCKFILE_FAI
e0f0: 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 2c 0a 20  L_IMMEDIATELY,. 
e100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e110: 20 20 20 20 20 20 30 2c 20 53 48 41 52 45 44 5f        0, SHARED_
e120: 53 49 5a 45 2c 20 30 2c 20 26 6f 76 6c 70 29 3b  SIZE, 0, &ovlp);
e130: 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20  ./* isNT() is 1 
e140: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
e150: 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65  CE==1, so this e
e160: 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65  lse is never exe
e170: 63 75 74 65 64 2e 20 0a 2a 2f 0a 23 69 66 20 53  cuted. .*/.#if S
e180: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
e190: 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  0.  }else{.    i
e1a0: 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74  nt lk;.    sqlit
e1b0: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
e1c0: 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a  zeof(lk), &lk);.
e1d0: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
e1e0: 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f  dLockByte = (sho
e1f0: 72 74 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66  rt)((lk & 0x7fff
e200: 66 66 66 66 29 25 28 53 48 41 52 45 44 5f 53 49  ffff)%(SHARED_SI
e210: 5a 45 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65  ZE - 1));.    re
e220: 73 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 70  s = osLockFile(p
e230: 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
e240: 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61  FIRST+pFile->sha
e250: 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20  redLockByte, 0, 
e260: 31 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  1, 0);.#endif.  
e270: 7d 0a 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30  }.  if( res == 0
e280: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
e290: 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
e2a0: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
e2b0: 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c   /* No need to l
e2c0: 6f 67 20 61 20 66 61 69 6c 75 72 65 20 74 6f 20  og a failure to 
e2d0: 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  lock */.  }.  re
e2e0: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
e2f0: 2a 2a 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f  ** Undo a readlo
e300: 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ck.*/.static int
e310: 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28   unlockReadLock(
e320: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
e330: 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 44 57  .  int res;.  DW
e340: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  ORD lastErrno;. 
e350: 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20   if( isNT() ){. 
e360: 20 20 20 72 65 73 20 3d 20 6f 73 55 6e 6c 6f 63     res = osUnloc
e370: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
e380: 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
e390: 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
e3a0: 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31  ;./* isNT() is 1
e3b0: 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   if SQLITE_OS_WI
e3c0: 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20  NCE==1, so this 
e3d0: 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78  else is never ex
e3e0: 65 63 75 74 65 64 2e 20 0a 2a 2f 0a 23 69 66 20  ecuted. .*/.#if 
e3f0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
e400: 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  =0.  }else{.    
e410: 72 65 73 20 3d 20 6f 73 55 6e 6c 6f 63 6b 46 69  res = osUnlockFi
e420: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  le(pFile->h, SHA
e430: 52 45 44 5f 46 49 52 53 54 20 2b 20 70 46 69 6c  RED_FIRST + pFil
e440: 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e->sharedLockByt
e450: 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65 6e  e, 0, 1, 0);.#en
e460: 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 72 65  dif.  }.  if( re
e470: 73 3d 3d 30 20 26 26 20 28 28 6c 61 73 74 45 72  s==0 && ((lastEr
e480: 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
e490: 72 72 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 4e  rror())!=ERROR_N
e4a0: 4f 54 5f 4c 4f 43 4b 45 44 29 20 29 7b 0a 20 20  OT_LOCKED) ){.  
e4b0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
e4c0: 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
e4d0: 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
e4e0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
e4f0: 4f 43 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  OCK, pFile->last
e500: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
e510: 20 20 20 20 22 75 6e 6c 6f 63 6b 52 65 61 64 4c      "unlockReadL
e520: 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ock", pFile->zPa
e530: 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  th);.  }.  retur
e540: 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
e550: 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
e560: 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
e570: 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
e580: 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e  er locktype - on
e590: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
e5a0: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
e5b0: 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
e5c0: 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
e5d0: 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
e5e0: 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
e5f0: 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
e600: 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
e610: 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
e620: 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
e630: 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
e640: 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
e650: 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
e660: 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
e670: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
e680: 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
e690: 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
e6a0: 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
e6b0: 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
e6c0: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
e6d0: 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
e6e0: 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
e6f0: 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
e700: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
e710: 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
e720: 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
e730: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
e740: 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
e750: 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
e760: 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
e770: 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
e780: 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
e790: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
e7a0: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
e7b0: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
e7c0: 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
e7d0: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
e7e0: 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
e7f0: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
e800: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
e810: 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
e820: 65 20 61 20 6c 6f 63 6b 2e 20 20 54 68 65 20 77  e a lock.  The w
e830: 69 6e 55 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69  inUnlock() routi
e840: 6e 65 0a 2a 2a 20 65 72 61 73 65 73 20 61 6c 6c  ne.** erases all
e850: 20 6c 6f 63 6b 73 20 61 74 20 6f 6e 63 65 20 61   locks at once a
e860: 6e 64 20 72 65 74 75 72 6e 73 20 75 73 20 69 6d  nd returns us im
e870: 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6c 6f 63  mediately to loc
e880: 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a  king level 0..**
e890: 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
e8a0: 62 6c 65 20 74 6f 20 6c 6f 77 65 72 20 74 68 65  ble to lower the
e8b0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
e8c0: 6e 65 20 73 74 65 70 20 61 74 20 61 20 74 69 6d  ne step at a tim
e8d0: 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d 75 73 74 20  e.  You.** must 
e8e0: 67 6f 20 73 74 72 61 69 67 68 74 20 74 6f 20 6c  go straight to l
e8f0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a  ocking level 0..
e900: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
e910: 6e 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nLock(sqlite3_fi
e920: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
e930: 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  type){.  int rc 
e940: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
e950: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
e960: 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20  rom subroutines 
e970: 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31  */.  int res = 1
e980: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
e990: 65 73 75 6c 74 20 6f 66 20 61 20 57 69 6e 64 6f  esult of a Windo
e9a0: 77 73 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a  ws lock call */.
e9b0: 20 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70    int newLocktyp
e9c0: 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  e;       /* Set 
e9d0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
e9e0: 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 62 65  to this value be
e9f0: 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a  fore exiting */.
ea00: 20 20 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67    int gotPending
ea10: 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65  Lock = 0;/* True
ea20: 20 69 66 20 77 65 20 61 63 71 75 69 72 65 64 20   if we acquired 
ea30: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74  a PENDING lock t
ea40: 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20 77 69  his time */.  wi
ea50: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
ea60: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44  winFile*)id;.  D
ea70: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d  WORD lastErrno =
ea80: 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73   NO_ERROR;..  as
ea90: 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
eaa0: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
eab0: 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 29  %d %d was %d(%d)
eac0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
ead0: 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
eae0: 70 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  pe, pFile->lockt
eaf0: 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72  ype, pFile->shar
eb00: 65 64 4c 6f 63 6b 42 79 74 65 29 29 3b 0a 0a 20  edLockByte));.. 
eb10: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
eb20: 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
eb30: 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d  f this type or m
eb40: 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
eb50: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69  on the.  ** OsFi
eb60: 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
eb70: 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e  Don't use the en
eb80: 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
eb90: 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74  h, as.  ** sqlit
eba0: 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29  e3OsEnterMutex()
ebb0: 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
ebc0: 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  led yet..  */.  
ebd0: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
ebe0: 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ype>=locktype ){
ebf0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ec00: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
ec10: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
ec20: 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20  ocking sequence 
ec30: 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a  is correct.  */.
ec40: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
ec50: 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f  >locktype!=NO_LO
ec60: 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK || locktype==
ec70: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
ec80: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
ec90: 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  e!=PENDING_LOCK 
eca0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
ecb0: 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f  ktype!=RESERVED_
ecc0: 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c  LOCK || pFile->l
ecd0: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
ece0: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  LOCK );..  /* Lo
ecf0: 63 6b 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c  ck the PENDING_L
ed00: 4f 43 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e  OCK byte if we n
ed10: 65 65 64 20 74 6f 20 61 63 71 75 69 72 65 20 61  eed to acquire a
ed20: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72   PENDING lock or
ed30: 0a 20 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c  .  ** a SHARED l
ed40: 6f 63 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20  ock.  If we are 
ed50: 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
ed60: 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71  ED lock, the acq
ed70: 75 69 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a  uisition of.  **
ed80: 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   the PENDING_LOC
ed90: 4b 20 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72  K byte is tempor
eda0: 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c  ary..  */.  newL
edb0: 6f 63 6b 74 79 70 65 20 3d 20 70 46 69 6c 65 2d  ocktype = pFile-
edc0: 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28  >locktype;.  if(
edd0: 20 20 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74     (pFile->lockt
ede0: 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20  ype==NO_LOCK).  
edf0: 20 20 20 7c 7c 20 28 20 20 20 28 6c 6f 63 6b 74     || (   (lockt
ee00: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
ee10: 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20 26 26  OCK).         &&
ee20: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
ee30: 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e==RESERVED_LOCK
ee40: 29 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  )).  ){.    int 
ee50: 63 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77 68 69  cnt = 3;.    whi
ee60: 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28  le( cnt-->0 && (
ee70: 72 65 73 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65  res = osLockFile
ee80: 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49  (pFile->h, PENDI
ee90: 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  NG_BYTE, 0, 1, 0
eea0: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ))==0 ){.      /
eeb0: 2a 20 54 72 79 20 33 20 74 69 6d 65 73 20 74 6f  * Try 3 times to
eec0: 20 67 65 74 20 74 68 65 20 70 65 6e 64 69 6e 67   get the pending
eed0: 20 6c 6f 63 6b 2e 20 20 54 68 69 73 20 69 73 20   lock.  This is 
eee0: 6e 65 65 64 65 64 20 74 6f 20 77 6f 72 6b 0a 20  needed to work. 
eef0: 20 20 20 20 20 2a 2a 20 61 72 6f 75 6e 64 20 70       ** around p
ef00: 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62  roblems caused b
ef10: 79 20 69 6e 64 65 78 69 6e 67 20 61 6e 64 2f 6f  y indexing and/o
ef20: 72 20 61 6e 74 69 2d 76 69 72 75 73 20 73 6f 66  r anti-virus sof
ef30: 74 77 61 72 65 20 6f 6e 0a 20 20 20 20 20 20 2a  tware on.      *
ef40: 2a 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  * Windows system
ef50: 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 79  s..      ** If y
ef60: 6f 75 20 61 72 65 20 75 73 69 6e 67 20 74 68 69  ou are using thi
ef70: 73 20 63 6f 64 65 20 61 73 20 61 20 6d 6f 64 65  s code as a mode
ef80: 6c 20 66 6f 72 20 61 6c 74 65 72 6e 61 74 69 76  l for alternativ
ef90: 65 20 56 46 53 65 73 2c 20 64 6f 20 6e 6f 74 0a  e VFSes, do not.
efa0: 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 74 68        ** copy th
efb0: 69 73 20 72 65 74 72 79 20 6c 6f 67 69 63 2e 20  is retry logic. 
efc0: 20 49 74 20 69 73 20 61 20 68 61 63 6b 20 69 6e   It is a hack in
efd0: 74 65 6e 64 65 64 20 66 6f 72 20 57 69 6e 64 6f  tended for Windo
efe0: 77 73 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a  ws only..      *
eff0: 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  /.      OSTRACE(
f000: 28 22 63 6f 75 6c 64 20 6e 6f 74 20 67 65 74 20  ("could not get 
f010: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 20  a PENDING lock. 
f020: 63 6e 74 3d 25 64 5c 6e 22 2c 20 63 6e 74 29 29  cnt=%d\n", cnt))
f030: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 20  ;.      if( cnt 
f040: 29 20 6f 73 53 6c 65 65 70 28 31 29 3b 0a 20 20  ) osSleep(1);.  
f050: 20 20 7d 0a 20 20 20 20 67 6f 74 50 65 6e 64 69    }.    gotPendi
f060: 6e 67 4c 6f 63 6b 20 3d 20 72 65 73 3b 0a 20 20  ngLock = res;.  
f070: 20 20 69 66 28 20 21 72 65 73 20 29 7b 0a 20 20    if( !res ){.  
f080: 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20      lastErrno = 
f090: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
f0a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
f0b0: 2a 20 41 63 71 75 69 72 65 20 61 20 73 68 61 72  * Acquire a shar
f0c0: 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  ed lock.  */.  i
f0d0: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
f0e0: 52 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20  RED_LOCK && res 
f0f0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
f100: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
f110: 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  NO_LOCK );.    r
f120: 65 73 20 3d 20 67 65 74 52 65 61 64 4c 6f 63 6b  es = getReadLock
f130: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28  (pFile);.    if(
f140: 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65   res ){.      ne
f150: 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52  wLocktype = SHAR
f160: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
f170: 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72  se{.      lastEr
f180: 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
f190: 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20  rror();.    }.  
f1a0: 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
f1b0: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a  a RESERVED lock.
f1c0: 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
f1d0: 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype==RESERVED_LO
f1e0: 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  CK && res ){.   
f1f0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
f200: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
f210: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73  _LOCK );.    res
f220: 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 70 46   = osLockFile(pF
f230: 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44  ile->h, RESERVED
f240: 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
f250: 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a  .    if( res ){.
f260: 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70        newLocktyp
f270: 65 20 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  e = RESERVED_LOC
f280: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
f290: 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20      lastErrno = 
f2a0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
f2b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
f2c0: 2a 20 41 63 71 75 69 72 65 20 61 20 50 45 4e 44  * Acquire a PEND
f2d0: 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  ING lock.  */.  
f2e0: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
f2f0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
f300: 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c 6f  res ){.    newLo
f310: 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47  cktype = PENDING
f320: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50 65  _LOCK;.    gotPe
f330: 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ndingLock = 0;. 
f340: 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
f350: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
f360: 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
f370: 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
f380: 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  E_LOCK && res ){
f390: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
f3a0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48  le->locktype>=SH
f3b0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
f3c0: 20 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52 65 61   res = unlockRea
f3d0: 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
f3e0: 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 72 65    OSTRACE(("unre
f3f0: 61 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22 2c 20  adlock = %d\n", 
f400: 72 65 73 29 29 3b 0a 20 20 20 20 72 65 73 20 3d  res));.    res =
f410: 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c   osLockFile(pFil
f420: 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
f430: 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49  ST, 0, SHARED_SI
f440: 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ZE, 0);.    if( 
f450: 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  res ){.      new
f460: 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55  Locktype = EXCLU
f470: 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  SIVE_LOCK;.    }
f480: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74  else{.      last
f490: 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
f4a0: 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
f4b0: 4f 53 54 52 41 43 45 28 28 22 65 72 72 6f 72 2d  OSTRACE(("error-
f4c0: 63 6f 64 65 20 3d 20 25 64 5c 6e 22 2c 20 6c 61  code = %d\n", la
f4d0: 73 74 45 72 72 6e 6f 29 29 3b 0a 20 20 20 20 20  stErrno));.     
f4e0: 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69   getReadLock(pFi
f4f0: 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  le);.    }.  }..
f500: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 68    /* If we are h
f510: 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49 4e 47  olding a PENDING
f520: 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67 68 74   lock that ought
f530: 20 74 6f 20 62 65 20 72 65 6c 65 61 73 65 64 2c   to be released,
f540: 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61   then.  ** relea
f550: 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  se it now..  */.
f560: 20 20 69 66 28 20 67 6f 74 50 65 6e 64 69 6e 67    if( gotPending
f570: 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65  Lock && locktype
f580: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
f590: 0a 20 20 20 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c  .    osUnlockFil
f5a0: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44  e(pFile->h, PEND
f5b0: 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  ING_BYTE, 0, 1, 
f5c0: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70  0);.  }..  /* Up
f5d0: 64 61 74 65 20 74 68 65 20 73 74 61 74 65 20 6f  date the state o
f5e0: 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 68  f the lock has h
f5f0: 65 6c 64 20 69 6e 20 74 68 65 20 66 69 6c 65 20  eld in the file 
f600: 64 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e 0a  descriptor then.
f610: 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20    ** return the 
f620: 61 70 70 72 6f 70 72 69 61 74 65 20 72 65 73 75  appropriate resu
f630: 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  lt code..  */.  
f640: 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 72  if( res ){.    r
f650: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
f660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 53 54 52   }else{.    OSTR
f670: 41 43 45 28 28 22 4c 4f 43 4b 20 46 41 49 4c 45  ACE(("LOCK FAILE
f680: 44 20 25 64 20 74 72 79 69 6e 67 20 66 6f 72 20  D %d trying for 
f690: 25 64 20 62 75 74 20 67 6f 74 20 25 64 5c 6e 22  %d but got %d\n"
f6a0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
f6b0: 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 2c         locktype,
f6c0: 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29 29 3b 0a   newLocktype));.
f6d0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
f6e0: 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
f6f0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
f700: 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 46  E_BUSY;.  }.  pF
f710: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
f720: 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79 70 65 3b  (u8)newLocktype;
f730: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
f740: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
f750: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
f760: 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
f770: 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
f780: 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
f790: 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
f7a0: 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
f7b0: 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
f7c0: 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72  k is held, retur
f7d0: 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f  n.** non-zero, o
f7e0: 74 68 65 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a  therwise zero..*
f7f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
f800: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
f810: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
f820: 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
f830: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 77  ){.  int rc;.  w
f840: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
f850: 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  (winFile*)id;.. 
f860: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
f870: 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
f880: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
f890: 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61  VEDLOCK; );..  a
f8a0: 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
f8b0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
f8c0: 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f  ktype>=RESERVED_
f8d0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  LOCK ){.    rc =
f8e0: 20 31 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   1;.    OSTRACE(
f8f0: 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
f900: 64 20 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c  d %d (local)\n",
f910: 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b   pFile->h, rc));
f920: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
f930: 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 70 46   = osLockFile(pF
f940: 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44  ile->h, RESERVED
f950: 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
f960: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
f970: 20 20 20 20 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c       osUnlockFil
f980: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45  e(pFile->h, RESE
f990: 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
f9a0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   0);.    }.    r
f9b0: 63 20 3d 20 21 72 63 3b 0a 20 20 20 20 4f 53 54  c = !rc;.    OST
f9c0: 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
f9d0: 4f 43 4b 20 25 64 20 25 64 20 28 72 65 6d 6f 74  OCK %d %d (remot
f9e0: 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  e)\n", pFile->h,
f9f0: 20 72 63 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52   rc));.  }.  *pR
fa00: 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 72 65  esOut = rc;.  re
fa10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
fa20: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
fa30: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
fa40: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
fa50: 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79  tor id to lockty
fa60: 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a  pe.  locktype.**
fa70: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
fa80: 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
fa90: 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
faa0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
fab0: 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
fac0: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
fad0: 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
fae0: 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
faf0: 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
fb00: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
fb10: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
fb20: 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
fb30: 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74  le for this rout
fb40: 69 6e 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74  ine to fail if t
fb50: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
fb60: 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b  nt.** is NO_LOCK
fb70: 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
fb80: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41   argument is SHA
fb90: 52 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68  RED_LOCK then th
fba0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69  is routine.** mi
fbb0: 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ght return SQLIT
fbc0: 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74  E_IOERR;.*/.stat
fbd0: 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b  ic int winUnlock
fbe0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
fbf0: 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
fc00: 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20  {.  int type;.  
fc10: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
fc20: 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
fc30: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
fc40: 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
fc50: 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  File!=0 );.  ass
fc60: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53  ert( locktype<=S
fc70: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
fc80: 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
fc90: 20 25 64 20 74 6f 20 25 64 20 77 61 73 20 25 64   %d to %d was %d
fca0: 28 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  (%d)\n", pFile->
fcb0: 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20  h, locktype,.   
fcc0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f         pFile->lo
fcd0: 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73  cktype, pFile->s
fce0: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 29 29 3b  haredLockByte));
fcf0: 0a 20 20 74 79 70 65 20 3d 20 70 46 69 6c 65 2d  .  type = pFile-
fd00: 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28  >locktype;.  if(
fd10: 20 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56 45   type>=EXCLUSIVE
fd20: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 6f 73 55  _LOCK ){.    osU
fd30: 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d  nlockFile(pFile-
fd40: 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
fd50: 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  , 0, SHARED_SIZE
fd60: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f  , 0);.    if( lo
fd70: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
fd80: 4f 43 4b 20 26 26 20 21 67 65 74 52 65 61 64 4c  OCK && !getReadL
fd90: 6f 63 6b 28 70 46 69 6c 65 29 20 29 7b 0a 20 20  ock(pFile) ){.  
fda0: 20 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75      /* This shou
fdb0: 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 2e  ld never happen.
fdc0: 20 20 57 65 20 73 68 6f 75 6c 64 20 61 6c 77 61    We should alwa
fdd0: 79 73 20 62 65 20 61 62 6c 65 20 74 6f 0a 20 20  ys be able to.  
fde0: 20 20 20 20 2a 2a 20 72 65 61 63 71 75 69 72 65      ** reacquire
fdf0: 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a   the read lock *
fe00: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  /.      rc = win
fe10: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
fe20: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 6f 73  IOERR_UNLOCK, os
fe30: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
fe40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
fe50: 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c  winUnlock", pFil
fe60: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
fe70: 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e  .  }.  if( type>
fe80: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
fe90: 7b 0a 20 20 20 20 6f 73 55 6e 6c 6f 63 6b 46 69  {.    osUnlockFi
fea0: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53  le(pFile->h, RES
feb0: 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31  ERVED_BYTE, 0, 1
fec0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
fed0: 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
fee0: 4b 20 26 26 20 74 79 70 65 3e 3d 53 48 41 52 45  K && type>=SHARE
fef0: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 6e  D_LOCK ){.    un
ff00: 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69  lockReadLock(pFi
ff10: 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74  le);.  }.  if( t
ff20: 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ype>=PENDING_LOC
ff30: 4b 20 29 7b 0a 20 20 20 20 6f 73 55 6e 6c 6f 63  K ){.    osUnloc
ff40: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
ff50: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c  PENDING_BYTE, 0,
ff60: 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 46   1, 0);.  }.  pF
ff70: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
ff80: 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  (u8)locktype;.  
ff90: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
ffa0: 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20  .** If *pArg is 
ffb0: 69 6e 69 74 69 74 69 61 6c 6c 79 20 6e 65 67 61  inititially nega
ffc0: 74 69 76 65 20 74 68 65 6e 20 74 68 69 73 20 69  tive then this i
ffd0: 73 20 61 20 71 75 65 72 79 2e 20 20 53 65 74 20  s a query.  Set 
ffe0: 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72  *pArg to.** 1 or
fff0: 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20   0 depending on 
10000 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62  whether or not b
10010 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65  it mask of pFile
10020 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73  ->ctrlFlags is s
10030 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41  et..**.** If *pA
10040 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68  rg is 0 or 1, th
10050 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20  en clear or set 
10060 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20  the mask bit of 
10070 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
10080 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10090 20 77 69 6e 4d 6f 64 65 42 69 74 28 77 69 6e 46   winModeBit(winF
100a0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69  ile *pFile, unsi
100b0 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20  gned char mask, 
100c0 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66  int *pArg){.  if
100d0 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20  ( *pArg<0 ){.   
100e0 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d   *pArg = (pFile-
100f0 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73  >ctrlFlags & mas
10100 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69  k)!=0;.  }else i
10110 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b  f( (*pArg)==0 ){
10120 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
10130 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a  Flags &= ~mask;.
10140 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
10150 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  le->ctrlFlags |=
10160 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   mask;.  }.}../*
10170 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e 64 20  .** Control and 
10180 71 75 65 72 79 20 6f 66 20 74 68 65 20 6f 70 65  query of the ope
10190 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a  n file handle..*
101a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
101b0 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69  FileControl(sqli
101c0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
101d0 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
101e0 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  ){.  winFile *pF
101f0 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
10200 69 64 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  id;.  switch( op
10210 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
10220 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54  ITE_FCNTL_LOCKST
10230 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  ATE: {.      *(i
10240 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65  nt*)pArg = pFile
10250 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  ->locktype;.    
10260 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10270 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
10280 73 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45  se SQLITE_LAST_E
10290 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28  RRNO: {.      *(
102a0 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 69 6e 74  int*)pArg = (int
102b0 29 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e  )pFile->lastErrn
102c0 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  o;.      return 
102d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
102e0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
102f0 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a  _FCNTL_CHUNK_SIZ
10300 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  E: {.      pFile
10310 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e  ->szChunk = *(in
10320 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  t *)pArg;.      
10330 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10340 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
10350 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
10360 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20  ZE_HINT: {.     
10370 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68   if( pFile->szCh
10380 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  unk>0 ){.       
10390 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
103a0 6c 64 53 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e  ldSz;.        in
103b0 74 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69  t rc = winFileSi
103c0 7a 65 28 69 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a  ze(id, &oldSz);.
103d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
103e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
103f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
10400 6e 74 36 34 20 6e 65 77 53 7a 20 3d 20 2a 28 73  nt64 newSz = *(s
10410 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 41  qlite3_int64*)pA
10420 72 67 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  rg;.          if
10430 28 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b  ( newSz>oldSz ){
10440 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 69 6d  .            Sim
10450 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
10460 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 20  gn(1);.         
10470 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63     rc = winTrunc
10480 61 74 65 28 69 64 2c 20 6e 65 77 53 7a 29 3b 0a  ate(id, newSz);.
10490 20 20 20 20 20 20 20 20 20 20 20 20 53 69 6d 75              Simu
104a0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
104b0 6e 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n(0);.          
104c0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
104d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
104e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
104f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10500 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
10510 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49  LITE_FCNTL_PERSI
10520 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20  ST_WAL: {.      
10530 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c 65  winModeBit(pFile
10540 2c 20 57 49 4e 46 49 4c 45 5f 50 45 52 53 49 53  , WINFILE_PERSIS
10550 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72  T_WAL, (int*)pAr
10560 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  g);.      return
10570 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
10580 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
10590 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46  E_FCNTL_POWERSAF
105a0 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20  E_OVERWRITE: {. 
105b0 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28       winModeBit(
105c0 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50  pFile, WINFILE_P
105d0 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  SOW, (int*)pArg)
105e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
105f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
10600 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
10610 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b  FCNTL_VFSNAME: {
10620 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29  .      *(char**)
10630 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pArg = sqlite3_m
10640 70 72 69 6e 74 66 28 22 77 69 6e 33 32 22 29 3b  printf("win32");
10650 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
10660 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
10670 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
10680 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45  CNTL_WIN32_AV_RE
10690 54 52 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  TRY: {.      int
106a0 20 2a 61 20 3d 20 28 69 6e 74 2a 29 70 41 72 67   *a = (int*)pArg
106b0 3b 0a 20 20 20 20 20 20 69 66 28 20 61 5b 30 5d  ;.      if( a[0]
106c0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69  >0 ){.        wi
106d0 6e 33 32 49 6f 65 72 72 52 65 74 72 79 20 3d 20  n32IoerrRetry = 
106e0 61 5b 30 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  a[0];.      }els
106f0 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 30 5d 20  e{.        a[0] 
10700 3d 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72  = win32IoerrRetr
10710 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  y;.      }.     
10720 20 69 66 28 20 61 5b 31 5d 3e 30 20 29 7b 0a 20   if( a[1]>0 ){. 
10730 20 20 20 20 20 20 20 77 69 6e 33 32 49 6f 65 72         win32Ioer
10740 72 52 65 74 72 79 44 65 6c 61 79 20 3d 20 61 5b  rRetryDelay = a[
10750 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1];.      }else{
10760 0a 20 20 20 20 20 20 20 20 61 5b 31 5d 20 3d 20  .        a[1] = 
10770 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44  win32IoerrRetryD
10780 65 6c 61 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20  elay;.      }.  
10790 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
107a0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
107b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
107c0 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a  NOTFOUND;.}../*.
107d0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
107e0 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74  ctor size in byt
107f0 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c  es of the underl
10800 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63  ying block devic
10810 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65  e for.** the spe
10820 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69  cified file. Thi
10830 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61  s is almost alwa
10840 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62 75  ys 512 bytes, bu
10850 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67  t may be.** larg
10860 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69  er for some devi
10870 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ces..**.** SQLit
10880 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74  e code assumes t
10890 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  his function can
108a0 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73  not fail. It als
108b0 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a  o assumes that.*
108c0 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61  * if two files a
108d0 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  re created in th
108e0 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74  e same file-syst
108f0 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e  em directory (i.
10900 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65  e..** a database
10910 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c   and its journal
10920 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65 20   file) that the 
10930 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c  sector size will
10940 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20   be the.** same 
10950 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61  for both..*/.sta
10960 74 69 63 20 69 6e 74 20 77 69 6e 53 65 63 74 6f  tic int winSecto
10970 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  rSize(sqlite3_fi
10980 6c 65 20 2a 69 64 29 7b 0a 20 20 28 76 6f 69 64  le *id){.  (void
10990 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  )id;.  return SQ
109a0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43  LITE_DEFAULT_SEC
109b0 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a  TOR_SIZE;.}../*.
109c0 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65 63 74  ** Return a vect
109d0 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63 68 61  or of device cha
109e0 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a 2a 2f  racteristics..*/
109f0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44  .static int winD
10a00 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
10a10 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  tics(sqlite3_fil
10a20 65 20 2a 69 64 29 7b 0a 20 20 77 69 6e 46 69 6c  e *id){.  winFil
10a30 65 20 2a 70 20 3d 20 28 77 69 6e 46 69 6c 65 2a  e *p = (winFile*
10a40 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  )id;.  return SQ
10a50 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
10a60 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
10a70 20 7c 0a 20 20 20 20 20 20 20 20 20 28 28 70 2d   |.         ((p-
10a80 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57 49 4e  >ctrlFlags & WIN
10a90 46 49 4c 45 5f 50 53 4f 57 29 3f 53 51 4c 49 54  FILE_PSOW)?SQLIT
10aa0 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
10ab0 45 5f 4f 56 45 52 57 52 49 54 45 3a 30 29 3b 0a  E_OVERWRITE:0);.
10ac0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
10ad0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 20 0a  E_OMIT_WAL../* .
10ae0 2a 2a 20 57 69 6e 64 6f 77 73 20 77 69 6c 6c 20  ** Windows will 
10af0 6f 6e 6c 79 20 6c 65 74 20 79 6f 75 20 63 72 65  only let you cre
10b00 61 74 65 20 66 69 6c 65 20 76 69 65 77 20 6d 61  ate file view ma
10b10 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c 6c  ppings.** on all
10b20 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 67 72 61  ocation size gra
10b30 6e 75 6c 61 72 69 74 79 20 62 6f 75 6e 64 61 72  nularity boundar
10b40 69 65 73 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 73  ies..** During s
10b50 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29  qlite3_os_init()
10b60 20 77 65 20 64 6f 20 61 20 47 65 74 53 79 73 74   we do a GetSyst
10b70 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20 67  emInfo().** to g
10b80 65 74 20 74 68 65 20 67 72 61 6e 75 6c 61 72 69  et the granulari
10b90 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a 53 59 53 54  ty size..*/.SYST
10ba0 45 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73 49 6e  EM_INFO winSysIn
10bb0 66 6f 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65  fo;../*.** Helpe
10bc0 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f  r functions to o
10bd0 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71  btain and relinq
10be0 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20  uish the global 
10bf0 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c  mutex. The.** gl
10c00 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73  obal mutex is us
10c10 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68  ed to protect th
10c20 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20 6f 62  e winLockInfo ob
10c30 6a 65 63 74 73 20 75 73 65 64 20 62 79 20 0a 2a  jects used by .*
10c40 2a 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c  * this file, all
10c50 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62 65   of which may be
10c60 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69   shared by multi
10c70 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a  ple threads..**.
10c80 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77 69 6e 53  ** Function winS
10c90 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  hmMutexHeld() is
10ca0 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28   used to assert(
10cb0 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61  ) that the globa
10cc0 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68  l mutex .** is h
10cd0 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65  eld when require
10ce0 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
10cf0 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
10d00 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
10d10 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ) .** statements
10d20 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 77  . e.g..**.**   w
10d30 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
10d40 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28  ).**     assert(
10d50 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
10d60 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69 6e 53 68  () );.**   winSh
10d70 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 0a 2a 2f  mLeaveMutex().*/
10d80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
10d90 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 76 6f  ShmEnterMutex(vo
10da0 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
10db0 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74  utex_enter(sqlit
10dc0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
10dd0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
10de0 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61  _MASTER));.}.sta
10df0 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 4c  tic void winShmL
10e00 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b  eaveMutex(void){
10e10 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
10e20 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75  _leave(sqlite3Mu
10e30 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
10e40 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
10e50 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20  TER));.}.#ifdef 
10e60 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
10e70 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 75  tic int winShmMu
10e80 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a  texHeld(void) {.
10e90 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
10ea0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69  _mutex_held(sqli
10eb0 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
10ec0 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
10ed0 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65  C_MASTER));.}.#e
10ee0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65  ndif../*.** Obje
10ef0 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ct used to repre
10f00 73 65 6e 74 20 61 20 73 69 6e 67 6c 65 20 66 69  sent a single fi
10f10 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64 20 6d 6d  le opened and mm
10f20 61 70 70 65 64 20 74 6f 20 70 72 6f 76 69 64 65  apped to provide
10f30 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  .** shared memor
10f40 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c  y.  When multipl
10f50 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65  e threads all re
10f60 66 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65  ference the same
10f70 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c  .** log-summary,
10f80 20 65 61 63 68 20 74 68 72 65 61 64 20 68 61 73   each thread has
10f90 20 69 74 73 20 6f 77 6e 20 77 69 6e 46 69 6c 65   its own winFile
10fa0 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65   object, but the
10fb0 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74  y all.** point t
10fc0 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61  o a single insta
10fd0 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
10fe0 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ct.  In other wo
10ff0 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f 67  rds, each.** log
11000 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f 70 65 6e  -summary is open
11010 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72  ed only once per
11020 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
11030 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
11040 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77  ) must be true w
11050 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20  hen creating or 
11060 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68  destroying.** th
11070 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69  is object or whi
11080 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  le reading or wr
11090 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  iting the follow
110a0 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a  ing fields:.**.*
110b0 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 20 20  *      nRef.**  
110c0 20 20 20 20 70 4e 65 78 74 20 0a 2a 2a 0a 2a 2a      pNext .**.**
110d0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
110e0 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f  ields are read-o
110f0 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f 62  nly after the ob
11100 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 3a  ject is created:
11110 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69 64  .** .**      fid
11120 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61  .**      zFilena
11130 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20  me.**.** Either 
11140 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78  winShmNode.mutex
11150 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72   must be held or
11160 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66   winShmNode.nRef
11170 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e 53 68  ==0 and.** winSh
11180 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20  mMutexHeld() is 
11190 74 72 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e  true when readin
111a0 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79  g or writing any
111b0 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20   other field.** 
111c0 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
111d0 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74 20  e..**.*/.struct 
111e0 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 73  winShmNode {.  s
111f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
11200 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74  tex;      /* Mut
11210 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69  ex to access thi
11220 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68  s object */.  ch
11230 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
11240 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
11250 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   of the file */.
11260 20 20 77 69 6e 46 69 6c 65 20 68 46 69 6c 65 3b    winFile hFile;
11270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11280 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d  File handle from
11290 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69   winOpen */..  i
112a0 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20  nt szRegion;    
112b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
112c0 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f  e of shared-memo
112d0 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  ry regions */.  
112e0 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20  int nRegion;    
112f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
11300 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52 65  ze of array apRe
11310 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74  gion */.  struct
11320 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20 20 20   ShmRegion {.   
11330 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20   HANDLE hMap;   
11340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
11350 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 43 72  e handle from Cr
11360 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 20  eateFileMapping 
11370 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4d 61  */.    void *pMa
11380 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f 6e 3b  p;.  } *aRegion;
11390 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
113a0 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no;           /*
113b0 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72 72   The Windows err
113c0 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74  no from the last
113d0 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a 20   I/O error */.. 
113e0 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
113f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
11400 75 6d 62 65 72 20 6f 66 20 77 69 6e 53 68 6d 20  umber of winShm 
11410 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67  objects pointing
11420 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69   to this */.  wi
11430 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20  nShm *pFirst;   
11440 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
11450 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20 70  winShm objects p
11460 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20  ointing to this 
11470 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  */.  winShmNode 
11480 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
11490 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73 74 20  /* Next in list 
114a0 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64  of all winShmNod
114b0 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66  e objects */.#if
114c0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
114d0 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b  .  u8 nextShmId;
114e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
114f0 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   Next available 
11500 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75 65 20  winShm.id value 
11510 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
11520 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72 72  .** A global arr
11530 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d  ay of all winShm
11540 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a  Node objects..**
11550 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d 4d 75  .** The winShmMu
11560 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
11570 65 20 74 72 75 65 20 77 68 69 6c 65 20 72 65 61  e true while rea
11580 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
11590 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  this list..*/.st
115a0 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64 65 20  atic winShmNode 
115b0 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20  *winShmNodeList 
115c0 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75  = 0;../*.** Stru
115d0 63 74 75 72 65 20 75 73 65 64 20 69 6e 74 65 72  cture used inter
115e0 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46  nally by this VF
115f0 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  S to record the 
11600 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f  state of an.** o
11610 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  pen shared memor
11620 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  y connection..**
11630 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
11640 67 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69  g fields are ini
11650 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68  tialized when th
11660 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  is object is cre
11670 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20  ated and.** are 
11680 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61  read-only therea
11690 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 77  fter:.**.**    w
116a0 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a  inShm.pShmNode.*
116b0 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69 64 0a 2a  *    winShm.id.*
116c0 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66  *.** All other f
116d0 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77  ields are read/w
116e0 72 69 74 65 2e 20 20 54 68 65 20 77 69 6e 53 68  rite.  The winSh
116f0 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  m.pShmNode->mute
11700 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  x must be held.*
11710 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e  * while accessin
11720 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65  g any read/write
11730 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75   fields..*/.stru
11740 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77 69  ct winShm {.  wi
11750 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  nShmNode *pShmNo
11760 64 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  de;      /* The 
11770 75 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e 53 68  underlying winSh
11780 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  mNode object */.
11790 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74 3b    winShm *pNext;
117a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
117b0 4e 65 78 74 20 77 69 6e 53 68 6d 20 77 69 74 68  Next winShm with
117c0 20 74 68 65 20 73 61 6d 65 20 77 69 6e 53 68 6d   the same winShm
117d0 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73  Node */.  u8 has
117e0 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20  Mutex;          
117f0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
11800 68 6f 6c 64 69 6e 67 20 74 68 65 20 77 69 6e 53  holding the winS
11810 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a  hmNode mutex */.
11820 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b    u16 sharedMask
11830 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
11840 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c  Mask of shared l
11850 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
11860 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  16 exclMask;    
11870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
11880 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c  k of exclusive l
11890 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66  ocks held */.#if
118a0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
118b0 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 20 20  .  u8 id;       
118c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
118d0 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e   Id of this conn
118e0 65 63 74 69 6f 6e 20 77 69 74 68 20 69 74 73 20  ection with its 
118f0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65  winShmNode */.#e
11900 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  ndif.};../*.** C
11910 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f  onstants used fo
11920 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65  r locking.*/.#de
11930 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 42 41 53  fine WIN_SHM_BAS
11940 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f  E   ((22+SQLITE_
11950 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20  SHM_NLOCK)*4)   
11960 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f       /* first lo
11970 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69  ck byte */.#defi
11980 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 20 20  ne WIN_SHM_DMS  
11990 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2b    (WIN_SHM_BASE+
119a0 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
119b0 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77  )  /* deadman sw
119c0 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  itch */../*.** A
119d0 70 70 6c 79 20 61 64 76 69 73 6f 72 79 20 6c 6f  pply advisory lo
119e0 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e 20 62 79  cks for all n by
119f0 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  tes beginning at
11a00 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e   ofst..*/.#defin
11a10 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a  e _SHM_UNLCK  1.
11a20 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 52 44 4c  #define _SHM_RDL
11a30 43 4b 20 20 32 0a 23 64 65 66 69 6e 65 20 5f 53  CK  2.#define _S
11a40 48 4d 5f 57 52 4c 43 4b 20 20 33 0a 73 74 61 74  HM_WRLCK  3.stat
11a50 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 53 79 73  ic int winShmSys
11a60 74 65 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e 53 68  temLock(.  winSh
11a70 6d 4e 6f 64 65 20 2a 70 46 69 6c 65 2c 20 20 20  mNode *pFile,   
11a80 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20   /* Apply locks 
11a90 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61  to this open sha
11aa0 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red-memory segme
11ab0 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b  nt */.  int lock
11ac0 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Type,         /*
11ad0 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48   _SHM_UNLCK, _SH
11ae0 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d  M_RDLCK, or _SHM
11af0 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20  _WRLCK */.  int 
11b00 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  ofst,           
11b10 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 66    /* Offset to f
11b20 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65 20  irst byte to be 
11b30 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64 20  locked/unlocked 
11b40 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 20  */.  int nByte  
11b50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
11b60 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
11b70 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20   lock or unlock 
11b80 2a 2f 0a 29 7b 0a 20 20 4f 56 45 52 4c 41 50 50  */.){.  OVERLAPP
11b90 45 44 20 6f 76 6c 70 3b 0a 20 20 44 57 4f 52 44  ED ovlp;.  DWORD
11ba0 20 64 77 46 6c 61 67 73 3b 0a 20 20 69 6e 74 20   dwFlags;.  int 
11bb0 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rc = 0;         
11bc0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
11bd0 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63   form Lock/Unloc
11be0 6b 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20  kFileEx() */..  
11bf0 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65  /* Access to the
11c00 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65   winShmNode obje
11c10 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64  ct is serialized
11c20 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a   by the caller *
11c30 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
11c40 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11c50 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20  File->mutex) || 
11c60 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  pFile->nRef==0 )
11c70 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
11c80 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70  ze the locking p
11c90 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 64  arameters */.  d
11ca0 77 46 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c  wFlags = LOCKFIL
11cb0 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
11cc0 4c 59 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79  LY;.  if( lockTy
11cd0 70 65 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b  pe == _SHM_WRLCK
11ce0 20 29 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c 4f   ) dwFlags |= LO
11cf0 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45  CKFILE_EXCLUSIVE
11d00 5f 4c 4f 43 4b 3b 0a 0a 20 20 6d 65 6d 73 65 74  _LOCK;..  memset
11d10 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f  (&ovlp, 0, sizeo
11d20 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a  f(OVERLAPPED));.
11d30 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20    ovlp.Offset = 
11d40 6f 66 73 74 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65  ofst;..  /* Rele
11d50 61 73 65 2f 41 63 71 75 69 72 65 20 74 68 65 20  ase/Acquire the 
11d60 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63  system-level loc
11d70 6b 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54  k */.  if( lockT
11d80 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20  ype==_SHM_UNLCK 
11d90 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 55 6e  ){.    rc = osUn
11da0 6c 6f 63 6b 46 69 6c 65 45 78 28 70 46 69 6c 65  lockFileEx(pFile
11db0 2d 3e 68 46 69 6c 65 2e 68 2c 20 30 2c 20 6e 42  ->hFile.h, 0, nB
11dc0 79 74 65 2c 20 30 2c 20 26 6f 76 6c 70 29 3b 0a  yte, 0, &ovlp);.
11dd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
11de0 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 28 70  = osLockFileEx(p
11df0 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 64  File->hFile.h, d
11e00 77 46 6c 61 67 73 2c 20 30 2c 20 6e 42 79 74 65  wFlags, 0, nByte
11e10 2c 20 30 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d  , 0, &ovlp);.  }
11e20 0a 20 20 0a 20 20 69 66 28 20 72 63 21 3d 20 30  .  .  if( rc!= 0
11e30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
11e40 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
11e50 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
11e60 45 72 72 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61  Errno =  osGetLa
11e70 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72  stError();.    r
11e80 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
11e90 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
11ea0 28 22 53 48 4d 2d 4c 4f 43 4b 20 25 64 20 25 73  ("SHM-LOCK %d %s
11eb0 20 25 73 20 30 78 25 30 38 6c 78 5c 6e 22 2c 20   %s 0x%08lx\n", 
11ec0 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
11ed0 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20  e->hFile.h,.    
11ee0 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
11ef0 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
11f00 61 69 6c 65 64 22 2c 0a 20 20 20 20 20 20 20 20  ailed",.        
11f10 20 20 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48     lockType==_SH
11f20 4d 5f 55 4e 4c 43 4b 20 3f 20 22 55 6e 6c 6f 63  M_UNLCK ? "Unloc
11f30 6b 46 69 6c 65 45 78 22 20 3a 20 22 4c 6f 63 6b  kFileEx" : "Lock
11f40 46 69 6c 65 45 78 22 2c 0a 20 20 20 20 20 20 20  FileEx",.       
11f50 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
11f60 72 72 6e 6f 29 29 3b 0a 0a 20 20 72 65 74 75 72  rrno));..  retur
11f70 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
11f80 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 74  ard references t
11f90 6f 20 56 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f  o VFS methods */
11fa0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f  .static int winO
11fb0 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a  pen(sqlite3_vfs*
11fc0 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c  ,const char*,sql
11fd0 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69  ite3_file*,int,i
11fe0 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  nt*);.static int
11ff0 20 77 69 6e 44 65 6c 65 74 65 28 73 71 6c 69 74   winDelete(sqlit
12000 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20 63  e3_vfs *,const c
12010 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a  har*,int);../*.*
12020 2a 20 50 75 72 67 65 20 74 68 65 20 77 69 6e 53  * Purge the winS
12030 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20  hmNodeList list 
12040 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77  of all entries w
12050 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e  ith winShmNode.n
12060 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  Ref==0..**.** Th
12070 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20  is is not a VFS 
12080 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
12090 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74  thod; it is a ut
120a0 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63  ility function c
120b0 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20  alled.** by VFS 
120c0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
120d0 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  thods..*/.static
120e0 20 76 6f 69 64 20 77 69 6e 53 68 6d 50 75 72 67   void winShmPurg
120f0 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  e(sqlite3_vfs *p
12100 56 66 73 2c 20 69 6e 74 20 64 65 6c 65 74 65 46  Vfs, int deleteF
12110 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f  lag){.  winShmNo
12120 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53 68  de **pp;.  winSh
12130 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 42 4f 4f 4c  mNode *p;.  BOOL
12140 20 62 52 63 3b 0a 20 20 61 73 73 65 72 74 28 20   bRc;.  assert( 
12150 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
12160 29 20 29 3b 0a 20 20 70 70 20 3d 20 26 77 69 6e  ) );.  pp = &win
12170 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 77  ShmNodeList;.  w
12180 68 69 6c 65 28 20 28 70 20 3d 20 2a 70 70 29 21  hile( (p = *pp)!
12190 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  =0 ){.    if( p-
121a0 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
121b0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
121c0 66 28 20 70 2d 3e 6d 75 74 65 78 20 29 20 73 71  f( p->mutex ) sq
121d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
121e0 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  (p->mutex);.    
121f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
12200 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20  nRegion; i++){. 
12210 20 20 20 20 20 20 20 62 52 63 20 3d 20 6f 73 55         bRc = osU
12220 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  nmapViewOfFile(p
12230 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61  ->aRegion[i].pMa
12240 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52  p);.        OSTR
12250 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 20  ACE(("SHM-PURGE 
12260 70 69 64 2d 25 64 20 75 6e 6d 61 70 20 72 65 67  pid-%d unmap reg
12270 69 6f 6e 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20  ion=%d %s\n",.  
12280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
12290 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74  int)osGetCurrent
122a0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 0a  ProcessId(), i,.
122b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122c0 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66   bRc ? "ok" : "f
122d0 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ailed"));.      
122e0 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f 73 65 48    bRc = osCloseH
122f0 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e  andle(p->aRegion
12300 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20 20 20 20  [i].hMap);.     
12310 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d     OSTRACE(("SHM
12320 2d 50 55 52 47 45 20 70 69 64 2d 25 64 20 63 6c  -PURGE pid-%d cl
12330 6f 73 65 20 72 65 67 69 6f 6e 3d 25 64 20 25 73  ose region=%d %s
12340 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
12350 20 20 20 20 20 20 28 69 6e 74 29 6f 73 47 65 74        (int)osGet
12360 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
12370 28 29 2c 20 69 2c 0a 20 20 20 20 20 20 20 20 20  (), i,.         
12380 20 20 20 20 20 20 20 20 62 52 63 20 3f 20 22 6f          bRc ? "o
12390 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
123a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
123b0 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68 20 21 3d  f( p->hFile.h !=
123c0 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f   INVALID_HANDLE_
123d0 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 20 20 20  VALUE ){.       
123e0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
123f0 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
12400 20 20 20 77 69 6e 43 6c 6f 73 65 28 28 73 71 6c     winClose((sql
12410 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 2d 3e  ite3_file *)&p->
12420 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  hFile);.        
12430 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
12440 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
12450 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c 65  }.      if( dele
12460 74 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  teFlag ){.      
12470 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
12480 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
12490 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
124a0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
124b0 20 20 20 20 20 20 20 20 77 69 6e 44 65 6c 65 74          winDelet
124c0 65 28 70 56 66 73 2c 20 70 2d 3e 7a 46 69 6c 65  e(pVfs, p->zFile
124d0 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  name, 0);.      
124e0 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
124f0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
12500 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
12510 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
12520 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20      }.      *pp 
12530 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  = p->pNext;.    
12540 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
12550 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  ->aRegion);.    
12560 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
12570 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
12580 20 20 20 20 70 70 20 3d 20 26 70 2d 3e 70 4e 65      pp = &p->pNe
12590 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  xt;.    }.  }.}.
125a0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  ./*.** Open the 
125b0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72  shared-memory ar
125c0 65 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ea associated wi
125d0 74 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  th database file
125e0 20 70 44 62 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68   pDbFd..**.** Wh
125f0 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77  en opening a new
12600 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
12610 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72  ile, if no other
12620 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
12630 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63  at.** file are c
12640 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69  urrently open, i
12650 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  n this process o
12660 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65  r in other proce
12670 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  sses, then.** th
12680 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74  e file must be t
12690 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
126a0 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20   length or have 
126b0 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72  its header clear
126c0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
126d0 74 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d  t winOpenSharedM
126e0 65 6d 6f 72 79 28 77 69 6e 46 69 6c 65 20 2a 70  emory(winFile *p
126f0 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20  DbFd){.  struct 
12700 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20  winShm *p;      
12710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12720 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
12730 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20   be opened */.  
12740 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64  struct winShmNod
12750 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b  e *pShmNode = 0;
12760 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
12770 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c  ying mmapped fil
12780 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
12790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
127b0 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 73 74  ult code */.  st
127c0 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ruct winShmNode 
127d0 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
127e0 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61   /* Newly alloca
127f0 74 65 64 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  ted winShmNode *
12800 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
12810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12820 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
12830 66 20 7a 4e 61 6d 65 20 69 6e 20 62 79 74 65 73  f zName in bytes
12840 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
12850 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b  DbFd->pShm==0 );
12860 20 20 20 20 2f 2a 20 4e 6f 74 20 70 72 65 76 69      /* Not previ
12870 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 2a 2f 0a  ously opened */.
12880 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
12890 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
128a0 20 73 71 6c 69 74 65 33 5f 73 68 6d 20 6f 62 6a   sqlite3_shm obj
128b0 65 63 74 2e 20 20 41 6c 73 6f 20 73 70 65 63 75  ect.  Also specu
128c0 6c 61 74 69 76 65 6c 79 0a 20 20 2a 2a 20 61 6c  latively.  ** al
128d0 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
128e0 20 61 20 6e 65 77 20 77 69 6e 53 68 6d 4e 6f 64   a new winShmNod
128f0 65 20 61 6e 64 20 66 69 6c 65 6e 61 6d 65 2e 0a  e and filename..
12900 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74    */.  p = sqlit
12910 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
12920 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
12930 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
12940 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
12950 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
12960 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 6e  sizeof(*p));.  n
12970 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
12980 72 6c 65 6e 33 30 28 70 44 62 46 64 2d 3e 7a 50  rlen30(pDbFd->zP
12990 61 74 68 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ath);.  pNew = s
129a0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
129b0 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29  izeof(*pShmNode)
129c0 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 37 20 29 3b   + nName + 17 );
129d0 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
129e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
129f0 65 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ee(p);.    retur
12a00 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
12a10 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  OMEM;.  }.  mems
12a20 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
12a30 6f 66 28 2a 70 4e 65 77 29 20 2b 20 6e 4e 61 6d  of(*pNew) + nNam
12a40 65 20 2b 20 31 37 29 3b 0a 20 20 70 4e 65 77 2d  e + 17);.  pNew-
12a50 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68  >zFilename = (ch
12a60 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20  ar*)&pNew[1];.  
12a70 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
12a80 28 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e 65 77 2d  (nName+15, pNew-
12a90 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d  >zFilename, "%s-
12aa0 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  shm", pDbFd->zPa
12ab0 74 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69  th);.  sqlite3Fi
12ac0 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64 2d  leSuffix3(pDbFd-
12ad0 3e 7a 50 61 74 68 2c 20 70 4e 65 77 2d 3e 7a 46  >zPath, pNew->zF
12ae0 69 6c 65 6e 61 6d 65 29 3b 20 0a 0a 20 20 2f 2a  ilename); ..  /*
12af0 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66 20   Look to see if 
12b00 74 68 65 72 65 20 69 73 20 61 6e 20 65 78 69 73  there is an exis
12b10 74 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ting winShmNode 
12b20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
12b30 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61 74  ..  ** If no mat
12b40 63 68 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65  ching winShmNode
12b50 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74   currently exist
12b60 73 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  s, create a new 
12b70 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e 53  one..  */.  winS
12b80 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  hmEnterMutex();.
12b90 20 20 66 6f 72 28 70 53 68 6d 4e 6f 64 65 20 3d    for(pShmNode =
12ba0 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b   winShmNodeList;
12bb0 20 70 53 68 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e   pShmNode; pShmN
12bc0 6f 64 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e  ode=pShmNode->pN
12bd0 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 42 44  ext){.    /* TBD
12be0 20 6e 65 65 64 20 74 6f 20 63 6f 6d 65 20 75 70   need to come up
12bf0 20 77 69 74 68 20 62 65 74 74 65 72 20 6d 61 74   with better mat
12c00 63 68 20 68 65 72 65 2e 20 20 50 65 72 68 61 70  ch here.  Perhap
12c10 73 0a 20 20 20 20 2a 2a 20 75 73 65 20 46 49 4c  s.    ** use FIL
12c20 45 5f 49 44 5f 42 4f 54 48 5f 44 49 52 5f 49 4e  E_ID_BOTH_DIR_IN
12c30 46 4f 20 53 74 72 75 63 74 75 72 65 2e 0a 20 20  FO Structure..  
12c40 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
12c50 69 74 65 33 53 74 72 49 43 6d 70 28 70 53 68 6d  ite3StrICmp(pShm
12c60 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  Node->zFilename,
12c70 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
12c80 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
12c90 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  }.  if( pShmNode
12ca0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
12cb0 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d 65  free(pNew);.  }e
12cc0 6c 73 65 7b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  lse{.    pShmNod
12cd0 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e  e = pNew;.    pN
12ce0 65 77 20 3d 20 30 3b 0a 20 20 20 20 28 28 77 69  ew = 0;.    ((wi
12cf0 6e 46 69 6c 65 2a 29 28 26 70 53 68 6d 4e 6f 64  nFile*)(&pShmNod
12d00 65 2d 3e 68 46 69 6c 65 29 29 2d 3e 68 20 3d 20  e->hFile))->h = 
12d10 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
12d20 41 4c 55 45 3b 0a 20 20 20 20 70 53 68 6d 4e 6f  ALUE;.    pShmNo
12d30 64 65 2d 3e 70 4e 65 78 74 20 3d 20 77 69 6e 53  de->pNext = winS
12d40 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20  hmNodeList;.    
12d50 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d  winShmNodeList =
12d60 20 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20   pShmNode;..    
12d70 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
12d80 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
12d90 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
12da0 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66  EX_FAST);.    if
12db0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  ( pShmNode->mute
12dc0 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  x==0 ){.      rc
12dd0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
12de0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
12df0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
12e00 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
12e10 77 69 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e 70  winOpen(pDbFd->p
12e20 56 66 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Vfs,.           
12e30 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
12e40 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20  zFilename,      
12e50 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
12e60 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d  f the file (UTF-
12e70 38 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  8) */.          
12e80 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
12e90 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  file*)&pShmNode-
12ea0 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 46 69 6c 65  >hFile,  /* File
12eb0 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a   handle here */.
12ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ed0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c   SQLITE_OPEN_WAL
12ee0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   | SQLITE_OPEN_R
12ef0 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
12f00 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 2f  E_OPEN_CREATE, /
12f10 2a 20 4d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a  * Mode flags */.
12f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f30 20 30 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c   0);.    if( SQL
12f40 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
12f50 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
12f60 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  n_err;.    }..  
12f70 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
12f80 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f  e if another pro
12f90 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
12fa0 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69  the dead-man swi
12fb0 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e  tch..    ** If n
12fc0 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  ot, truncate the
12fd0 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65   file to zero le
12fe0 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  ngth. .    */.  
12ff0 20 20 69 66 28 20 77 69 6e 53 68 6d 53 79 73 74    if( winShmSyst
13000 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
13010 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e   _SHM_WRLCK, WIN
13020 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51  _SHM_DMS, 1)==SQ
13030 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13040 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74   rc = winTruncat
13050 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
13060 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  *)&pShmNode->hFi
13070 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  le, 0);.      if
13080 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13090 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
130a0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
130b0 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
130c0 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
130d0 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
130e0 20 20 20 20 20 22 77 69 6e 4f 70 65 6e 53 68 6d       "winOpenShm
130f0 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
13100 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13110 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
13120 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77  TE_OK ){.      w
13130 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
13140 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55  pShmNode, _SHM_U
13150 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  NLCK, WIN_SHM_DM
13160 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 63 20  S, 1);.      rc 
13170 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  = winShmSystemLo
13180 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
13190 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d  M_RDLCK, WIN_SHM
131a0 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  _DMS, 1);.    }.
131b0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
131c0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
131d0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74    }..  /* Make t
131e0 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f  he new connectio
131f0 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65  n a child of the
13200 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20   winShmNode */. 
13210 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70   p->pShmNode = p
13220 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20  ShmNode;.#ifdef 
13230 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70  SQLITE_DEBUG.  p
13240 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  ->id = pShmNode-
13250 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65  >nextShmId++;.#e
13260 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  ndif.  pShmNode-
13270 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64  >nRef++;.  pDbFd
13280 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69  ->pShm = p;.  wi
13290 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
132a0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65  ;..  /* The refe
132b0 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70  rence count on p
132c0 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65  ShmNode has alre
132d0 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65  ady been increme
132e0 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20  nted under.  ** 
132f0 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65  the cover of the
13300 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
13310 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68  x() mutex and th
13320 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  e pointer from t
13330 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72  he.  ** new (str
13340 75 63 74 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65  uct winShm) obje
13350 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f  ct to the pShmNo
13360 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  de has been set.
13370 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a   All that is.  *
13380 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20  * left to do is 
13390 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20  to link the new 
133a0 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20  object into the 
133b0 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
133c0 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68  ting.  ** at pSh
133d0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54  mNode->pFirst. T
133e0 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65  his must be done
133f0 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74   while holding t
13400 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  he pShmNode->mut
13410 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a  ex .  ** mutex..
13420 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d    */.  sqlite3_m
13430 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
13440 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  ode->mutex);.  p
13450 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f  ->pNext = pShmNo
13460 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53  de->pFirst;.  pS
13470 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d  hmNode->pFirst =
13480 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   p;.  sqlite3_mu
13490 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
134a0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  de->mutex);.  re
134b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
134c0 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
134d0 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a  on any error */.
134e0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20  shm_open_err:.  
134f0 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
13500 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
13510 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44  UNLCK, WIN_SHM_D
13520 4d 53 2c 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d  MS, 1);.  winShm
13530 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66  Purge(pDbFd->pVf
13540 73 2c 20 30 29 3b 20 20 20 20 20 20 2f 2a 20 54  s, 0);      /* T
13550 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70  his call frees p
13560 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69  ShmNode if requi
13570 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  red */.  sqlite3
13580 5f 66 72 65 65 28 70 29 3b 0a 20 20 73 71 6c 69  _free(p);.  sqli
13590 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
135a0 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
135b0 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ex();.  return r
135c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
135d0 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  e a connection t
135e0 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e  o shared-memory.
135f0 20 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64    Delete the und
13600 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72  erlying .** stor
13610 61 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61  age if deleteFla
13620 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74  g is true..*/.st
13630 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 55  atic int winShmU
13640 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  nmap(.  sqlite3_
13650 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
13660 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
13670 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65  olding shared me
13680 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65  mory */.  int de
13690 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 20 20  leteFlag        
136a0 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61       /* Delete a
136b0 66 74 65 72 20 63 6c 6f 73 69 6e 67 20 69 66 20  fter closing if 
136c0 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e  true */.){.  win
136d0 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20  File *pDbFd;    
136e0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
136f0 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 2d 6d 65  olding shared-me
13700 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  mory */.  winShm
13710 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
13720 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
13730 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a  n to be closed *
13740 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  /.  winShmNode *
13750 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65  pShmNode; /* The
13760 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72   underlying shar
13770 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a  ed-memory file *
13780 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b  /.  winShm **pp;
13790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
137a0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69   looping over si
137b0 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
137c0 73 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20  s */..  pDbFd = 
137d0 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20  (winFile*)fd;.  
137e0 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
137f0 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
13800 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13810 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e    pShmNode = p->
13820 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20  pShmNode;..  /* 
13830 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f  Remove connectio
13840 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74  n p from the set
13850 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   of connections 
13860 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20  associated.  ** 
13870 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f  with pShmNode */
13880 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
13890 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
138a0 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70  >mutex);.  for(p
138b0 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  p=&pShmNode->pFi
138c0 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70  rst; (*pp)!=p; p
138d0 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78  p = &(*pp)->pNex
138e0 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e  t){}.  *pp = p->
138f0 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65  pNext;..  /* Fre
13900 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  e the connection
13910 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f   p */.  sqlite3_
13920 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64  free(p);.  pDbFd
13930 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71  ->pShm = 0;.  sq
13940 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
13950 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
13960 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68  x);..  /* If pSh
13970 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20  mNode->nRef has 
13980 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20  reached 0, then 
13990 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c  close the underl
139a0 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64  ying.  ** shared
139b0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f  -memory file, to
139c0 6f 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74  o */.  winShmEnt
139d0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73  erMutex();.  ass
139e0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ert( pShmNode->n
139f0 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e  Ref>0 );.  pShmN
13a00 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  ode->nRef--;.  i
13a10 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
13a20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 53  f==0 ){.    winS
13a30 68 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70  hmPurge(pDbFd->p
13a40 56 66 73 2c 20 64 65 6c 65 74 65 46 6c 61 67 29  Vfs, deleteFlag)
13a50 3b 0a 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65  ;.  }.  winShmLe
13a60 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72  aveMutex();..  r
13a70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13a80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
13a90 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
13aa0 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d  for a shared-mem
13ab0 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a  ory segment..*/.
13ac0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
13ad0 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33  mLock(.  sqlite3
13ae0 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
13af0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
13b00 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  file holding the
13b10 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
13b20 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
13b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13b40 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20  * First lock to 
13b50 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61  acquire or relea
13b60 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20  se */.  int n,  
13b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b80 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13b90 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65  locks to acquire
13ba0 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
13bb0 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
13bc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
13bd0 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
13be0 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20  he lock */.){.  
13bf0 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  winFile *pDbFd =
13c00 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20   (winFile*)fd;  
13c10 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
13c20 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ion holding shar
13c30 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77  ed memory */.  w
13c40 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64  inShm *p = pDbFd
13c50 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20  ->pShm;         
13c60 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
13c70 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20  ed memory being 
13c80 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53  locked */.  winS
13c90 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  hm *pX;         
13ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cb0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
13cc0 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e   over all siblin
13cd0 67 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f  gs */.  winShmNo
13ce0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70  de *pShmNode = p
13cf0 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e  ->pShmNode;.  in
13d00 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13d10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13d20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
13d30 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b  de */.  u16 mask
13d40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13d60 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74   Mask of locks t
13d70 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73  o take or releas
13d80 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
13d90 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b  ofst>=0 && ofst+
13da0 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  n<=SQLITE_SHM_NL
13db0 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
13dc0 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72   n>=1 );.  asser
13dd0 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  t( flags==(SQLIT
13de0 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c  E_SHM_LOCK | SQL
13df0 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a  ITE_SHM_SHARED).
13e00 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
13e10 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43  =(SQLITE_SHM_LOC
13e20 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  K | SQLITE_SHM_E
13e30 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20  XCLUSIVE).      
13e40 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
13e50 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20  TE_SHM_UNLOCK | 
13e60 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
13e70 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  D).       || fla
13e80 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
13e90 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  UNLOCK | SQLITE_
13ea0 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29  SHM_EXCLUSIVE) )
13eb0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31  ;.  assert( n==1
13ec0 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c   || (flags & SQL
13ed0 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
13ee0 45 29 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b  E)!=0 );..  mask
13ef0 20 3d 20 28 75 31 36 29 28 28 31 55 3c 3c 28 6f   = (u16)((1U<<(o
13f00 66 73 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f  fst+n)) - (1U<<o
13f10 66 73 74 29 29 3b 0a 20 20 61 73 73 65 72 74 28  fst));.  assert(
13f20 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31   n>1 || mask==(1
13f30 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c  <<ofst) );.  sql
13f40 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
13f50 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
13f60 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  );.  if( flags &
13f70 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f   SQLITE_SHM_UNLO
13f80 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c  CK ){.    u16 al
13f90 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61  lMask = 0; /* Ma
13fa0 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  sk of locks held
13fb0 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a   by siblings */.
13fc0 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61  .    /* See if a
13fd0 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64  ny siblings hold
13fe0 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20   this same lock 
13ff0 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
14000 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
14010 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
14020 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d  ){.      if( pX=
14030 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =p ) continue;. 
14040 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58       assert( (pX
14050 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d  ->exclMask & (p-
14060 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61  >exclMask|p->sha
14070 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a  redMask))==0 );.
14080 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d        allMask |=
14090 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
140a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
140b0 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d  nlock the system
140c0 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a  -level locks */.
140d0 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20      if( (mask & 
140e0 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  allMask)==0 ){. 
140f0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d       rc = winShm
14100 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
14110 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c  ode, _SHM_UNLCK,
14120 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
14130 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  SE, n);.    }els
14140 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
14150 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a  LITE_OK;.    }..
14160 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20      /* Undo the 
14170 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  local locks */. 
14180 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14190 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
141a0 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61  >exclMask &= ~ma
141b0 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61  sk;.      p->sha
141c0 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  redMask &= ~mask
141d0 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65  ;.    } .  }else
141e0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
141f0 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29  ITE_SHM_SHARED )
14200 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61  {.    u16 allSha
14210 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69  red = 0;  /* Uni
14220 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  on of locks held
14230 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   by connections 
14240 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a  other than "p" *
14250 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f  /..    /* Find o
14260 75 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20  ut which shared 
14270 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64  locks are alread
14280 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e  y held by siblin
14290 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20  g connections.. 
142a0 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62     ** If any sib
142b0 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c  ling already hol
142c0 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ds an exclusive 
142d0 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61  lock, go ahead a
142e0 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a  nd return.    **
142f0 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20   SQLITE_BUSY..  
14300 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
14310 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
14320 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
14330 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
14340 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
14350 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
14360 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
14370 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65  USY;.        bre
14380 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
14390 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70    allShared |= p
143a0 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
143b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
143c0 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74   shared locks at
143d0 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65   the system leve
143e0 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  l, if necessary 
143f0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
14400 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14410 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64    if( (allShared
14420 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20   & mask)==0 ){. 
14430 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53         rc = winS
14440 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
14450 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43  mNode, _SHM_RDLC
14460 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f  K, ofst+WIN_SHM_
14470 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
14480 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
14490 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
144a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
144b0 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63    /* Get the loc
144c0 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  al shared locks 
144d0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
144e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
144f0 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20    p->sharedMask 
14500 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20  |= mask;.    }. 
14510 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d   }else{.    /* M
14520 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c  ake sure no sibl
14530 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
14540 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20  hold locks that 
14550 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a  will block this.
14560 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66      ** lock.  If
14570 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20   any do, return 
14580 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68  SQLITE_BUSY righ
14590 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20  t away..    */. 
145a0 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
145b0 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
145c0 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
145d0 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78       if( (pX->ex
145e0 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  clMask & mask)!=
145f0 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64  0 || (pX->shared
14600 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
14610 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
14620 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
14630 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14640 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
14650 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c   /* Get the excl
14660 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74  usive locks at t
14670 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e  he system level.
14680 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65 73    Then if succes
14690 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f  sful.    ** also
146a0 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20   mark the local 
146b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65  connection as be
146c0 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20  ing locked..    
146d0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
146e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
146f0 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73    rc = winShmSys
14700 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
14710 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66  , _SHM_WRLCK, of
14720 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c  st+WIN_SHM_BASE,
14730 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   n);.      if( r
14740 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
14750 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14760 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  (p->sharedMask &
14770 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20   mask)==0 );.   
14780 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
14790 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
147a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
147b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
147c0 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
147d0 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  x);.  OSTRACE(("
147e0 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25  SHM-LOCK shmid-%
147f0 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30  d, pid-%d got %0
14800 33 78 2c 25 30 33 78 20 25 73 5c 6e 22 2c 0a 20  3x,%03x %s\n",. 
14810 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c            p->id,
14820 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65   (int)osGetCurre
14830 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
14840 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d  ->sharedMask, p-
14850 3e 65 78 63 6c 4d 61 73 6b 2c 0a 20 20 20 20 20  >exclMask,.     
14860 20 20 20 20 20 20 72 63 20 3f 20 22 66 61 69 6c        rc ? "fail
14870 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 20 20  ed" : "ok"));.  
14880 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
14890 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20  .** Implement a 
148a0 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f  memory barrier o
148b0 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f  r memory fence o
148c0 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  n shared memory.
148d0 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61    .**.** All loa
148e0 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65  ds and stores be
148f0 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62  gun before the b
14900 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70  arrier must comp
14910 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61  lete before.** a
14920 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65  ny load or store
14930 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65   begun after the
14940 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61   barrier..*/.sta
14950 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 42  tic void winShmB
14960 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65  arrier(.  sqlite
14970 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20  3_file *fd      
14980 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
14990 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72  holding the shar
149a0 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a  ed memory */.){.
149b0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
149c0 45 52 28 66 64 29 3b 0a 20 20 2f 2a 20 4d 65 6d  ER(fd);.  /* Mem
149d0 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20 2f 2f  oryBarrier(); //
149e0 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 2d   does not work -
149f0 2d 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 77 68  - do not know wh
14a00 79 20 6e 6f 74 20 2a 2f 0a 20 20 77 69 6e 53 68  y not */.  winSh
14a10 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  mEnterMutex();. 
14a20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
14a30 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  x();.}../*.** Th
14a40 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
14a50 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20  alled to obtain 
14a60 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 67  a pointer to reg
14a70 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20 74  ion iRegion of t
14a80 68 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65  he .** shared-me
14a90 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
14aa0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
14ab0 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72 65  e file fd. Share
14ac0 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
14ad0 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72 65   .** are numbere
14ae0 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20  d starting from 
14af0 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72 65  zero. Each share
14b00 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
14b10 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20  is szRegion .** 
14b20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
14b30 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
14b40 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
14b50 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
14b60 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65  ed and *pp is se
14b70 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
14b80 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
14b90 68 65 20 69 73 57 72 69 74 65 20 70 61 72 61 6d  he isWrite param
14ba0 65 74 65 72 20 69 73 20 30 20 61 6e 64 20 74 68  eter is 0 and th
14bb0 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
14bc0 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67  ed-memory.** reg
14bd0 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ion has not been
14be0 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20 61   allocated (by a
14bf0 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75  ny client, inclu
14c00 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67  ding one running
14c10 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61 74   in a.** separat
14c20 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e  e process), then
14c30 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e   *pp is set to N
14c40 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
14c50 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 0a  K returned. If .
14c60 2a 2a 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f  ** isWrite is no
14c70 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 72  n-zero and the r
14c80 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d  equested shared-
14c90 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
14ca0 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65  s not yet .** be
14cb0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
14cc0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79   is allocated by
14cd0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
14ce0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61  **.** If the sha
14cf0 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
14d00 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
14d10 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20  en allocated or 
14d20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a  is allocated by.
14d30 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61 73 20  ** this call as 
14d40 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2c  described above,
14d50 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61 70 70   then it is mapp
14d60 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
14d70 63 65 73 73 65 73 20 0a 2a 2a 20 61 64 64 72 65  cesses .** addre
14d80 73 73 20 73 70 61 63 65 20 28 69 66 20 69 74 20  ss space (if it 
14d90 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c  is not already),
14da0 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 70   *pp is set to p
14db0 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70 70  oint to the mapp
14dc0 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e  ed .** memory an
14dd0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
14de0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
14df0 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70 28 0a 20  int winShmMap(. 
14e00 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
14e10 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
14e20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20   /* Handle open 
14e30 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  on database file
14e40 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f   */.  int iRegio
14e50 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
14e60 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20        /* Region 
14e70 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20  to retrieve */. 
14e80 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20   int szRegion,  
14e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ea0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69   /* Size of regi
14eb0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 57  ons */.  int isW
14ec0 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
14ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
14ee0 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20   to extend file 
14ef0 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
14f00 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20    void volatile 
14f10 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20 20 20  **pp            
14f20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64    /* OUT: Mapped
14f30 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20   memory */.){.  
14f40 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  winFile *pDbFd =
14f50 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20   (winFile*)fd;. 
14f60 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62   winShm *p = pDb
14f70 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77 69 6e 53  Fd->pShm;.  winS
14f80 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
14f90 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
14fa0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21  ITE_OK;..  if( !
14fb0 70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69  p ){.    rc = wi
14fc0 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  nOpenSharedMemor
14fd0 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66  y(pDbFd);.    if
14fe0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14ff0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
15000 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d   p = pDbFd->pShm
15010 3b 0a 20 20 7d 0a 20 20 70 53 68 6d 4e 6f 64 65  ;.  }.  pShmNode
15020 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
15030 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
15040 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
15050 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
15060 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68  t( szRegion==pSh
15070 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
15080 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  || pShmNode->nRe
15090 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  gion==0 );..  if
150a0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
150b0 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a  ion<=iRegion ){.
150c0 20 20 20 20 73 74 72 75 63 74 20 53 68 6d 52 65      struct ShmRe
150d0 67 69 6f 6e 20 2a 61 70 4e 65 77 3b 20 20 20 20  gion *apNew;    
150e0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 52         /* New aR
150f0 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f  egion[] array */
15100 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
15110 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52   (iRegion+1)*szR
15120 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d  egion;  /* Minim
15130 75 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c 65  um required file
15140 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c   size */.    sql
15150 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 20 20  ite3_int64 sz;  
15160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15170 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65 20  /* Current size 
15180 6f 66 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c  of wal-index fil
15190 65 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f  e */..    pShmNo
151a0 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73  de->szRegion = s
151b0 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a  zRegion;..    /*
151c0 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72   The requested r
151d0 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70  egion is not map
151e0 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ped into this pr
151f0 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20  ocesses address 
15200 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 43 68  space..    ** Ch
15210 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74  eck to see if it
15220 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
15230 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65  ted (i.e. if the
15240 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20   wal-index file 
15250 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 20  is.    ** large 
15260 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69  enough to contai
15270 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
15280 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a  region)..    */.
15290 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65      rc = winFile
152a0 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66 69  Size((sqlite3_fi
152b0 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  le *)&pShmNode->
152c0 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a 20 20 20  hFile, &sz);.   
152d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
152e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
152f0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
15300 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
15310 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  E, osGetLastErro
15320 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
15330 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 31 22      "winShmMap1"
15340 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
15350 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70  .      goto shmp
15360 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a  age_out;.    }..
15370 20 20 20 20 69 66 28 20 73 7a 3c 6e 42 79 74 65      if( sz<nByte
15380 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
15390 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
153a0 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f  y region does no
153b0 74 20 65 78 69 73 74 2e 20 49 66 20 69 73 57 72  t exist. If isWr
153c0 69 74 65 20 69 73 20 73 65 74 20 74 6f 0a 20 20  ite is set to.  
153d0 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65 78 69      ** zero, exi
153e0 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c  t early. *pp wil
153f0 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c  l be set to NULL
15400 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
15410 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 2a  eturned..      *
15420 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72  *.      ** Alter
15430 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 69 73 57  natively, if isW
15440 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  rite is non-zero
15450 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74 65 28  , use ftruncate(
15460 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20  ) to allocate.  
15470 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65      ** the reque
15480 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
15490 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
154a0 20 20 20 69 66 28 20 21 69 73 57 72 69 74 65 20     if( !isWrite 
154b0 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f  ) goto shmpage_o
154c0 75 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ut;.      rc = w
154d0 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69  inTruncate((sqli
154e0 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d  te3_file *)&pShm
154f0 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e 42 79  Node->hFile, nBy
15500 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  te);.      if( r
15510 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15520 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e          rc = win
15530 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
15540 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f  IOERR_SHMSIZE, o
15550 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
15560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15570 20 20 22 77 69 6e 53 68 6d 4d 61 70 32 22 2c 20    "winShmMap2", 
15580 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
15590 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
155a0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  age_out;.      }
155b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
155c0 61 70 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ap the requested
155d0 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69   memory region i
155e0 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
155f0 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
15600 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d  . */.    apNew =
15610 20 28 73 74 72 75 63 74 20 53 68 6d 52 65 67 69   (struct ShmRegi
15620 6f 6e 20 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  on *)sqlite3_rea
15630 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53  lloc(.        pS
15640 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 2c  hmNode->aRegion,
15650 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a   (iRegion+1)*siz
15660 65 6f 66 28 61 70 4e 65 77 5b 30 5d 29 0a 20 20  eof(apNew[0]).  
15670 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70    );.    if( !ap
15680 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20  New ){.      rc 
15690 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  = SQLITE_IOERR_N
156a0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
156b0 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
156c0 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65    }.    pShmNode
156d0 2d 3e 61 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65  ->aRegion = apNe
156e0 77 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 70  w;..    while( p
156f0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
15700 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  <=iRegion ){.   
15710 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20     HANDLE hMap; 
15720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15730 2a 20 66 69 6c 65 2d 6d 61 70 70 69 6e 67 20 68  * file-mapping h
15740 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 76  andle */.      v
15750 6f 69 64 20 2a 70 4d 61 70 20 3d 20 30 3b 20 20  oid *pMap = 0;  
15760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
15770 70 70 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  pped memory regi
15780 6f 6e 20 2a 2f 0a 20 20 20 20 20 0a 20 20 20 20  on */.     .    
15790 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74    hMap = osCreat
157a0 65 46 69 6c 65 4d 61 70 70 69 6e 67 28 70 53 68  eFileMapping(pSh
157b0 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  mNode->hFile.h, 
157c0 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c  .          NULL,
157d0 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c   PAGE_READWRITE,
157e0 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a   0, nByte, NULL.
157f0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 4f        );.      O
15800 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50  STRACE(("SHM-MAP
15810 20 70 69 64 2d 25 64 20 63 72 65 61 74 65 20 72   pid-%d create r
15820 65 67 69 6f 6e 3d 25 64 20 6e 62 79 74 65 3d 25  egion=%d nbyte=%
15830 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
15840 20 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73 47          (int)osG
15850 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
15860 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  Id(), pShmNode->
15870 6e 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a  nRegion, nByte,.
15880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
15890 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  Map ? "ok" : "fa
158a0 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 69  iled"));.      i
158b0 66 28 20 68 4d 61 70 20 29 7b 0a 20 20 20 20 20  f( hMap ){.     
158c0 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d     int iOffset =
158d0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
158e0 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20  on*szRegion;.   
158f0 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74       int iOffset
15900 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20  Shift = iOffset 
15910 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41  % winSysInfo.dwA
15920 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61  llocationGranula
15930 72 69 74 79 3b 0a 20 20 20 20 20 20 20 20 70 4d  rity;.        pM
15940 61 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66  ap = osMapViewOf
15950 46 69 6c 65 28 68 4d 61 70 2c 20 46 49 4c 45 5f  File(hMap, FILE_
15960 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49 4c 45  MAP_WRITE | FILE
15970 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20 20 20  _MAP_READ,.     
15980 20 20 20 20 20 20 20 30 2c 20 69 4f 66 66 73 65         0, iOffse
15990 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74  t - iOffsetShift
159a0 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66  , szRegion + iOf
159b0 66 73 65 74 53 68 69 66 74 0a 20 20 20 20 20 20  fsetShift.      
159c0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54    );.        OST
159d0 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 20 70  RACE(("SHM-MAP p
159e0 69 64 2d 25 64 20 6d 61 70 20 72 65 67 69 6f 6e  id-%d map region
159f0 3d 25 64 20 6f 66 66 73 65 74 3d 25 64 20 73 69  =%d offset=%d si
15a00 7a 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20  ze=%d %s\n",.   
15a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
15a20 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74 50  nt)osGetCurrentP
15a30 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d  rocessId(), pShm
15a40 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69  Node->nRegion, i
15a50 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 20  Offset,.        
15a60 20 20 20 20 20 20 20 20 20 73 7a 52 65 67 69 6f           szRegio
15a70 6e 2c 20 70 4d 61 70 20 3f 20 22 6f 6b 22 20 3a  n, pMap ? "ok" :
15a80 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
15a90 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
15aa0 70 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20  pMap ){.        
15ab0 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72  pShmNode->lastEr
15ac0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
15ad0 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20  rror();.        
15ae0 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
15af0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
15b00 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  MMAP, pShmNode->
15b10 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
15b20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
15b30 53 68 6d 4d 61 70 33 22 2c 20 70 44 62 46 64 2d  ShmMap3", pDbFd-
15b40 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  >zPath);.       
15b50 20 69 66 28 20 68 4d 61 70 20 29 20 6f 73 43 6c   if( hMap ) osCl
15b60 6f 73 65 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b  oseHandle(hMap);
15b70 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
15b80 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
15b90 20 7d 0a 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f   }..      pShmNo
15ba0 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d  de->aRegion[pShm
15bb0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70  Node->nRegion].p
15bc0 4d 61 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20  Map = pMap;.    
15bd0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67    pShmNode->aReg
15be0 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ion[pShmNode->nR
15bf0 65 67 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d  egion].hMap = hM
15c00 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ap;.      pShmNo
15c10 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20  de->nRegion++;. 
15c20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67     }.  }..shmpag
15c30 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68  e_out:.  if( pSh
15c40 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69  mNode->nRegion>i
15c50 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e  Region ){.    in
15c60 74 20 69 4f 66 66 73 65 74 20 3d 20 69 52 65 67  t iOffset = iReg
15c70 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20  ion*szRegion;.  
15c80 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69    int iOffsetShi
15c90 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77  ft = iOffset % w
15ca0 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f  inSysInfo.dwAllo
15cb0 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74  cationGranularit
15cc0 79 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d  y;.    char *p =
15cd0 20 28 63 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64   (char *)pShmNod
15ce0 65 2d 3e 61 52 65 67 69 6f 6e 5b 69 52 65 67 69  e->aRegion[iRegi
15cf0 6f 6e 5d 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70  on].pMap;.    *p
15d00 70 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 69  p = (void *)&p[i
15d10 4f 66 66 73 65 74 53 68 69 66 74 5d 3b 0a 20 20  OffsetShift];.  
15d20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d  }else{.    *pp =
15d30 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
15d40 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
15d50 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
15d60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15d70 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77  #else.# define w
15d80 69 6e 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23  inShmMap     0.#
15d90 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f   define winShmLo
15da0 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  ck    0.# define
15db0 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 20 30   winShmBarrier 0
15dc0 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
15dd0 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66  Unmap   0.#endif
15de0 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
15df0 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
15e00 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20  /*.** Here ends 
15e10 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
15e20 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65  on of all sqlite
15e30 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a  3_file methods..
15e40 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
15e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71  ********* End sq
15e60 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f  lite3_file Metho
15e70 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
15e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15e90 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
15ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15ee0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  */../*.** This v
15ef0 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c  ector defines al
15f00 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68  l the methods th
15f10 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f  at can operate o
15f20 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  n an.** sqlite3_
15f30 66 69 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a  file for win32..
15f40 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
15f50 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
15f60 64 73 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d  ds winIoMethod =
15f70 20 7b 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20   {.  2,         
15f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f90 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
15fa0 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20   */.  winClose, 
15fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fc0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
15fd0 2a 2f 0a 20 20 77 69 6e 52 65 61 64 2c 20 20 20  */.  winRead,   
15fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ff0 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f       /* xRead */
16000 0a 20 20 77 69 6e 57 72 69 74 65 2c 20 20 20 20  .  winWrite,    
16010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16020 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a     /* xWrite */.
16030 20 20 77 69 6e 54 72 75 6e 63 61 74 65 2c 20 20    winTruncate,  
16040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16050 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a    /* xTruncate *
16060 2f 0a 20 20 77 69 6e 53 79 6e 63 2c 20 20 20 20  /.  winSync,    
16070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16080 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a      /* xSync */.
16090 20 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20    winFileSize,  
160a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160b0 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a    /* xFileSize *
160c0 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20 20 20 20  /.  winLock,    
160d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160e0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a      /* xLock */.
160f0 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20    winUnlock,    
16100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16110 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a    /* xUnlock */.
16120 20 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76    winCheckReserv
16130 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  edLock,         
16140 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
16150 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  vedLock */.  win
16160 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20  FileControl,    
16170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16180 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a  xFileControl */.
16190 20 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c    winSectorSize,
161a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161b0 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65    /* xSectorSize
161c0 20 2a 2f 0a 20 20 77 69 6e 44 65 76 69 63 65 43   */.  winDeviceC
161d0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20  haracteristics, 
161e0 20 20 20 20 20 20 2f 2a 20 78 44 65 76 69 63 65        /* xDevice
161f0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
16200 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20  */.  winShmMap, 
16210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16220 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
16230 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c  */.  winShmLock,
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16250 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b       /* xShmLock
16260 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72 72   */.  winShmBarr
16270 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ier,            
16280 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72        /* xShmBar
16290 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  rier */.  winShm
162a0 55 6e 6d 61 70 20 20 20 20 20 20 20 20 20 20 20  Unmap           
162b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
162c0 6d 55 6e 6d 61 70 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  mUnmap */.};../*
162d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
162e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
162f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
16320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16330 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33  ******** sqlite3
16340 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a  _vfs methods ***
16350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16360 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
16370 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f  This division co
16380 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65  ntains the imple
16390 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74  mentation of met
163a0 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73  hods on the.** s
163b0 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63  qlite3_vfs objec
163c0 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  t..*/../*.** Con
163d0 76 65 72 74 20 61 20 55 54 46 2d 38 20 66 69 6c  vert a UTF-8 fil
163e0 65 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61 74 65  ename into whate
163f0 76 65 72 20 66 6f 72 6d 20 74 68 65 20 75 6e 64  ver form the und
16400 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  erlying.** opera
16410 74 69 6e 67 20 73 79 73 74 65 6d 20 77 61 6e 74  ting system want
16420 73 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20  s filenames in. 
16430 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
16440 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20  he result.** is 
16450 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
16460 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65  lloc and must be
16470 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
16480 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
16490 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
164a0 64 20 2a 63 6f 6e 76 65 72 74 55 74 66 38 46 69  d *convertUtf8Fi
164b0 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61  lename(const cha
164c0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
164d0 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
164e0 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 73 4e  d = 0;.  if( isN
164f0 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76  T() ){.    zConv
16500 65 72 74 65 64 20 3d 20 75 74 66 38 54 6f 55 6e  erted = utf8ToUn
16510 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
16520 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31  ;./* isNT() is 1
16530 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   if SQLITE_OS_WI
16540 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20  NCE==1, so this 
16550 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78  else is never ex
16560 65 63 75 74 65 64 2e 20 0a 2a 2f 0a 23 69 66 20  ecuted. .*/.#if 
16570 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
16580 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  =0.  }else{.    
16590 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c  zConverted = sql
165a0 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f  ite3_win32_utf8_
165b0 74 6f 5f 6d 62 63 73 28 7a 46 69 6c 65 6e 61 6d  to_mbcs(zFilenam
165c0 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  e);.#endif.  }. 
165d0 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20   /* caller will 
165e0 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65  handle out of me
165f0 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e  mory */.  return
16600 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a   zConverted;.}..
16610 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74  /*.** Create a t
16620 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61  emporary file na
16630 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75  me in zBuf.  zBu
16640 66 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e  f must be big en
16650 6f 75 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20  ough to.** hold 
16660 61 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  at pVfs->mxPathn
16670 61 6d 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a  ame characters..
16680 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
16690 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42  tTempname(int nB
166a0 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
166b0 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a  .  static char z
166c0 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61  Chars[] =.    "a
166d0 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
166e0 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22  rstuvwxyz".    "
166f0 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
16700 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20  QRSTUVWXYZ".    
16710 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20  "0123456789";.  
16720 73 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 63  size_t i, j;.  c
16730 68 61 72 20 7a 54 65 6d 70 50 61 74 68 5b 4d 41  har zTempPath[MA
16740 58 5f 50 41 54 48 2b 32 5d 3b 0a 0a 20 20 2f 2a  X_PATH+2];..  /*
16750 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d   It's odd to sim
16760 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f  ulate an io-erro
16770 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c  r here, but real
16780 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a  ly this is just.
16790 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69    ** using the i
167a0 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72  o-error infrastr
167b0 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74  ucture to test t
167c0 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c  hat SQLite handl
167d0 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  es this.  ** fun
167e0 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a  ction failing. .
167f0 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
16800 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
16810 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a  QLITE_IOERR );..
16820 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65    if( sqlite3_te
16830 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a  mp_directory ){.
16840 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
16850 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30  intf(MAX_PATH-30
16860 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73  , zTempPath, "%s
16870 22 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  ", sqlite3_temp_
16880 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 7d 65  directory);.  }e
16890 6c 73 65 20 69 66 28 20 69 73 4e 54 28 29 20 29  lse if( isNT() )
168a0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75 6c  {.    char *zMul
168b0 74 69 3b 0a 20 20 20 20 57 43 48 41 52 20 7a 57  ti;.    WCHAR zW
168c0 69 64 65 50 61 74 68 5b 4d 41 58 5f 50 41 54 48  idePath[MAX_PATH
168d0 5d 3b 0a 20 20 20 20 6f 73 47 65 74 54 65 6d 70  ];.    osGetTemp
168e0 50 61 74 68 57 28 4d 41 58 5f 50 41 54 48 2d 33  PathW(MAX_PATH-3
168f0 30 2c 20 7a 57 69 64 65 50 61 74 68 29 3b 0a 20  0, zWidePath);. 
16900 20 20 20 7a 4d 75 6c 74 69 20 3d 20 75 6e 69 63     zMulti = unic
16910 6f 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65 50  odeToUtf8(zWideP
16920 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d  ath);.    if( zM
16930 75 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73 71  ulti ){.      sq
16940 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
16950 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d  AX_PATH-30, zTem
16960 70 50 61 74 68 2c 20 22 25 73 22 2c 20 7a 4d 75  pPath, "%s", zMu
16970 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lti);.      sqli
16980 74 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29  te3_free(zMulti)
16990 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
169a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
169b0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
169c0 20 20 7d 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73    }./* isNT() is
169d0 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f   1 if SQLITE_OS_
169e0 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69  WINCE==1, so thi
169f0 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20  s else is never 
16a00 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69  executed. .** Si
16a10 6e 63 65 20 74 68 65 20 41 4e 53 49 20 76 65 72  nce the ANSI ver
16a20 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69  sion of these Wi
16a30 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74  ndows API do not
16a40 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45   exist for WINCE
16a50 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74  ,.** it's import
16a60 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72  ant to not refer
16a70 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49  ence them for WI
16a80 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23  NCE builds..*/.#
16a90 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
16aa0 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20  CE==0.  }else{. 
16ab0 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a     char *zUtf8;.
16ac0 20 20 20 20 63 68 61 72 20 7a 4d 62 63 73 50 61      char zMbcsPa
16ad0 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20  th[MAX_PATH];.  
16ae0 20 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41    osGetTempPathA
16af0 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 4d  (MAX_PATH-30, zM
16b00 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20 7a 55  bcsPath);.    zU
16b10 74 66 38 20 3d 20 73 71 6c 69 74 65 33 5f 77 69  tf8 = sqlite3_wi
16b20 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
16b30 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20  (zMbcsPath);.   
16b40 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20   if( zUtf8 ){.  
16b50 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
16b60 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30  intf(MAX_PATH-30
16b70 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73  , zTempPath, "%s
16b80 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ", zUtf8);.     
16b90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55   sqlite3_free(zU
16ba0 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tf8);.    }else{
16bb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
16bc0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
16bd0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
16be0 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
16bf0 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62  hat the output b
16c00 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65  uffer is large e
16c10 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65  nough for the te
16c20 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20  mporary file .  
16c30 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69  ** name. If it i
16c40 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51  s not, return SQ
16c50 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f  LITE_ERROR..  */
16c60 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 53  .  if( (sqlite3S
16c70 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 50 61 74  trlen30(zTempPat
16c80 68 29 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c  h) + sqlite3Strl
16c90 65 6e 33 30 28 53 51 4c 49 54 45 5f 54 45 4d 50  en30(SQLITE_TEMP
16ca0 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20 2b 20  _FILE_PREFIX) + 
16cb0 31 38 29 20 3e 3d 20 6e 42 75 66 20 29 7b 0a 20  18) >= nBuf ){. 
16cc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16cd0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 66  _ERROR;.  }..  f
16ce0 6f 72 28 69 3d 73 71 6c 69 74 65 33 53 74 72 6c  or(i=sqlite3Strl
16cf0 65 6e 33 30 28 7a 54 65 6d 70 50 61 74 68 29 3b  en30(zTempPath);
16d00 20 69 3e 30 20 26 26 20 7a 54 65 6d 70 50 61 74   i>0 && zTempPat
16d10 68 5b 69 2d 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d  h[i-1]=='\\'; i-
16d20 2d 29 7b 7d 0a 20 20 7a 54 65 6d 70 50 61 74 68  -){}.  zTempPath
16d30 5b 69 5d 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69  [i] = 0;..  sqli
16d40 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
16d50 66 2d 31 38 2c 20 7a 42 75 66 2c 0a 20 20 20 20  f-18, zBuf,.    
16d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
16d70 25 73 5c 5c 22 53 51 4c 49 54 45 5f 54 45 4d 50  %s\\"SQLITE_TEMP
16d80 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 54  _FILE_PREFIX, zT
16d90 65 6d 70 50 61 74 68 29 3b 0a 20 20 6a 20 3d 20  empPath);.  j = 
16da0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
16db0 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  zBuf);.  sqlite3
16dc0 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20  _randomness(15, 
16dd0 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72  &zBuf[j]);.  for
16de0 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c  (i=0; i<15; i++,
16df0 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b   j++){.    zBuf[
16e00 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72  j] = (char)zChar
16e10 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68  s[ ((unsigned ch
16e20 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a  ar)zBuf[j])%(siz
16e30 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d  eof(zChars)-1) ]
16e40 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20  ;.  }.  zBuf[j] 
16e50 3d 20 30 3b 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d  = 0;.  zBuf[j+1]
16e60 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45   = 0;..  OSTRACE
16e70 28 28 22 54 45 4d 50 20 46 49 4c 45 4e 41 4d 45  (("TEMP FILENAME
16e80 3a 20 25 73 5c 6e 22 2c 20 7a 42 75 66 29 29 3b  : %s\n", zBuf));
16e90 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
16ea0 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  _OK; .}../*.** O
16eb0 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  pen a file..*/.s
16ec0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65  tatic int winOpe
16ed0 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
16ee0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 2f   *pVfs,        /
16ef0 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20  * Not used */.  
16f00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
16f10 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  e,        /* Nam
16f20 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55  e of the file (U
16f30 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74  TF-8) */.  sqlit
16f40 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20  e3_file *id,    
16f50 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
16f60 65 20 53 51 4c 69 74 65 20 66 69 6c 65 20 68 61  e SQLite file ha
16f70 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  ndle here */.  i
16f80 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
16f90 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
16fa0 20 6d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20   mode flags */. 
16fb0 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20   int *pOutFlags 
16fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
16fd0 61 74 75 73 20 72 65 74 75 72 6e 20 66 6c 61 67  atus return flag
16fe0 73 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c 45  s */.){.  HANDLE
16ff0 20 68 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   h;.  DWORD last
17000 45 72 72 6e 6f 3b 0a 20 20 44 57 4f 52 44 20 64  Errno;.  DWORD d
17010 77 44 65 73 69 72 65 64 41 63 63 65 73 73 3b 0a  wDesiredAccess;.
17020 20 20 44 57 4f 52 44 20 64 77 53 68 61 72 65 4d    DWORD dwShareM
17030 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20 64 77 43  ode;.  DWORD dwC
17040 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
17050 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64 77 46 6c  on;.  DWORD dwFl
17060 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
17070 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c 49 54 45   = 0;.#if SQLITE
17080 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20  _OS_WINCE.  int 
17090 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23 65 6e 64  isTemp = 0;.#end
170a0 69 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  if.  winFile *pF
170b0 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
170c0 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  id;.  void *zCon
170d0 76 65 72 74 65 64 3b 20 20 20 20 20 20 20 20 20  verted;         
170e0 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65       /* Filename
170f0 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69 6e 67 20   in OS encoding 
17100 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
17110 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 4e 61  *zUtf8Name = zNa
17120 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20  me; /* Filename 
17130 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 69 6e  in UTF-8 encodin
17140 67 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d  g */.  int cnt =
17150 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67   0;..  /* If arg
17160 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61  ument zPath is a
17170 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74   NULL pointer, t
17180 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
17190 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e  required to open
171a0 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  .  ** a temporar
171b0 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73  y file. Use this
171c0 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65   buffer to store
171d0 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69   the file name i
171e0 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a  n..  */.  char z
171f0 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  Tmpname[MAX_PATH
17200 2b 32 5d 3b 20 20 20 20 20 2f 2a 20 42 75 66 66  +2];     /* Buff
17210 65 72 20 75 73 65 64 20 74 6f 20 63 72 65 61 74  er used to creat
17220 65 20 74 65 6d 70 20 66 69 6c 65 6e 61 6d 65 20  e temp filename 
17230 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  */..  int rc = S
17240 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
17250 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
17260 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
17270 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
17280 42 55 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  BUG) || SQLITE_O
17290 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 54  S_WINCE.  int eT
172a0 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46  ype = flags&0xFF
172b0 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65  FFFF00;  /* Type
172c0 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e   of file to open
172d0 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e   */.#endif..  in
172e0 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d  t isExclusive  =
172f0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
17300 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29  _OPEN_EXCLUSIVE)
17310 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  ;.  int isDelete
17320 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
17330 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
17340 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e  TEONCLOSE);.  in
17350 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d  t isCreate     =
17360 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
17370 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 23  _OPEN_CREATE);.#
17380 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
17390 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20  int isReadonly  
173a0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
173b0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
173c0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20  );.#endif.  int 
173d0 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28  isReadWrite  = (
173e0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
173f0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a  PEN_READWRITE);.
17400 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
17410 20 20 69 6e 74 20 69 73 4f 70 65 6e 4a 6f 75 72    int isOpenJour
17420 6e 61 6c 20 3d 20 28 69 73 43 72 65 61 74 65 20  nal = (isCreate 
17430 26 26 20 28 0a 20 20 20 20 20 20 20 20 65 54 79  && (.        eTy
17440 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
17450 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a  MASTER_JOURNAL .
17460 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
17470 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
17480 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c  JOURNAL .     ||
17490 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
174a0 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 23 65  PEN_WAL.  ));.#e
174b0 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ndif..  /* Check
174c0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
174d0 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72  tatements are tr
174e0 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ue: .  **.  **  
174f0 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65   (a) Exactly one
17500 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54   of the READWRIT
17510 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66  E and READONLY f
17520 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74  lags must be set
17530 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62  , and .  **   (b
17540 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73  ) if CREATE is s
17550 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49  et, then READWRI
17560 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
17570 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20  set, and.  **   
17580 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45  (c) if EXCLUSIVE
17590 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
175a0 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
175b0 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64  e set..  **   (d
175c0 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f  ) if DELETEONCLO
175d0 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  SE is set, then 
175e0 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f  CREATE must also
175f0 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20   be set..  */.  
17600 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e  assert((isReadon
17610 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  ly==0 || isReadW
17620 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52  rite==0) && (isR
17630 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65  eadWrite || isRe
17640 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65  adonly));.  asse
17650 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c  rt(isCreate==0 |
17660 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a  | isReadWrite);.
17670 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75    assert(isExclu
17680 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65  sive==0 || isCre
17690 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ate);.  assert(i
176a0 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73  sDelete==0 || is
176b0 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54  Create);..  /* T
176c0 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e  he main DB, main
176d0 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69   journal, WAL fi
176e0 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f  le and master jo
176f0 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20  urnal are never 
17700 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  .  ** automatica
17710 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72  lly deleted. Nor
17720 20 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74   are they ever t
17730 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
17740 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21   */.  assert( (!
17750 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
17760 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
17770 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
17780 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
17790 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
177a0 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
177b0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
177c0 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  URNAL );.  asser
177d0 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
177e0 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
177f0 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
17800 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  STER_JOURNAL );.
17810 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
17820 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
17830 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
17840 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f  OPEN_WAL );..  /
17850 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
17860 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61  e upper layer ha
17870 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65  s set one of the
17880 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61   "file-type" fla
17890 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  gs. */.  assert(
178a0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
178b0 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20  PEN_MAIN_DB     
178c0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
178d0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a  E_OPEN_TEMP_DB .
178e0 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
178f0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
17900 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79  N_JOURNAL || eTy
17910 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
17920 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  TEMP_JOURNAL .  
17930 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
17940 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
17950 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65  URNAL   || eType
17960 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
17970 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
17980 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
17990 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
179a0 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65  IENT_DB || eType
179b0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
179c0 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  L.  );..  assert
179d0 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 55 4e 55  ( id!=0 );.  UNU
179e0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
179f0 66 73 29 3b 0a 0a 20 20 70 46 69 6c 65 2d 3e 68  fs);..  pFile->h
17a00 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c   = INVALID_HANDL
17a10 45 5f 56 41 4c 55 45 3b 0a 0a 20 20 2f 2a 20 49  E_VALUE;..  /* I
17a20 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
17a30 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
17a40 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20  nction is NULL, 
17a50 67 65 6e 65 72 61 74 65 20 61 20 0a 20 20 2a 2a  generate a .  **
17a60 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
17a70 6e 61 6d 65 20 74 6f 20 75 73 65 20 0a 20 20 2a  name to use .  *
17a80 2f 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61  /.  if( !zUtf8Na
17a90 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  me ){.    assert
17aa0 28 69 73 44 65 6c 65 74 65 20 26 26 20 21 69 73  (isDelete && !is
17ab0 4f 70 65 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  OpenJournal);.  
17ac0 20 20 72 63 20 3d 20 67 65 74 54 65 6d 70 6e 61    rc = getTempna
17ad0 6d 65 28 4d 41 58 5f 50 41 54 48 2b 32 2c 20 7a  me(MAX_PATH+2, z
17ae0 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  Tmpname);.    if
17af0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17b00 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
17b10 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55  rc;.    }.    zU
17b20 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61  tf8Name = zTmpna
17b30 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 61  me;.  }..  /* Da
17b40 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73  tabase filenames
17b50 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f   are double-zero
17b60 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74   terminated if t
17b70 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 2a 2a  hey are not.  **
17b80 20 55 52 49 73 20 77 69 74 68 20 70 61 72 61 6d   URIs with param
17b90 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74  eters.  Hence, t
17ba0 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62  hey can always b
17bb0 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20  e passed into.  
17bc0 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70  ** sqlite3_uri_p
17bd0 61 72 61 6d 65 74 65 72 28 29 2e 0a 20 20 2a 2f  arameter()..  */
17be0 0a 20 20 61 73 73 65 72 74 28 20 28 65 54 79 70  .  assert( (eTyp
17bf0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
17c00 41 49 4e 5f 44 42 29 20 7c 7c 20 28 66 6c 61 67  AIN_DB) || (flag
17c10 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
17c20 55 52 49 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  URI) ||.        
17c30 7a 55 74 66 38 4e 61 6d 65 5b 73 74 72 6c 65 6e  zUtf8Name[strlen
17c40 28 7a 55 74 66 38 4e 61 6d 65 29 2b 31 5d 3d 3d  (zUtf8Name)+1]==
17c50 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65  0 );..  /* Conve
17c60 72 74 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  rt the filename 
17c70 74 6f 20 74 68 65 20 73 79 73 74 65 6d 20 65 6e  to the system en
17c80 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f  coding. */.  zCo
17c90 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72  nverted = conver
17ca0 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 55  tUtf8Filename(zU
17cb0 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  tf8Name);.  if( 
17cc0 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
17cd0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17ce0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
17cf0 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 65 61    }..  if( isRea
17d00 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 64 77  dWrite ){.    dw
17d10 44 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20  DesiredAccess = 
17d20 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 47  GENERIC_READ | G
17d30 45 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a 20 20  ENERIC_WRITE;.  
17d40 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 44 65 73  }else{.    dwDes
17d50 69 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e  iredAccess = GEN
17d60 45 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a  ERIC_READ;.  }..
17d70 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e    /* SQLITE_OPEN
17d80 5f 45 58 43 4c 55 53 49 56 45 20 69 73 20 75 73  _EXCLUSIVE is us
17d90 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
17da0 74 68 61 74 20 61 20 6e 65 77 20 66 69 6c 65 20  that a new file 
17db0 69 73 20 0a 20 20 2a 2a 20 63 72 65 61 74 65 64  is .  ** created
17dc0 2e 20 53 51 4c 69 74 65 20 64 6f 65 73 6e 27 74  . SQLite doesn't
17dd0 20 75 73 65 20 69 74 20 74 6f 20 69 6e 64 69 63   use it to indic
17de0 61 74 65 20 22 65 78 63 6c 75 73 69 76 65 20 61  ate "exclusive a
17df0 63 63 65 73 73 22 20 0a 20 20 2a 2a 20 61 73 20  ccess" .  ** as 
17e00 69 74 20 69 73 20 75 73 75 61 6c 6c 79 20 75 6e  it is usually un
17e10 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20  derstood..  */. 
17e20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65   if( isExclusive
17e30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   ){.    /* Creat
17e40 65 73 20 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f  es a new file, o
17e50 6e 6c 79 20 69 66 20 69 74 20 64 6f 65 73 20 6e  nly if it does n
17e60 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
17e70 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74  . */.    /* If t
17e80 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  he file exists, 
17e90 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20  it fails. */.   
17ea0 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
17eb0 73 69 74 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f  sition = CREATE_
17ec0 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NEW;.  }else if(
17ed0 20 69 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20   isCreate ){.   
17ee0 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74 69 6e   /* Open existin
17ef0 67 20 66 69 6c 65 2c 20 6f 72 20 63 72 65 61 74  g file, or creat
17f00 65 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20  e if it doesn't 
17f10 65 78 69 73 74 20 2a 2f 0a 20 20 20 20 64 77 43  exist */.    dwC
17f20 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
17f30 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53  on = OPEN_ALWAYS
17f40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
17f50 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c 20  * Opens a file, 
17f60 6f 6e 6c 79 20 69 66 20 69 74 20 65 78 69 73 74  only if it exist
17f70 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61  s. */.    dwCrea
17f80 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20  tionDisposition 
17f90 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b  = OPEN_EXISTING;
17fa0 0a 20 20 7d 0a 0a 20 20 64 77 53 68 61 72 65 4d  .  }..  dwShareM
17fb0 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48 41 52 45  ode = FILE_SHARE
17fc0 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48 41  _READ | FILE_SHA
17fd0 52 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69 66 28  RE_WRITE;..  if(
17fe0 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66   isDelete ){.#if
17ff0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
18000 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41  .    dwFlagsAndA
18010 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45  ttributes = FILE
18020 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 45  _ATTRIBUTE_HIDDE
18030 4e 3b 0a 20 20 20 20 69 73 54 65 6d 70 20 3d 20  N;.    isTemp = 
18040 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 77 46  1;.#else.    dwF
18050 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
18060 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s = FILE_ATTRIBU
18070 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20 20  TE_TEMPORARY.   
18080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18090 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49              | FI
180a0 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44  LE_ATTRIBUTE_HID
180b0 44 45 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20  DEN.            
180c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180d0 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44     | FILE_FLAG_D
180e0 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a  ELETE_ON_CLOSE;.
180f0 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
18100 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
18110 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f  tributes = FILE_
18120 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c  ATTRIBUTE_NORMAL
18130 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70 6f 72  ;.  }.  /* Repor
18140 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65  ts from the inte
18150 72 6e 65 74 20 61 72 65 20 74 68 61 74 20 70 65  rnet are that pe
18160 72 66 6f 72 6d 61 6e 63 65 20 69 73 20 61 6c 77  rformance is alw
18170 61 79 73 0a 20 20 2a 2a 20 62 65 74 74 65 72 20  ays.  ** better 
18180 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e  if FILE_FLAG_RAN
18190 44 4f 4d 5f 41 43 43 45 53 53 20 69 73 20 75 73  DOM_ACCESS is us
181a0 65 64 2e 20 20 54 69 63 6b 65 74 20 23 32 36 39  ed.  Ticket #269
181b0 39 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  9. */.#if SQLITE
181c0 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77 46 6c  _OS_WINCE.  dwFl
181d0 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
181e0 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41   |= FILE_FLAG_RA
181f0 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23 65 6e  NDOM_ACCESS;.#en
18200 64 69 66 0a 0a 20 20 69 66 28 20 69 73 4e 54 28  dif..  if( isNT(
18210 29 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  ) ){.    while( 
18220 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  (h = osCreateFil
18230 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  eW((LPCWSTR)zCon
18240 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
18250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18260 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
18270 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20  ccess,.         
18280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18290 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65       dwShareMode
182a0 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  , NULL,.        
182b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182c0 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e        dwCreation
182d0 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20  Disposition,.   
182e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182f0 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61             dwFla
18300 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c  gsAndAttributes,
18310 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
18330 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48  ULL))==INVALID_H
18340 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20  ANDLE_VALUE &&. 
18350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18360 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
18370 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
18380 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 2f 2a  astErrno) ){}./*
18390 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20   isNT() is 1 if 
183a0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
183b0 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65  =1, so this else
183c0 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74   is never execut
183d0 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68  ed. .** Since th
183e0 65 20 41 4e 53 49 20 76 65 72 73 69 6f 6e 20 6f  e ANSI version o
183f0 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20  f these Windows 
18400 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  API do not exist
18410 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69   for WINCE,.** i
18420 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f  t's important to
18430 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74   not reference t
18440 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75  hem for WINCE bu
18450 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  ilds..*/.#if SQL
18460 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a  ITE_OS_WINCE==0.
18470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
18480 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74  le( (h = osCreat
18490 65 46 69 6c 65 41 28 28 4c 50 43 53 54 52 29 7a  eFileA((LPCSTR)z
184a0 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
184b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184c0 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72           dwDesir
184d0 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20  edAccess,.      
184e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184f0 20 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d          dwShareM
18500 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20  ode, NULL,.     
18510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18520 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74           dwCreat
18530 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a  ionDisposition,.
18540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
18560 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
18570 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  es,.            
18580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18590 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49    NULL))==INVALI
185a0 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26  D_HANDLE_VALUE &
185b0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
185c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185d0 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  retryIoerr(&cnt,
185e0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d   &lastErrno) ){}
185f0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 6c  .#endif.  }..  l
18600 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 0a 20  ogIoerr(cnt);.. 
18610 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
18620 25 64 20 25 73 20 30 78 25 6c 78 20 25 73 5c 6e  %d %s 0x%lx %s\n
18630 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 68  ", .           h
18640 2c 20 7a 4e 61 6d 65 2c 20 64 77 44 65 73 69 72  , zName, dwDesir
18650 65 64 41 63 63 65 73 73 2c 20 0a 20 20 20 20 20  edAccess, .     
18660 20 20 20 20 20 20 68 3d 3d 49 4e 56 41 4c 49 44        h==INVALID
18670 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 3f 20  _HANDLE_VALUE ? 
18680 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29  "failed" : "ok")
18690 29 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56  );..  if( h==INV
186a0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
186b0 45 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  E ){.    pFile->
186c0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
186d0 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f  Errno;.    winLo
186e0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
186f0 4e 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c  NTOPEN, pFile->l
18700 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70  astErrno, "winOp
18710 65 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b  en", zUtf8Name);
18720 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
18730 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
18740 20 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69     if( isReadWri
18750 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69  te && !isExclusi
18760 76 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ve ){.      retu
18770 72 6e 20 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c  rn winOpen(pVfs,
18780 20 7a 4e 61 6d 65 2c 20 69 64 2c 20 0a 20 20 20   zName, id, .   
18790 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67            ((flag
187a0 73 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  s|SQLITE_OPEN_RE
187b0 41 44 4f 4e 4c 59 29 26 7e 28 53 51 4c 49 54 45  ADONLY)&~(SQLITE
187c0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c  _OPEN_CREATE|SQL
187d0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
187e0 54 45 29 29 2c 20 70 4f 75 74 46 6c 61 67 73 29  TE)), pOutFlags)
187f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18800 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18810 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
18820 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
18830 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20   pOutFlags ){.  
18840 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
18850 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74  e ){.      *pOut
18860 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  Flags = SQLITE_O
18870 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20  PEN_READWRITE;. 
18880 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18890 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c  *pOutFlags = SQL
188a0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
188b0 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  Y;.    }.  }..  
188c0 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c  memset(pFile, 0,
188d0 20 73 69 7a 65 6f 66 28 2a 70 46 69 6c 65 29 29   sizeof(*pFile))
188e0 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  ;.  pFile->pMeth
188f0 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f  od = &winIoMetho
18900 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  d;.  pFile->h = 
18910 68 3b 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  h;.  pFile->last
18920 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52  Errno = NO_ERROR
18930 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66 73 20  ;.  pFile->pVfs 
18940 3d 20 70 56 66 73 3b 0a 20 20 70 46 69 6c 65 2d  = pVfs;.  pFile-
18950 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 70 46 69  >pShm = 0;.  pFi
18960 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d  le->zPath = zNam
18970 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  e;.  if( sqlite3
18980 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61  _uri_boolean(zNa
18990 6d 65 2c 20 22 70 73 6f 77 22 2c 20 53 51 4c 49  me, "psow", SQLI
189a0 54 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  TE_POWERSAFE_OVE
189b0 52 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 70  RWRITE) ){.    p
189c0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
189d0 7c 3d 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 3b  |= WINFILE_PSOW;
189e0 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  .  }..#if SQLITE
189f0 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66 28 20  _OS_WINCE.  if( 
18a00 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20 65  isReadWrite && e
18a10 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
18a20 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20 20 20 20 20  N_MAIN_DB.      
18a30 20 26 26 20 21 77 69 6e 63 65 43 72 65 61 74 65   && !winceCreate
18a40 4c 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 6c  Lock(zName, pFil
18a50 65 29 0a 20 20 29 7b 0a 20 20 20 20 6f 73 43 6c  e).  ){.    osCl
18a60 6f 73 65 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20  oseHandle(h);.  
18a70 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
18a80 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
18a90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
18aa0 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 7d  NTOPEN_BKPT;.  }
18ab0 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b  .  if( isTemp ){
18ac0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c  .    pFile->zDel
18ad0 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f  eteOnClose = zCo
18ae0 6e 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65  nverted;.  }else
18af0 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20  .#endif.  {.    
18b00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
18b10 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 0a 20  nverted);.  }.. 
18b20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
18b30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
18b40 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
18b50 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a  he named file..*
18b60 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 57  *.** Note that W
18b70 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20  indows does not 
18b80 61 6c 6c 6f 77 20 61 20 66 69 6c 65 20 74 6f 20  allow a file to 
18b90 62 65 20 64 65 6c 65 74 65 64 20 69 66 20 73 6f  be deleted if so
18ba0 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63  me other.** proc
18bb0 65 73 73 20 68 61 73 20 69 74 20 6f 70 65 6e 2e  ess has it open.
18bc0 20 20 53 6f 6d 65 74 69 6d 65 73 20 61 20 76 69    Sometimes a vi
18bd0 72 75 73 20 73 63 61 6e 6e 65 72 20 6f 72 20 69  rus scanner or i
18be0 6e 64 65 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a  ndexing program.
18bf0 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a  ** will open a j
18c00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72  ournal file shor
18c10 74 6c 79 20 61 66 74 65 72 20 69 74 20 69 73 20  tly after it is 
18c20 63 72 65 61 74 65 64 20 69 6e 20 6f 72 64 65 72  created in order
18c30 20 74 6f 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76   to do.** whatev
18c40 65 72 20 69 74 20 64 6f 65 73 2e 20 20 57 68 69  er it does.  Whi
18c50 6c 65 20 74 68 69 73 20 6f 74 68 65 72 20 70 72  le this other pr
18c60 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
18c70 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65   the.** file ope
18c80 6e 2c 20 77 65 20 77 69 6c 6c 20 62 65 20 75 6e  n, we will be un
18c90 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 69  able to delete i
18ca0 74 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  t.  To work arou
18cb0 6e 64 20 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c  nd this.** probl
18cc0 65 6d 2c 20 77 65 20 64 65 6c 61 79 20 31 30 30  em, we delay 100
18cd0 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e   milliseconds an
18ce0 64 20 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20  d try to delete 
18cf0 61 67 61 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f  again.  Up.** to
18d00 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54   MX_DELETION_ATT
18d10 45 4d 50 54 73 20 64 65 6c 65 74 69 6f 6e 20 61  EMPTs deletion a
18d20 74 74 65 6d 70 74 73 20 61 72 65 20 72 75 6e 20  ttempts are run 
18d30 62 65 66 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a  before giving.**
18d40 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e   up and returnin
18d50 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73  g an error..*/.s
18d60 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c  tatic int winDel
18d70 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ete(.  sqlite3_v
18d80 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
18d90 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f     /* Not used o
18da0 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e  n win32 */.  con
18db0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
18dc0 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  me,      /* Name
18dd0 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65   of file to dele
18de0 74 65 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63  te */.  int sync
18df0 44 69 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Dir             
18e00 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20      /* Not used 
18e10 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20  on win32 */.){. 
18e20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
18e30 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52 44 20  int rc;.  DWORD 
18e40 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 76 6f 69  lastErrno;.  voi
18e50 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
18e60 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
18e70 52 28 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45  R(pVfs);.  UNUSE
18e80 44 5f 50 41 52 41 4d 45 54 45 52 28 73 79 6e 63  D_PARAMETER(sync
18e90 44 69 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  Dir);..  Simulat
18ea0 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
18eb0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
18ec0 45 54 45 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74  ETE);.  zConvert
18ed0 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38  ed = convertUtf8
18ee0 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Filename(zFilena
18ef0 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  me);.  if( zConv
18f00 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
18f10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
18f20 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ERR_NOMEM;.  }. 
18f30 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20   if( isNT() ){. 
18f40 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 77     rc = 1;.    w
18f50 68 69 6c 65 28 20 6f 73 47 65 74 46 69 6c 65 41  hile( osGetFileA
18f60 74 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e 76  ttributesW(zConv
18f70 65 72 74 65 64 29 21 3d 49 4e 56 41 4c 49 44 5f  erted)!=INVALID_
18f80 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20  FILE_ATTRIBUTES 
18f90 26 26 0a 20 20 20 20 20 20 20 20 20 28 72 63 20  &&.         (rc 
18fa0 3d 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28  = osDeleteFileW(
18fb0 7a 43 6f 6e 76 65 72 74 65 64 29 29 3d 3d 30 20  zConverted))==0 
18fc0 26 26 20 72 65 74 72 79 49 6f 65 72 72 28 26 63  && retryIoerr(&c
18fd0 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
18fe0 29 7b 7d 0a 20 20 20 20 72 63 20 3d 20 72 63 20  ){}.    rc = rc 
18ff0 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51  ? SQLITE_OK : SQ
19000 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 2f 2a 20 69  LITE_ERROR;./* i
19010 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51  sNT() is 1 if SQ
19020 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31  LITE_OS_WINCE==1
19030 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69  , so this else i
19040 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64  s never executed
19050 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20  . .** Since the 
19060 41 4e 53 49 20 76 65 72 73 69 6f 6e 20 6f 66 20  ANSI version of 
19070 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50  these Windows AP
19080 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66  I do not exist f
19090 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27  or WINCE,.** it'
190a0 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e  s important to n
190b0 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ot reference the
190c0 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c  m for WINCE buil
190d0 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ds..*/.#if SQLIT
190e0 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20  E_OS_WINCE==0.  
190f0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
19100 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6f 73  1;.    while( os
19110 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
19120 73 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 21 3d  sA(zConverted)!=
19130 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
19140 52 49 42 55 54 45 53 20 26 26 0a 20 20 20 20 20  RIBUTES &&.     
19150 20 20 20 20 28 72 63 20 3d 20 6f 73 44 65 6c 65      (rc = osDele
19160 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74  teFileA(zConvert
19170 65 64 29 29 3d 3d 30 20 26 26 20 72 65 74 72 79  ed))==0 && retry
19180 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
19190 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20  tErrno) ){}.    
191a0 72 63 20 3d 20 72 63 20 3f 20 53 51 4c 49 54 45  rc = rc ? SQLITE
191b0 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 45 52 52  _OK : SQLITE_ERR
191c0 4f 52 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  OR;.#endif.  }. 
191d0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
191e0 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
191f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
19200 45 54 45 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 0a  ETE, lastErrno,.
19210 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
19220 6e 44 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e  nDelete", zFilen
19230 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
19240 20 20 20 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29     logIoerr(cnt)
19250 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
19260 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
19270 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 45  ;.  OSTRACE(("DE
19280 4c 45 54 45 20 5c 22 25 73 5c 22 20 25 73 5c 6e  LETE \"%s\" %s\n
19290 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 72  ", zFilename, (r
192a0 63 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22  c ? "failed" : "
192b0 6f 6b 22 20 29 29 29 3b 0a 20 20 72 65 74 75 72  ok" )));.  retur
192c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
192d0 68 65 63 6b 20 74 68 65 20 65 78 69 73 74 61 6e  heck the existan
192e0 63 65 20 61 6e 64 20 73 74 61 74 75 73 20 6f 66  ce and status of
192f0 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
19300 69 63 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73  ic int winAccess
19310 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
19320 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f  *pVfs,         /
19330 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69  * Not used on wi
19340 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  n32 */.  const c
19350 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
19360 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66      /* Name of f
19370 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
19380 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
19390 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
193a0 54 79 70 65 20 6f 66 20 74 65 73 74 20 74 6f 20  Type of test to 
193b0 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 66 69 6c  make on this fil
193c0 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  e */.  int *pRes
193d0 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
193e0 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74    /* OUT: Result
193f0 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61   */.){.  DWORD a
19400 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ttr;.  int rc = 
19410 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  0;.  DWORD lastE
19420 72 72 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a 7a 43  rrno;.  void *zC
19430 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53  onverted;.  UNUS
19440 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
19450 73 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  s);..  SimulateI
19460 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
19470 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
19480 53 53 3b 20 29 3b 0a 20 20 7a 43 6f 6e 76 65 72  SS; );.  zConver
19490 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66  ted = convertUtf
194a0 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e  8Filename(zFilen
194b0 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ame);.  if( zCon
194c0 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
194d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
194e0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
194f0 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
19500 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
19510 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f  .    WIN32_FILE_
19520 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73  ATTRIBUTE_DATA s
19530 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65  AttrData;.    me
19540 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c  mset(&sAttrData,
19550 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72   0, sizeof(sAttr
19560 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c  Data));.    whil
19570 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46  e( !(rc = osGetF
19580 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
19590 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
195a0 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
195b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195c0 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f     GetFileExInfo
195d0 53 74 61 6e 64 61 72 64 2c 20 0a 20 20 20 20 20  Standard, .     
195e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195f0 20 20 20 20 20 20 20 20 26 73 41 74 74 72 44 61          &sAttrDa
19600 74 61 29 29 20 26 26 20 72 65 74 72 79 49 6f 65  ta)) && retryIoe
19610 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
19620 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 28  rno) ){}.    if(
19630 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   rc ){.      /* 
19640 46 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 41 43  For an SQLITE_AC
19650 43 45 53 53 5f 45 58 49 53 54 53 20 71 75 65 72  CESS_EXISTS quer
19660 79 2c 20 74 72 65 61 74 20 61 20 7a 65 72 6f 2d  y, treat a zero-
19670 6c 65 6e 67 74 68 20 66 69 6c 65 0a 20 20 20 20  length file.    
19680 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 64 6f    ** as if it do
19690 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20  es not exist..  
196a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
196b0 20 20 20 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54      flags==SQLIT
196c0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 0a  E_ACCESS_EXISTS.
196d0 20 20 20 20 20 20 20 20 20 20 26 26 20 73 41 74            && sAt
196e0 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65  trData.nFileSize
196f0 48 69 67 68 3d 3d 30 20 0a 20 20 20 20 20 20 20  High==0 .       
19700 20 20 20 26 26 20 73 41 74 74 72 44 61 74 61 2e     && sAttrData.
19710 6e 46 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30 20  nFileSizeLow==0 
19720 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20  ){.        attr 
19730 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  = INVALID_FILE_A
19740 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20  TTRIBUTES;.     
19750 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19760 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61  attr = sAttrData
19770 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65  .dwFileAttribute
19780 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  s;.      }.    }
19790 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 67 49  else{.      logI
197a0 6f 65 72 72 28 63 6e 74 29 3b 0a 20 20 20 20 20  oerr(cnt);.     
197b0 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 21 3d   if( lastErrno!=
197c0 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46  ERROR_FILE_NOT_F
197d0 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OUND ){.        
197e0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
197f0 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 2c  TE_IOERR_ACCESS,
19800 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e   lastErrno, "win
19810 41 63 63 65 73 73 22 2c 20 7a 46 69 6c 65 6e 61  Access", zFilena
19820 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  me);.        sql
19830 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
19840 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 72  rted);.        r
19850 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
19860 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20 20 20  RR_ACCESS;.     
19870 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19880 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46  attr = INVALID_F
19890 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a  ILE_ATTRIBUTES;.
198a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 2f 2a        }.    }./*
198b0 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20   isNT() is 1 if 
198c0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
198d0 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65  =1, so this else
198e0 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74   is never execut
198f0 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68  ed. .** Since th
19900 65 20 41 4e 53 49 20 76 65 72 73 69 6f 6e 20 6f  e ANSI version o
19910 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20  f these Windows 
19920 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  API do not exist
19930 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69   for WINCE,.** i
19940 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f  t's important to
19950 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74   not reference t
19960 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75  hem for WINCE bu
19970 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  ilds..*/.#if SQL
19980 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a  ITE_OS_WINCE==0.
19990 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 74 74    }else{.    att
199a0 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74  r = osGetFileAtt
199b0 72 69 62 75 74 65 73 41 28 28 63 68 61 72 2a 29  ributesA((char*)
199c0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e  zConverted);.#en
199d0 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  dif.  }.  sqlite
199e0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
199f0 64 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c  d);.  switch( fl
19a00 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ags ){.    case 
19a10 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
19a20 41 44 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  AD:.    case SQL
19a30 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
19a40 53 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74  S:.      rc = at
19a50 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr!=INVALID_FILE
19a60 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20  _ATTRIBUTES;.   
19a70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
19a80 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
19a90 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20  _READWRITE:.    
19aa0 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56    rc = attr!=INV
19ab0 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
19ac0 55 54 45 53 20 26 26 0a 20 20 20 20 20 20 20 20  UTES &&.        
19ad0 20 20 20 20 20 28 61 74 74 72 20 26 20 46 49 4c       (attr & FIL
19ae0 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45 41 44  E_ATTRIBUTE_READ
19af0 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ONLY)==0;.      
19b00 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
19b10 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  lt:.      assert
19b20 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73  (!"Invalid flags
19b30 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d   argument");.  }
19b40 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63  .  *pResOut = rc
19b50 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
19b60 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
19b70 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20  Turn a relative 
19b80 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20  pathname into a 
19b90 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20  full pathname.  
19ba0 57 72 69 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a  Write the full.*
19bb0 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  * pathname into 
19bc0 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20  zOut[].  zOut[] 
19bd0 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61 73 74  will be at least
19be0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
19bf0 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69  e.** bytes in si
19c00 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
19c10 74 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  t winFullPathnam
19c20 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
19c30 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
19c40 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
19c50 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
19c60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65   const char *zRe
19c70 6c 61 74 69 76 65 2c 20 20 20 20 20 20 20 20 2f  lative,        /
19c80 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74  * Possibly relat
19c90 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a  ive input path *
19ca0 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20  /.  int nFull,  
19cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cc0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74    /* Size of out
19cd0 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
19ce0 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  tes */.  char *z
19cf0 46 75 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20  Full            
19d00 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
19d10 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20   buffer */.){.  
19d20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43  .#if defined(__C
19d30 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c  YGWIN__).  Simul
19d40 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
19d50 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
19d60 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
19d70 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20  METER(nFull);.  
19d80 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 66  cygwin_conv_to_f
19d90 75 6c 6c 5f 77 69 6e 33 32 5f 70 61 74 68 28 7a  ull_win32_path(z
19da0 52 65 6c 61 74 69 76 65 2c 20 7a 46 75 6c 6c 29  Relative, zFull)
19db0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
19dc0 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  E_OK;.#endif..#i
19dd0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
19de0 45 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  E.  SimulateIOEr
19df0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
19e00 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e  TE_ERROR );.  UN
19e10 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
19e20 46 75 6c 6c 29 3b 0a 20 20 2f 2a 20 57 69 6e 43  Full);.  /* WinC
19e30 45 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74  E has no concept
19e40 20 6f 66 20 61 20 72 65 6c 61 74 69 76 65 20 70   of a relative p
19e50 61 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49  athname, or so I
19e60 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 73   am told. */.  s
19e70 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
19e80 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
19e90 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a  , zFull, "%s", z
19ea0 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 72 65 74  Relative);.  ret
19eb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
19ec0 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49  endif..#if !SQLI
19ed0 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
19ee0 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
19ef0 5f 5f 29 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  __).  int nByte;
19f00 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
19f10 74 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75  ted;.  char *zOu
19f20 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  t;..  /* If this
19f30 20 70 61 74 68 20 6e 61 6d 65 20 62 65 67 69 6e   path name begin
19f40 73 20 77 69 74 68 20 22 2f 58 3a 22 2c 20 77 68  s with "/X:", wh
19f50 65 72 65 20 22 58 22 20 69 73 20 61 6e 79 20 61  ere "X" is any a
19f60 6c 70 68 61 62 65 74 69 63 0a 20 20 2a 2a 20 63  lphabetic.  ** c
19f70 68 61 72 61 63 74 65 72 2c 20 64 69 73 63 61 72  haracter, discar
19f80 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 22 2f  d the initial "/
19f90 22 20 66 72 6f 6d 20 74 68 65 20 70 61 74 68 6e  " from the pathn
19fa0 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ame..  */.  if( 
19fb0 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f  zRelative[0]=='/
19fc0 27 20 26 26 20 73 71 6c 69 74 65 33 49 73 61 6c  ' && sqlite3Isal
19fd0 70 68 61 28 7a 52 65 6c 61 74 69 76 65 5b 31 5d  pha(zRelative[1]
19fe0 29 20 26 26 20 7a 52 65 6c 61 74 69 76 65 5b 32  ) && zRelative[2
19ff0 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20 7a 52  ]==':' ){.    zR
1a000 65 6c 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a  elative++;.  }..
1a010 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
1a020 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
1a030 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
1a040 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
1a050 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
1a060 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
1a070 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
1a080 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
1a090 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
1a0a0 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
1a0b0 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  g. This function
1a0c0 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20   could fail if, 
1a0d0 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  for example, the
1a0e0 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f  .  ** current wo
1a0f0 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20  rking directory 
1a100 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65  has been unlinke
1a110 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  d..  */.  Simula
1a120 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
1a130 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
1a140 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1a150 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 7a  ETER(nFull);.  z
1a160 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
1a170 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
1a180 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 69 66  zRelative);.  if
1a190 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
1a1a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1a1b0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1a1c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54  ;.  }.  if( isNT
1a1d0 28 29 20 29 7b 0a 20 20 20 20 4c 50 57 53 54 52  () ){.    LPWSTR
1a1e0 20 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74   zTemp;.    nByt
1a1f0 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  e = osGetFullPat
1a200 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29  hNameW((LPCWSTR)
1a210 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30  zConverted, 0, 0
1a220 2c 20 30 29 20 2b 20 33 3b 0a 20 20 20 20 7a 54  , 0) + 3;.    zT
1a230 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  emp = sqlite3_ma
1a240 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a 65  lloc( nByte*size
1a250 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a  of(zTemp[0]) );.
1a260 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30      if( zTemp==0
1a270 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1a280 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
1a290 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
1a2a0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
1a2b0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  MEM;.    }.    o
1a2c0 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
1a2d0 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
1a2e0 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54  erted, nByte, zT
1a2f0 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  emp, 0);.    sql
1a300 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
1a310 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20  rted);.    zOut 
1a320 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  = unicodeToUtf8(
1a330 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69  zTemp);.    sqli
1a340 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b  te3_free(zTemp);
1a350 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20  ./* isNT() is 1 
1a360 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1a370 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65  CE==1, so this e
1a380 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65  lse is never exe
1a390 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65  cuted. .** Since
1a3a0 20 74 68 65 20 41 4e 53 49 20 76 65 72 73 69 6f   the ANSI versio
1a3b0 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f  n of these Windo
1a3c0 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78  ws API do not ex
1a3d0 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a  ist for WINCE,.*
1a3e0 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74  * it's important
1a3f0 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63   to not referenc
1a400 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45  e them for WINCE
1a410 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20   builds..*/.#if 
1a420 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
1a430 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  =0.  }else{.    
1a440 63 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20  char *zTemp;.   
1a450 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75   nByte = osGetFu
1a460 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61  llPathNameA((cha
1a470 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30  r*)zConverted, 0
1a480 2c 20 30 2c 20 30 29 20 2b 20 33 3b 0a 20 20 20  , 0, 0) + 3;.   
1a490 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33   zTemp = sqlite3
1a4a0 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73  _malloc( nByte*s
1a4b0 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20  izeof(zTemp[0]) 
1a4c0 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70  );.    if( zTemp
1a4d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
1a4e0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
1a4f0 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
1a500 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1a510 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
1a520 20 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e    osGetFullPathN
1a530 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  ameA((char*)zCon
1a540 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a  verted, nByte, z
1a550 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 73 71  Temp, 0);.    sq
1a560 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
1a570 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74  erted);.    zOut
1a580 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
1a590 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54  _mbcs_to_utf8(zT
1a5a0 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  emp);.    sqlite
1a5b0 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 23  3_free(zTemp);.#
1a5c0 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20  endif.  }.  if( 
1a5d0 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  zOut ){.    sqli
1a5e0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 70 56 66  te3_snprintf(pVf
1a5f0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a  s->mxPathname, z
1a600 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74  Full, "%s", zOut
1a610 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1a620 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72  ree(zOut);.    r
1a630 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a640 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
1a650 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1a660 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e  R_NOMEM;.  }.#en
1a670 64 69 66 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  dif.}..#ifndef S
1a680 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
1a690 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20  EXTENSION./*.** 
1a6a0 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f  Interfaces for o
1a6b0 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20  pening a shared 
1a6c0 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67  library, finding
1a6d0 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a   entry points.**
1a6e0 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72   within the shar
1a6f0 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20  ed library, and 
1a700 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72  closing the shar
1a710 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 2f  ed library..*/./
1a720 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20  *.** Interfaces 
1a730 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68  for opening a sh
1a740 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69  ared library, fi
1a750 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e  nding entry poin
1a760 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ts.** within the
1a770 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
1a780 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65   and closing the
1a790 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e   shared library.
1a7a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1a7b0 2a 77 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69 74  *winDlOpen(sqlit
1a7c0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f  e3_vfs *pVfs, co
1a7d0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1a7e0 61 6d 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68  ame){.  HANDLE h
1a7f0 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
1a800 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74  rted = convertUt
1a810 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65  f8Filename(zFile
1a820 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  name);.  UNUSED_
1a830 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
1a840 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
1a850 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d==0 ){.    retu
1a860 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
1a870 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 68 20  isNT() ){.    h 
1a880 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57  = osLoadLibraryW
1a890 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
1a8a0 72 74 65 64 29 3b 0a 2f 2a 20 69 73 4e 54 28 29  rted);./* isNT()
1a8b0 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f   is 1 if SQLITE_
1a8c0 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20  OS_WINCE==1, so 
1a8d0 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76  this else is nev
1a8e0 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a  er executed. .**
1a8f0 20 53 69 6e 63 65 20 74 68 65 20 41 4e 53 49 20   Since the ANSI 
1a900 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65  version of these
1a910 20 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20   Windows API do 
1a920 6e 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57 49  not exist for WI
1a930 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70  NCE,.** it's imp
1a940 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65  ortant to not re
1a950 66 65 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72  ference them for
1a960 20 57 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a   WINCE builds..*
1a970 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
1a980 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65  WINCE==0.  }else
1a990 7b 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64  {.    h = osLoad
1a9a0 4c 69 62 72 61 72 79 41 28 28 63 68 61 72 2a 29  LibraryA((char*)
1a9b0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e  zConverted);.#en
1a9c0 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  dif.  }.  sqlite
1a9d0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
1a9e0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  d);.  return (vo
1a9f0 69 64 2a 29 68 3b 0a 7d 0a 73 74 61 74 69 63 20  id*)h;.}.static 
1aa00 76 6f 69 64 20 77 69 6e 44 6c 45 72 72 6f 72 28  void winDlError(
1aa10 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1aa20 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
1aa30 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 55  r *zBufOut){.  U
1aa40 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1aa50 70 56 66 73 29 3b 0a 20 20 67 65 74 4c 61 73 74  pVfs);.  getLast
1aa60 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61  ErrorMsg(osGetLa
1aa70 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c  stError(), nBuf,
1aa80 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 73 74 61   zBufOut);.}.sta
1aa90 74 69 63 20 76 6f 69 64 20 28 2a 77 69 6e 44 6c  tic void (*winDl
1aaa0 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20  Sym(sqlite3_vfs 
1aab0 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61  *pVfs, void *pHa
1aac0 6e 64 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  ndle, const char
1aad0 20 2a 7a 53 79 6d 62 6f 6c 29 29 28 76 6f 69 64   *zSymbol))(void
1aae0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
1aaf0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72  METER(pVfs);.  r
1ab00 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28 76  eturn (void(*)(v
1ab10 6f 69 64 29 29 6f 73 47 65 74 50 72 6f 63 41 64  oid))osGetProcAd
1ab20 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45 29 70  dressA((HANDLE)p
1ab30 48 61 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29  Handle, zSymbol)
1ab40 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
1ab50 77 69 6e 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74  winDlClose(sqlit
1ab60 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f  e3_vfs *pVfs, vo
1ab70 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20  id *pHandle){.  
1ab80 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1ab90 28 70 56 66 73 29 3b 0a 20 20 6f 73 46 72 65 65  (pVfs);.  osFree
1aba0 4c 69 62 72 61 72 79 28 28 48 41 4e 44 4c 45 29  Library((HANDLE)
1abb0 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73  pHandle);.}.#els
1abc0 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f  e /* if SQLITE_O
1abd0 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
1abe0 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a  ON is defined: *
1abf0 2f 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44  /.  #define winD
1ac00 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69  lOpen  0.  #defi
1ac10 6e 65 20 77 69 6e 44 6c 45 72 72 6f 72 20 30 0a  ne winDlError 0.
1ac20 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 53    #define winDlS
1ac30 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65  ym   0.  #define
1ac40 20 77 69 6e 44 6c 43 6c 6f 73 65 20 30 0a 23 65   winDlClose 0.#e
1ac50 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  ndif.../*.** Wri
1ac60 74 65 20 75 70 20 74 6f 20 6e 42 75 66 20 62 79  te up to nBuf by
1ac70 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73  tes of randomnes
1ac80 73 20 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a  s into zBuf..*/.
1ac90 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 61  static int winRa
1aca0 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33  ndomness(sqlite3
1acb0 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
1acc0 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
1acd0 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a  ){.  int n = 0;.
1ace0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1acf0 45 52 28 70 56 66 73 29 3b 0a 23 69 66 20 64 65  ER(pVfs);.#if de
1ad00 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
1ad10 54 29 0a 20 20 6e 20 3d 20 6e 42 75 66 3b 0a 20  T).  n = nBuf;. 
1ad20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c   memset(zBuf, 0,
1ad30 20 6e 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20   nBuf);.#else.  
1ad40 69 66 28 20 73 69 7a 65 6f 66 28 53 59 53 54 45  if( sizeof(SYSTE
1ad50 4d 54 49 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20 29  MTIME)<=nBuf-n )
1ad60 7b 0a 20 20 20 20 53 59 53 54 45 4d 54 49 4d 45  {.    SYSTEMTIME
1ad70 20 78 3b 0a 20 20 20 20 6f 73 47 65 74 53 79 73   x;.    osGetSys
1ad80 74 65 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20 20  temTime(&x);.   
1ad90 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d   memcpy(&zBuf[n]
1ada0 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29  , &x, sizeof(x))
1adb0 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
1adc0 66 28 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  f(x);.  }.  if( 
1add0 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e  sizeof(DWORD)<=n
1ade0 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f  Buf-n ){.    DWO
1adf0 52 44 20 70 69 64 20 3d 20 6f 73 47 65 74 43 75  RD pid = osGetCu
1ae00 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1ae10 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
1ae20 75 66 5b 6e 5d 2c 20 26 70 69 64 2c 20 73 69 7a  uf[n], &pid, siz
1ae30 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20 6e  eof(pid));.    n
1ae40 20 2b 3d 20 73 69 7a 65 6f 66 28 70 69 64 29 3b   += sizeof(pid);
1ae50 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f  .  }.  if( sizeo
1ae60 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e  f(DWORD)<=nBuf-n
1ae70 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 63 6e   ){.    DWORD cn
1ae80 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75  t = osGetTickCou
1ae90 6e 74 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  nt();.    memcpy
1aea0 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c  (&zBuf[n], &cnt,
1aeb0 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20   sizeof(cnt));. 
1aec0 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63     n += sizeof(c
1aed0 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  nt);.  }.  if( s
1aee0 69 7a 65 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45  izeof(LARGE_INTE
1aef0 47 45 52 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  GER)<=nBuf-n ){.
1af00 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45      LARGE_INTEGE
1af10 52 20 69 3b 0a 20 20 20 20 6f 73 51 75 65 72 79  R i;.    osQuery
1af20 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
1af30 65 72 28 26 69 29 3b 0a 20 20 20 20 6d 65 6d 63  er(&i);.    memc
1af40 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c  py(&zBuf[n], &i,
1af50 20 73 69 7a 65 6f 66 28 69 29 29 3b 0a 20 20 20   sizeof(i));.   
1af60 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 69 29 3b   n += sizeof(i);
1af70 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
1af80 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn n;.}.../*.*
1af90 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69  * Sleep for a li
1afa0 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74  ttle while.  Ret
1afb0 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  urn the amount o
1afc0 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f  f time slept..*/
1afd0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
1afe0 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73  leep(sqlite3_vfs
1aff0 20 2a 70 56 66 73 2c 20 69 6e 74 20 6d 69 63 72   *pVfs, int micr
1b000 6f 73 65 63 29 7b 0a 20 20 6f 73 53 6c 65 65 70  osec){.  osSleep
1b010 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f  ((microsec+999)/
1b020 31 30 30 30 29 3b 0a 20 20 55 4e 55 53 45 44 5f  1000);.  UNUSED_
1b030 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
1b040 0a 20 20 72 65 74 75 72 6e 20 28 28 6d 69 63 72  .  return ((micr
1b050 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29 2a  osec+999)/1000)*
1b060 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  1000;.}../*.** T
1b070 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
1b080 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f  iable, if set to
1b090 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
1b0a0 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  e, is interprete
1b0b0 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  d as.** the numb
1b0c0 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69  er of seconds si
1b0d0 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20  nce 1970 and is 
1b0e0 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20  used to set the 
1b0f0 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c  result of.** sql
1b100 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d  ite3OsCurrentTim
1b110 65 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69  e() during testi
1b120 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ng..*/.#ifdef SQ
1b130 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
1b140 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
1b150 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65  me = 0;  /* Fake
1b160 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20   system time in 
1b170 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
1b180 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f  70. */.#endif../
1b190 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
1b1a0 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
1b1b0 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
1b1c0 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
1b1d0 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a  te into *piNow.*
1b1e0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  * the current ti
1b1f0 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
1b200 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
1b210 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f  er times 86_400_
1b220 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65  000.  In.** othe
1b230 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69  r words, write i
1b240 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e  nto *piNow the n
1b250 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
1b260 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20  conds since the 
1b270 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20  Julian.** epoch 
1b280 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e  of noon in Green
1b290 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72  wich on November
1b2a0 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63   24, 4714 B.C ac
1b2b0 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a  cording to the.*
1b2c0 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67  * proleptic Greg
1b2d0 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a  orian calendar..
1b2e0 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
1b2f0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1b300 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  OK.  Return SQLI
1b310 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20  TE_ERROR if the 
1b320 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 0a 2a  time and date .*
1b330 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  * cannot be foun
1b340 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1b350 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49   winCurrentTimeI
1b360 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73  nt64(sqlite3_vfs
1b370 20 2a 70 56 66 73 2c 20 73 71 6c 69 74 65 33 5f   *pVfs, sqlite3_
1b380 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20  int64 *piNow){. 
1b390 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72   /* FILETIME str
1b3a0 75 63 74 75 72 65 20 69 73 20 61 20 36 34 2d 62  ucture is a 64-b
1b3b0 69 74 20 76 61 6c 75 65 20 72 65 70 72 65 73 65  it value represe
1b3c0 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nting the number
1b3d0 20 6f 66 20 0a 20 20 20 20 20 31 30 30 2d 6e 61   of .     100-na
1b3e0 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61  nosecond interva
1b3f0 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79  ls since January
1b400 20 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32   1, 1601 (= JD 2
1b410 33 30 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f  305813.5). .  */
1b420 0a 20 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a  .  FILETIME ft;.
1b430 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
1b440 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 77 69 6e  qlite3_int64 win
1b450 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 3d 20  FiletimeEpoch = 
1b460 32 33 30 35 38 31 33 35 2a 28 73 71 6c 69 74 65  23058135*(sqlite
1b470 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b  3_int64)8640000;
1b480 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1b490 45 53 54 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  EST.  static con
1b4a0 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  st sqlite3_int64
1b4b0 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34   unixEpoch = 244
1b4c0 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69  05875*(sqlite3_i
1b4d0 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 65  nt64)8640000;.#e
1b4e0 6e 64 69 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d  ndif.  /* 2^32 -
1b4f0 20 74 6f 20 61 76 6f 69 64 20 75 73 65 20 6f 66   to avoid use of
1b500 20 4c 4c 20 61 6e 64 20 77 61 72 6e 69 6e 67 73   LL and warnings
1b510 20 69 6e 20 67 63 63 20 2a 2f 0a 20 20 73 74 61   in gcc */.  sta
1b520 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
1b530 33 5f 69 6e 74 36 34 20 6d 61 78 33 32 42 69 74  3_int64 max32Bit
1b540 56 61 6c 75 65 20 3d 20 0a 20 20 20 20 20 20 28  Value = .      (
1b550 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30  sqlite3_int64)20
1b560 30 30 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69  00000000 + (sqli
1b570 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30  te3_int64)200000
1b580 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f  0000 + (sqlite3_
1b590 69 6e 74 36 34 29 32 39 34 39 36 37 32 39 36 3b  int64)294967296;
1b5a0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
1b5b0 57 49 4e 43 45 0a 20 20 53 59 53 54 45 4d 54 49  WINCE.  SYSTEMTI
1b5c0 4d 45 20 74 69 6d 65 3b 0a 20 20 6f 73 47 65 74  ME time;.  osGet
1b5d0 53 79 73 74 65 6d 54 69 6d 65 28 26 74 69 6d 65  SystemTime(&time
1b5e0 29 3b 0a 20 20 2f 2a 20 69 66 20 53 79 73 74 65  );.  /* if Syste
1b5f0 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28  mTimeToFileTime(
1b600 29 20 66 61 69 6c 73 2c 20 69 74 20 72 65 74 75  ) fails, it retu
1b610 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69  rns zero. */.  i
1b620 66 20 28 21 6f 73 53 79 73 74 65 6d 54 69 6d 65  f (!osSystemTime
1b630 54 6f 46 69 6c 65 54 69 6d 65 28 26 74 69 6d 65  ToFileTime(&time
1b640 2c 26 66 74 29 29 7b 0a 20 20 20 20 72 65 74 75  ,&ft)){.    retu
1b650 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1b660 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 6f 73 47  .  }.#else.  osG
1b670 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69  etSystemTimeAsFi
1b680 6c 65 54 69 6d 65 28 20 26 66 74 20 29 3b 0a 23  leTime( &ft );.#
1b690 65 6e 64 69 66 0a 0a 20 20 2a 70 69 4e 6f 77 20  endif..  *piNow 
1b6a0 3d 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f  = winFiletimeEpo
1b6b0 63 68 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20  ch +.           
1b6c0 20 28 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74   ((((sqlite3_int
1b6d0 36 34 29 66 74 2e 64 77 48 69 67 68 44 61 74 65  64)ft.dwHighDate
1b6e0 54 69 6d 65 29 2a 6d 61 78 33 32 42 69 74 56 61  Time)*max32BitVa
1b6f0 6c 75 65 29 20 2b 20 0a 20 20 20 20 20 20 20 20  lue) + .        
1b700 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
1b710 69 6e 74 36 34 29 66 74 2e 64 77 4c 6f 77 44 61  int64)ft.dwLowDa
1b720 74 65 54 69 6d 65 29 2f 28 73 71 6c 69 74 65 33  teTime)/(sqlite3
1b730 5f 69 6e 74 36 34 29 31 30 30 30 30 3b 0a 0a 23  _int64)10000;..#
1b740 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1b750 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
1b760 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a  current_time ){.
1b770 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30      *piNow = 100
1b780 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  0*(sqlite3_int64
1b790 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74  )sqlite3_current
1b7a0 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63  _time + unixEpoc
1b7b0 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  h;.  }.#endif.  
1b7c0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1b7d0 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e  (pVfs);.  return
1b7e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1b7f0 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
1b800 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
1b810 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
1b820 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
1b830 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  te the.** curren
1b840 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
1b850 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
1b860 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e  number into *prN
1b870 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ow and.** return
1b880 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66   0.  Return 1 if
1b890 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
1b8a0 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  te cannot be fou
1b8b0 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
1b8c0 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65  t winCurrentTime
1b8d0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
1b8e0 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f  fs, double *prNo
1b8f0 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  w){.  int rc;.  
1b900 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 3b  sqlite3_int64 i;
1b910 0a 20 20 72 63 20 3d 20 77 69 6e 43 75 72 72 65  .  rc = winCurre
1b920 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66 73  ntTimeInt64(pVfs
1b930 2c 20 26 69 29 3b 0a 20 20 69 66 28 20 21 72 63  , &i);.  if( !rc
1b940 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d   ){.    *prNow =
1b950 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20   i/86400000.0;. 
1b960 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1b970 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65  }../*.** The ide
1b980 61 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66  a is that this f
1b990 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69  unction works li
1b9a0 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ke a combination
1b9b0 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72   of.** GetLastEr
1b9c0 72 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d 61 74  ror() and Format
1b9d0 4d 65 73 73 61 67 65 28 29 20 6f 6e 20 57 69 6e  Message() on Win
1b9e0 64 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f 20 61  dows (or errno a
1b9f0 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72  nd.** strerror_r
1ba00 28 29 20 6f 6e 20 55 6e 69 78 29 2e 20 41 66 74  () on Unix). Aft
1ba10 65 72 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  er an error is r
1ba20 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 4f 53  eturned by an OS
1ba30 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51  .** function, SQ
1ba40 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20  Lite calls this 
1ba50 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 7a 42  function with zB
1ba60 75 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a  uf pointing to.*
1ba70 2a 20 61 20 62 75 66 66 65 72 20 6f 66 20 6e 42  * a buffer of nB
1ba80 75 66 20 62 79 74 65 73 2e 20 54 68 65 20 4f 53  uf bytes. The OS
1ba90 20 6c 61 79 65 72 20 73 68 6f 75 6c 64 20 70 6f   layer should po
1baa0 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20 62 75  pulate the.** bu
1bab0 66 66 65 72 20 77 69 74 68 20 61 20 6e 75 6c 2d  ffer with a nul-
1bac0 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38  terminated UTF-8
1bad0 20 65 6e 63 6f 64 65 64 20 65 72 72 6f 72 20 6d   encoded error m
1bae0 65 73 73 61 67 65 0a 2a 2a 20 64 65 73 63 72 69  essage.** descri
1baf0 62 69 6e 67 20 74 68 65 20 6c 61 73 74 20 49 4f  bing the last IO
1bb00 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20 6f   error to have o
1bb10 63 63 75 72 72 65 64 20 77 69 74 68 69 6e 20 74  ccurred within t
1bb20 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  he calling.** th
1bb30 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  read..**.** If t
1bb40 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
1bb50 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f   is too large fo
1bb60 72 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62  r the supplied b
1bb70 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f  uffer,.** it sho
1bb80 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
1bb90 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  . The return val
1bba0 75 65 20 6f 66 20 78 47 65 74 4c 61 73 74 45 72  ue of xGetLastEr
1bbb0 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69  ror.** is zero i
1bbc0 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
1bbd0 61 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20  age fits in the 
1bbe0 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a  buffer, or non-z
1bbf0 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ero.** otherwise
1bc00 20 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65   (if the message
1bc10 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e   was truncated).
1bc20 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20   If non-zero is 
1bc30 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65  returned,.** the
1bc40 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  n it is not nece
1bc50 73 73 61 72 79 20 74 6f 20 69 6e 63 6c 75 64 65  ssary to include
1bc60 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61   the nul-termina
1bc70 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  tor character.**
1bc80 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 62   in the output b
1bc90 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  uffer..**.** Not
1bca0 20 73 75 70 70 6c 79 69 6e 67 20 61 6e 20 65 72   supplying an er
1bcb0 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c  ror message will
1bcc0 20 68 61 76 65 20 6e 6f 20 61 64 76 65 72 73 65   have no adverse
1bcd0 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51   effect.** on SQ
1bce0 4c 69 74 65 2e 20 49 74 20 69 73 20 66 69 6e 65  Lite. It is fine
1bcf0 20 74 6f 20 68 61 76 65 20 61 6e 20 69 6d 70 6c   to have an impl
1bd00 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 20  ementation that 
1bd10 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73  never.** returns
1bd20 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
1bd30 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78  e:.**.**   int x
1bd40 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c  GetLastError(sql
1bd50 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
1bd60 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
1bd70 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73  zBuf){.**     as
1bd80 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c  sert(zBuf[0]=='\
1bd90 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75  0');.**     retu
1bda0 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a  rn 0;.**   }.**.
1bdb0 2a 2a 20 48 6f 77 65 76 65 72 20 69 66 20 61 6e  ** However if an
1bdc0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
1bdd0 73 20 73 75 70 70 6c 69 65 64 2c 20 69 74 20 77  s supplied, it w
1bde0 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72 61  ill be incorpora
1bdf0 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65  ted.** by sqlite
1be00 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20   into the error 
1be10 6d 65 73 73 61 67 65 20 61 76 61 69 6c 61 62 6c  message availabl
1be20 65 20 74 6f 20 74 68 65 20 75 73 65 72 20 75 73  e to the user us
1be30 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65  ing.** sqlite3_e
1be40 72 72 6d 73 67 28 29 2c 20 70 6f 73 73 69 62 6c  rrmsg(), possibl
1be50 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f  y making IO erro
1be60 72 73 20 65 61 73 69 65 72 20 74 6f 20 64 65 62  rs easier to deb
1be70 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ug..*/.static in
1be80 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f  t winGetLastErro
1be90 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
1bea0 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
1beb0 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e  har *zBuf){.  UN
1bec0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
1bed0 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 67  Vfs);.  return g
1bee0 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f  etLastErrorMsg(o
1bef0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
1bf00 20 6e 42 75 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a   nBuf, zBuf);.}.
1bf10 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
1bf20 65 20 61 6e 64 20 64 65 69 6e 69 74 69 61 6c 69  e and deinitiali
1bf30 7a 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  ze the operating
1bf40 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63   system interfac
1bf50 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1bf60 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b  3_os_init(void){
1bf70 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
1bf80 33 5f 76 66 73 20 77 69 6e 56 66 73 20 3d 20 7b  3_vfs winVfs = {
1bf90 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20 20 20  .    3,         
1bfa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
1bfb0 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a  rsion */.    siz
1bfc0 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20  eof(winFile),   
1bfd0 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f    /* szOsFile */
1bfe0 0a 20 20 20 20 4d 41 58 5f 50 41 54 48 2c 20 20  .    MAX_PATH,  
1bff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50            /* mxP
1c000 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30  athname */.    0
1c010 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c020 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a      /* pNext */.
1c030 20 20 20 20 22 77 69 6e 33 32 22 2c 20 20 20 20      "win32",    
1c040 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d           /* zNam
1c050 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
1c060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c070 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20   pAppData */.   
1c080 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20   winOpen,       
1c090 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
1c0a0 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c  /.    winDelete,
1c0b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
1c0c0 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e  elete */.    win
1c0d0 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
1c0e0 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a    /* xAccess */.
1c0f0 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e      winFullPathn
1c100 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c  ame,     /* xFul
1c110 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  lPathname */.   
1c120 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20   winDlOpen,     
1c130 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e        /* xDlOpen
1c140 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72   */.    winDlErr
1c150 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or,          /* 
1c160 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  xDlError */.    
1c170 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20  winDlSym,       
1c180 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a       /* xDlSym *
1c190 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65  /.    winDlClose
1c1a0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
1c1b0 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69  lClose */.    wi
1c1c0 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20  nRandomness,    
1c1d0 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73     /* xRandomnes
1c1e0 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65  s */.    winSlee
1c1f0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
1c200 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77   xSleep */.    w
1c210 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20  inCurrentTime,  
1c220 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
1c230 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  ime */.    winGe
1c240 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
1c250 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
1c260 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65   */.    winCurre
1c270 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20  ntTimeInt64, /* 
1c280 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
1c290 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53  4 */.    winSetS
1c2a0 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a  ystemCall,    /*
1c2b0 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xSetSystemCall 
1c2c0 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73  */.    winGetSys
1c2d0 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78  temCall,    /* x
1c2e0 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  GetSystemCall */
1c2f0 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74  .    winNextSyst
1c300 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65  emCall,   /* xNe
1c310 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  xtSystemCall */.
1c320 20 20 7d 3b 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c    };..  /* Doubl
1c330 65 2d 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  e-check that the
1c340 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61   aSyscall[] arra
1c350 79 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 74  y has been const
1c360 72 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72  ructed.  ** corr
1c370 65 63 74 6c 79 2e 20 20 53 65 65 20 74 69 63 6b  ectly.  See tick
1c380 65 74 20 5b 62 62 33 61 38 36 65 38 39 30 63 38  et [bb3a86e890c8
1c390 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65  e96ab] */.  asse
1c3a0 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 61 53  rt( ArraySize(aS
1c3b0 79 73 63 61 6c 6c 29 3d 3d 36 30 20 29 3b 0a 0a  yscall)==60 );..
1c3c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c3d0 4d 49 54 5f 57 41 4c 0a 20 20 2f 2a 20 67 65 74  MIT_WAL.  /* get
1c3e0 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61 6c 6c 6f   memory map allo
1c3f0 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c 61 72 69  cation granulari
1c400 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ty */.  memset(&
1c410 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30 2c 20 73  winSysInfo, 0, s
1c420 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f 49 4e 46  izeof(SYSTEM_INF
1c430 4f 29 29 3b 0a 20 20 6f 73 47 65 74 53 79 73 74  O));.  osGetSyst
1c440 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e  emInfo(&winSysIn
1c450 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 77 69  fo);.  assert(wi
1c460 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63  nSysInfo.dwAlloc
1c470 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79  ationGranularity
1c480 20 3e 20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20   > 0);.#endif.. 
1c490 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
1c4a0 69 73 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31  ister(&winVfs, 1
1c4b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1c4c0 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 69 6e 74 20 73  TE_OK; .}..int s
1c4d0 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f  qlite3_os_end(vo
1c4e0 69 64 29 7b 20 0a 20 20 72 65 74 75 72 6e 20 53  id){ .  return S
1c4f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e  QLITE_OK;.}..#en
1c500 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53  dif /* SQLITE_OS
1c510 5f 57 49 4e 20 2a 2f 0a                          _WIN */.