/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact b9c36459cf8f37d16a24f35cca934c21d74f0e5b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59   */..#ifdef __CY
0220: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0230: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0240: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
0250: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
0260: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
0270: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
0280: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
0290: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 53  mmon.h"../*.** S
02a0: 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f  ome Microsoft co
02b0: 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69  mpilers lack thi
02c0: 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f  s definition..*/
02d0: 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44  .#ifndef INVALID
02e0: 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
02f0: 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49  .# define INVALI
0300: 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
0310: 53 20 28 28 44 57 4f 52 44 29 2d 31 29 20 0a 23  S ((DWORD)-1) .#
0320: 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72  endif../* Forwar
0330: 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a  d references */.
0340: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
0350: 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20 20 20  inShm winShm;   
0360: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6e          /* A con
0370: 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65  nection to share
0380: 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65  d-memory */.type
0390: 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 53 68  def struct winSh
03a0: 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f 64 65  mNode winShmNode
03b0: 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f 6e 20  ;   /* A region 
03c0: 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
03d0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 43 45   */../*.** WinCE
03e0: 20 6c 61 63 6b 73 20 6e 61 74 69 76 65 20 73 75   lacks native su
03f0: 70 70 6f 72 74 20 66 6f 72 20 66 69 6c 65 20 6c  pport for file l
0400: 6f 63 6b 69 6e 67 20 73 6f 20 77 65 20 68 61 76  ocking so we hav
0410: 65 20 74 6f 20 66 61 6b 65 20 69 74 0a 2a 2a 20  e to fake it.** 
0420: 77 69 74 68 20 73 6f 6d 65 20 63 6f 64 65 20 6f  with some code o
0430: 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a 23 69  f our own..*/.#i
0440: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
0450: 45 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  E.typedef struct
0460: 20 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20 20 69   winceLock {.  i
0470: 6e 74 20 6e 52 65 61 64 65 72 73 3b 20 20 20 20  nt nReaders;    
0480: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0490: 72 65 61 64 65 72 20 6c 6f 63 6b 73 20 6f 62 74  reader locks obt
04a0: 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ained */.  BOOL 
04b0: 62 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 2f  bPending;      /
04c0: 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20 70 65  * Indicates a pe
04d0: 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62  nding lock has b
04e0: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a  een obtained */.
04f0: 20 20 42 4f 4f 4c 20 62 52 65 73 65 72 76 65 64    BOOL bReserved
0500: 3b 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74  ;     /* Indicat
0510: 65 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  es a reserved lo
0520: 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61  ck has been obta
0530: 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  ined */.  BOOL b
0540: 45 78 63 6c 75 73 69 76 65 3b 20 20 20 20 2f 2a  Exclusive;    /*
0550: 20 49 6e 64 69 63 61 74 65 73 20 61 6e 20 65 78   Indicates an ex
0560: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 68 61 73  clusive lock has
0570: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a   been obtained *
0580: 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b 0a 23  /.} winceLock;.#
0590: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
05a0: 20 77 69 6e 46 69 6c 65 20 73 74 72 75 63 74 75   winFile structu
05b0: 72 65 20 69 73 20 61 20 73 75 62 63 6c 61 73 73  re is a subclass
05c0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   of sqlite3_file
05d0: 2a 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68  * specific to th
05e0: 65 20 77 69 6e 33 32 0a 2a 2a 20 70 6f 72 74 61  e win32.** porta
05f0: 62 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a 2f  bility layer..*/
0600: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0610: 77 69 6e 46 69 6c 65 20 77 69 6e 46 69 6c 65 3b  winFile winFile;
0620: 0a 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20  .struct winFile 
0630: 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  {.  const sqlite
0640: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d  3_io_methods *pM
0650: 65 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75 73 74  ethod; /*** Must
0660: 20 62 65 20 66 69 72 73 74 20 2a 2a 2a 2f 0a 20   be first ***/. 
0670: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
0680: 66 73 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  fs;      /* The 
0690: 56 46 53 20 75 73 65 64 20 74 6f 20 6f 70 65 6e  VFS used to open
06a0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
06b0: 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20 20  HANDLE h;       
06c0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
06d0: 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20  e for accessing 
06e0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  the file */.  u8
06f0: 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20   locktype;      
0700: 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
0710: 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79 20   lock currently 
0720: 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 69 6c  held on this fil
0730: 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73 68 61  e */.  short sha
0740: 72 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20 20 2f  redLockByte;   /
0750: 2a 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f 73 65  * Randomly chose
0760: 6e 20 62 79 74 65 20 75 73 65 64 20 61 73 20 61  n byte used as a
0770: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a   shared lock */.
0780: 20 20 75 38 20 63 74 72 6c 46 6c 61 67 73 3b 20    u8 ctrlFlags; 
0790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
07a0: 67 73 2e 20 20 53 65 65 20 57 49 4e 46 49 4c 45  gs.  See WINFILE
07b0: 5f 2a 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 44 57  _* below */.  DW
07c0: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  ORD lastErrno;  
07d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e        /* The Win
07e0: 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20  dows errno from 
07f0: 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72  the last I/O err
0800: 6f 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  or */.  winShm *
0810: 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pShm;           
0820: 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20 73  /* Instance of s
0830: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e 20  hared memory on 
0840: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 63  this file */.  c
0850: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
0860: 3b 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70  ;      /* Full p
0870: 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 69 73 20  athname of this 
0880: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  file */.  int sz
0890: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
08a0: 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65 20    /* Chunk size 
08b0: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46 43  configured by FC
08c0: 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2a  NTL_CHUNK_SIZE *
08d0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
08e0: 57 49 4e 43 45 0a 20 20 4c 50 57 53 54 52 20 7a  WINCE.  LPWSTR z
08f0: 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20 20  DeleteOnClose;  
0900: 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
0910: 74 6f 20 64 65 6c 65 74 65 20 77 68 65 6e 20 63  to delete when c
0920: 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e 44  losing */.  HAND
0930: 4c 45 20 68 4d 75 74 65 78 3b 20 20 20 20 20 20  LE hMutex;      
0940: 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 75 73 65      /* Mutex use
0950: 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63  d to control acc
0960: 65 73 73 20 74 6f 20 73 68 61 72 65 64 20 6c 6f  ess to shared lo
0970: 63 6b 20 2a 2f 20 20 0a 20 20 48 41 4e 44 4c 45  ck */  .  HANDLE
0980: 20 68 53 68 61 72 65 64 3b 20 20 20 20 20 20 20   hShared;       
0990: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
09a0: 72 79 20 73 65 67 6d 65 6e 74 20 75 73 65 64 20  ry segment used 
09b0: 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20  for locking */. 
09c0: 20 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c   winceLock local
09d0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b  ;        /* Lock
09e0: 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68  s obtained by th
09f0: 69 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 77  is instance of w
0a00: 69 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 63  inFile */.  winc
0a10: 65 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20 20  eLock *shared;  
0a20: 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 68      /* Global sh
0a30: 61 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79  ared lock memory
0a40: 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 20 2a   for the file  *
0a50: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
0a60: 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  ** Allowed value
0a70: 73 20 66 6f 72 20 77 69 6e 46 69 6c 65 2e 63 74  s for winFile.ct
0a80: 72 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69  rlFlags.*/.#defi
0a90: 6e 65 20 57 49 4e 46 49 4c 45 5f 50 45 52 53 49  ne WINFILE_PERSI
0aa0: 53 54 5f 57 41 4c 20 20 20 20 20 30 78 30 34 20  ST_WAL     0x04 
0ab0: 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74 20    /* Persistent 
0ac0: 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 64 65 66  WAL mode */.#def
0ad0: 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57  ine WINFILE_PSOW
0ae0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31 30              0x10
0af0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43     /* SQLITE_IOC
0b00: 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
0b10: 52 57 52 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 20 2a  RWRITE */../*. *
0b20: 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   If compiled wit
0b30: 68 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  h SQLITE_WIN32_M
0b40: 41 4c 4c 4f 43 20 6f 6e 20 57 69 6e 64 6f 77 73  ALLOC on Windows
0b50: 2c 20 77 65 20 77 69 6c 6c 20 75 73 65 20 74 68  , we will use th
0b60: 65 0a 20 2a 20 76 61 72 69 6f 75 73 20 57 69 6e  e. * various Win
0b70: 33 32 20 41 50 49 20 68 65 61 70 20 66 75 6e 63  32 API heap func
0b80: 74 69 6f 6e 73 20 69 6e 73 74 65 61 64 20 6f 66  tions instead of
0b90: 20 6f 75 72 20 6f 77 6e 2e 0a 20 2a 2f 0a 23 69   our own.. */.#i
0ba0: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
0bb0: 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 20 2a 20 54  2_MALLOC./*. * T
0bc0: 68 65 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20  he initial size 
0bd0: 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  of the Win32-spe
0be0: 63 69 66 69 63 20 68 65 61 70 2e 20 20 54 68 69  cific heap.  Thi
0bf0: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  s value may be z
0c00: 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ero.. */.#ifndef
0c10: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
0c20: 41 50 5f 49 4e 49 54 5f 53 49 5a 45 0a 23 20 20  AP_INIT_SIZE.#  
0c30: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
0c40: 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49  N32_HEAP_INIT_SI
0c50: 5a 45 20 28 28 53 51 4c 49 54 45 5f 44 45 46 41  ZE ((SQLITE_DEFA
0c60: 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 20  ULT_CACHE_SIZE) 
0c70: 2a 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  * \.            
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c90: 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49             (SQLI
0ca0: 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
0cb0: 53 49 5a 45 29 20 2b 20 34 31 39 34 33 30 34 29  SIZE) + 4194304)
0cc0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
0cd0: 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20  he maximum size 
0ce0: 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  of the Win32-spe
0cf0: 63 69 66 69 63 20 68 65 61 70 2e 20 20 54 68 69  cific heap.  Thi
0d00: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  s value may be z
0d10: 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ero.. */.#ifndef
0d20: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
0d30: 41 50 5f 4d 41 58 5f 53 49 5a 45 0a 23 20 20 64  AP_MAX_SIZE.#  d
0d40: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
0d50: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45  32_HEAP_MAX_SIZE
0d60: 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a    (0).#endif../*
0d70: 0a 20 2a 20 54 68 65 20 65 78 74 72 61 20 66 6c  . * The extra fl
0d80: 61 67 73 20 74 6f 20 75 73 65 20 69 6e 20 63 61  ags to use in ca
0d90: 6c 6c 73 20 74 6f 20 74 68 65 20 57 69 6e 33 32  lls to the Win32
0da0: 20 68 65 61 70 20 41 50 49 73 2e 20 20 54 68 69   heap APIs.  Thi
0db0: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 0a 20  s value may be. 
0dc0: 2a 20 7a 65 72 6f 20 66 6f 72 20 74 68 65 20 64  * zero for the d
0dd0: 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f 72 2e  efault behavior.
0de0: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
0df0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
0e00: 4c 41 47 53 0a 23 20 20 64 65 66 69 6e 65 20 53  LAGS.#  define S
0e10: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
0e20: 5f 46 4c 41 47 53 20 20 20 20 20 28 30 29 0a 23  _FLAGS     (0).#
0e30: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
0e40: 20 77 69 6e 4d 65 6d 44 61 74 61 20 73 74 72 75   winMemData stru
0e50: 63 74 75 72 65 20 73 74 6f 72 65 73 20 69 6e 66  cture stores inf
0e60: 6f 72 6d 61 74 69 6f 6e 20 72 65 71 75 69 72 65  ormation require
0e70: 64 20 62 79 20 74 68 65 20 57 69 6e 33 32 2d 73  d by the Win32-s
0e80: 70 65 63 69 66 69 63 0a 2a 2a 20 73 71 6c 69 74  pecific.** sqlit
0e90: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 69  e3_mem_methods i
0ea0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a  mplementation..*
0eb0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0ec0: 20 77 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 4d   winMemData winM
0ed0: 65 6d 44 61 74 61 3b 0a 73 74 72 75 63 74 20 77  emData;.struct w
0ee0: 69 6e 4d 65 6d 44 61 74 61 20 7b 0a 23 69 66 6e  inMemData {.#ifn
0ef0: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 75 33 32  def NDEBUG.  u32
0f00: 20 6d 61 67 69 63 3b 20 20 20 20 2f 2a 20 4d 61   magic;    /* Ma
0f10: 67 69 63 20 6e 75 6d 62 65 72 20 74 6f 20 64 65  gic number to de
0f20: 74 65 63 74 20 73 74 72 75 63 74 75 72 65 20 63  tect structure c
0f30: 6f 72 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65  orruption. */.#e
0f40: 6e 64 69 66 0a 20 20 48 41 4e 44 4c 45 20 68 48  ndif.  HANDLE hH
0f50: 65 61 70 3b 20 2f 2a 20 54 68 65 20 68 61 6e 64  eap; /* The hand
0f60: 6c 65 20 74 6f 20 6f 75 72 20 68 65 61 70 2e 20  le to our heap. 
0f70: 2a 2f 0a 20 20 42 4f 4f 4c 20 62 4f 77 6e 65 64  */.  BOOL bOwned
0f80: 3b 20 20 2f 2a 20 44 6f 20 77 65 20 6f 77 6e 20  ;  /* Do we own 
0f90: 74 68 65 20 68 65 61 70 20 28 69 2e 65 2e 20 64  the heap (i.e. d
0fa0: 65 73 74 72 6f 79 20 69 74 20 6f 6e 20 73 68 75  estroy it on shu
0fb0: 74 64 6f 77 6e 29 3f 20 2a 2f 0a 7d 3b 0a 0a 23  tdown)? */.};..#
0fc0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64  ifndef NDEBUG.#d
0fd0: 65 66 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47  efine WINMEM_MAG
0fe0: 49 43 20 20 20 20 20 30 78 34 32 62 32 38 33 30  IC     0x42b2830
0ff0: 62 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63  b.#endif..static
1000: 20 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61   struct winMemDa
1010: 74 61 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 20  ta win_mem_data 
1020: 3d 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  = {.#ifndef NDEB
1030: 55 47 0a 20 20 57 49 4e 4d 45 4d 5f 4d 41 47 49  UG.  WINMEM_MAGI
1040: 43 2c 0a 23 65 6e 64 69 66 0a 20 20 4e 55 4c 4c  C,.#endif.  NULL
1050: 2c 20 46 41 4c 53 45 0a 7d 3b 0a 0a 23 69 66 6e  , FALSE.};..#ifn
1060: 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66 69  def NDEBUG.#defi
1070: 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  ne winMemAssertM
1080: 61 67 69 63 28 29 20 61 73 73 65 72 74 28 20 77  agic() assert( w
1090: 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69  in_mem_data.magi
10a0: 63 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20  c==WINMEM_MAGIC 
10b0: 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ).#else.#define 
10c0: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
10d0: 63 28 29 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66  c().#endif..#def
10e0: 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  ine winMemGetHea
10f0: 70 28 29 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61  p() win_mem_data
1100: 2e 68 48 65 61 70 0a 0a 73 74 61 74 69 63 20 76  .hHeap..static v
1110: 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f  oid *winMemMallo
1120: 63 28 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73  c(int nBytes);.s
1130: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65  tatic void winMe
1140: 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69  mFree(void *pPri
1150: 6f 72 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  or);.static void
1160: 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28   *winMemRealloc(
1170: 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e  void *pPrior, in
1180: 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69  t nBytes);.stati
1190: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65  c int winMemSize
11a0: 28 76 6f 69 64 20 2a 70 29 3b 0a 73 74 61 74 69  (void *p);.stati
11b0: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e  c int winMemRoun
11c0: 64 75 70 28 69 6e 74 20 6e 29 3b 0a 73 74 61 74  dup(int n);.stat
11d0: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69  ic int winMemIni
11e0: 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  t(void *pAppData
11f0: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  );.static void w
1200: 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f  inMemShutdown(vo
1210: 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 0a  id *pAppData);..
1220: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65  const sqlite3_me
1230: 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74  m_methods *sqlit
1240: 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f  e3MemGetWin32(vo
1250: 69 64 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  id);.#endif /* S
1260: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
1270: 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OC */../*.** The
1280: 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
1290: 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c 79  ble is (normally
12a0: 29 20 73 65 74 20 6f 6e 63 65 20 61 6e 64 20 6e  ) set once and n
12b0: 65 76 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a 20  ever changes.** 
12c0: 74 68 65 72 65 61 66 74 65 72 2e 20 20 49 74 20  thereafter.  It 
12d0: 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72 20  records whether 
12e0: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
12f0: 73 74 65 6d 20 69 73 20 57 69 6e 39 78 0a 2a 2a  stem is Win9x.**
1300: 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a   or WinNT..**.**
1310: 20 30 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20   0:   Operating 
1320: 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a  system unknown..
1330: 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61 74 69 6e  ** 1:   Operatin
1340: 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39  g system is Win9
1350: 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72 61  x..** 2:   Opera
1360: 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57  ting system is W
1370: 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  inNT..**.** In o
1380: 72 64 65 72 20 74 6f 20 66 61 63 69 6c 69 74 61  rder to facilita
1390: 74 65 20 74 65 73 74 69 6e 67 20 6f 6e 20 61 20  te testing on a 
13a0: 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74 68  WinNT system, th
13b0: 65 20 74 65 73 74 20 66 69 78 74 75 72 65 0a 2a  e test fixture.*
13c0: 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20 73  * can manually s
13d0: 65 74 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f  et this value to
13e0: 20 31 20 74 6f 20 65 6d 75 6c 61 74 65 20 57 69   1 to emulate Wi
13f0: 6e 39 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  n98 behavior..*/
1400: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1410: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
1420: 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6c  os_type = 0;.#el
1430: 73 65 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  se.static int sq
1440: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20  lite3_os_type = 
1450: 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  0;.#endif..#if !
1460: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
1470: 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  || SQLITE_OS_WIN
1480: 52 54 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  RT.#  define SQL
1490: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
14a0: 53 49 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53  SI.#endif..#if S
14b0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
14c0: 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e  | SQLITE_OS_WINN
14d0: 54 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  T || SQLITE_OS_W
14e0: 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20 53  INRT.#  define S
14f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1500: 57 49 44 45 0a 23 65 6e 64 69 66 0a 0a 23 69 66  WIDE.#endif..#if
1510: 6e 64 65 66 20 53 59 53 43 41 4c 4c 0a 23 20 20  ndef SYSCALL.#  
1520: 64 65 66 69 6e 65 20 53 59 53 43 41 4c 4c 20 73  define SYSCALL s
1530: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
1540: 74 72 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53  tr.#endif..#if S
1550: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 2f  QLITE_OS_WINCE./
1560: 2a 0a 2a 2a 20 54 68 65 73 65 20 6d 61 63 72 6f  *.** These macro
1570: 73 20 61 72 65 20 6e 65 63 65 73 73 61 72 79 20  s are necessary 
1580: 62 65 63 61 75 73 65 20 57 69 6e 64 6f 77 73 20  because Windows 
1590: 43 45 20 64 6f 65 73 20 6e 6f 74 20 6e 61 74 69  CE does not nati
15a0: 76 65 6c 79 20 73 75 70 70 6f 72 74 20 74 68 65  vely support the
15b0: 0a 2a 2a 20 57 69 6e 33 32 20 41 50 49 73 20 4c  .** Win32 APIs L
15c0: 6f 63 6b 46 69 6c 65 2c 20 55 6e 6c 6f 63 6b 46  ockFile, UnlockF
15d0: 69 6c 65 2c 20 61 6e 64 20 4c 6f 63 6b 46 69 6c  ile, and LockFil
15e0: 65 45 78 2e 0a 20 2a 2f 0a 0a 23 20 20 64 65 66  eEx.. */..#  def
15f0: 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 28 61 2c 62  ine LockFile(a,b
1600: 2c 63 2c 64 2c 65 29 20 20 20 20 20 20 20 77 69  ,c,d,e)       wi
1610: 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26 61 2c 20  nceLockFile(&a, 
1620: 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23 20 20 64  b, c, d, e).#  d
1630: 65 66 69 6e 65 20 55 6e 6c 6f 63 6b 46 69 6c 65  efine UnlockFile
1640: 28 61 2c 62 2c 63 2c 64 2c 65 29 20 20 20 20 20  (a,b,c,d,e)     
1650: 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28  winceUnlockFile(
1660: 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a  &a, b, c, d, e).
1670: 23 20 20 64 65 66 69 6e 65 20 4c 6f 63 6b 46 69  #  define LockFi
1680: 6c 65 45 78 28 61 2c 62 2c 63 2c 64 2c 65 2c 66  leEx(a,b,c,d,e,f
1690: 29 20 20 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c  )   winceLockFil
16a0: 65 45 78 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c  eEx(&a, b, c, d,
16b0: 20 65 2c 20 66 29 0a 0a 2f 2a 0a 2a 2a 20 54 68   e, f)../*.** Th
16c0: 65 73 65 20 61 72 65 20 74 68 65 20 73 70 65 63  ese are the spec
16d0: 69 61 6c 20 73 79 73 63 61 6c 6c 20 68 61 63 6b  ial syscall hack
16e0: 73 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 43 45  s for Windows CE
16f0: 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 72  .  The locking r
1700: 65 6c 61 74 65 64 0a 2a 2a 20 64 65 66 69 6e 65  elated.** define
1710: 73 20 68 65 72 65 20 72 65 66 65 72 20 74 6f 20  s here refer to 
1720: 74 68 65 20 6d 61 63 72 6f 73 20 64 65 66 69 6e  the macros defin
1730: 65 64 20 6a 75 73 74 20 61 62 6f 76 65 2e 0a 20  ed just above.. 
1740: 2a 2f 0a 0a 23 20 20 64 65 66 69 6e 65 20 6f 73  */..#  define os
1750: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28  AreFileApisANSI(
1760: 29 20 20 20 20 20 20 20 31 0a 23 20 20 64 65 66  )       1.#  def
1770: 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 20 20  ine osLockFile  
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 6f                Lo
1790: 63 6b 46 69 6c 65 0a 23 20 20 64 65 66 69 6e 65  ckFile.#  define
17a0: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 20 20   osUnlockFile   
17b0: 20 20 20 20 20 20 20 20 20 20 20 55 6e 6c 6f 63             Unloc
17c0: 6b 46 69 6c 65 0a 23 20 20 64 65 66 69 6e 65 20  kFile.#  define 
17d0: 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20 20 20 20  osLockFileEx    
17e0: 20 20 20 20 20 20 20 20 20 20 4c 6f 63 6b 46 69            LockFi
17f0: 6c 65 45 78 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  leEx.#endif../*.
1800: 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63  ** Many system c
1810: 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73 65  alls are accesse
1820: 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65  d through pointe
1830: 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73  r-to-functions s
1840: 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d  o that.** they m
1850: 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e  ay be overridden
1860: 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66   at runtime to f
1870: 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20  acilitate fault 
1880: 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67  injection during
1890: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
18a0: 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65  sandboxing.  The
18b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79   following array
18c0: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73   holds the names
18d0: 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a   and pointers.**
18e0: 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65   to all override
18f0: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
1900: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  s..*/.static str
1910: 75 63 74 20 77 69 6e 5f 73 79 73 63 61 6c 6c 20  uct win_syscall 
1920: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1930: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
1940: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1950: 20 73 79 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20   sytem call */. 
1960: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
1970: 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f  _ptr pCurrent; /
1980: 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20  * Current value 
1990: 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  of the system ca
19a0: 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ll */.  sqlite3_
19b0: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66  syscall_ptr pDef
19c0: 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74  ault; /* Default
19d0: 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73   value */.} aSys
19e0: 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 23 69 66 20 21  call[] = {.#if !
19f0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
1a00: 20 20 7b 20 22 41 72 65 46 69 6c 65 41 70 69 73    { "AreFileApis
1a10: 41 4e 53 49 22 2c 20 20 20 20 20 20 20 20 20 28  ANSI",         (
1a20: 53 59 53 43 41 4c 4c 29 41 72 65 46 69 6c 65 41  SYSCALL)AreFileA
1a30: 70 69 73 41 4e 53 49 2c 20 20 20 20 20 20 20 20  pisANSI,        
1a40: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
1a50: 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
1a60: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
1a70: 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  (VOID))aSyscall[
1a80: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6c  0].pCurrent).#el
1a90: 73 65 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41  se.  { "AreFileA
1aa0: 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20  pisANSI",       
1ab0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
1ae0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1af0: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
1b00: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
1b10: 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72  _WIDE).  { "Char
1b20: 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20 20 20  LowerW",        
1b30: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
1b40: 68 61 72 4c 6f 77 65 72 57 2c 20 20 20 20 20 20  harLowerW,      
1b50: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
1b60: 73 65 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65  se.  { "CharLowe
1b70: 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rW",            
1b80: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
1bb0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72 4c  .#define osCharL
1bc0: 6f 77 65 72 57 20 28 28 4c 50 57 53 54 52 28 57  owerW ((LPWSTR(W
1bd0: 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29  INAPI*)(LPWSTR))
1be0: 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72  aSyscall[1].pCur
1bf0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
1c00: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65  E_OS_WINCE && de
1c10: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1c20: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
1c30: 20 22 43 68 61 72 55 70 70 65 72 57 22 2c 20 20   "CharUpperW",  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
1c50: 43 41 4c 4c 29 43 68 61 72 55 70 70 65 72 57 2c  CALL)CharUpperW,
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
1c70: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 68  },.#else.  { "Ch
1c80: 61 72 55 70 70 65 72 57 22 2c 20 20 20 20 20 20  arUpperW",      
1c90: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
1ca0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
1cb0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
1cc0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
1cd0: 73 43 68 61 72 55 70 70 65 72 57 20 28 28 4c 50  sCharUpperW ((LP
1ce0: 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c 50  WSTR(WINAPI*)(LP
1cf0: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32  WSTR))aSyscall[2
1d00: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
1d10: 20 22 43 6c 6f 73 65 48 61 6e 64 6c 65 22 2c 20   "CloseHandle", 
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
1d30: 43 41 4c 4c 29 43 6c 6f 73 65 48 61 6e 64 6c 65  CALL)CloseHandle
1d40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
1d50: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c  },..#define osCl
1d60: 6f 73 65 48 61 6e 64 6c 65 20 28 28 42 4f 4f 4c  oseHandle ((BOOL
1d70: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
1d80: 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43  ))aSyscall[3].pC
1d90: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
1da0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
1db0: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
1dc0: 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c 20 20  "CreateFileA",  
1dd0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
1de0: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 41 2c  ALL)CreateFileA,
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
1e00: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
1e10: 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20  ateFileA",      
1e20: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
1e30: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
1e40: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
1e50: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
1e60: 43 72 65 61 74 65 46 69 6c 65 41 20 28 28 48 41  CreateFileA ((HA
1e70: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
1e80: 43 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44  CSTR,DWORD,DWORD
1e90: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45  , \.        LPSE
1ea0: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
1eb0: 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41  S,DWORD,DWORD,HA
1ec0: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 34  NDLE))aSyscall[4
1ed0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
1ee0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1ef0: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
1f00: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 57    { "CreateFileW
1f10: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
1f20: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69  SYSCALL)CreateFi
1f30: 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  leW,            
1f40: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
1f50: 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20  "CreateFileW",  
1f60: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
1f70: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
1f90: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
1fa0: 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57 20  e osCreateFileW 
1fb0: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
1fc0: 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c  )(LPCWSTR,DWORD,
1fd0: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
1fe0: 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52   LPSECURITY_ATTR
1ff0: 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f  IBUTES,DWORD,DWO
2000: 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73 63  RD,HANDLE))aSysc
2010: 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29  all[5].pCurrent)
2020: 0a 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  ..  { "CreateFil
2030: 65 4d 61 70 70 69 6e 67 22 2c 20 20 20 20 20 20  eMapping",      
2040: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
2050: 46 69 6c 65 4d 61 70 70 69 6e 67 2c 20 20 20 20  FileMapping,    
2060: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
2070: 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
2080: 70 69 6e 67 20 28 28 48 41 4e 44 4c 45 28 57 49  ping ((HANDLE(WI
2090: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
20a0: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
20b0: 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  TES, \.        D
20c0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
20d0: 2c 4c 50 43 54 53 54 52 29 29 61 53 79 73 63 61  ,LPCTSTR))aSysca
20e0: 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[6].pCurrent).
20f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
2100: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
2110: 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46  DE).  { "CreateF
2120: 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20 20  ileMappingW",   
2130: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
2140: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 2c 20  teFileMappingW, 
2150: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
2160: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d    { "CreateFileM
2170: 61 70 70 69 6e 67 57 22 2c 20 20 20 20 20 20 28  appingW",      (
2180: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
21b0: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
21c0: 6c 65 4d 61 70 70 69 6e 67 57 20 28 28 48 41 4e  leMappingW ((HAN
21d0: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  DLE(WINAPI*)(HAN
21e0: 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f 41  DLE,LPSECURITY_A
21f0: 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20  TTRIBUTES, \.   
2200: 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44       DWORD,DWORD
2210: 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52 29 29  ,DWORD,LPCWSTR))
2220: 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72  aSyscall[7].pCur
2230: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
2240: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
2250: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43  HAS_WIDE).  { "C
2260: 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20 20 20  reateMutexW",   
2270: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
2280: 4c 29 43 72 65 61 74 65 4d 75 74 65 78 57 2c 20  L)CreateMutexW, 
2290: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
22a0: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74  #else.  { "Creat
22b0: 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20 20  eMutexW",       
22c0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
22f0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72  if..#define osCr
2300: 65 61 74 65 4d 75 74 65 78 57 20 28 28 48 41 4e  eateMutexW ((HAN
2310: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53  DLE(WINAPI*)(LPS
2320: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
2330: 45 53 2c 42 4f 4f 4c 2c 20 5c 0a 20 20 20 20 20  ES,BOOL, \.     
2340: 20 20 20 4c 50 43 57 53 54 52 29 29 61 53 79 73     LPCWSTR))aSys
2350: 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74  call[8].pCurrent
2360: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
2370: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2380: 41 4e 53 49 29 0a 20 20 7b 20 22 44 65 6c 65 74  ANSI).  { "Delet
2390: 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20  eFileA",        
23a0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65       (SYSCALL)De
23b0: 6c 65 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20  leteFileA,      
23c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
23d0: 65 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c  e.  { "DeleteFil
23e0: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eA",            
23f0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2410: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
2420: 23 64 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65  #define osDelete
2430: 46 69 6c 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e  FileA ((BOOL(WIN
2440: 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53  API*)(LPCSTR))aS
2450: 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65  yscall[9].pCurre
2460: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
2470: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
2480: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 44 65 6c  S_WIDE).  { "Del
2490: 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20  eteFileW",      
24a0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
24b0: 44 65 6c 65 74 65 46 69 6c 65 57 2c 20 20 20 20  DeleteFileW,    
24c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
24d0: 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65 74 65 46  lse.  { "DeleteF
24e0: 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ileW",          
24f0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
2520: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44 65 6c 65  ..#define osDele
2530: 74 65 46 69 6c 65 57 20 28 28 42 4f 4f 4c 28 57  teFileW ((BOOL(W
2540: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29  INAPI*)(LPCWSTR)
2550: 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43  )aSyscall[10].pC
2560: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
2570: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b  ITE_OS_WINCE.  {
2580: 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61   "FileTimeToLoca
2590: 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53  lFileTime", (SYS
25a0: 43 41 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f 4c  CALL)FileTimeToL
25b0: 6f 63 61 6c 46 69 6c 65 54 69 6d 65 2c 20 30 20  ocalFileTime, 0 
25c0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 69  },.#else.  { "Fi
25d0: 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c  leTimeToLocalFil
25e0: 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c  eTime", (SYSCALL
25f0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
2600: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
2610: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
2620: 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c  sFileTimeToLocal
2630: 46 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28  FileTime ((BOOL(
2640: 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 46  WINAPI*)(CONST F
2650: 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20  ILETIME*, \.    
2660: 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29      LPFILETIME))
2670: 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75  aSyscall[11].pCu
2680: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
2690: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20  TE_OS_WINCE.  { 
26a0: 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65  "FileTimeToSyste
26b0: 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43  mTime",    (SYSC
26c0: 41 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f 53 79  ALL)FileTimeToSy
26d0: 73 74 65 6d 54 69 6d 65 2c 20 20 20 20 30 20 7d  stemTime,    0 }
26e0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c  ,.#else.  { "Fil
26f0: 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d  eTimeToSystemTim
2700: 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  e",    (SYSCALL)
2710: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2720: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
2730: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
2740: 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d  FileTimeToSystem
2750: 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  Time ((BOOL(WINA
2760: 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54  PI*)(CONST FILET
2770: 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20  IME*, \.        
2780: 4c 50 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53  LPSYSTEMTIME))aS
2790: 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72  yscall[12].pCurr
27a0: 65 6e 74 29 0a 0a 20 20 7b 20 22 46 6c 75 73 68  ent)..  { "Flush
27b0: 46 69 6c 65 42 75 66 66 65 72 73 22 2c 20 20 20  FileBuffers",   
27c0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6c       (SYSCALL)Fl
27d0: 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 2c 20  ushFileBuffers, 
27e0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
27f0: 66 69 6e 65 20 6f 73 46 6c 75 73 68 46 69 6c 65  fine osFlushFile
2800: 42 75 66 66 65 72 73 20 28 28 42 4f 4f 4c 28 57  Buffers ((BOOL(W
2810: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29  INAPI*)(HANDLE))
2820: 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75  aSyscall[13].pCu
2830: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
2840: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
2850: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
2860: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22 2c  FormatMessageA",
2870: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
2880: 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  LL)FormatMessage
2890: 41 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  A,          0 },
28a0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d  .#else.  { "Form
28b0: 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20  atMessageA",    
28c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
28d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
28f0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46  dif..#define osF
2900: 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 20 28 28  ormatMessageA ((
2910: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44  DWORD(WINAPI*)(D
2920: 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f  WORD,LPCVOID,DWO
2930: 52 44 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20  RD,DWORD,LPSTR, 
2940: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
2950: 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63 61  va_list*))aSysca
2960: 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[14].pCurrent)
2970: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
2980: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
2990: 49 44 45 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74  IDE).  { "Format
29a0: 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20 20 20  MessageW",      
29b0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72      (SYSCALL)For
29c0: 6d 61 74 4d 65 73 73 61 67 65 57 2c 20 20 20 20  matMessageW,    
29d0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
29e0: 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73  .  { "FormatMess
29f0: 61 67 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ageW",          
2a00: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a20: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
2a30: 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d  define osFormatM
2a40: 65 73 73 61 67 65 57 20 28 28 44 57 4f 52 44 28  essageW ((DWORD(
2a50: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c  WINAPI*)(DWORD,L
2a60: 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f  PCVOID,DWORD,DWO
2a70: 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20  RD,LPWSTR, \.   
2a80: 20 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69       DWORD,va_li
2a90: 73 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 35  st*))aSyscall[15
2aa0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
2ab0: 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20   "FreeLibrary", 
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
2ad0: 43 41 4c 4c 29 46 72 65 65 4c 69 62 72 61 72 79  CALL)FreeLibrary
2ae0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
2af0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 72  },..#define osFr
2b00: 65 65 4c 69 62 72 61 72 79 20 28 28 42 4f 4f 4c  eeLibrary ((BOOL
2b10: 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c  (WINAPI*)(HMODUL
2b20: 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e  E))aSyscall[16].
2b30: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
2b40: 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
2b50: 73 49 64 22 2c 20 20 20 20 20 28 53 59 53 43 41  sId",     (SYSCA
2b60: 4c 4c 29 47 65 74 43 75 72 72 65 6e 74 50 72 6f  LL)GetCurrentPro
2b70: 63 65 73 73 49 64 2c 20 20 20 20 20 30 20 7d 2c  cessId,     0 },
2b80: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 43  ..#define osGetC
2b90: 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 20  urrentProcessId 
2ba0: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
2bb0: 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  (VOID))aSyscall[
2bc0: 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  17].pCurrent)..#
2bd0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
2be0: 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28 53  NCE && defined(S
2bf0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2c00: 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 44 69  ANSI).  { "GetDi
2c10: 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20 20  skFreeSpaceA",  
2c20: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
2c30: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 2c  tDiskFreeSpaceA,
2c40: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
2c50: 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72  e.  { "GetDiskFr
2c60: 65 65 53 70 61 63 65 41 22 2c 20 20 20 20 20 20  eeSpaceA",      
2c70: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c90: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
2ca0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69 73  #define osGetDis
2cb0: 6b 46 72 65 65 53 70 61 63 65 41 20 28 28 42 4f  kFreeSpaceA ((BO
2cc0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53  OL(WINAPI*)(LPCS
2cd0: 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f  TR,LPDWORD,LPDWO
2ce0: 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20  RD,LPDWORD, \.  
2cf0: 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61        LPDWORD))a
2d00: 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 72  Syscall[18].pCur
2d10: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
2d20: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64  TE_OS_WINCE && d
2d30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
2d40: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
2d50: 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53 70  { "GetDiskFreeSp
2d60: 61 63 65 57 22 2c 20 20 20 20 20 20 20 28 53 59  aceW",       (SY
2d70: 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46 72 65  SCALL)GetDiskFre
2d80: 65 53 70 61 63 65 57 2c 20 20 20 20 20 20 20 30  eSpaceW,       0
2d90: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
2da0: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57  etDiskFreeSpaceW
2db0: 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ",       (SYSCAL
2dc0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
2dd0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2de0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
2df0: 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53 70 61  osGetDiskFreeSpa
2e00: 63 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ceW ((BOOL(WINAP
2e10: 49 2a 29 28 4c 50 43 57 53 54 52 2c 4c 50 44 57  I*)(LPCWSTR,LPDW
2e20: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57  ORD,LPDWORD,LPDW
2e30: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
2e40: 50 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  PDWORD))aSyscall
2e50: 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [19].pCurrent)..
2e60: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
2e70: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
2e80: 49 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  I).  { "GetFileA
2e90: 74 74 72 69 62 75 74 65 73 41 22 2c 20 20 20 20  ttributesA",    
2ea0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69    (SYSCALL)GetFi
2eb0: 6c 65 41 74 74 72 69 62 75 74 65 73 41 2c 20 20  leAttributesA,  
2ec0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
2ed0: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
2ee0: 62 75 74 65 73 41 22 2c 20 20 20 20 20 20 28 53  butesA",      (S
2ef0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f10: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
2f20: 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74  fine osGetFileAt
2f30: 74 72 69 62 75 74 65 73 41 20 28 28 44 57 4f 52  tributesA ((DWOR
2f40: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  D(WINAPI*)(LPCST
2f50: 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e  R))aSyscall[20].
2f60: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
2f70: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
2f80: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
2f90: 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62  { "GetFileAttrib
2fa0: 75 74 65 73 57 22 2c 20 20 20 20 20 20 28 53 59  utesW",      (SY
2fb0: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74  SCALL)GetFileAtt
2fc0: 72 69 62 75 74 65 73 57 2c 20 20 20 20 20 20 30  ributesW,      0
2fd0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
2fe0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
2ff0: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
3000: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
3010: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3020: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
3030: 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
3040: 74 65 73 57 20 28 28 44 57 4f 52 44 28 57 49 4e  tesW ((DWORD(WIN
3050: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61  API*)(LPCWSTR))a
3060: 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72  Syscall[21].pCur
3070: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
3080: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3090: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
30a0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
30b0: 45 78 57 22 2c 20 20 20 20 28 53 59 53 43 41 4c  ExW",    (SYSCAL
30c0: 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  L)GetFileAttribu
30d0: 74 65 73 45 78 57 2c 20 20 20 20 30 20 7d 2c 0a  tesExW,    0 },.
30e0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
30f0: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 22  leAttributesExW"
3100: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c  ,    (SYSCALL)0,
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3120: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3130: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
3140: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
3150: 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  xW ((BOOL(WINAPI
3160: 2a 29 28 4c 50 43 57 53 54 52 2c 47 45 54 5f 46  *)(LPCWSTR,GET_F
3170: 49 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c  ILEEX_INFO_LEVEL
3180: 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 56  S, \.        LPV
3190: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 32  OID))aSyscall[22
31a0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
31b0: 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20   "GetFileSize", 
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
31d0: 43 41 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a 65  CALL)GetFileSize
31e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
31f0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  },..#define osGe
3200: 74 46 69 6c 65 53 69 7a 65 20 28 28 44 57 4f 52  tFileSize ((DWOR
3210: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
3220: 45 2c 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63  E,LPDWORD))aSysc
3230: 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65 6e 74  all[23].pCurrent
3240: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
3250: 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e  S_WINCE && defin
3260: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3270: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47  HAS_ANSI).  { "G
3280: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22  etFullPathNameA"
3290: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
32a0: 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  L)GetFullPathNam
32b0: 65 41 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  eA,        0 },.
32c0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 75  #else.  { "GetFu
32d0: 6c 6c 50 61 74 68 4e 61 6d 65 41 22 2c 20 20 20  llPathNameA",   
32e0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3300: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3310: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
3320: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 20 28  tFullPathNameA (
3330: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
3340: 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c 4c 50 53  LPCSTR,DWORD,LPS
3350: 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  TR, \.        LP
3360: 53 54 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b 32  STR*))aSyscall[2
3370: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
3380: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
3390: 43 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  CE && defined(SQ
33a0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
33b0: 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46 75 6c  IDE).  { "GetFul
33c0: 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20 20 20 20  lPathNameW",    
33d0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
33e0: 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 2c 20 20  FullPathNameW,  
33f0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3400: 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74  .  { "GetFullPat
3410: 68 4e 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20  hNameW",        
3420: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3440: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3450: 64 65 66 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c  define osGetFull
3460: 50 61 74 68 4e 61 6d 65 57 20 28 28 44 57 4f 52  PathNameW ((DWOR
3470: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  D(WINAPI*)(LPCWS
3480: 54 52 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c  TR,DWORD,LPWSTR,
3490: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 57 53 54   \.        LPWST
34a0: 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b 32 35 5d  R*))aSyscall[25]
34b0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
34c0: 22 47 65 74 4c 61 73 74 45 72 72 6f 72 22 2c 20  "GetLastError", 
34d0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
34e0: 41 4c 4c 29 47 65 74 4c 61 73 74 45 72 72 6f 72  ALL)GetLastError
34f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
3500: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  ,..#define osGet
3510: 4c 61 73 74 45 72 72 6f 72 20 28 28 44 57 4f 52  LastError ((DWOR
3520: 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  D(WINAPI*)(VOID)
3530: 29 61 53 79 73 63 61 6c 6c 5b 32 36 5d 2e 70 43  )aSyscall[26].pC
3540: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
3550: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f  ITE_OS_WINCE.  /
3560: 2a 20 54 68 65 20 47 65 74 50 72 6f 63 41 64 64  * The GetProcAdd
3570: 72 65 73 73 41 28 29 20 72 6f 75 74 69 6e 65 20  ressA() routine 
3580: 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
3590: 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 2e  e on Windows CE.
35a0: 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63   */.  { "GetProc
35b0: 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20 20  AddressA",      
35c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50     (SYSCALL)GetP
35d0: 72 6f 63 41 64 64 72 65 73 73 41 2c 20 20 20 20  rocAddressA,    
35e0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
35f0: 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 57    /* All other W
3600: 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73  indows platforms
3610: 20 65 78 70 65 63 74 20 47 65 74 50 72 6f 63 41   expect GetProcA
3620: 64 64 72 65 73 73 28 29 20 74 6f 20 74 61 6b 65  ddress() to take
3630: 0a 20 20 2a 2a 20 61 6e 20 41 4e 53 49 20 73 74  .  ** an ANSI st
3640: 72 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20  ring regardless 
3650: 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f 44 45 20  of the _UNICODE 
3660: 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 7b 20 22  setting */.  { "
3670: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 22  GetProcAddressA"
3680: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
3690: 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65 73  LL)GetProcAddres
36a0: 73 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  s,          0 },
36b0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
36c0: 20 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65 73   osGetProcAddres
36d0: 73 41 20 28 28 46 41 52 50 52 4f 43 28 57 49 4e  sA ((FARPROC(WIN
36e0: 41 50 49 2a 29 28 48 4d 4f 44 55 4c 45 2c 20 5c  API*)(HMODULE, \
36f0: 0a 20 20 20 20 20 20 20 20 4c 50 43 53 54 52 29  .        LPCSTR)
3700: 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d 2e 70 43  )aSyscall[27].pC
3710: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65  urrent)..  { "Ge
3720: 74 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20  tSystemInfo",   
3730: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3740: 29 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 2c 20  )GetSystemInfo, 
3750: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
3760: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73  #define osGetSys
3770: 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57  temInfo ((VOID(W
3780: 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d  INAPI*)(LPSYSTEM
3790: 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b  _INFO))aSyscall[
37a0: 32 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  28].pCurrent).. 
37b0: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d   { "GetSystemTim
37c0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  e",           (S
37d0: 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d  YSCALL)GetSystem
37e0: 54 69 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Time,           
37f0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
3800: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 20 28 28  GetSystemTime ((
3810: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  VOID(WINAPI*)(LP
3820: 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73  SYSTEMTIME))aSys
3830: 63 61 6c 6c 5b 32 39 5d 2e 70 43 75 72 72 65 6e  call[29].pCurren
3840: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
3850: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 47 65  OS_WINCE.  { "Ge
3860: 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c  tSystemTimeAsFil
3870: 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c  eTime", (SYSCALL
3880: 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73  )GetSystemTimeAs
3890: 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23  FileTime, 0 },.#
38a0: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 53 79 73  else.  { "GetSys
38b0: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
38c0: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20  e", (SYSCALL)0, 
38d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38e0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
38f0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
3900: 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
3910: 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49 4e 41  Time ((VOID(WINA
3920: 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20  PI*)( \.        
3930: 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73  LPFILETIME))aSys
3940: 63 61 6c 6c 5b 33 30 5d 2e 70 43 75 72 72 65 6e  call[30].pCurren
3950: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
3960: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3970: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 54  _ANSI).  { "GetT
3980: 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20 20 20  empPathA",      
3990: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
39a0: 65 74 54 65 6d 70 50 61 74 68 41 2c 20 20 20 20  etTempPathA,    
39b0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
39c0: 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50  se.  { "GetTempP
39d0: 61 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20  athA",          
39e0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a00: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3a10: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65  .#define osGetTe
3a20: 6d 70 50 61 74 68 41 20 28 28 44 57 4f 52 44 28  mpPathA ((DWORD(
3a30: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c  WINAPI*)(DWORD,L
3a40: 50 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33  PSTR))aSyscall[3
3a50: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
3a60: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
3a70: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
3a80: 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74  .  { "GetTempPat
3a90: 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  hW",            
3aa0: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70  (SYSCALL)GetTemp
3ab0: 50 61 74 68 57 2c 20 20 20 20 20 20 20 20 20 20  PathW,          
3ac0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3ad0: 20 22 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c   "GetTempPathW",
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3af0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
3b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3b10: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
3b20: 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68  ne osGetTempPath
3b30: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
3b40: 2a 29 28 44 57 4f 52 44 2c 4c 50 57 53 54 52 29  *)(DWORD,LPWSTR)
3b50: 29 61 53 79 73 63 61 6c 6c 5b 33 32 5d 2e 70 43  )aSyscall[32].pC
3b60: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65  urrent)..  { "Ge
3b70: 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20  tTickCount",    
3b80: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3b90: 29 47 65 74 54 69 63 6b 43 6f 75 6e 74 2c 20 20  )GetTickCount,  
3ba0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
3bb0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63  #define osGetTic
3bc0: 6b 43 6f 75 6e 74 20 28 28 44 57 4f 52 44 28 57  kCount ((DWORD(W
3bd0: 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53  INAPI*)(VOID))aS
3be0: 79 73 63 61 6c 6c 5b 33 33 5d 2e 70 43 75 72 72  yscall[33].pCurr
3bf0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
3c00: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3c10: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65  AS_ANSI).  { "Ge
3c20: 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20 20 20  tVersionExA",   
3c30: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3c40: 29 47 65 74 56 65 72 73 69 6f 6e 45 78 41 2c 20  )GetVersionExA, 
3c50: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3c60: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 56 65 72  else.  { "GetVer
3c70: 73 69 6f 6e 45 78 41 22 2c 20 20 20 20 20 20 20  sionExA",       
3c80: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ca0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3cb0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
3cc0: 56 65 72 73 69 6f 6e 45 78 41 20 28 28 42 4f 4f  VersionExA ((BOO
3cd0: 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20  L(WINAPI*)( \.  
3ce0: 20 20 20 20 20 20 4c 50 4f 53 56 45 52 53 49 4f        LPOSVERSIO
3cf0: 4e 49 4e 46 4f 41 29 29 61 53 79 73 63 61 6c 6c  NINFOA))aSyscall
3d00: 5b 33 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [34].pCurrent)..
3d10: 20 20 7b 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c    { "HeapAlloc",
3d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
3d30: 53 59 53 43 41 4c 4c 29 48 65 61 70 41 6c 6c 6f  SYSCALL)HeapAllo
3d40: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
3d50: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
3d60: 73 48 65 61 70 41 6c 6c 6f 63 20 28 28 4c 50 56  sHeapAlloc ((LPV
3d70: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OID(WINAPI*)(HAN
3d80: 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  DLE,DWORD, \.   
3d90: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
3da0: 73 63 61 6c 6c 5b 33 35 5d 2e 70 43 75 72 72 65  scall[35].pCurre
3db0: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 43 72  nt)..  { "HeapCr
3dc0: 65 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  eate",          
3dd0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
3de0: 70 43 72 65 61 74 65 2c 20 20 20 20 20 20 20 20  pCreate,        
3df0: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
3e00: 69 6e 65 20 6f 73 48 65 61 70 43 72 65 61 74 65  ine osHeapCreate
3e10: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
3e20: 2a 29 28 44 57 4f 52 44 2c 53 49 5a 45 5f 54 2c  *)(DWORD,SIZE_T,
3e30: 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f   \.        SIZE_
3e40: 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 36 5d 2e  T))aSyscall[36].
3e50: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3e60: 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20 20  HeapDestroy",   
3e70: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3e80: 4c 4c 29 48 65 61 70 44 65 73 74 72 6f 79 2c 20  LL)HeapDestroy, 
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3ea0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
3eb0: 44 65 73 74 72 6f 79 20 28 28 42 4f 4f 4c 28 57  Destroy ((BOOL(W
3ec0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29  INAPI*)(HANDLE))
3ed0: 61 53 79 73 63 61 6c 6c 5b 33 37 5d 2e 70 43 75  aSyscall[37].pCu
3ee0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61  rrent)..  { "Hea
3ef0: 70 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20  pFree",         
3f00: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3f10: 48 65 61 70 46 72 65 65 2c 20 20 20 20 20 20 20  HeapFree,       
3f20: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
3f30: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 46 72 65  define osHeapFre
3f40: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
3f50: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c  )(HANDLE,DWORD,L
3f60: 50 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  PVOID))aSyscall[
3f70: 33 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  38].pCurrent).. 
3f80: 20 7b 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22   { "HeapReAlloc"
3f90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
3fa0: 59 53 43 41 4c 4c 29 48 65 61 70 52 65 41 6c 6c  YSCALL)HeapReAll
3fb0: 6f 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  oc,             
3fc0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
3fd0: 48 65 61 70 52 65 41 6c 6c 6f 63 20 28 28 4c 50  HeapReAlloc ((LP
3fe0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41  VOID(WINAPI*)(HA
3ff0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49  NDLE,DWORD,LPVOI
4000: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  D, \.        SIZ
4010: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 39  E_T))aSyscall[39
4020: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
4030: 20 22 48 65 61 70 53 69 7a 65 22 2c 20 20 20 20   "HeapSize",    
4040: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4050: 43 41 4c 4c 29 48 65 61 70 53 69 7a 65 2c 20 20  CALL)HeapSize,  
4060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4070: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
4080: 61 70 53 69 7a 65 20 28 28 53 49 5a 45 5f 54 28  apSize ((SIZE_T(
4090: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
40a0: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
40b0: 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61   LPCVOID))aSysca
40c0: 6c 6c 5b 34 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[40].pCurrent)
40d0: 0a 0a 20 20 7b 20 22 48 65 61 70 56 61 6c 69 64  ..  { "HeapValid
40e0: 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ate",           
40f0: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 56 61   (SYSCALL)HeapVa
4100: 6c 69 64 61 74 65 2c 20 20 20 20 20 20 20 20 20  lidate,         
4110: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
4120: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 20   osHeapValidate 
4130: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4140: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a  HANDLE,DWORD, \.
4150: 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29          LPCVOID)
4160: 29 61 53 79 73 63 61 6c 6c 5b 34 31 5d 2e 70 43  )aSyscall[41].pC
4170: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
4180: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4190: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
41a0: 22 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20  "LoadLibraryA", 
41b0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
41c0: 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 41  ALL)LoadLibraryA
41d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
41e0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61  ,.#else.  { "Loa
41f0: 64 4c 69 62 72 61 72 79 41 22 2c 20 20 20 20 20  dLibraryA",     
4200: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4210: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4220: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4230: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4240: 4c 6f 61 64 4c 69 62 72 61 72 79 41 20 28 28 48  LoadLibraryA ((H
4250: 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28  MODULE(WINAPI*)(
4260: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
4270: 5b 34 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [42].pCurrent)..
4280: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
4290: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
42a0: 45 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72  E).  { "LoadLibr
42b0: 61 72 79 57 22 2c 20 20 20 20 20 20 20 20 20 20  aryW",          
42c0: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c    (SYSCALL)LoadL
42d0: 69 62 72 61 72 79 57 2c 20 20 20 20 20 20 20 20  ibraryW,        
42e0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
42f0: 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 57   { "LoadLibraryW
4300: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
4310: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4330: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4340: 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61  fine osLoadLibra
4350: 72 79 57 20 28 28 48 4d 4f 44 55 4c 45 28 57 49  ryW ((HMODULE(WI
4360: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29  NAPI*)(LPCWSTR))
4370: 61 53 79 73 63 61 6c 6c 5b 34 33 5d 2e 70 43 75  aSyscall[43].pCu
4380: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 4c 6f 63  rrent)..  { "Loc
4390: 61 6c 46 72 65 65 22 2c 20 20 20 20 20 20 20 20  alFree",        
43a0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
43b0: 4c 6f 63 61 6c 46 72 65 65 2c 20 20 20 20 20 20  LocalFree,      
43c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
43d0: 64 65 66 69 6e 65 20 6f 73 4c 6f 63 61 6c 46 72  define osLocalFr
43e0: 65 65 20 28 28 48 4c 4f 43 41 4c 28 57 49 4e 41  ee ((HLOCAL(WINA
43f0: 50 49 2a 29 28 48 4c 4f 43 41 4c 29 29 61 53 79  PI*)(HLOCAL))aSy
4400: 73 63 61 6c 6c 5b 34 34 5d 2e 70 43 75 72 72 65  scall[44].pCurre
4410: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
4420: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c  _OS_WINCE.  { "L
4430: 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20  ockFile",       
4440: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4450: 4c 29 4c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20  L)LockFile,     
4460: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4470: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46  .#define osLockF
4480: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
4490: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
44a0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
44b0: 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61          DWORD))a
44c0: 53 79 73 63 61 6c 6c 5b 34 35 5d 2e 70 43 75 72  Syscall[45].pCur
44d0: 72 65 6e 74 29 0a 23 65 6c 73 65 0a 20 20 7b 20  rent).#else.  { 
44e0: 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20  "LockFile",     
44f0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4500: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4510: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4520: 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53  ,.#endif..#if !S
4530: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
4540: 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c   { "LockFileEx",
4550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
4560: 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 45  YSCALL)LockFileE
4570: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
4580: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
4590: 4c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f  LockFileEx ((BOO
45a0: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
45b0: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
45c0: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
45d0: 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45       LPOVERLAPPE
45e0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 36 5d 2e  D))aSyscall[46].
45f0: 70 43 75 72 72 65 6e 74 29 0a 23 65 6c 73 65 0a  pCurrent).#else.
4600: 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22    { "LockFileEx"
4610: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
4620: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4640: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 20 20   0 },.#endif..  
4650: 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  { "MapViewOfFile
4660: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
4670: 53 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46  SCALL)MapViewOfF
4680: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 30  ile,           0
4690: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d   },..#define osM
46a0: 61 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 4c  apViewOfFile ((L
46b0: 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48  PVOID(WINAPI*)(H
46c0: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52  ANDLE,DWORD,DWOR
46d0: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
46e0: 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63     SIZE_T))aSysc
46f0: 61 6c 6c 5b 34 37 5d 2e 70 43 75 72 72 65 6e 74  all[47].pCurrent
4700: 29 0a 0a 20 20 7b 20 22 4d 75 6c 74 69 42 79 74  )..  { "MultiByt
4710: 65 54 6f 57 69 64 65 43 68 61 72 22 2c 20 20 20  eToWideChar",   
4720: 20 20 28 53 59 53 43 41 4c 4c 29 4d 75 6c 74 69    (SYSCALL)Multi
4730: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 2c 20  ByteToWideChar, 
4740: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
4750: 65 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  e osMultiByteToW
4760: 69 64 65 43 68 61 72 20 28 28 69 6e 74 28 57 49  ideChar ((int(WI
4770: 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52  NAPI*)(UINT,DWOR
4780: 44 2c 4c 50 43 53 54 52 2c 69 6e 74 2c 4c 50 57  D,LPCSTR,int,LPW
4790: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 69  STR, \.        i
47a0: 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 34 38 5d  nt))aSyscall[48]
47b0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
47c0: 22 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63  "QueryPerformanc
47d0: 65 43 6f 75 6e 74 65 72 22 2c 20 28 53 59 53 43  eCounter", (SYSC
47e0: 41 4c 4c 29 51 75 65 72 79 50 65 72 66 6f 72 6d  ALL)QueryPerform
47f0: 61 6e 63 65 43 6f 75 6e 74 65 72 2c 20 30 20 7d  anceCounter, 0 }
4800: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 51 75 65  ,..#define osQue
4810: 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75  ryPerformanceCou
4820: 6e 74 65 72 20 28 28 42 4f 4f 4c 28 57 49 4e 41  nter ((BOOL(WINA
4830: 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20  PI*)( \.        
4840: 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2a 29 29  LARGE_INTEGER*))
4850: 61 53 79 73 63 61 6c 6c 5b 34 39 5d 2e 70 43 75  aSyscall[49].pCu
4860: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 52 65 61  rrent)..  { "Rea
4870: 64 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  dFile",         
4880: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4890: 52 65 61 64 46 69 6c 65 2c 20 20 20 20 20 20 20  ReadFile,       
48a0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
48b0: 64 65 66 69 6e 65 20 6f 73 52 65 61 64 46 69 6c  define osReadFil
48c0: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
48d0: 29 28 48 41 4e 44 4c 45 2c 4c 50 56 4f 49 44 2c  )(HANDLE,LPVOID,
48e0: 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c  DWORD,LPDWORD, \
48f0: 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c  .        LPOVERL
4900: 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b  APPED))aSyscall[
4910: 35 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  50].pCurrent).. 
4920: 20 7b 20 22 53 65 74 45 6e 64 4f 66 46 69 6c 65   { "SetEndOfFile
4930: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
4940: 59 53 43 41 4c 4c 29 53 65 74 45 6e 64 4f 66 46  YSCALL)SetEndOfF
4950: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
4960: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
4970: 53 65 74 45 6e 64 4f 66 46 69 6c 65 20 28 28 42  SetEndOfFile ((B
4980: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
4990: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 31  DLE))aSyscall[51
49a0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
49b0: 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72   "SetFilePointer
49c0: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
49d0: 43 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e  CALL)SetFilePoin
49e0: 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 30 20  ter,          0 
49f0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65  },..#define osSe
4a00: 74 46 69 6c 65 50 6f 69 6e 74 65 72 20 28 28 44  tFilePointer ((D
4a10: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41  WORD(WINAPI*)(HA
4a20: 4e 44 4c 45 2c 4c 4f 4e 47 2c 50 4c 4f 4e 47 2c  NDLE,LONG,PLONG,
4a30: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
4a40: 29 29 61 53 79 73 63 61 6c 6c 5b 35 32 5d 2e 70  ))aSyscall[52].p
4a50: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
4a60: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
4a70: 7b 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20  { "Sleep",      
4a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4a90: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4ab0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53   },.#else.  { "S
4ac0: 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20 20 20  leep",          
4ad0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4ae0: 4c 29 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20  L)Sleep,        
4af0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4b00: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4b10: 6f 73 53 6c 65 65 70 20 28 28 56 4f 49 44 28 57  osSleep ((VOID(W
4b20: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 29 29 61  INAPI*)(DWORD))a
4b30: 53 79 73 63 61 6c 6c 5b 35 33 5d 2e 70 43 75 72  Syscall[53].pCur
4b40: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 79 73 74  rent)..  { "Syst
4b50: 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
4b60: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53  ",    (SYSCALL)S
4b70: 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
4b80: 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 0a 23 64  ime,    0 },..#d
4b90: 65 66 69 6e 65 20 6f 73 53 79 73 74 65 6d 54 69  efine osSystemTi
4ba0: 6d 65 54 6f 46 69 6c 65 54 69 6d 65 20 28 28 42  meToFileTime ((B
4bb0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e  OOL(WINAPI*)(CON
4bc0: 53 54 20 53 59 53 54 45 4d 54 49 4d 45 2a 2c 20  ST SYSTEMTIME*, 
4bd0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45  \.        LPFILE
4be0: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 35  TIME))aSyscall[5
4bf0: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
4c00: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
4c10: 43 45 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69  CE.  { "UnlockFi
4c20: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
4c30: 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63    (SYSCALL)Unloc
4c40: 6b 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  kFile,          
4c50: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
4c60: 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 28  e osUnlockFile (
4c70: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
4c80: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52  ANDLE,DWORD,DWOR
4c90: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
4ca0: 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61     DWORD))aSysca
4cb0: 6c 6c 5b 35 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[55].pCurrent)
4cc0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f  .#else.  { "Unlo
4cd0: 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  ckFile",        
4ce0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4cf0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4d00: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4d10: 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  dif..#if !SQLITE
4d20: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55  _OS_WINCE.  { "U
4d30: 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20  nlockFileEx",   
4d40: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4d50: 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c 20  L)UnlockFileEx, 
4d60: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4d70: 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63  .#define osUnloc
4d80: 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57  kFileEx ((BOOL(W
4d90: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
4da0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
4db0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56  , \.        LPOV
4dc0: 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61  ERLAPPED))aSysca
4dd0: 6c 6c 5b 35 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[56].pCurrent)
4de0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f  .#else.  { "Unlo
4df0: 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20  ckFileEx",      
4e00: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4e10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4e20: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4e30: 64 69 66 0a 0a 20 20 7b 20 22 55 6e 6d 61 70 56  dif..  { "UnmapV
4e40: 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20  iewOfFile",     
4e50: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6d      (SYSCALL)Unm
4e60: 61 70 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20  apViewOfFile,   
4e70: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
4e80: 69 6e 65 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f  ine osUnmapViewO
4e90: 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e  fFile ((BOOL(WIN
4ea0: 41 50 49 2a 29 28 4c 50 43 56 4f 49 44 29 29 61  API*)(LPCVOID))a
4eb0: 53 79 73 63 61 6c 6c 5b 35 37 5d 2e 70 43 75 72  Syscall[57].pCur
4ec0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57 69 64 65  rent)..  { "Wide
4ed0: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 22  CharToMultiByte"
4ee0: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57  ,     (SYSCALL)W
4ef0: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
4f00: 74 65 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64  te,     0 },..#d
4f10: 65 66 69 6e 65 20 6f 73 57 69 64 65 43 68 61 72  efine osWideChar
4f20: 54 6f 4d 75 6c 74 69 42 79 74 65 20 28 28 69 6e  ToMultiByte ((in
4f30: 74 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c  t(WINAPI*)(UINT,
4f40: 44 57 4f 52 44 2c 4c 50 43 57 53 54 52 2c 69 6e  DWORD,LPCWSTR,in
4f50: 74 2c 4c 50 53 54 52 2c 69 6e 74 2c 20 5c 0a 20  t,LPSTR,int, \. 
4f60: 20 20 20 20 20 20 20 4c 50 43 53 54 52 2c 4c 50         LPCSTR,LP
4f70: 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 35  BOOL))aSyscall[5
4f80: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  8].pCurrent)..  
4f90: 7b 20 22 57 72 69 74 65 46 69 6c 65 22 2c 20 20  { "WriteFile",  
4fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4fb0: 53 43 41 4c 4c 29 57 72 69 74 65 46 69 6c 65 2c  SCALL)WriteFile,
4fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4fd0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57   },..#define osW
4fe0: 72 69 74 65 46 69 6c 65 20 28 28 42 4f 4f 4c 28  riteFile ((BOOL(
4ff0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
5000: 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50  LPCVOID,DWORD,LP
5010: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
5020: 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61   LPOVERLAPPED))a
5030: 53 79 73 63 61 6c 6c 5b 35 39 5d 2e 70 43 75 72  Syscall[59].pCur
5040: 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64  rent)..}; /* End
5050: 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65   of the override
5060: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
5070: 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  s */../*.** This
5080: 20 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74   is the xSetSyst
5090: 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20  emCall() method 
50a0: 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66  of sqlite3_vfs f
50b0: 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a  or all of the.**
50c0: 20 22 77 69 6e 33 32 22 20 56 46 53 65 73 2e 20   "win32" VFSes. 
50d0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
50e0: 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75  K opon successfu
50f0: 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68 65  lly updating the
5100: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  .** system call 
5110: 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49  pointer, or SQLI
5120: 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74  TE_NOTFOUND if t
5130: 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69  here is no confi
5140: 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65  gurable.** syste
5150: 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61  m call named zNa
5160: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
5170: 74 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61  t winSetSystemCa
5180: 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ll(.  sqlite3_vf
5190: 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20  s *pNotUsed,    
51a0: 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70      /* The VFS p
51b0: 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65  ointer.  Not use
51c0: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
51d0: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
51e0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
51f0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f  system call to o
5200: 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c  verride */.  sql
5210: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
5220: 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f   pNewFunc  /* Po
5230: 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73  inter to new sys
5240: 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a  tem call value *
5250: 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
5260: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20  int i;.  int rc 
5270: 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  = SQLITE_NOTFOUN
5280: 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  D;..  UNUSED_PAR
5290: 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29  AMETER(pNotUsed)
52a0: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
52b0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f   ){.    /* If no
52c0: 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c   zName is given,
52d0: 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73   restore all sys
52e0: 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65  tem calls to the
52f0: 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a  ir default.    *
5300: 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72  * settings and r
5310: 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a  eturn NULL.    *
5320: 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
5330: 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d  E_OK;.    for(i=
5340: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
5350: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
5360: 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b  scall[0]); i++){
5370: 0a 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63  .      if( aSysc
5380: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20  all[i].pDefault 
5390: 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63  ){.        aSysc
53a0: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20  all[i].pCurrent 
53b0: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  = aSyscall[i].pD
53c0: 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a  efault;.      }.
53d0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
53e0: 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69     /* If zName i
53f0: 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65  s specified, ope
5400: 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65  rate on only the
5410: 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   one system call
5420: 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65  .    ** specifie
5430: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
5440: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
5450: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
5460: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
5470: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
5480: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79  trcmp(zName, aSy
5490: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  scall[i].zName)=
54a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
54b0: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  ( aSyscall[i].pD
54c0: 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20  efault==0 ){.   
54d0: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
54e0: 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53  i].pDefault = aS
54f0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
5500: 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nt;.        }.  
5510: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
5520: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  E_OK;.        if
5530: 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20  ( pNewFunc==0 ) 
5540: 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63  pNewFunc = aSysc
5550: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b  all[i].pDefault;
5560: 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c  .        aSyscal
5570: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20  l[i].pCurrent = 
5580: 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20  pNewFunc;.      
5590: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
55a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
55b0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
55c0: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
55d0: 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61  e of a system ca
55e0: 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ll.  Return NULL
55f0: 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74   if zName is not
5600: 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64   a.** recognized
5610: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d   system call nam
5620: 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f  e.  NULL is also
5630: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
5640: 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20   system call.** 
5650: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  is currently und
5660: 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
5670: 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c  c sqlite3_syscal
5680: 6c 5f 70 74 72 20 77 69 6e 47 65 74 53 79 73 74  l_ptr winGetSyst
5690: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
56a0: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
56b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
56c0: 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  Name.){.  unsign
56d0: 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55  ed int i;..  UNU
56e0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
56f0: 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69  otUsed);.  for(i
5700: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
5710: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
5720: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
5730: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
5740: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
5750: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
5760: 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b  return aSyscall[
5770: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d  i].pCurrent;.  }
5780: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
5790: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
57a0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
57b0: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61  st system call a
57c0: 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20  fter zName.  If 
57d0: 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74  zName==NULL.** t
57e0: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e  hen return the n
57f0: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
5800: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
5810: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
5820: 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61  ame.** is the la
5830: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f  st system call o
5840: 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  r if zName is no
5850: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
5860: 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20  valid.** system 
5870: 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
5880: 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 69 6e 4e  const char *winN
5890: 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71  extSystemCall(sq
58a0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f  lite3_vfs *p, co
58b0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
58c0: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a  {.  int i = -1;.
58d0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
58e0: 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e  TER(p);.  if( zN
58f0: 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ame ){.    for(i
5900: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
5910: 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b  aSyscall)-1; i++
5920: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
5930: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
5940: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
5950: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
5960: 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69    }.  for(i++; i
5970: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63  <ArraySize(aSysc
5980: 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  all); i++){.    
5990: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
59a0: 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65  pCurrent!=0 ) re
59b0: 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d  turn aSyscall[i]
59c0: 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65  .zName;.  }.  re
59d0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
59e0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
59f0: 6f 75 74 69 6e 65 20 53 75 73 70 65 6e 64 73 20  outine Suspends 
5a00: 74 68 65 20 74 68 72 65 61 64 20 66 6f 72 20 61  the thread for a
5a10: 74 20 6c 65 61 73 74 20 6d 73 20 6d 69 6c 6c 69  t least ms milli
5a20: 73 65 63 6f 6e 64 73 2e 20 20 54 68 69 73 20 69  seconds.  This i
5a30: 73 20 65 71 75 69 76 61 6c 65 6e 74 0a 2a 2a 20  s equivalent.** 
5a40: 74 6f 20 74 68 65 20 77 69 6e 33 32 20 53 6c 65  to the win32 Sle
5a50: 65 70 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a  ep() interface..
5a60: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
5a70: 5f 57 49 4e 52 54 0a 73 74 61 74 69 63 20 48 41  _WINRT.static HA
5a80: 4e 44 4c 45 20 73 6c 65 65 70 4f 62 6a 3b 0a 73  NDLE sleepObj;.s
5a90: 74 61 74 69 63 20 76 6f 69 64 20 70 6f 72 74 61  tatic void porta
5aa0: 62 6c 65 53 6c 65 65 70 28 69 6e 74 20 6d 73 29  bleSleep(int ms)
5ab0: 7b 0a 20 20 57 61 69 74 46 6f 72 53 69 6e 67 6c  {.  WaitForSingl
5ac0: 65 4f 62 6a 65 63 74 45 78 28 73 6c 65 65 70 4f  eObjectEx(sleepO
5ad0: 62 6a 2c 20 6d 73 2c 20 46 41 4c 53 45 29 3b 0a  bj, ms, FALSE);.
5ae0: 7d 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 76  }.#else.static v
5af0: 6f 69 64 20 70 6f 72 74 61 62 6c 65 53 6c 65 65  oid portableSlee
5b00: 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20 6f 73 53  p(int ms){.  osS
5b10: 6c 65 65 70 28 6d 73 29 3b 20 0a 7d 0a 23 65 6e  leep(ms); .}.#en
5b20: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
5b30: 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f  n true (non-zero
5b40: 29 20 69 66 20 77 65 20 61 72 65 20 72 75 6e 6e  ) if we are runn
5b50: 69 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e 54 2c  ing under WinNT,
5b60: 20 57 69 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a 2a   Win2K, WinXP,.*
5b70: 2a 20 6f 72 20 57 69 6e 43 45 2e 20 20 52 65 74  * or WinCE.  Ret
5b80: 75 72 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f 29  urn false (zero)
5b90: 20 66 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e 39   for Win95, Win9
5ba0: 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a 0a  8, or WinME..**.
5bb0: 2a 2a 20 48 65 72 65 20 69 73 20 61 6e 20 69 6e  ** Here is an in
5bc0: 74 65 72 65 73 74 69 6e 67 20 6f 62 73 65 72 76  teresting observ
5bd0: 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20 57  ation:  Win95, W
5be0: 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45 20  in98, and WinME 
5bf0: 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b  lack.** the Lock
5c00: 46 69 6c 65 45 78 28 29 20 41 50 49 2e 20 20 42  FileEx() API.  B
5c10: 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c 6c 20  ut we can still 
5c20: 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 20  statically link 
5c30: 61 67 61 69 6e 73 74 20 74 68 61 74 0a 2a 2a 20  against that.** 
5c40: 41 50 49 20 61 73 20 6c 6f 6e 67 20 61 73 20 77  API as long as w
5c50: 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74 20  e don't call it 
5c60: 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e  when running Win
5c70: 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c  95/98/ME.  A cal
5c80: 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75  l to.** this rou
5c90: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
5ca0: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
5cb0: 20 68 6f 73 74 20 69 73 20 57 69 6e 39 35 2f 39   host is Win95/9
5cc0: 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54  8/ME or.** WinNT
5cd0: 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61 74 20 77  /2K/XP so that w
5ce0: 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74  e will know whet
5cf0: 68 65 72 20 6f 72 20 6e 6f 74 20 77 65 20 63 61  her or not we ca
5d00: 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a  n safely call.**
5d10: 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28   the LockFileEx(
5d20: 29 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 20 53 51  ) API..*/.#if SQ
5d30: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 20 7c  LITE_OS_WINCE  |
5d40: 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  | SQLITE_OS_WINR
5d50: 54 0a 23 20 64 65 66 69 6e 65 20 69 73 4e 54 28  T.# define isNT(
5d60: 29 20 20 28 31 29 0a 23 65 6c 73 65 0a 20 20 73  )  (1).#else.  s
5d70: 74 61 74 69 63 20 69 6e 74 20 69 73 4e 54 28 76  tatic int isNT(v
5d80: 6f 69 64 29 7b 0a 20 20 20 20 69 66 28 20 73 71  oid){.    if( sq
5d90: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 30  lite3_os_type==0
5da0: 20 29 7b 0a 20 20 20 20 20 20 4f 53 56 45 52 53   ){.      OSVERS
5db0: 49 4f 4e 49 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a  IONINFOA sInfo;.
5dc0: 20 20 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53        sInfo.dwOS
5dd0: 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20  VersionInfoSize 
5de0: 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b  = sizeof(sInfo);
5df0: 0a 20 20 20 20 20 20 6f 73 47 65 74 56 65 72 73  .      osGetVers
5e00: 69 6f 6e 45 78 41 28 26 73 49 6e 66 6f 29 3b 0a  ionExA(&sInfo);.
5e10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73        sqlite3_os
5e20: 5f 74 79 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77  _type = sInfo.dw
5e30: 50 6c 61 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f  PlatformId==VER_
5e40: 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e  PLATFORM_WIN32_N
5e50: 54 20 3f 20 32 20 3a 20 31 3b 0a 20 20 20 20 7d  T ? 2 : 1;.    }
5e60: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
5e70: 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 3b 0a  te3_os_type==2;.
5e80: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
5e90: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f  LITE_OS_WINCE */
5ea0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5eb0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a  WIN32_MALLOC./*.
5ec0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
5ed0: 65 73 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  es of memory..*/
5ee0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
5ef0: 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e  nMemMalloc(int n
5f00: 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45  Bytes){.  HANDLE
5f10: 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a   hHeap;.  void *
5f20: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
5f30: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
5f40: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
5f50: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
5f60: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
5f70: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
5f80: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
5f90: 45 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  E );.#ifdef SQLI
5fa0: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
5fb0: 56 41 4c 49 44 41 54 45 0a 20 20 61 73 73 65 72  VALIDATE.  asser
5fc0: 74 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  t ( osHeapValida
5fd0: 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  te(hHeap, SQLITE
5fe0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
5ff0: 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64  S, NULL) );.#end
6000: 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  if.  assert( nBy
6010: 74 65 73 3e 3d 30 20 29 3b 0a 20 20 70 20 3d 20  tes>=0 );.  p = 
6020: 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61  osHeapAlloc(hHea
6030: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
6040: 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a  HEAP_FLAGS, (SIZ
6050: 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 69  E_T)nBytes);.  i
6060: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c  f( !p ){.    sql
6070: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
6080: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
6090: 6f 20 48 65 61 70 41 6c 6c 6f 63 20 25 75 20 62  o HeapAlloc %u b
60a0: 79 74 65 73 20 28 25 64 29 2c 20 68 65 61 70 3d  ytes (%d), heap=
60b0: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
60c0: 20 20 20 20 20 6e 42 79 74 65 73 2c 20 6f 73 47       nBytes, osG
60d0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
60e0: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
60f0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
6100: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f  ./*.** Free memo
6110: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
6120: 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f  id winMemFree(vo
6130: 69 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20 48  id *pPrior){.  H
6140: 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20  ANDLE hHeap;..  
6150: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
6160: 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77  c();.  hHeap = w
6170: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a  inMemGetHeap();.
6180: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
6190: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
61a0: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
61b0: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
61c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
61d0: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
61e0: 54 45 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73  TE.  assert ( os
61f0: 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65  HeapValidate(hHe
6200: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
6210: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72  _HEAP_FLAGS, pPr
6220: 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ior) );.#endif. 
6230: 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 20 72   if( !pPrior ) r
6240: 65 74 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69 6e  eturn; /* Passin
6250: 67 20 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46 72  g NULL to HeapFr
6260: 65 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ee is undefined.
6270: 20 2a 2f 0a 20 20 69 66 28 20 21 6f 73 48 65 61   */.  if( !osHea
6280: 70 46 72 65 65 28 68 48 65 61 70 2c 20 53 51 4c  pFree(hHeap, SQL
6290: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
62a0: 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 7b  LAGS, pPrior) ){
62b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
62c0: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22  (SQLITE_NOMEM, "
62d0: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 46 72  failed to HeapFr
62e0: 65 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 64 29  ee block %p (%d)
62f0: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
6300: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69              pPri
6310: 6f 72 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  or, osGetLastErr
6320: 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65  or(), (void*)hHe
6330: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ap);.  }.}../*.*
6340: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a  * Change the siz
6350: 65 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e of an existing
6360: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
6370: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on.*/.static voi
6380: 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63  d *winMemRealloc
6390: 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69  (void *pPrior, i
63a0: 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41  nt nBytes){.  HA
63b0: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f  NDLE hHeap;.  vo
63c0: 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d  id *p;..  winMem
63d0: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
63e0: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47   hHeap = winMemG
63f0: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65  etHeap();.  asse
6400: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a  rt( hHeap!=0 );.
6410: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
6420: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
6430: 56 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66 20  VALUE );.#ifdef 
6440: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
6450: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20 61  LOC_VALIDATE.  a
6460: 73 73 65 72 74 20 28 20 6f 73 48 65 61 70 56 61  ssert ( osHeapVa
6470: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
6480: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
6490: 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29  FLAGS, pPrior) )
64a0: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
64b0: 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a  t( nBytes>=0 );.
64c0: 20 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 7b    if( !pPrior ){
64d0: 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 41  .    p = osHeapA
64e0: 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49  lloc(hHeap, SQLI
64f0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
6500: 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79  AGS, (SIZE_T)nBy
6510: 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tes);.  }else{. 
6520: 20 20 20 70 20 3d 20 6f 73 48 65 61 70 52 65 41     p = osHeapReA
6530: 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49  lloc(hHeap, SQLI
6540: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
6550: 41 47 53 2c 20 70 50 72 69 6f 72 2c 20 28 53 49  AGS, pPrior, (SI
6560: 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20  ZE_T)nBytes);.  
6570: 7d 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  }.  if( !p ){.  
6580: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
6590: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
65a0: 6c 65 64 20 74 6f 20 25 73 20 25 75 20 62 79 74  led to %s %u byt
65b0: 65 73 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70  es (%d), heap=%p
65c0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
65d0: 20 20 20 70 50 72 69 6f 72 20 3f 20 22 48 65 61     pPrior ? "Hea
65e0: 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48 65 61  pReAlloc" : "Hea
65f0: 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65 73 2c  pAlloc", nBytes,
6600: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
6610: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
6620: 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29     (void*)hHeap)
6630: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
6640: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6650: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e  n the size of an
6660: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c   outstanding all
6670: 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79 74 65  ocation, in byte
6680: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
6690: 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64   winMemSize(void
66a0: 20 2a 70 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68   *p){.  HANDLE h
66b0: 48 65 61 70 3b 0a 20 20 53 49 5a 45 5f 54 20 6e  Heap;.  SIZE_T n
66c0: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
66d0: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
66e0: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
66f0: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
6700: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
6710: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
6720: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
6730: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
6740: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
6750: 41 4c 49 44 41 54 45 0a 20 20 61 73 73 65 72 74  ALIDATE.  assert
6760: 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74   ( osHeapValidat
6770: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
6780: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
6790: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
67a0: 66 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  f.  if( !p ) ret
67b0: 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f 73 48  urn 0;.  n = osH
67c0: 65 61 70 53 69 7a 65 28 68 48 65 61 70 2c 20 53  eapSize(hHeap, S
67d0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
67e0: 5f 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20 69 66  _FLAGS, p);.  if
67f0: 28 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d 31 20  ( n==(SIZE_T)-1 
6800: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
6810: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
6820: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
6830: 53 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20 28 25  Size block %p (%
6840: 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  d), heap=%p",.  
6850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c                p,
6860: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
6870: 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29  ), (void*)hHeap)
6880: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
6890: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e    }.  return (in
68a0: 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  t)n;.}../*.** Ro
68b0: 75 6e 64 20 75 70 20 61 20 72 65 71 75 65 73 74  und up a request
68c0: 20 73 69 7a 65 20 74 6f 20 74 68 65 20 6e 65 78   size to the nex
68d0: 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69  t valid allocati
68e0: 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  on size..*/.stat
68f0: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75  ic int winMemRou
6900: 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72  ndup(int n){.  r
6910: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
6920: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69  * Initialize thi
6930: 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61  s module..*/.sta
6940: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e  tic int winMemIn
6950: 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74  it(void *pAppDat
6960: 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61  a){.  winMemData
6970: 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20   *pWinMemData = 
6980: 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41  (winMemData *)pA
6990: 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21  ppData;..  if( !
69a0: 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65  pWinMemData ) re
69b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
69c0: 52 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69  R;.  assert( pWi
69d0: 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 3d  nMemData->magic=
69e0: 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 29 3b  =WINMEM_MAGIC );
69f0: 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44  .  if( !pWinMemD
6a00: 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20  ata->hHeap ){.  
6a10: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68    pWinMemData->h
6a20: 48 65 61 70 20 3d 20 6f 73 48 65 61 70 43 72 65  Heap = osHeapCre
6a30: 61 74 65 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ate(SQLITE_WIN32
6a40: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20  _HEAP_FLAGS,.   
6a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a70: 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f     SQLITE_WIN32_
6a80: 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 0a  HEAP_INIT_SIZE,.
6a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ab0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e        SQLITE_WIN
6ac0: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45  32_HEAP_MAX_SIZE
6ad0: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 57 69 6e  );.    if( !pWin
6ae0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29  MemData->hHeap )
6af0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
6b00: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
6b10: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 66 61 69  ,.          "fai
6b20: 6c 65 64 20 74 6f 20 48 65 61 70 43 72 65 61 74  led to HeapCreat
6b30: 65 20 28 25 64 29 2c 20 66 6c 61 67 73 3d 25 75  e (%d), flags=%u
6b40: 2c 20 69 6e 69 74 53 69 7a 65 3d 25 75 2c 20 6d  , initSize=%u, m
6b50: 61 78 53 69 7a 65 3d 25 75 22 2c 0a 20 20 20 20  axSize=%u",.    
6b60: 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
6b70: 72 72 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f 57  rror(), SQLITE_W
6b80: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
6b90: 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
6ba0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49  E_WIN32_HEAP_INI
6bb0: 54 5f 53 49 5a 45 2c 20 53 51 4c 49 54 45 5f 57  T_SIZE, SQLITE_W
6bc0: 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49  IN32_HEAP_MAX_SI
6bd0: 5a 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ZE);.      retur
6be0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
6bf0: 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65      }.    pWinMe
6c00: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20  mData->bOwned = 
6c10: 54 52 55 45 3b 0a 20 20 7d 0a 20 20 61 73 73 65  TRUE;.  }.  asse
6c20: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
6c30: 3e 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61  >hHeap!=0 );.  a
6c40: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
6c50: 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c  ta->hHeap!=INVAL
6c60: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
6c70: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
6c80: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
6c90: 4c 49 44 41 54 45 0a 20 20 61 73 73 65 72 74 28  LIDATE.  assert(
6ca0: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
6cb0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
6cc0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
6cd0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c  _HEAP_FLAGS, NUL
6ce0: 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  L) );.#endif.  r
6cf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6d00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74  .}../*.** Deinit
6d10: 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75  ialize this modu
6d20: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
6d30: 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77  id winMemShutdow
6d40: 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  n(void *pAppData
6d50: 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20  ){.  winMemData 
6d60: 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28  *pWinMemData = (
6d70: 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70  winMemData *)pAp
6d80: 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70  pData;..  if( !p
6d90: 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74  WinMemData ) ret
6da0: 75 72 6e 3b 0a 20 20 69 66 28 20 70 57 69 6e 4d  urn;.  if( pWinM
6db0: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b  emData->hHeap ){
6dc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69  .    assert( pWi
6dd0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21  nMemData->hHeap!
6de0: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
6df0: 56 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66 20  VALUE );.#ifdef 
6e00: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
6e10: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20 20  LOC_VALIDATE.   
6e20: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56   assert( osHeapV
6e30: 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44  alidate(pWinMemD
6e40: 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49  ata->hHeap, SQLI
6e50: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
6e60: 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65  AGS, NULL) );.#e
6e70: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 57 69  ndif.    if( pWi
6e80: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64  nMemData->bOwned
6e90: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6f   ){.      if( !o
6ea0: 73 48 65 61 70 44 65 73 74 72 6f 79 28 70 57 69  sHeapDestroy(pWi
6eb0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29  nMemData->hHeap)
6ec0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6ed0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
6ee0: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
6ef0: 20 48 65 61 70 44 65 73 74 72 6f 79 20 28 25 64   HeapDestroy (%d
6f00: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
6f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f20: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
6f30: 29 2c 20 28 76 6f 69 64 2a 29 70 57 69 6e 4d 65  ), (void*)pWinMe
6f40: 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 3b 0a 20  mData->hHeap);. 
6f50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57 69       }.      pWi
6f60: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64  nMemData->bOwned
6f70: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a   = FALSE;.    }.
6f80: 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d      pWinMemData-
6f90: 3e 68 48 65 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20  >hHeap = NULL;. 
6fa0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75   }.}../*.** Popu
6fb0: 6c 61 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76  late the low-lev
6fc0: 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  el memory alloca
6fd0: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f  tion function po
6fe0: 69 6e 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c  inters in.** sql
6ff0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
7000: 2e 6d 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73  .m with pointers
7010: 20 74 6f 20 74 68 65 20 72 6f 75 74 69 6e 65 73   to the routines
7020: 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 54   in this file. T
7030: 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20  he.** arguments 
7040: 73 70 65 63 69 66 79 20 74 68 65 20 62 6c 6f 63  specify the bloc
7050: 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6d  k of memory to m
7060: 61 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  anage..**.** Thi
7070: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
7080: 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69  y called by sqli
7090: 74 65 33 5f 63 6f 6e 66 69 67 28 29 2c 20 61 6e  te3_config(), an
70a0: 64 20 74 68 65 72 65 66 6f 72 65 0a 2a 2a 20 69  d therefore.** i
70b0: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74  s not required t
70c0: 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65 20  o be threadsafe 
70d0: 28 69 74 20 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a  (it is not)..*/.
70e0: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65  const sqlite3_me
70f0: 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74  m_methods *sqlit
7100: 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f  e3MemGetWin32(vo
7110: 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  id){.  static co
7120: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  nst sqlite3_mem_
7130: 6d 65 74 68 6f 64 73 20 77 69 6e 4d 65 6d 4d 65  methods winMemMe
7140: 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20 20 77 69  thods = {.    wi
7150: 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20  nMemMalloc,.    
7160: 77 69 6e 4d 65 6d 46 72 65 65 2c 0a 20 20 20 20  winMemFree,.    
7170: 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20  winMemRealloc,. 
7180: 20 20 20 77 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20     winMemSize,. 
7190: 20 20 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70     winMemRoundup
71a0: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 49 6e 69 74  ,.    winMemInit
71b0: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74  ,.    winMemShut
71c0: 64 6f 77 6e 2c 0a 20 20 20 20 26 77 69 6e 5f 6d  down,.    &win_m
71d0: 65 6d 5f 64 61 74 61 0a 20 20 7d 3b 0a 20 20 72  em_data.  };.  r
71e0: 65 74 75 72 6e 20 26 77 69 6e 4d 65 6d 4d 65 74  eturn &winMemMet
71f0: 68 6f 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71  hods;.}..void sq
7200: 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75  lite3MemSetDefau
7210: 6c 74 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  lt(void){.  sqli
7220: 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54  te3_config(SQLIT
7230: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c  E_CONFIG_MALLOC,
7240: 20 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69   sqlite3MemGetWi
7250: 6e 33 32 28 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  n32());.}.#endif
7260: 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   /* SQLITE_WIN32
7270: 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a  _MALLOC */../*.*
7280: 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d  * Convert a UTF-
7290: 38 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72  8 string to Micr
72a0: 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 28 55  osoft Unicode (U
72b0: 54 46 2d 31 36 3f 29 2e 20 0a 2a 2a 0a 2a 2a 20  TF-16?). .**.** 
72c0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
72d0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
72e0: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
72f0: 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74  om malloc..*/.st
7300: 61 74 69 63 20 4c 50 57 53 54 52 20 75 74 66 38  atic LPWSTR utf8
7310: 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20  ToUnicode(const 
7320: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
7330: 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20  {.  int nChar;. 
7340: 20 4c 50 57 53 54 52 20 7a 57 69 64 65 46 69 6c   LPWSTR zWideFil
7350: 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20  ename;..  nChar 
7360: 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  = osMultiByteToW
7370: 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c  ideChar(CP_UTF8,
7380: 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d   0, zFilename, -
7390: 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 69  1, NULL, 0);.  i
73a0: 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20  f( nChar==0 ){. 
73b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
73c0: 0a 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  .  zWideFilename
73d0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
73e0: 63 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28  c( nChar*sizeof(
73f0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d  zWideFilename[0]
7400: 29 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65  ) );.  if( zWide
7410: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
7420: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7430: 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c  .  nChar = osMul
7440: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
7450: 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69  (CP_UTF8, 0, zFi
7460: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64  lename, -1, zWid
7470: 65 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  eFilename,.     
7480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7490: 20 20 20 20 20 20 20 20 20 20 20 6e 43 68 61 72             nChar
74a0: 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d  );.  if( nChar==
74b0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
74c0: 5f 66 72 65 65 28 7a 57 69 64 65 46 69 6c 65 6e  _free(zWideFilen
74d0: 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69 64 65 46  ame);.    zWideF
74e0: 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ilename = 0;.  }
74f0: 0a 20 20 72 65 74 75 72 6e 20 7a 57 69 64 65 46  .  return zWideF
7500: 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
7510: 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73  * Convert Micros
7520: 6f 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 55  oft Unicode to U
7530: 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20  TF-8.  Space to 
7540: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
7550: 64 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f  d string is.** o
7560: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
7570: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
7580: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75  /.static char *u
7590: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 4c 50 43  nicodeToUtf8(LPC
75a0: 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61  WSTR zWideFilena
75b0: 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  me){.  int nByte
75c0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  ;.  char *zFilen
75d0: 61 6d 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20  ame;..  nByte = 
75e0: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
75f0: 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30  iByte(CP_UTF8, 0
7600: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
7610: 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29   -1, 0, 0, 0, 0)
7620: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
7630: 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e   0 ){.    return
7640: 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e   0;.  }.  zFilen
7650: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ame = sqlite3_ma
7660: 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20  lloc( nByte );. 
7670: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d   if( zFilename==
7680: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
7690: 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  0;.  }.  nByte =
76a0: 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   osWideCharToMul
76b0: 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20  tiByte(CP_UTF8, 
76c0: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
76d0: 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  , -1, zFilename,
76e0: 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20   nByte,.        
76f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7700: 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20          0, 0);. 
7710: 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20   if( nByte == 0 
7720: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
7730: 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ree(zFilename);.
7740: 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20      zFilename = 
7750: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
7760: 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
7770: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 41  .** Convert an A
7780: 4e 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d 69  NSI string to Mi
7790: 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c  crosoft Unicode,
77a0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a   based on the.**
77b0: 20 63 75 72 72 65 6e 74 20 63 6f 64 65 70 61 67   current codepag
77c0: 65 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20 66  e settings for f
77d0: 69 6c 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a  ile apis..** .**
77e0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
77f0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
7800: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  ng is obtained.*
7810: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  * from sqlite3_m
7820: 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  alloc..*/.static
7830: 20 4c 50 57 53 54 52 20 6d 62 63 73 54 6f 55 6e   LPWSTR mbcsToUn
7840: 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72  icode(const char
7850: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
7860: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 4c 50 57  int nByte;.  LPW
7870: 53 54 52 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  STR zMbcsFilenam
7880: 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67  e;.  int codepag
7890: 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69  e = osAreFileApi
78a0: 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50  sANSI() ? CP_ACP
78b0: 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20   : CP_OEMCP;..  
78c0: 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42  nByte = osMultiB
78d0: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f  yteToWideChar(co
78e0: 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65  depage, 0, zFile
78f0: 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 0a  name, -1, NULL,.
7900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7920: 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29  0)*sizeof(WCHAR)
7930: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30  ;.  if( nByte==0
7940: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
7950: 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 46 69 6c  ;.  }.  zMbcsFil
7960: 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f  ename = sqlite3_
7970: 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69  malloc( nByte*si
7980: 7a 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61  zeof(zMbcsFilena
7990: 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  me[0]) );.  if( 
79a0: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30  zMbcsFilename==0
79b0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
79c0: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
79d0: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  osMultiByteToWid
79e0: 65 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20  eChar(codepage, 
79f0: 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  0, zFilename, -1
7a00: 2c 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c  , zMbcsFilename,
7a10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a30: 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e   nByte);.  if( n
7a40: 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Byte==0 ){.    s
7a50: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 62 63  qlite3_free(zMbc
7a60: 73 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  sFilename);.    
7a70: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20  zMbcsFilename = 
7a80: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
7a90: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d  zMbcsFilename;.}
7aa0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
7ab0: 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64  Microsoft Unicod
7ac0: 65 20 74 6f 20 6d 75 6c 74 69 2d 62 79 74 65 20  e to multi-byte 
7ad0: 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67  character string
7ae0: 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a  , based on the.*
7af0: 2a 20 75 73 65 72 27 73 20 41 4e 53 49 20 63 6f  * user's ANSI co
7b00: 64 65 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70  depage..**.** Sp
7b10: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
7b20: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
7b30: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
7b40: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  .** sqlite3_mall
7b50: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
7b60: 63 68 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 4d  char *unicodeToM
7b70: 62 63 73 28 4c 50 43 57 53 54 52 20 7a 57 69 64  bcs(LPCWSTR zWid
7b80: 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e  eFilename){.  in
7b90: 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20  t nByte;.  char 
7ba0: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e  *zFilename;.  in
7bb0: 74 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73 41  t codepage = osA
7bc0: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
7bd0: 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f   ? CP_ACP : CP_O
7be0: 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d  EMCP;..  nByte =
7bf0: 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   osWideCharToMul
7c00: 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c  tiByte(codepage,
7c10: 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d   0, zWideFilenam
7c20: 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20  e, -1, 0, 0, 0, 
7c30: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
7c40: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75  == 0 ){.    retu
7c50: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c  rn 0;.  }.  zFil
7c60: 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f  ename = sqlite3_
7c70: 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b  malloc( nByte );
7c80: 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
7c90: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
7ca0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  n 0;.  }.  nByte
7cb0: 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d   = osWideCharToM
7cc0: 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67  ultiByte(codepag
7cd0: 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e  e, 0, zWideFilen
7ce0: 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61  ame, -1, zFilena
7cf0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d10: 20 20 20 20 6e 42 79 74 65 2c 20 30 2c 20 30 29      nByte, 0, 0)
7d20: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
7d30: 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   0 ){.    sqlite
7d40: 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65  3_free(zFilename
7d50: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
7d60: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
7d70: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  rn zFilename;.}.
7d80: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 6d  ./*.** Convert m
7d90: 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74  ultibyte charact
7da0: 65 72 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46  er string to UTF
7db0: 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  -8.  Space to ho
7dc0: 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e  ld the.** return
7dd0: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
7de0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
7df0: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  e3_malloc()..*/.
7e00: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
7e10: 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
7e20: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
7e30: 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  lename){.  char 
7e40: 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a  *zFilenameUtf8;.
7e50: 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64    LPWSTR zTmpWid
7e60: 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d  e;..  zTmpWide =
7e70: 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a   mbcsToUnicode(z
7e80: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
7e90: 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a   zTmpWide==0 ){.
7ea0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7eb0: 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66  }.  zFilenameUtf
7ec0: 38 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66  8 = unicodeToUtf
7ed0: 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73  8(zTmpWide);.  s
7ee0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70  qlite3_free(zTmp
7ef0: 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Wide);.  return 
7f00: 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 7d  zFilenameUtf8;.}
7f10: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
7f20: 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69 62 79  UTF-8 to multiby
7f30: 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72  te character str
7f40: 69 6e 67 2e 20 20 53 70 61 63 65 20 74 6f 20 68  ing.  Space to h
7f50: 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72 65 74 75  old the .** retu
7f60: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
7f70: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
7f80: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
7f90: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
7fa0: 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62  win32_utf8_to_mb
7fb0: 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  cs(const char *z
7fc0: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61  Filename){.  cha
7fd0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73  r *zFilenameMbcs
7fe0: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57  ;.  LPWSTR zTmpW
7ff0: 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65  ide;..  zTmpWide
8000: 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65   = utf8ToUnicode
8010: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
8020: 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29  f( zTmpWide==0 )
8030: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
8040: 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 4d    }.  zFilenameM
8050: 62 63 73 20 3d 20 75 6e 69 63 6f 64 65 54 6f 4d  bcs = unicodeToM
8060: 62 63 73 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20  bcs(zTmpWide);. 
8070: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
8080: 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72  mpWide);.  retur
8090: 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b  n zFilenameMbcs;
80a0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72  .}.../*.** The r
80b0: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 67  eturn value of g
80c0: 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a 2a  etLastErrorMsg.*
80d0: 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65  * is zero if the
80e0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
80f0: 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65  its in the buffe
8100: 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a  r, or non-zero.*
8110: 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20  * otherwise (if 
8120: 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20  the message was 
8130: 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a 73  truncated)..*/.s
8140: 74 61 74 69 63 20 69 6e 74 20 67 65 74 4c 61 73  tatic int getLas
8150: 74 45 72 72 6f 72 4d 73 67 28 44 57 4f 52 44 20  tErrorMsg(DWORD 
8160: 6c 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20 6e  lastErrno, int n
8170: 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
8180: 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73  {.  /* FormatMes
8190: 73 61 67 65 20 72 65 74 75 72 6e 73 20 30 20 6f  sage returns 0 o
81a0: 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68 65  n failure.  Othe
81b0: 72 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72 65  rwise it.  ** re
81c0: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
81d0: 20 6f 66 20 54 43 48 41 52 73 20 77 72 69 74 74   of TCHARs writt
81e0: 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  en to the output
81f0: 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65 78  .  ** buffer, ex
8200: 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72 6d  cluding the term
8210: 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61  inating null cha
8220: 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44 20  r..  */.  DWORD 
8230: 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61  dwLen = 0;.  cha
8240: 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20 20  r *zOut = 0;..  
8250: 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
8260: 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 57 69    LPWSTR zTempWi
8270: 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64  de = NULL;.    d
8280: 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d  wLen = osFormatM
8290: 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d  essageW(FORMAT_M
82a0: 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f  ESSAGE_ALLOCATE_
82b0: 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20  BUFFER |.       
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82d0: 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53        FORMAT_MES
82e0: 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d  SAGE_FROM_SYSTEM
82f0: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
8300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8310: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49  FORMAT_MESSAGE_I
8320: 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20  GNORE_INSERTS,. 
8330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8340: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
8350: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
8370: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
8380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8390: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83b0: 20 20 20 20 20 20 20 28 4c 50 57 53 54 52 29 20         (LPWSTR) 
83c0: 26 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20  &zTempWide,.    
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83e0: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
83f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8400: 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20           0);.   
8410: 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29   if( dwLen > 0 )
8420: 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63  {.      /* alloc
8430: 61 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64  ate a buffer and
8440: 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38   convert to UTF8
8450: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
8460: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
8470: 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74  oc();.      zOut
8480: 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38   = unicodeToUtf8
8490: 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20  (zTempWide);.   
84a0: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
84b0: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
84c0: 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73     /* free the s
84d0: 79 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c  ystem buffer all
84e0: 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74  ocated by Format
84f0: 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20  Message */.     
8500: 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65   osLocalFree(zTe
8510: 6d 70 57 69 64 65 29 3b 0a 20 20 20 20 7d 0a 2f  mpWide);.    }./
8520: 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66  * isNT() is 1 if
8530: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
8540: 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73  ==1, so this els
8550: 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75  e is never execu
8560: 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74  ted. .** Since t
8570: 68 65 20 41 4e 53 49 20 76 65 72 73 69 6f 6e 20  he ANSI version 
8580: 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73  of these Windows
8590: 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73   API do not exis
85a0: 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20  t for WINCE,.** 
85b0: 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  it's important t
85c0: 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20  o not reference 
85d0: 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62  them for WINCE b
85e0: 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51  uilds..*/.#if SQ
85f0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30  LITE_OS_WINCE==0
8600: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
8610: 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c  ar *zTemp = NULL
8620: 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73  ;.    dwLen = os
8630: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28 46  FormatMessageA(F
8640: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c  ORMAT_MESSAGE_AL
8650: 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a  LOCATE_BUFFER |.
8660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8670: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
8680: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d  MAT_MESSAGE_FROM
8690: 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20  _SYSTEM |.      
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86b0: 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45         FORMAT_ME
86c0: 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53  SSAGE_IGNORE_INS
86d0: 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20  ERTS,.          
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86f0: 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20     NULL,.       
8700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8710: 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c        lastErrno,
8720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
8740: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4c                (L
8760: 50 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20  PSTR) &zTemp,.  
8770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8780: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
8790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87a0: 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20             0);. 
87b0: 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30     if( dwLen > 0
87c0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c   ){.      /* all
87d0: 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61  ocate a buffer a
87e0: 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54  nd convert to UT
87f0: 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  F8 */.      sqli
8800: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
8810: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f  lloc();.      zO
8820: 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  ut = sqlite3_win
8830: 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
8840: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71  zTemp);.      sq
8850: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
8860: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a  lloc();.      /*
8870: 20 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d   free the system
8880: 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
8890: 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61  d by FormatMessa
88a0: 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f  ge */.      osLo
88b0: 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a  calFree(zTemp);.
88c0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
88d0: 0a 20 20 69 66 28 20 30 20 3d 3d 20 64 77 4c 65  .  if( 0 == dwLe
88e0: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
88f0: 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20  _snprintf(nBuf, 
8900: 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f 72 20 30  zBuf, "OsError 0
8910: 78 25 78 20 28 25 75 29 22 2c 20 6c 61 73 74 45  x%x (%u)", lastE
8920: 72 72 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29  rrno, lastErrno)
8930: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
8940: 2a 20 63 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d  * copy a maximum
8950: 20 6f 66 20 6e 42 75 66 20 63 68 61 72 73 20 74   of nBuf chars t
8960: 6f 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  o output buffer 
8970: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
8980: 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42  nprintf(nBuf, zB
8990: 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b  uf, "%s", zOut);
89a0: 0a 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65  .    /* free the
89b0: 20 55 54 46 38 20 62 75 66 66 65 72 20 2a 2f 0a   UTF8 buffer */.
89c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
89d0: 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65  (zOut);.  }.  re
89e0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
89f0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
8a00: 6e 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41  n - winLogErrorA
8a10: 74 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c  tLine() - is onl
8a20: 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69  y ever called vi
8a30: 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77  a the macro.** w
8a40: 69 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a  inLogError()..**
8a50: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8a60: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65   is invoked afte
8a70: 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  r an error occur
8a80: 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74  s in an OS funct
8a90: 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20  ion..** It logs 
8aa0: 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20  a message using 
8ab0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f  sqlite3_log() co
8ac0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72  ntaining the cur
8ad0: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a  rent value of.**
8ae0: 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c   error code and,
8af0: 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68   if possible, th
8b00: 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  e human-readable
8b10: 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d   equivalent from
8b20: 20 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61   .** FormatMessa
8b30: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ge..**.** The fi
8b40: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
8b50: 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f  sed to the macro
8b60: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65   should be the e
8b70: 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a  rror code that.*
8b80: 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  * will be return
8b90: 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e  ed to SQLite (e.
8ba0: 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  g. SQLITE_IOERR_
8bb0: 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43  DELETE, SQLITE_C
8bc0: 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68  ANTOPEN). .** Th
8bd0: 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74  e two subsequent
8be0: 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c   arguments shoul
8bf0: 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  d be the name of
8c00: 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e   the OS function
8c10: 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20   that.** failed 
8c20: 61 6e 64 20 74 68 65 20 74 68 65 20 61 73 73 6f  and the the asso
8c30: 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74  ciated file-syst
8c40: 65 6d 20 70 61 74 68 2c 20 69 66 20 61 6e 79 2e  em path, if any.
8c50: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c  .*/.#define winL
8c60: 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29  ogError(a,b,c,d)
8c70: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74     winLogErrorAt
8c80: 4c 69 6e 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c  Line(a,b,c,d,__L
8c90: 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e  INE__).static in
8ca0: 74 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c  t winLogErrorAtL
8cb0: 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f  ine(.  int errco
8cc0: 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
8cd0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65         /* SQLite
8ce0: 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
8cf0: 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
8d00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8d10: 20 2f 2a 20 57 69 6e 33 32 20 6c 61 73 74 20 65   /* Win32 last e
8d20: 72 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rror */.  const 
8d30: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20  char *zFunc,    
8d40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
8d50: 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e  e of OS function
8d60: 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a   that failed */.
8d70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
8d80: 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
8d90: 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61    /* File path a
8da0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
8db0: 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  rror */.  int iL
8dc0: 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ine             
8dd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75            /* Sou
8de0: 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  rce line number 
8df0: 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75  where error occu
8e00: 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  rred */.){.  cha
8e10: 72 20 7a 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20  r zMsg[500];    
8e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8e30: 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 65  Human readable e
8e40: 72 72 6f 72 20 74 65 78 74 20 2a 2f 0a 20 20 69  rror text */.  i
8e50: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
8e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8e70: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
8e80: 2f 0a 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30  /..  zMsg[0] = 0
8e90: 3b 0a 20 20 67 65 74 4c 61 73 74 45 72 72 6f 72  ;.  getLastError
8ea0: 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73  Msg(lastErrno, s
8eb0: 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73  izeof(zMsg), zMs
8ec0: 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 72  g);.  assert( er
8ed0: 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rcode!=SQLITE_OK
8ee0: 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d   );.  if( zPath=
8ef0: 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b  =0 ) zPath = "";
8f00: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67  .  for(i=0; zMsg
8f10: 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d  [i] && zMsg[i]!=
8f20: 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21  '\r' && zMsg[i]!
8f30: 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\n'; i++){}.  
8f40: 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73  zMsg[i] = 0;.  s
8f50: 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f  qlite3_log(errco
8f60: 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77 69  de,.      "os_wi
8f70: 6e 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28  n.c:%d: (%d) %s(
8f80: 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20  %s) - %s",.     
8f90: 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e   iLine, lastErrn
8fa0: 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c  o, zFunc, zPath,
8fb0: 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65   zMsg.  );..  re
8fc0: 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a  turn errcode;.}.
8fd0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65  ./*.** The numbe
8fe0: 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20  r of times that 
8ff0: 61 20 52 65 61 64 46 69 6c 65 28 29 2c 20 57 72  a ReadFile(), Wr
9000: 69 74 65 46 69 6c 65 28 29 2c 20 61 6e 64 20 44  iteFile(), and D
9010: 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77  eleteFile().** w
9020: 69 6c 6c 20 62 65 20 72 65 74 72 69 65 64 20 66  ill be retried f
9030: 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69  ollowing a locki
9040: 6e 67 20 65 72 72 6f 72 20 2d 20 70 72 6f 62 61  ng error - proba
9050: 62 6c 79 20 63 61 75 73 65 64 20 62 79 20 0a 2a  bly caused by .*
9060: 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f 66 74  * antivirus soft
9070: 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68 65 20  ware.  Also the 
9080: 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20 62 65  initial delay be
9090: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 72  fore the first r
90a0: 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c  etry..** The del
90b0: 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c 69 6e  ay increases lin
90c0: 65 61 72 6c 79 20 77 69 74 68 20 65 61 63 68 20  early with each 
90d0: 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65  retry..*/.#ifnde
90e0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  f SQLITE_WIN32_I
90f0: 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64 65 66  OERR_RETRY.# def
9100: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
9110: 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31 30 0a  _IOERR_RETRY 10.
9120: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
9130: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
9140: 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a 23 20  R_RETRY_DELAY.# 
9150: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
9160: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
9170: 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69 66 0a  DELAY 25.#endif.
9180: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32  static int win32
9190: 49 6f 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c  IoerrRetry = SQL
91a0: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
91b0: 52 45 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e  RETRY;.static in
91c0: 74 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72  t win32IoerrRetr
91d0: 79 44 65 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f  yDelay = SQLITE_
91e0: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
91f0: 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20  Y_DELAY;../*.** 
9200: 49 66 20 61 20 52 65 61 64 46 69 6c 65 28 29 20  If a ReadFile() 
9210: 6f 72 20 57 72 69 74 65 46 69 6c 65 28 29 20 65  or WriteFile() e
9220: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 69 6e 76  rror occurs, inv
9230: 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oke this routine
9240: 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 69 74  .** to see if it
9250: 20 73 68 6f 75 6c 64 20 62 65 20 72 65 74 72 69   should be retri
9260: 65 64 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ed.  Return TRUE
9270: 20 74 6f 20 72 65 74 72 79 2e 20 20 52 65 74 75   to retry.  Retu
9280: 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 74 6f 20 67  rn FALSE.** to g
9290: 69 76 65 20 75 70 20 77 69 74 68 20 61 6e 20 65  ive up with an e
92a0: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
92b0: 69 6e 74 20 72 65 74 72 79 49 6f 65 72 72 28 69  int retryIoerr(i
92c0: 6e 74 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f  nt *pnRetry, DWO
92d0: 52 44 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44  RD *pError){.  D
92e0: 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61  WORD e = osGetLa
92f0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28  stError();.  if(
9300: 20 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e 33 32   *pnRetry>=win32
9310: 49 6f 65 72 72 52 65 74 72 79 20 29 7b 0a 20 20  IoerrRetry ){.  
9320: 20 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a    if( pError ){.
9330: 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20        *pError = 
9340: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  e;.    }.    ret
9350: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
9360: 20 65 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53 53   e==ERROR_ACCESS
9370: 5f 44 45 4e 49 45 44 20 7c 7c 0a 20 20 20 20 20  _DENIED ||.     
9380: 20 65 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56   e==ERROR_LOCK_V
9390: 49 4f 4c 41 54 49 4f 4e 20 7c 7c 0a 20 20 20 20  IOLATION ||.    
93a0: 20 20 65 3d 3d 45 52 52 4f 52 5f 53 48 41 52 49    e==ERROR_SHARI
93b0: 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 20 29 7b 0a  NG_VIOLATION ){.
93c0: 20 20 20 20 70 6f 72 74 61 62 6c 65 53 6c 65 65      portableSlee
93d0: 70 28 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72  p(win32IoerrRetr
93e0: 79 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74  yDelay*(1+*pnRet
93f0: 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52  ry));.    ++*pnR
9400: 65 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e  etry;.    return
9410: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45   1;.  }.  if( pE
9420: 72 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72  rror ){.    *pEr
9430: 72 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72  ror = e;.  }.  r
9440: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
9450: 2a 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f  * Log a I/O erro
9460: 72 20 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e  r retry episode.
9470: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9480: 6c 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e 52 65  logIoerr(int nRe
9490: 74 72 79 29 7b 0a 20 20 69 66 28 20 6e 52 65 74  try){.  if( nRet
94a0: 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ry ){.    sqlite
94b0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 49 4f 45  3_log(SQLITE_IOE
94c0: 52 52 2c 20 0a 20 20 20 20 20 20 22 64 65 6c 61  RR, .      "dela
94d0: 79 65 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63  yed %dms for loc
94e0: 6b 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69  k/sharing confli
94f0: 63 74 22 2c 0a 20 20 20 20 20 20 77 69 6e 33 32  ct",.      win32
9500: 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a  IoerrRetryDelay*
9510: 6e 52 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31  nRetry*(nRetry+1
9520: 29 2f 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  )/2.    );.  }.}
9530: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
9540: 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  WINCE./*********
9550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9590: 0a 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e  .** This section
95a0: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66   contains code f
95b0: 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a  or WinCE only..*
95c0: 2f 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73 20  /./*.** Windows 
95d0: 43 45 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  CE does not have
95e0: 20 61 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 66   a localtime() f
95f0: 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 63 72 65  unction.  So cre
9600: 61 74 65 20 61 0a 2a 2a 20 73 75 62 73 74 69 74  ate a.** substit
9610: 75 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ute..*/.#include
9620: 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 72 75 63 74   <time.h>.struct
9630: 20 74 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f 63   tm *__cdecl loc
9640: 61 6c 74 69 6d 65 28 63 6f 6e 73 74 20 74 69 6d  altime(const tim
9650: 65 5f 74 20 2a 74 29 0a 7b 0a 20 20 73 74 61 74  e_t *t).{.  stat
9660: 69 63 20 73 74 72 75 63 74 20 74 6d 20 79 3b 0a  ic struct tm y;.
9670: 20 20 46 49 4c 45 54 49 4d 45 20 75 54 6d 2c 20    FILETIME uTm, 
9680: 6c 54 6d 3b 0a 20 20 53 59 53 54 45 4d 54 49 4d  lTm;.  SYSTEMTIM
9690: 45 20 70 54 6d 3b 0a 20 20 73 71 6c 69 74 65 33  E pTm;.  sqlite3
96a0: 5f 69 6e 74 36 34 20 74 36 34 3b 0a 20 20 74 36  _int64 t64;.  t6
96b0: 34 20 3d 20 2a 74 3b 0a 20 20 74 36 34 20 3d 20  4 = *t;.  t64 = 
96c0: 28 74 36 34 20 2b 20 31 31 36 34 34 34 37 33 36  (t64 + 116444736
96d0: 30 30 29 2a 31 30 30 30 30 30 30 30 3b 0a 20 20  00)*10000000;.  
96e0: 75 54 6d 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d  uTm.dwLowDateTim
96f0: 65 20 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20  e = (DWORD)(t64 
9700: 26 20 30 78 46 46 46 46 46 46 46 46 29 3b 0a 20  & 0xFFFFFFFF);. 
9710: 20 75 54 6d 2e 64 77 48 69 67 68 44 61 74 65 54   uTm.dwHighDateT
9720: 69 6d 65 3d 20 28 44 57 4f 52 44 29 28 74 36 34  ime= (DWORD)(t64
9730: 20 3e 3e 20 33 32 29 3b 0a 20 20 6f 73 46 69 6c   >> 32);.  osFil
9740: 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65  eTimeToLocalFile
9750: 54 69 6d 65 28 26 75 54 6d 2c 26 6c 54 6d 29 3b  Time(&uTm,&lTm);
9760: 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53  .  osFileTimeToS
9770: 79 73 74 65 6d 54 69 6d 65 28 26 6c 54 6d 2c 26  ystemTime(&lTm,&
9780: 70 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f 79 65 61  pTm);.  y.tm_yea
9790: 72 20 3d 20 70 54 6d 2e 77 59 65 61 72 20 2d 20  r = pTm.wYear - 
97a0: 31 39 30 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f 6e  1900;.  y.tm_mon
97b0: 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20   = pTm.wMonth - 
97c0: 31 3b 0a 20 20 79 2e 74 6d 5f 77 64 61 79 20 3d  1;.  y.tm_wday =
97d0: 20 70 54 6d 2e 77 44 61 79 4f 66 57 65 65 6b 3b   pTm.wDayOfWeek;
97e0: 0a 20 20 79 2e 74 6d 5f 6d 64 61 79 20 3d 20 70  .  y.tm_mday = p
97f0: 54 6d 2e 77 44 61 79 3b 0a 20 20 79 2e 74 6d 5f  Tm.wDay;.  y.tm_
9800: 68 6f 75 72 20 3d 20 70 54 6d 2e 77 48 6f 75 72  hour = pTm.wHour
9810: 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20 70  ;.  y.tm_min = p
9820: 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20 20 79 2e  Tm.wMinute;.  y.
9830: 74 6d 5f 73 65 63 20 3d 20 70 54 6d 2e 77 53 65  tm_sec = pTm.wSe
9840: 63 6f 6e 64 3b 0a 20 20 72 65 74 75 72 6e 20 26  cond;.  return &
9850: 79 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 48 41  y;.}..#define HA
9860: 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28  NDLE_TO_WINFILE(
9870: 61 29 20 28 77 69 6e 46 69 6c 65 2a 29 26 28 28  a) (winFile*)&((
9880: 63 68 61 72 2a 29 61 29 5b 2d 28 69 6e 74 29 6f  char*)a)[-(int)o
9890: 66 66 73 65 74 6f 66 28 77 69 6e 46 69 6c 65 2c  ffsetof(winFile,
98a0: 68 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  h)]../*.** Acqui
98b0: 72 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  re a lock on the
98c0: 20 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74 61   handle h.*/.sta
98d0: 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 4d 75  tic void winceMu
98e0: 74 65 78 41 63 71 75 69 72 65 28 48 41 4e 44 4c  texAcquire(HANDL
98f0: 45 20 68 29 7b 0a 20 20 20 44 57 4f 52 44 20 64  E h){.   DWORD d
9900: 77 45 72 72 3b 0a 20 20 20 64 6f 20 7b 0a 20 20  wErr;.   do {.  
9910: 20 20 20 64 77 45 72 72 20 3d 20 57 61 69 74 46     dwErr = WaitF
9920: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68  orSingleObject(h
9930: 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20  , INFINITE);.   
9940: 7d 20 77 68 69 6c 65 20 28 64 77 45 72 72 20 21  } while (dwErr !
9950: 3d 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20  = WAIT_OBJECT_0 
9960: 26 26 20 64 77 45 72 72 20 21 3d 20 57 41 49 54  && dwErr != WAIT
9970: 5f 41 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f  _ABANDONED);.}./
9980: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c  *.** Release a l
9990: 6f 63 6b 20 61 63 71 75 69 72 65 64 20 62 79 20  ock acquired by 
99a0: 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72  winceMutexAcquir
99b0: 65 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77  e().*/.#define w
99c0: 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
99d0: 28 68 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78  (h) ReleaseMutex
99e0: 28 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  (h)../*.** Creat
99f0: 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20  e the mutex and 
9a00: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73  shared memory us
9a10: 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69  ed for locking i
9a20: 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65  n the file.** de
9a30: 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a  scriptor pFile.*
9a40: 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  /.static BOOL wi
9a50: 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f  nceCreateLock(co
9a60: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
9a70: 61 6d 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46  ame, winFile *pF
9a80: 69 6c 65 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a  ile){.  LPWSTR z
9a90: 54 6f 6b 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e  Tok;.  LPWSTR zN
9aa0: 61 6d 65 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e 69  ame;.  BOOL bIni
9ab0: 74 20 3d 20 54 52 55 45 3b 0a 0a 20 20 7a 4e 61  t = TRUE;..  zNa
9ac0: 6d 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f  me = utf8ToUnico
9ad0: 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
9ae0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
9af0: 0a 20 20 20 20 2f 2a 20 6f 75 74 20 6f 66 20 6d  .    /* out of m
9b00: 65 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 72 65 74  emory */.    ret
9b10: 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a  urn FALSE;.  }..
9b20: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
9b30: 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61  the local lockda
9b40: 74 61 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ta */.  memset(&
9b50: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2c 20 30 2c  pFile->local, 0,
9b60: 20 73 69 7a 65 6f 66 28 70 46 69 6c 65 2d 3e 6c   sizeof(pFile->l
9b70: 6f 63 61 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52 65  ocal));..  /* Re
9b80: 70 6c 61 63 65 20 74 68 65 20 62 61 63 6b 73 6c  place the backsl
9b90: 61 73 68 65 73 20 66 72 6f 6d 20 74 68 65 20 66  ashes from the f
9ba0: 69 6c 65 6e 61 6d 65 20 61 6e 64 20 6c 6f 77 65  ilename and lowe
9bb0: 72 63 61 73 65 20 69 74 0a 20 20 2a 2a 20 74 6f  rcase it.  ** to
9bc0: 20 64 65 72 69 76 65 20 61 20 6d 75 74 65 78 20   derive a mutex 
9bd0: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20  name. */.  zTok 
9be0: 3d 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 28 7a  = osCharLowerW(z
9bf0: 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 20 28 3b 2a  Name);.  for (;*
9c00: 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20  zTok;zTok++){.  
9c10: 20 20 69 66 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27    if (*zTok == '
9c20: 5c 5c 27 29 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27  \\') *zTok = '_'
9c30: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61  ;.  }..  /* Crea
9c40: 74 65 2f 6f 70 65 6e 20 74 68 65 20 6e 61 6d 65  te/open the name
9c50: 64 20 6d 75 74 65 78 20 2a 2f 0a 20 20 70 46 69  d mutex */.  pFi
9c60: 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 6f 73 43  le->hMutex = osC
9c70: 72 65 61 74 65 4d 75 74 65 78 57 28 4e 55 4c 4c  reateMutexW(NULL
9c80: 2c 20 46 41 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b  , FALSE, zName);
9c90: 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68  .  if (!pFile->h
9ca0: 4d 75 74 65 78 29 7b 0a 20 20 20 20 70 46 69 6c  Mutex){.    pFil
9cb0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
9cc0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
9cd0: 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  .    winLogError
9ce0: 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 70  (SQLITE_ERROR, p
9cf0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
9d00: 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63   "winceCreateLoc
9d10: 6b 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  k1", zFilename);
9d20: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
9d30: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  e(zName);.    re
9d40: 74 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a  turn FALSE;.  }.
9d50: 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68  .  /* Acquire th
9d60: 65 20 6d 75 74 65 78 20 62 65 66 6f 72 65 20 63  e mutex before c
9d70: 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77  ontinuing */.  w
9d80: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
9d90: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
9da0: 0a 20 20 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74  .  .  /* Since t
9db0: 68 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65  he names of name
9dc0: 64 20 6d 75 74 65 78 65 73 2c 20 73 65 6d 61 70  d mutexes, semap
9dd0: 68 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61 70 70  hores, file mapp
9de0: 69 6e 67 73 20 65 74 63 20 61 72 65 20 0a 20 20  ings etc are .  
9df0: 2a 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69 76  ** case-sensitiv
9e00: 65 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67  e, take advantag
9e10: 65 20 6f 66 20 74 68 61 74 20 62 79 20 75 70 70  e of that by upp
9e20: 65 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75 74  ercasing the mut
9e30: 65 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64  ex name.  ** and
9e40: 20 75 73 69 6e 67 20 74 68 61 74 20 61 73 20 74   using that as t
9e50: 68 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d 61  he shared filema
9e60: 70 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f  pping name..  */
9e70: 0a 20 20 6f 73 43 68 61 72 55 70 70 65 72 57 28  .  osCharUpperW(
9e80: 7a 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d  zName);.  pFile-
9e90: 3e 68 53 68 61 72 65 64 20 3d 20 6f 73 43 72 65  >hShared = osCre
9ea0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28  ateFileMappingW(
9eb0: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
9ec0: 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20  ALUE, NULL,.    
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ef0: 20 20 20 20 50 41 47 45 5f 52 45 41 44 57 52 49      PAGE_READWRI
9f00: 54 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69  TE, 0, sizeof(wi
9f10: 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20  nceLock),.      
9f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f40: 20 20 7a 4e 61 6d 65 29 3b 20 20 0a 0a 20 20 2f    zName);  ..  /
9f50: 2a 20 53 65 74 20 61 20 66 6c 61 67 20 74 68 61  * Set a flag tha
9f60: 74 20 69 6e 64 69 63 61 74 65 73 20 77 65 27 72  t indicates we'r
9f70: 65 20 74 68 65 20 66 69 72 73 74 20 74 6f 20 63  e the first to c
9f80: 72 65 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79  reate the memory
9f90: 20 73 6f 20 69 74 20 0a 20 20 2a 2a 20 6d 75 73   so it .  ** mus
9fa0: 74 20 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61  t be zero-initia
9fb0: 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 66 20 28 6f  lized */.  if (o
9fc0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20  sGetLastError() 
9fd0: 3d 3d 20 45 52 52 4f 52 5f 41 4c 52 45 41 44 59  == ERROR_ALREADY
9fe0: 5f 45 58 49 53 54 53 29 7b 0a 20 20 20 20 62 49  _EXISTS){.    bI
9ff0: 6e 69 74 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d  nit = FALSE;.  }
a000: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
a010: 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49  (zName);..  /* I
a020: 66 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69  f we succeeded i
a030: 6e 20 6d 61 6b 69 6e 67 20 74 68 65 20 73 68 61  n making the sha
a040: 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c  red memory handl
a050: 65 2c 20 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20  e, map it. */.  
a060: 69 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61 72  if (pFile->hShar
a070: 65 64 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ed){.    pFile->
a080: 73 68 61 72 65 64 20 3d 20 28 77 69 6e 63 65 4c  shared = (winceL
a090: 6f 63 6b 2a 29 6f 73 4d 61 70 56 69 65 77 4f 66  ock*)osMapViewOf
a0a0: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61  File(pFile->hSha
a0b0: 72 65 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20  red, .          
a0c0: 20 20 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44     FILE_MAP_READ
a0d0: 7c 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c  |FILE_MAP_WRITE,
a0e0: 20 30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69   0, 0, sizeof(wi
a0f0: 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f  nceLock));.    /
a100: 2a 20 49 66 20 6d 61 70 70 69 6e 67 20 66 61 69  * If mapping fai
a110: 6c 65 64 2c 20 63 6c 6f 73 65 20 74 68 65 20 73  led, close the s
a120: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e  hared memory han
a130: 64 6c 65 20 61 6e 64 20 65 72 61 73 65 20 69 74  dle and erase it
a140: 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 70 46 69   */.    if (!pFi
a150: 6c 65 2d 3e 73 68 61 72 65 64 29 7b 0a 20 20 20  le->shared){.   
a160: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
a170: 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
a180: 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69  rror();.      wi
a190: 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
a1a0: 5f 45 52 52 4f 52 2c 20 70 46 69 6c 65 2d 3e 6c  _ERROR, pFile->l
a1b0: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
a1c0: 20 20 20 20 20 20 20 20 20 22 77 69 6e 63 65 43           "winceC
a1d0: 72 65 61 74 65 4c 6f 63 6b 32 22 2c 20 7a 46 69  reateLock2", zFi
a1e0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6f  lename);.      o
a1f0: 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
a200: 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20 20  le->hShared);.  
a210: 20 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72      pFile->hShar
a220: 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  ed = NULL;.    }
a230: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68  .  }..  /* If sh
a240: 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c  ared memory coul
a250: 64 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64  d not be created
a260: 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65  , then close the
a270: 20 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c 20   mutex and fail 
a280: 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
a290: 68 53 68 61 72 65 64 20 3d 3d 20 4e 55 4c 4c 29  hShared == NULL)
a2a0: 7b 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78  {.    winceMutex
a2b0: 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
a2c0: 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c  Mutex);.    osCl
a2d0: 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
a2e0: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46  >hMutex);.    pF
a2f0: 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55  ile->hMutex = NU
a300: 4c 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46  LL;.    return F
a310: 41 4c 53 45 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  ALSE;.  }.  .  /
a320: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
a330: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
a340: 66 20 77 65 27 72 65 20 73 75 70 70 6f 73 65 64  f we're supposed
a350: 20 74 6f 20 2a 2f 0a 20 20 69 66 20 28 62 49 6e   to */.  if (bIn
a360: 69 74 29 20 7b 0a 20 20 20 20 6d 65 6d 73 65 74  it) {.    memset
a370: 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20  (pFile->shared, 
a380: 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c  0, sizeof(winceL
a390: 6f 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69  ock));.  }..  wi
a3a0: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
a3b0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
a3c0: 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 7d    return TRUE;.}
a3d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20  ../*.** Destroy 
a3e0: 74 68 65 20 70 61 72 74 20 6f 66 20 77 69 6e 46  the part of winF
a3f0: 69 6c 65 20 74 68 61 74 20 64 65 61 6c 73 20 77  ile that deals w
a400: 69 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a  ith wince locks.
a410: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
a420: 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28  inceDestroyLock(
a430: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
a440: 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d  .  if (pFile->hM
a450: 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63  utex){.    /* Ac
a460: 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20  quire the mutex 
a470: 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65  */.    winceMute
a480: 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
a490: 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a  hMutex);..    /*
a4a0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
a4b0: 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f  locks should pro
a4c0: 62 61 62 6c 79 20 61 73 73 65 72 74 20 69 6e 20  bably assert in 
a4d0: 64 65 62 75 67 20 6d 6f 64 65 2c 20 62 75 74 20  debug mode, but 
a4e0: 74 68 65 79 0a 20 20 20 20 20 20 20 61 72 65 20  they.       are 
a4f0: 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20 63 61  to cleanup in ca
a500: 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d  se any locks rem
a510: 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20  ained open */.  
a520: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
a530: 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20  al.nReaders){.  
a540: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
a550: 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a  d->nReaders --;.
a560: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46      }.    if (pF
a570: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65  ile->local.bRese
a580: 72 76 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69  rved){.      pFi
a590: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
a5a0: 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  erved = FALSE;. 
a5b0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69     }.    if (pFi
a5c0: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69  le->local.bPendi
a5d0: 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ng){.      pFile
a5e0: 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69  ->shared->bPendi
a5f0: 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ng = FALSE;.    
a600: 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  }.    if (pFile-
a610: 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
a620: 65 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  e){.      pFile-
a630: 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
a640: 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ive = FALSE;.   
a650: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65   }..    /* De-re
a660: 66 65 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73  ference and clos
a670: 65 20 6f 75 72 20 63 6f 70 79 20 6f 66 20 74 68  e our copy of th
a680: 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
a690: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 6f 73  handle */.    os
a6a0: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
a6b0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a  pFile->shared);.
a6c0: 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
a6d0: 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  e(pFile->hShared
a6e0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20  );..    /* Done 
a6f0: 77 69 74 68 20 74 68 65 20 6d 75 74 65 78 20 2a  with the mutex *
a700: 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78  /.    winceMutex
a710: 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
a720: 4d 75 74 65 78 29 3b 20 20 20 20 0a 20 20 20 20  Mutex);    .    
a730: 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
a740: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
a750: 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20    pFile->hMutex 
a760: 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = NULL;.  }.}../
a770: 2a 20 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65  * .** An impleme
a780: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c  ntation of the L
a790: 6f 63 6b 46 69 6c 65 28 29 20 41 50 49 20 6f 66  ockFile() API of
a7a0: 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a   Windows for CE.
a7b0: 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
a7c0: 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20  inceLockFile(.  
a7d0: 48 41 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a  HANDLE *phFile,.
a7e0: 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66    DWORD dwFileOf
a7f0: 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  fsetLow,.  DWORD
a800: 20 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67   dwFileOffsetHig
a810: 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62  h,.  DWORD nNumb
a820: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
a830: 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d  ow,.  DWORD nNum
a840: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
a850: 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  High.){.  winFil
a860: 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c  e *pFile = HANDL
a870: 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46  E_TO_WINFILE(phF
a880: 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65  ile);.  BOOL bRe
a890: 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20  turn = FALSE;.. 
a8a0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
a8b0: 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69  R(dwFileOffsetHi
a8c0: 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  gh);.  UNUSED_PA
a8d0: 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f  RAMETER(nNumberO
a8e0: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68  fBytesToLockHigh
a8f0: 29 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65  );..  if (!pFile
a900: 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e  ->hMutex) return
a910: 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75   TRUE;.  winceMu
a920: 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
a930: 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  ->hMutex);..  /*
a940: 20 57 61 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c   Wanting an excl
a950: 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  usive lock? */. 
a960: 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
a970: 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53  tLow == (DWORD)S
a980: 48 41 52 45 44 5f 46 49 52 53 54 0a 20 20 20 20  HARED_FIRST.    
a990: 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42     && nNumberOfB
a9a0: 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d  ytesToLockLow ==
a9b0: 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53   (DWORD)SHARED_S
a9c0: 49 5a 45 29 7b 0a 20 20 20 20 69 66 20 28 70 46  IZE){.    if (pF
a9d0: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65  ile->shared->nRe
a9e0: 61 64 65 72 73 20 3d 3d 20 30 20 26 26 20 70 46  aders == 0 && pF
a9f0: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78  ile->shared->bEx
aa00: 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20  clusive == 0){. 
aa10: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
aa20: 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
aa30: 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 70  = TRUE;.       p
aa40: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63  File->local.bExc
aa50: 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20  lusive = TRUE;. 
aa60: 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
aa70: 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
aa80: 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 61  .  /* Want a rea
aa90: 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a  d-only lock? */.
aaa0: 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c    else if (dwFil
aab0: 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44  eOffsetLow == (D
aac0: 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53  WORD)SHARED_FIRS
aad0: 54 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  T &&.           
aae0: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
aaf0: 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20  LockLow == 1){. 
ab00: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68     if (pFile->sh
ab10: 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65  ared->bExclusive
ab20: 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 70 46   == 0){.      pF
ab30: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
ab40: 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66  ers ++;.      if
ab50: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
ab60: 52 65 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20  Readers == 1){. 
ab70: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68         pFile->sh
ab80: 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b  ared->nReaders +
ab90: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
aba0: 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
abb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
abc0: 20 57 61 6e 74 20 61 20 70 65 6e 64 69 6e 67 20   Want a pending 
abd0: 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20  lock? */.  else 
abe0: 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
abf0: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45  Low == (DWORD)PE
ac00: 4e 44 49 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e  NDING_BYTE && nN
ac10: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
ac20: 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
ac30: 20 2f 2a 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e   /* If no pendin
ac40: 67 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  g lock has been 
ac50: 61 63 71 75 69 72 65 64 2c 20 74 68 65 6e 20 61  acquired, then a
ac60: 63 71 75 69 72 65 20 69 74 20 2a 2f 0a 20 20 20  cquire it */.   
ac70: 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72   if (pFile->shar
ac80: 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20  ed->bPending == 
ac90: 30 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  0) {.      pFile
aca0: 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69  ->shared->bPendi
acb0: 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ng = TRUE;.     
acc0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50   pFile->local.bP
acd0: 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20  ending = TRUE;. 
ace0: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
acf0: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
ad00: 20 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 73 65    /* Want a rese
ad10: 72 76 65 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  rved lock? */.  
ad20: 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
ad30: 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
ad40: 52 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45  RD)RESERVED_BYTE
ad50: 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
ad60: 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  esToLockLow == 1
ad70: 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
ad80: 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72  ->shared->bReser
ad90: 76 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20  ved == 0) {.    
ada0: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
adb0: 3e 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55  >bReserved = TRU
adc0: 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
add0: 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20  local.bReserved 
ade0: 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52  = TRUE;.      bR
adf0: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
ae00: 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65    }.  }..  wince
ae10: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
ae20: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72  le->hMutex);.  r
ae30: 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d  eturn bReturn;.}
ae40: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65  ../*.** An imple
ae50: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
ae60: 20 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20   UnlockFile API 
ae70: 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43  of Windows for C
ae80: 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  E.*/.static BOOL
ae90: 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65   winceUnlockFile
aea0: 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69  (.  HANDLE *phFi
aeb0: 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69  le,.  DWORD dwFi
aec0: 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  leOffsetLow,.  D
aed0: 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
aee0: 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e  tHigh,.  DWORD n
aef0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
af00: 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52  nlockLow,.  DWOR
af10: 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
af20: 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a  ToUnlockHigh.){.
af30: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
af40: 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e   = HANDLE_TO_WIN
af50: 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20  FILE(phFile);.  
af60: 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46  BOOL bReturn = F
af70: 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  ALSE;..  UNUSED_
af80: 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65  PARAMETER(dwFile
af90: 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55  OffsetHigh);.  U
afa0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
afb0: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
afc0: 55 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20  UnlockHigh);..  
afd0: 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74  if (!pFile->hMut
afe0: 65 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b  ex) return TRUE;
aff0: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
b000: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
b010: 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  ex);..  /* Relea
b020: 73 69 6e 67 20 61 20 72 65 61 64 65 72 20 6c 6f  sing a reader lo
b030: 63 6b 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  ck or an exclusi
b040: 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20  ve lock */.  if 
b050: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
b060: 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
b070: 44 5f 46 49 52 53 54 29 7b 0a 20 20 20 20 2f 2a  D_FIRST){.    /*
b080: 20 44 69 64 20 77 65 20 68 61 76 65 20 61 6e 20   Did we have an 
b090: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20  exclusive lock? 
b0a0: 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  */.    if (pFile
b0b0: 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
b0c0: 76 65 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ve){.      asser
b0d0: 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  t(nNumberOfBytes
b0e0: 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  ToUnlockLow == (
b0f0: 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
b100: 45 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  E);.      pFile-
b110: 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
b120: 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  e = FALSE;.     
b130: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
b140: 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c  bExclusive = FAL
b150: 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  SE;.      bRetur
b160: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
b170: 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 6a  .    /* Did we j
b180: 75 73 74 20 68 61 76 65 20 61 20 72 65 61 64 65  ust have a reade
b190: 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65  r lock? */.    e
b1a0: 6c 73 65 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c  lse if (pFile->l
b1b0: 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a  ocal.nReaders){.
b1c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75        assert(nNu
b1d0: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
b1e0: 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  ockLow == (DWORD
b1f0: 29 53 48 41 52 45 44 5f 53 49 5a 45 20 7c 7c 20  )SHARED_SIZE || 
b200: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
b210: 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b  UnlockLow == 1);
b220: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
b230: 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b  cal.nReaders --;
b240: 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65  .      if (pFile
b250: 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
b260: 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 20   == 0).      {. 
b270: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68         pFile->sh
b280: 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d  ared->nReaders -
b290: 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
b2a0: 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
b2b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
b2c0: 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70 65 6e   Releasing a pen
b2d0: 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65  ding lock */.  e
b2e0: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
b2f0: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
b300: 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 26  D)PENDING_BYTE &
b310: 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
b320: 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  ToUnlockLow == 1
b330: 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
b340: 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67  ->local.bPending
b350: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
b360: 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d  local.bPending =
b370: 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46   FALSE;.      pF
b380: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65  ile->shared->bPe
b390: 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20  nding = FALSE;. 
b3a0: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
b3b0: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  RUE;.    }.  }. 
b3c0: 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20   /* Releasing a 
b3d0: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f  reserved lock */
b3e0: 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69  .  else if (dwFi
b3f0: 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28  leOffsetLow == (
b400: 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f 42  DWORD)RESERVED_B
b410: 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66  YTE && nNumberOf
b420: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
b430: 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28   == 1){.    if (
b440: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
b450: 73 65 72 76 65 64 29 20 7b 0a 20 20 20 20 20 20  served) {.      
b460: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
b470: 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a  served = FALSE;.
b480: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
b490: 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
b4a0: 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52   FALSE;.      bR
b4b0: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
b4c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65    }.  }..  wince
b4d0: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
b4e0: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72  le->hMutex);.  r
b4f0: 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d  eturn bReturn;.}
b500: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65  ../*.** An imple
b510: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
b520: 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50   LockFileEx() AP
b530: 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72  I of Windows for
b540: 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f   CE.*/.static BO
b550: 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65  OL winceLockFile
b560: 45 78 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68  Ex(.  HANDLE *ph
b570: 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77  File,.  DWORD dw
b580: 46 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 64  Flags,.  DWORD d
b590: 77 52 65 73 65 72 76 65 64 2c 0a 20 20 44 57 4f  wReserved,.  DWO
b5a0: 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
b5b0: 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57  sToLockLow,.  DW
b5c0: 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
b5d0: 65 73 54 6f 4c 6f 63 6b 48 69 67 68 2c 0a 20 20  esToLockHigh,.  
b5e0: 4c 50 4f 56 45 52 4c 41 50 50 45 44 20 6c 70 4f  LPOVERLAPPED lpO
b5f0: 76 65 72 6c 61 70 70 65 64 0a 29 7b 0a 20 20 55  verlapped.){.  U
b600: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
b610: 64 77 52 65 73 65 72 76 65 64 29 3b 0a 20 20 55  dwReserved);.  U
b620: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
b630: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
b640: 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 2f 2a  LockHigh);..  /*
b650: 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 77   If the caller w
b660: 61 6e 74 73 20 61 20 73 68 61 72 65 64 20 72 65  ants a shared re
b670: 61 64 20 6c 6f 63 6b 2c 20 66 6f 72 77 61 72 64  ad lock, forward
b680: 20 74 68 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20   this call.  ** 
b690: 74 6f 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65  to winceLockFile
b6a0: 20 2a 2f 0a 20 20 69 66 20 28 6c 70 4f 76 65 72   */.  if (lpOver
b6b0: 6c 61 70 70 65 64 2d 3e 4f 66 66 73 65 74 20 3d  lapped->Offset =
b6c0: 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
b6d0: 46 49 52 53 54 20 26 26 0a 20 20 20 20 20 20 64  FIRST &&.      d
b6e0: 77 46 6c 61 67 73 20 3d 3d 20 31 20 26 26 0a 20  wFlags == 1 &&. 
b6f0: 20 20 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79       nNumberOfBy
b700: 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
b710: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49  (DWORD)SHARED_SI
b720: 5a 45 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ZE){.    return 
b730: 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70 68  winceLockFile(ph
b740: 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
b750: 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  ST, 0, 1, 0);.  
b760: 7d 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45  }.  return FALSE
b770: 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66  ;.}./*.** End of
b780: 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f 64   the special cod
b790: 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a  e for wince.****
b7a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b7b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b7c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b7d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b7e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69  *********/.#endi
b7f0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57  f /* SQLITE_OS_W
b800: 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  INCE */../******
b810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b850: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  *******.** The n
b860: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 72 6f 75  ext group of rou
b870: 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20  tines implement 
b880: 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20  the I/O methods 
b890: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20  specified.** by 
b8a0: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
b8b0: 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a  ethods object..*
b8c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b8d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b8e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b8f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
b910: 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f  /*.** Some Micro
b920: 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c  soft compilers l
b930: 61 63 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74  ack this definit
b940: 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
b950: 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
b960: 5f 50 4f 49 4e 54 45 52 0a 23 20 64 65 66 69 6e  _POINTER.# defin
b970: 65 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  e INVALID_SET_FI
b980: 4c 45 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 4f  LE_POINTER ((DWO
b990: 52 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f  RD)-1).#endif../
b9a0: 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
b9b0: 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f  rrent position o
b9c0: 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c  f the file handl
b9d0: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
b9e0: 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65  first .** argume
b9f0: 6e 74 20 74 6f 20 6f 66 66 73 65 74 20 69 4f 66  nt to offset iOf
ba00: 66 73 65 74 20 77 69 74 68 69 6e 20 74 68 65 20  fset within the 
ba10: 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73  file. If success
ba20: 66 75 6c 2c 20 72 65 74 75 72 6e 20 30 2e 20 0a  ful, return 0. .
ba30: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  ** Otherwise, se
ba40: 74 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  t pFile->lastErr
ba50: 6e 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f  no and return no
ba60: 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  n-zero..*/.stati
ba70: 63 20 69 6e 74 20 73 65 65 6b 57 69 6e 46 69 6c  c int seekWinFil
ba80: 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  e(winFile *pFile
ba90: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
baa0: 69 4f 66 66 73 65 74 29 7b 0a 20 20 4c 4f 4e 47  iOffset){.  LONG
bab0: 20 75 70 70 65 72 42 69 74 73 3b 20 20 20 20 20   upperBits;     
bac0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
bad0: 6f 73 74 20 73 69 67 2e 20 33 32 20 62 69 74 73  ost sig. 32 bits
bae0: 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a   of new offset *
baf0: 2f 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69  /.  LONG lowerBi
bb00: 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ts;             
bb10: 20 20 20 20 2f 2a 20 4c 65 61 73 74 20 73 69 67      /* Least sig
bb20: 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77  . 32 bits of new
bb30: 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 44 57 4f   offset */.  DWO
bb40: 52 44 20 64 77 52 65 74 3b 20 20 20 20 20 20 20  RD dwRet;       
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bb60: 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
bb70: 79 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  y SetFilePointer
bb80: 28 29 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61  () */.  DWORD la
bb90: 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  stErrno;        
bba0: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
bbb0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 47 65 74   returned by Get
bbc0: 4c 61 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a  LastError() */..
bbd0: 20 20 75 70 70 65 72 42 69 74 73 20 3d 20 28 4c    upperBits = (L
bbe0: 4f 4e 47 29 28 28 69 4f 66 66 73 65 74 3e 3e 33  ONG)((iOffset>>3
bbf0: 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29  2) & 0x7fffffff)
bc00: 3b 0a 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20  ;.  lowerBits = 
bc10: 28 4c 4f 4e 47 29 28 69 4f 66 66 73 65 74 20 26  (LONG)(iOffset &
bc20: 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 0a 20   0xffffffff);.. 
bc30: 20 2f 2a 20 41 50 49 20 6f 64 64 69 74 79 3a 20   /* API oddity: 
bc40: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
bc50: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20  etFilePointer() 
bc60: 72 65 74 75 72 6e 73 20 61 20 64 77 6f 72 64 20  returns a dword 
bc70: 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  .  ** containing
bc80: 20 74 68 65 20 6c 6f 77 65 72 20 33 32 2d 62 69   the lower 32-bi
bc90: 74 73 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69  ts of the new fi
bca0: 6c 65 2d 6f 66 66 73 65 74 2e 20 4f 72 2c 20 69  le-offset. Or, i
bcb0: 66 20 69 74 20 66 61 69 6c 73 2c 0a 20 20 2a 2a  f it fails,.  **
bcc0: 20 69 74 20 72 65 74 75 72 6e 73 20 49 4e 56 41   it returns INVA
bcd0: 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
bce0: 4e 54 45 52 2e 20 48 6f 77 65 76 65 72 20 61 63  NTER. However ac
bcf0: 63 6f 72 64 69 6e 67 20 74 6f 20 4d 53 44 4e 2c  cording to MSDN,
bd00: 20 0a 20 20 2a 2a 20 49 4e 56 41 4c 49 44 5f 53   .  ** INVALID_S
bd10: 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20  ET_FILE_POINTER 
bd20: 6d 61 79 20 61 6c 73 6f 20 62 65 20 61 20 76 61  may also be a va
bd30: 6c 69 64 20 6e 65 77 20 6f 66 66 73 65 74 2e 20  lid new offset. 
bd40: 53 6f 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  So to determine 
bd50: 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 61 6e  .  ** whether an
bd60: 20 65 72 72 6f 72 20 68 61 73 20 61 63 74 75 61   error has actua
bd70: 6c 6c 79 20 6f 63 63 75 72 65 64 2c 20 69 74 20  lly occured, it 
bd80: 69 73 20 61 6c 73 6f 20 6e 65 63 65 73 73 61 72  is also necessar
bd90: 79 20 74 6f 20 63 61 6c 6c 20 0a 20 20 2a 2a 20  y to call .  ** 
bda0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2e 0a  GetLastError()..
bdb0: 20 20 2a 2f 0a 20 20 64 77 52 65 74 20 3d 20 6f    */.  dwRet = o
bdc0: 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28  sSetFilePointer(
bdd0: 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72 42  pFile->h, lowerB
bde0: 69 74 73 2c 20 26 75 70 70 65 72 42 69 74 73 2c  its, &upperBits,
bdf0: 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20   FILE_BEGIN);.. 
be00: 20 69 66 28 20 28 64 77 52 65 74 3d 3d 49 4e 56   if( (dwRet==INV
be10: 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f  ALID_SET_FILE_PO
be20: 49 4e 54 45 52 0a 20 20 20 20 20 20 26 26 20 28  INTER.      && (
be30: 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  (lastErrno = osG
be40: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d  etLastError())!=
be50: 4e 4f 5f 45 52 52 4f 52 29 29 20 29 7b 0a 20 20  NO_ERROR)) ){.  
be60: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
be70: 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
be80: 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
be90: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45  SQLITE_IOERR_SEE
bea0: 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  K, pFile->lastEr
beb0: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
bec0: 20 20 22 73 65 65 6b 57 69 6e 46 69 6c 65 22 2c    "seekWinFile",
bed0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
bee0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
bef0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  }..  return 0;.}
bf00: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
bf10: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  file..**.** It i
bf20: 73 20 72 65 70 6f 72 74 65 64 20 74 68 61 74 20  s reported that 
bf30: 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6c  an attempt to cl
bf40: 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6d 69 67  ose a handle mig
bf50: 68 74 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  ht sometimes.** 
bf60: 66 61 69 6c 2e 20 20 54 68 69 73 20 69 73 20 61  fail.  This is a
bf70: 20 76 65 72 79 20 75 6e 72 65 61 73 6f 6e 61 62   very unreasonab
bf80: 6c 65 20 72 65 73 75 6c 74 2c 20 62 75 74 20 57  le result, but W
bf90: 69 6e 64 6f 77 73 20 69 73 20 6e 6f 74 6f 72 69  indows is notori
bfa0: 6f 75 73 0a 2a 2a 20 66 6f 72 20 62 65 69 6e 67  ous.** for being
bfb0: 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 73 6f   unreasonable so
bfc0: 20 49 20 64 6f 20 6e 6f 74 20 64 6f 75 62 74 20   I do not doubt 
bfd0: 74 68 61 74 20 69 74 20 6d 69 67 68 74 20 68 61  that it might ha
bfe0: 70 70 65 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65  ppen.  If.** the
bff0: 20 63 6c 6f 73 65 20 66 61 69 6c 73 2c 20 77 65   close fails, we
c000: 20 70 61 75 73 65 20 66 6f 72 20 31 30 30 20 6d   pause for 100 m
c010: 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20  illiseconds and 
c020: 74 72 79 20 61 67 61 69 6e 2e 20 20 41 73 0a 2a  try again.  As.*
c030: 2a 20 6d 61 6e 79 20 61 73 20 4d 58 5f 43 4c 4f  * many as MX_CLO
c040: 53 45 5f 41 54 54 45 4d 50 54 20 61 74 74 65 6d  SE_ATTEMPT attem
c050: 70 74 73 20 74 6f 20 63 6c 6f 73 65 20 74 68 65  pts to close the
c060: 20 68 61 6e 64 6c 65 20 61 72 65 20 6d 61 64 65   handle are made
c070: 20 62 65 66 6f 72 65 0a 2a 2a 20 67 69 76 69 6e   before.** givin
c080: 67 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69  g up and returni
c090: 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a  ng an error..*/.
c0a0: 23 64 65 66 69 6e 65 20 4d 58 5f 43 4c 4f 53 45  #define MX_CLOSE
c0b0: 5f 41 54 54 45 4d 50 54 20 33 0a 73 74 61 74 69  _ATTEMPT 3.stati
c0c0: 63 20 69 6e 74 20 77 69 6e 43 6c 6f 73 65 28 73  c int winClose(s
c0d0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
c0e0: 7b 0a 20 20 69 6e 74 20 72 63 2c 20 63 6e 74 20  {.  int rc, cnt 
c0f0: 3d 20 30 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  = 0;.  winFile *
c100: 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
c110: 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28  *)id;..  assert(
c120: 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   id!=0 );.  asse
c130: 72 74 28 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d  rt( pFile->pShm=
c140: 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  =0 );.  OSTRACE(
c150: 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 70  ("CLOSE %d\n", p
c160: 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 64 6f 7b  File->h));.  do{
c170: 0a 20 20 20 20 72 63 20 3d 20 6f 73 43 6c 6f 73  .    rc = osClos
c180: 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
c190: 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d 75 6c 61  );.    /* Simula
c1a0: 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 30 3b  teIOError( rc=0;
c1b0: 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54   cnt=MX_CLOSE_AT
c1c0: 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d  TEMPT; ); */.  }
c1d0: 77 68 69 6c 65 28 20 72 63 3d 3d 30 20 26 26 20  while( rc==0 && 
c1e0: 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53 45  ++cnt < MX_CLOSE
c1f0: 5f 41 54 54 45 4d 50 54 20 26 26 20 28 70 6f 72  _ATTEMPT && (por
c200: 74 61 62 6c 65 53 6c 65 65 70 28 31 30 30 29 2c  tableSleep(100),
c210: 20 31 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 54   1) );.#if SQLIT
c220: 45 5f 4f 53 5f 57 49 4e 43 45 0a 23 64 65 66 69  E_OS_WINCE.#defi
c230: 6e 65 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f  ne WINCE_DELETIO
c240: 4e 5f 41 54 54 45 4d 50 54 53 20 33 0a 20 20 77  N_ATTEMPTS 3.  w
c250: 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28  inceDestroyLock(
c260: 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 46  pFile);.  if( pF
c270: 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
c280: 6f 73 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  ose ){.    int c
c290: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  nt = 0;.    whil
c2a0: 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  e(.           os
c2b0: 44 65 6c 65 74 65 46 69 6c 65 57 28 70 46 69 6c  DeleteFileW(pFil
c2c0: 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
c2d0: 65 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26  e)==0.        &&
c2e0: 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
c2f0: 75 74 65 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65  utesW(pFile->zDe
c300: 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78  leteOnClose)!=0x
c310: 66 66 66 66 66 66 66 66 20 0a 20 20 20 20 20 20  ffffffff .      
c320: 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20 57 49 4e    && cnt++ < WIN
c330: 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45  CE_DELETION_ATTE
c340: 4d 50 54 53 0a 20 20 20 20 29 7b 0a 20 20 20 20  MPTS.    ){.    
c350: 20 20 20 70 6f 72 74 61 62 6c 65 53 6c 65 65 70     portableSleep
c360: 28 31 30 30 29 3b 20 20 2f 2a 20 57 61 69 74 20  (100);  /* Wait 
c370: 61 20 6c 69 74 74 6c 65 20 62 65 66 6f 72 65 20  a little before 
c380: 74 72 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a  trying again */.
c390: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
c3a0: 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44  3_free(pFile->zD
c3b0: 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20  eleteOnClose);. 
c3c0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52   }.#endif.  OSTR
c3d0: 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 20 25  ACE(("CLOSE %d %
c3e0: 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  s\n", pFile->h, 
c3f0: 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  rc ? "ok" : "fai
c400: 6c 65 64 22 29 29 3b 0a 20 20 4f 70 65 6e 43 6f  led"));.  OpenCo
c410: 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 72 65 74  unter(-1);.  ret
c420: 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f  urn rc ? SQLITE_
c430: 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 3a  OK.            :
c440: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
c450: 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c  ITE_IOERR_CLOSE,
c460: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
c470: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
c480: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
c490: 6e 43 6c 6f 73 65 22 2c 20 70 46 69 6c 65 2d 3e  nClose", pFile->
c4a0: 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zPath);.}../*.**
c4b0: 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20   Read data from 
c4c0: 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75  a file into a bu
c4d0: 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ffer.  Return SQ
c4e0: 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a  LITE_OK if all.*
c4f0: 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61  * bytes were rea
c500: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61  d successfully a
c510: 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  nd SQLITE_IOERR 
c520: 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
c530: 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  .** wrong..*/.st
c540: 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65 61 64  atic int winRead
c550: 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
c560: 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *id,          /
c570: 2a 20 46 69 6c 65 20 74 6f 20 72 65 61 64 20 66  * File to read f
c580: 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  rom */.  void *p
c590: 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
c5a0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 6f 6e      /* Write con
c5b0: 74 65 6e 74 20 69 6e 74 6f 20 74 68 69 73 20 62  tent into this b
c5c0: 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61  uffer */.  int a
c5d0: 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
c5e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c5f0: 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61 64  of bytes to read
c600: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
c610: 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 20 20  t64 offset      
c620: 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
c630: 67 20 61 74 20 74 68 69 73 20 6f 66 66 73 65 74  g at this offset
c640: 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65   */.){.  winFile
c650: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
c660: 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c 65  le*)id;  /* file
c670: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57 4f   handle */.  DWO
c680: 52 44 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  RD nRead;       
c690: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c6a0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
c6b0: 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72  actually read fr
c6c0: 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  om file */.  int
c6d0: 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20   nRetry = 0;    
c6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c6f0: 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 79 73  Number of retrys
c700: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
c710: 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61  d!=0 );.  Simula
c720: 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
c730: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
c740: 41 44 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  AD);.  OSTRACE((
c750: 22 52 45 41 44 20 25 64 20 6c 6f 63 6b 3d 25 64  "READ %d lock=%d
c760: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
c770: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
c780: 3b 0a 0a 20 20 69 66 28 20 73 65 65 6b 57 69 6e  ;..  if( seekWin
c790: 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73  File(pFile, offs
c7a0: 65 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  et) ){.    retur
c7b0: 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
c7c0: 20 7d 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52   }.  while( !osR
c7d0: 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  eadFile(pFile->h
c7e0: 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52  , pBuf, amt, &nR
c7f0: 65 61 64 2c 20 30 29 20 29 7b 0a 20 20 20 20 44  ead, 0) ){.    D
c800: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
c810: 20 20 20 20 69 66 28 20 72 65 74 72 79 49 6f 65      if( retryIoe
c820: 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73  rr(&nRetry, &las
c830: 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e  tErrno) ) contin
c840: 75 65 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ue;.    pFile->l
c850: 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
c860: 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
c870: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
c880: 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c 20  ITE_IOERR_READ, 
c890: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
c8a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
c8b0: 77 69 6e 52 65 61 64 22 2c 20 70 46 69 6c 65 2d  winRead", pFile-
c8c0: 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 6c  >zPath);.  }.  l
c8d0: 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79 29 3b  ogIoerr(nRetry);
c8e0: 0a 20 20 69 66 28 20 6e 52 65 61 64 3c 28 44 57  .  if( nRead<(DW
c8f0: 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20 20 20 2f  ORD)amt ){.    /
c900: 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f  * Unread parts o
c910: 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75 73  f the buffer mus
c920: 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64  t be zero-filled
c930: 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
c940: 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 6e 52  ((char*)pBuf)[nR
c950: 65 61 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52 65  ead], 0, amt-nRe
c960: 61 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ad);.    return 
c970: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
c980: 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20  RT_READ;.  }..  
c990: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c9a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
c9b0: 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
c9c0: 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e  fer into a file.
c9d0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
c9e0: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a  OK on success.**
c9f0: 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
ca00: 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69  rror code on fai
ca10: 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
ca20: 69 6e 74 20 77 69 6e 57 72 69 74 65 28 0a 20 20  int winWrite(.  
ca30: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
ca40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ca50: 2f 2a 20 46 69 6c 65 20 74 6f 20 77 72 69 74 65  /* File to write
ca60: 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74   into */.  const
ca70: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
ca80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
ca90: 65 20 62 79 74 65 73 20 74 6f 20 62 65 20 77 72  e bytes to be wr
caa0: 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  itten */.  int a
cab0: 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
cac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
cad0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
cae0: 20 77 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69   write */.  sqli
caf0: 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
cb10: 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66  ffset into the f
cb20: 69 6c 65 20 74 6f 20 62 65 67 69 6e 20 77 72 69  ile to begin wri
cb30: 74 69 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20  ting at */.){.  
cb40: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
cb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb60: 2f 2a 20 54 72 75 65 20 69 66 20 65 72 72 6f 72  /* True if error
cb70: 20 68 61 73 20 6f 63 63 75 72 65 64 2c 20 65 6c   has occured, el
cb80: 73 65 20 66 61 6c 73 65 20 2a 2f 0a 20 20 77 69  se false */.  wi
cb90: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
cba0: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a  winFile*)id;  /*
cbb0: 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a   File handle */.
cbc0: 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30    int nRetry = 0
cbd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cbe0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
cbf0: 65 74 72 69 65 73 20 2a 2f 0a 0a 20 20 61 73 73  etries */..  ass
cc00: 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20  ert( amt>0 );.  
cc10: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
cc20: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
cc30: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
cc40: 5f 49 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a 20  _IOERR_WRITE);. 
cc50: 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
cc60: 6c 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  lError(return SQ
cc70: 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f  LITE_FULL);..  O
cc80: 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20 25  STRACE(("WRITE %
cc90: 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46  d lock=%d\n", pF
cca0: 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
ccb0: 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 72 63  ocktype));..  rc
ccc0: 20 3d 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70   = seekWinFile(p
ccd0: 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20  File, offset);. 
cce0: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
ccf0: 20 20 75 38 20 2a 61 52 65 6d 20 3d 20 28 75 38    u8 *aRem = (u8
cd00: 20 2a 29 70 42 75 66 3b 20 20 20 20 20 20 20 20   *)pBuf;        
cd10: 2f 2a 20 44 61 74 61 20 79 65 74 20 74 6f 20 62  /* Data yet to b
cd20: 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20  e written */.   
cd30: 20 69 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b   int nRem = amt;
cd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cd50: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
cd60: 73 20 79 65 74 20 74 6f 20 62 65 20 77 72 69 74  s yet to be writ
cd70: 74 65 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44  ten */.    DWORD
cd80: 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
cd90: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
cda0: 73 20 77 72 69 74 74 65 6e 20 62 79 20 65 61 63  s written by eac
cdb0: 68 20 57 72 69 74 65 46 69 6c 65 28 29 20 63 61  h WriteFile() ca
cdc0: 6c 6c 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20  ll */.    DWORD 
cdd0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45  lastErrno = NO_E
cde0: 52 52 4f 52 3b 20 20 20 2f 2a 20 56 61 6c 75 65  RROR;   /* Value
cdf0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 47 65 74   returned by Get
ce00: 4c 61 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a  LastError() */..
ce10: 20 20 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e      while( nRem>
ce20: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
ce30: 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c  osWriteFile(pFil
ce40: 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d  e->h, aRem, nRem
ce50: 2c 20 26 6e 57 72 69 74 65 2c 20 30 29 20 29 7b  , &nWrite, 0) ){
ce60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 74  .        if( ret
ce70: 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c  ryIoerr(&nRetry,
ce80: 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63   &lastErrno) ) c
ce90: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
cea0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
ceb0: 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74 65        if( nWrite
cec0: 3c 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  <=0 ) break;.   
ced0: 20 20 20 61 52 65 6d 20 2b 3d 20 6e 57 72 69 74     aRem += nWrit
cee0: 65 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d  e;.      nRem -=
cef0: 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 7d 0a 20   nWrite;.    }. 
cf00: 20 20 20 69 66 28 20 6e 52 65 6d 3e 30 20 29 7b     if( nRem>0 ){
cf10: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
cf20: 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
cf30: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
cf40: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
cf50: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66  if( rc ){.    if
cf60: 28 20 20 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73  (   ( pFile->las
cf70: 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41  tErrno==ERROR_HA
cf80: 4e 44 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29  NDLE_DISK_FULL )
cf90: 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 70 46 69  .       || ( pFi
cfa0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  le->lastErrno==E
cfb0: 52 52 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29  RROR_DISK_FULL )
cfc0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
cfd0: 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
cfe0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69   }.    return wi
cff0: 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
d000: 5f 49 4f 45 52 52 5f 57 52 49 54 45 2c 20 70 46  _IOERR_WRITE, pF
d010: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
d030: 6e 57 72 69 74 65 22 2c 20 70 46 69 6c 65 2d 3e  nWrite", pFile->
d040: 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b  zPath);.  }else{
d050: 0a 20 20 20 20 6c 6f 67 49 6f 65 72 72 28 6e 52  .    logIoerr(nR
d060: 65 74 72 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74  etry);.  }.  ret
d070: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
d080: 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
d090: 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f   an open file to
d0a0: 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a   a specified siz
d0b0: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
d0c0: 77 69 6e 54 72 75 6e 63 61 74 65 28 73 71 6c 69  winTruncate(sqli
d0d0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71  te3_file *id, sq
d0e0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74  lite3_int64 nByt
d0f0: 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  e){.  winFile *p
d100: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
d110: 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61  )id;  /* File ha
d120: 6e 64 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ndle object */. 
d130: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
d140: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
d150: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
d160: 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  for this functio
d170: 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  n */..  assert( 
d180: 70 46 69 6c 65 20 29 3b 0a 0a 20 20 4f 53 54 52  pFile );..  OSTR
d190: 41 43 45 28 28 22 54 52 55 4e 43 41 54 45 20 25  ACE(("TRUNCATE %
d1a0: 64 20 25 6c 6c 64 5c 6e 22 2c 20 70 46 69 6c 65  d %lld\n", pFile
d1b0: 2d 3e 68 2c 20 6e 42 79 74 65 29 29 3b 0a 20 20  ->h, nByte));.  
d1c0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
d1d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
d1e0: 45 52 52 5f 54 52 55 4e 43 41 54 45 29 3b 0a 0a  ERR_TRUNCATE);..
d1f0: 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72    /* If the user
d200: 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20   has configured 
d210: 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72  a chunk-size for
d220: 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e   this file, trun
d230: 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69  cate the.  ** fi
d240: 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f  le so that it co
d250: 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74  nsists of an int
d260: 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63  eger number of c
d270: 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a  hunks (i.e. the.
d280: 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65    ** actual file
d290: 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 65 20   size after the 
d2a0: 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65  operation may be
d2b0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
d2c0: 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20   requested.  ** 
d2d0: 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  size)..  */.  if
d2e0: 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
d2f0: 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  >0 ){.    nByte 
d300: 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c  = ((nByte + pFil
d310: 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f  e->szChunk - 1)/
d320: 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20  pFile->szChunk) 
d330: 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  * pFile->szChunk
d340: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 45  ;.  }..  /* SetE
d350: 6e 64 4f 66 46 69 6c 65 28 29 20 72 65 74 75 72  ndOfFile() retur
d360: 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e  ns non-zero when
d370: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
d380: 7a 65 72 6f 20 77 68 65 6e 20 69 74 20 66 61 69  zero when it fai
d390: 6c 73 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 65  ls. */.  if( see
d3a0: 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20  kWinFile(pFile, 
d3b0: 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 72 63  nByte) ){.    rc
d3c0: 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
d3d0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
d3e0: 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  CATE, pFile->las
d3f0: 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
d400: 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74       "winTruncat
d410: 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  e1", pFile->zPat
d420: 68 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  h);.  }else if( 
d430: 30 3d 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c  0==osSetEndOfFil
d440: 65 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20  e(pFile->h) ){. 
d450: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
d460: 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
d470: 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d  rror();.    rc =
d480: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
d490: 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
d4a0: 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  TE, pFile->lastE
d4b0: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
d4c0: 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65 32     "winTruncate2
d4d0: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
d4e0: 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45  ;.  }..  OSTRACE
d4f0: 28 28 22 54 52 55 4e 43 41 54 45 20 25 64 20 25  (("TRUNCATE %d %
d500: 6c 6c 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65  lld %s\n", pFile
d510: 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 72 63 20 3f  ->h, nByte, rc ?
d520: 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22   "failed" : "ok"
d530: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
d540: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
d550: 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75  E_TEST./*.** Cou
d560: 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
d570: 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e   fullsyncs and n
d580: 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68  ormal syncs.  Th
d590: 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  is is used to te
d5a0: 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73  st.** that syncs
d5b0: 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61   and fullsyncs a
d5c0: 72 65 20 6f 63 63 75 72 69 6e 67 20 61 74 20 74  re occuring at t
d5d0: 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a  he right times..
d5e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
d5f0: 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69  ync_count = 0;.i
d600: 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73  nt sqlite3_fulls
d610: 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  ync_count = 0;.#
d620: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  endif../*.** Mak
d630: 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65  e sure all write
d640: 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61  s to a particula
d650: 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69  r file are commi
d660: 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f  tted to disk..*/
d670: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
d680: 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ync(sqlite3_file
d690: 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29   *id, int flags)
d6a0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
d6b0: 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a 20 20  _NO_SYNC.  /*.  
d6c0: 2a 2a 20 55 73 65 64 20 6f 6e 6c 79 20 77 68 65  ** Used only whe
d6d0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  n SQLITE_NO_SYNC
d6e0: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e   is not defined.
d6f0: 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63  .   */.  BOOL rc
d700: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
d710: 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c  fined(NDEBUG) ||
d720: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d730: 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c 0a 20  _NO_SYNC) || \. 
d740: 20 20 20 28 64 65 66 69 6e 65 64 28 53 51 4c 49     (defined(SQLI
d750: 54 45 5f 54 45 53 54 29 20 26 26 20 64 65 66 69  TE_TEST) && defi
d760: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
d770: 29 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65  )).  /*.  ** Use
d780: 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f  d when SQLITE_NO
d790: 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66  _SYNC is not def
d7a0: 69 6e 65 64 20 61 6e 64 20 62 79 20 74 68 65 20  ined and by the 
d7b0: 61 73 73 65 72 74 28 29 20 61 6e 64 2f 6f 72 0a  assert() and/or.
d7c0: 20 20 2a 2a 20 4f 53 54 52 41 43 45 28 29 20 6d    ** OSTRACE() m
d7d0: 61 63 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20 77  acros..   */.  w
d7e0: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
d7f0: 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 23 65  (winFile*)id;.#e
d800: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
d810: 41 4d 45 54 45 52 28 69 64 29 3b 0a 23 65 6e 64  AMETER(id);.#end
d820: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  if..  assert( pF
d830: 69 6c 65 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63  ile );.  /* Chec
d840: 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51  k that one of SQ
d850: 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
d860: 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73   or FULL was pas
d870: 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  sed */.  assert(
d880: 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
d890: 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
d8a0: 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73  .      || (flags
d8b0: 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
d8c0: 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20  YNC_FULL.  );.. 
d8d0: 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20   OSTRACE(("SYNC 
d8e0: 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70  %d lock=%d\n", p
d8f0: 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
d900: 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f  locktype));..  /
d910: 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62  * Unix cannot, b
d920: 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20  ut some systems 
d930: 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
d940: 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65  E_FULL from here
d950: 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65  . This.  ** line
d960: 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74   is to test that
d970: 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e   doing so does n
d980: 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f  ot cause any pro
d990: 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69  blems..  */.  Si
d9a0: 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
d9b0: 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
d9c0: 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 23 69 66 6e  TE_FULL );..#ifn
d9d0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
d9e0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
d9f0: 45 52 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65  ER(flags);.#else
da00: 0a 20 20 69 66 28 20 28 66 6c 61 67 73 26 30 78  .  if( (flags&0x
da10: 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
da20: 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c  _FULL ){.    sql
da30: 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
da40: 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c  unt++;.  }.  sql
da50: 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b  ite3_sync_count+
da60: 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  +;.#endif..  /* 
da70: 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77  If we compiled w
da80: 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e  ith the SQLITE_N
da90: 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65  O_SYNC flag, the
daa0: 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20  n syncing is a. 
dab0: 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23   ** no-op.  */.#
dac0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
dad0: 53 59 4e 43 0a 20 20 72 65 74 75 72 6e 20 53 51  SYNC.  return SQ
dae0: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20  LITE_OK;.#else. 
daf0: 20 72 63 20 3d 20 6f 73 46 6c 75 73 68 46 69 6c   rc = osFlushFil
db00: 65 42 75 66 66 65 72 73 28 70 46 69 6c 65 2d 3e  eBuffers(pFile->
db10: 68 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  h);.  SimulateIO
db20: 45 72 72 6f 72 28 20 72 63 3d 46 41 4c 53 45 20  Error( rc=FALSE 
db30: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
db40: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
db50: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
db60: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
db70: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
db80: 72 6f 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72  ror();.    retur
db90: 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
dba0: 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
dbb0: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
dbc0: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
dbd0: 20 22 77 69 6e 53 79 6e 63 22 2c 20 70 46 69 6c   "winSync", pFil
dbe0: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23  e->zPath);.  }.#
dbf0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  endif.}../*.** D
dc00: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72  etermine the cur
dc10: 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66  rent size of a f
dc20: 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a  ile in bytes.*/.
dc30: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69  static int winFi
dc40: 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  leSize(sqlite3_f
dc50: 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33  ile *id, sqlite3
dc60: 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a  _int64 *pSize){.
dc70: 20 20 44 57 4f 52 44 20 75 70 70 65 72 42 69 74    DWORD upperBit
dc80: 73 3b 0a 20 20 44 57 4f 52 44 20 6c 6f 77 65 72  s;.  DWORD lower
dc90: 42 69 74 73 3b 0a 20 20 77 69 6e 46 69 6c 65 20  Bits;.  winFile 
dca0: 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
dcb0: 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 6c  e*)id;.  DWORD l
dcc0: 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 61 73 73  astErrno;..  ass
dcd0: 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
dce0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
dcf0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
dd00: 45 52 52 5f 46 53 54 41 54 29 3b 0a 20 20 6c 6f  ERR_FSTAT);.  lo
dd10: 77 65 72 42 69 74 73 20 3d 20 6f 73 47 65 74 46  werBits = osGetF
dd20: 69 6c 65 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68  ileSize(pFile->h
dd30: 2c 20 26 75 70 70 65 72 42 69 74 73 29 3b 0a 20  , &upperBits);. 
dd40: 20 69 66 28 20 20 20 28 6c 6f 77 65 72 42 69 74   if(   (lowerBit
dd50: 73 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c  s == INVALID_FIL
dd60: 45 5f 53 49 5a 45 29 0a 20 20 20 20 20 26 26 20  E_SIZE).     && 
dd70: 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ((lastErrno = os
dd80: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21  GetLastError())!
dd90: 3d 4e 4f 5f 45 52 52 4f 52 29 20 29 0a 20 20 7b  =NO_ERROR) ).  {
dda0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
ddb0: 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
ddc0: 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69  o;.    return wi
ddd0: 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
dde0: 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46  _IOERR_FSTAT, pF
ddf0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
de10: 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c  nFileSize", pFil
de20: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20  e->zPath);.  }. 
de30: 20 2a 70 53 69 7a 65 20 3d 20 28 28 28 73 71 6c   *pSize = (((sql
de40: 69 74 65 33 5f 69 6e 74 36 34 29 75 70 70 65 72  ite3_int64)upper
de50: 42 69 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77  Bits)<<32) + low
de60: 65 72 42 69 74 73 3b 0a 20 20 72 65 74 75 72 6e  erBits;.  return
de70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
de80: 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  *.** LOCKFILE_FA
de90: 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 69  IL_IMMEDIATELY i
dea0: 73 20 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73  s undefined on s
deb0: 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73 79 73 74  ome Windows syst
dec0: 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ems..*/.#ifndef 
ded0: 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
dee0: 4d 45 44 49 41 54 45 4c 59 0a 23 20 64 65 66 69  MEDIATELY.# defi
def0: 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ne LOCKFILE_FAIL
df00: 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a 23  _IMMEDIATELY 1.#
df10: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  endif../*.** Acq
df20: 75 69 72 65 20 61 20 72 65 61 64 65 72 20 6c 6f  uire a reader lo
df30: 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74  ck..** Different
df40: 20 41 50 49 20 72 6f 75 74 69 6e 65 73 20 61 72   API routines ar
df50: 65 20 63 61 6c 6c 65 64 20 64 65 70 65 6e 64 69  e called dependi
df60: 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
df70: 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73 20   not this.** is 
df80: 57 69 6e 39 78 20 6f 72 20 57 69 6e 4e 54 2e 0a  Win9x or WinNT..
df90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
dfa0: 74 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c  tReadLock(winFil
dfb0: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74  e *pFile){.  int
dfc0: 20 72 65 73 3b 0a 20 20 69 66 28 20 69 73 4e 54   res;.  if( isNT
dfd0: 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41  () ){.    OVERLA
dfe0: 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6f  PPED ovlp;.    o
dff0: 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 53 48 41  vlp.Offset = SHA
e000: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6f  RED_FIRST;.    o
e010: 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d  vlp.OffsetHigh =
e020: 20 30 3b 0a 20 20 20 20 6f 76 6c 70 2e 68 45 76   0;.    ovlp.hEv
e030: 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 73  ent = 0;.    res
e040: 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 28   = osLockFileEx(
e050: 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 46 49  pFile->h, LOCKFI
e060: 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
e070: 45 4c 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ELY,.           
e080: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 53              0, S
e090: 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 2c 20 26  HARED_SIZE, 0, &
e0a0: 6f 76 6c 70 29 3b 0a 2f 2a 20 69 73 4e 54 28 29  ovlp);./* isNT()
e0b0: 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f   is 1 if SQLITE_
e0c0: 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20  OS_WINCE==1, so 
e0d0: 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76  this else is nev
e0e0: 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2f  er executed. .*/
e0f0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
e100: 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b  INCE==0.  }else{
e110: 0a 20 20 20 20 69 6e 74 20 6c 6b 3b 0a 20 20 20  .    int lk;.   
e120: 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
e130: 65 73 73 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20  ess(sizeof(lk), 
e140: 26 6c 6b 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  &lk);.    pFile-
e150: 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20  >sharedLockByte 
e160: 3d 20 28 73 68 6f 72 74 29 28 28 6c 6b 20 26 20  = (short)((lk & 
e170: 30 78 37 66 66 66 66 66 66 66 29 25 28 53 48 41  0x7fffffff)%(SHA
e180: 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 29 3b 0a  RED_SIZE - 1));.
e190: 20 20 20 20 72 65 73 20 3d 20 6f 73 4c 6f 63 6b      res = osLock
e1a0: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53  File(pFile->h, S
e1b0: 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c  HARED_FIRST+pFil
e1c0: 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e->sharedLockByt
e1d0: 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65 6e  e, 0, 1, 0);.#en
e1e0: 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 72 65  dif.  }.  if( re
e1f0: 73 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 70 46  s == 0 ){.    pF
e200: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
e210: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
e220: 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65  );.    /* No nee
e230: 64 20 74 6f 20 6c 6f 67 20 61 20 66 61 69 6c 75  d to log a failu
e240: 72 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  re to lock */.  
e250: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  }.  return res;.
e260: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20  }../*.** Undo a 
e270: 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74  readlock.*/.stat
e280: 69 63 20 69 6e 74 20 75 6e 6c 6f 63 6b 52 65 61  ic int unlockRea
e290: 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70  dLock(winFile *p
e2a0: 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73  File){.  int res
e2b0: 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
e2c0: 72 6e 6f 3b 0a 20 20 69 66 28 20 69 73 4e 54 28  rno;.  if( isNT(
e2d0: 29 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 6f  ) ){.    res = o
e2e0: 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c  sUnlockFile(pFil
e2f0: 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
e300: 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49  ST, 0, SHARED_SI
e310: 5a 45 2c 20 30 29 3b 0a 2f 2a 20 69 73 4e 54 28  ZE, 0);./* isNT(
e320: 29 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 45  ) is 1 if SQLITE
e330: 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f  _OS_WINCE==1, so
e340: 20 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65   this else is ne
e350: 76 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a  ver executed. .*
e360: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
e370: 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65  WINCE==0.  }else
e380: 7b 0a 20 20 20 20 72 65 73 20 3d 20 6f 73 55 6e  {.    res = osUn
e390: 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e  lockFile(pFile->
e3a0: 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20  h, SHARED_FIRST 
e3b0: 2b 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  + pFile->sharedL
e3c0: 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30  ockByte, 0, 1, 0
e3d0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
e3e0: 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20 28 28  if( res==0 && ((
e3f0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
e400: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45  tLastError())!=E
e410: 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29  RROR_NOT_LOCKED)
e420: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
e430: 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
e440: 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
e450: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
e460: 52 52 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65  RR_UNLOCK, pFile
e470: 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
e480: 20 20 20 20 20 20 20 20 20 20 22 75 6e 6c 6f 63            "unloc
e490: 6b 52 65 61 64 4c 6f 63 6b 22 2c 20 70 46 69 6c  kReadLock", pFil
e4a0: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20  e->zPath);.  }. 
e4b0: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
e4c0: 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
e4d0: 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
e4e0: 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
e4f0: 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70  arameter locktyp
e500: 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  e - one.** of th
e510: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
e520: 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
e530: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
e540: 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
e550: 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
e560: 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
e570: 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
e580: 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
e590: 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
e5a0: 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
e5b0: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
e5c0: 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
e5d0: 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
e5e0: 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
e5f0: 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
e600: 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
e610: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
e620: 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
e630: 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
e640: 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
e650: 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
e660: 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
e670: 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
e680: 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
e690: 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
e6a0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
e6b0: 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
e6c0: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
e6d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
e6e0: 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
e6f0: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
e700: 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
e710: 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
e720: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
e730: 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
e740: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
e750: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
e760: 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
e770: 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
e780: 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
e790: 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
e7a0: 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29   The winUnlock()
e7b0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73   routine.** eras
e7c0: 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20  es all locks at 
e7d0: 6f 6e 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73  once and returns
e7e0: 20 75 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   us immediately 
e7f0: 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  to locking level
e800: 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74   0..** It is not
e810: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77   possible to low
e820: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
e830: 65 76 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74  evel one step at
e840: 20 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a   a time.  You.**
e850: 20 6d 75 73 74 20 67 6f 20 73 74 72 61 69 67 68   must go straigh
e860: 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  t to locking lev
e870: 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  el 0..*/.static 
e880: 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69  int winLock(sqli
e890: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
e8a0: 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
e8b0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
e8c0: 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  K;    /* Return 
e8d0: 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75  code from subrou
e8e0: 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  tines */.  int r
e8f0: 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  es = 1;         
e900: 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61    /* Result of a
e910: 20 57 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61   Windows lock ca
e920: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c  ll */.  int newL
e930: 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f  ocktype;       /
e940: 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63  * Set pFile->loc
e950: 6b 74 79 70 65 20 74 6f 20 74 68 69 73 20 76 61  ktype to this va
e960: 6c 75 65 20 62 65 66 6f 72 65 20 65 78 69 74 69  lue before exiti
e970: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50  ng */.  int gotP
e980: 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f  endingLock = 0;/
e990: 2a 20 54 72 75 65 20 69 66 20 77 65 20 61 63 71  * True if we acq
e9a0: 75 69 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20  uired a PENDING 
e9b0: 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a  lock this time *
e9c0: 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  /.  winFile *pFi
e9d0: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
e9e0: 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  d;.  DWORD lastE
e9f0: 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b  rrno = NO_ERROR;
ea00: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
ea10: 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  0 );.  OSTRACE((
ea20: 22 4c 4f 43 4b 20 25 64 20 25 64 20 77 61 73 20  "LOCK %d %d was 
ea30: 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20  %d(%d)\n",.     
ea40: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
ea50: 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d  locktype, pFile-
ea60: 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65  >locktype, pFile
ea70: 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
ea80: 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ));..  /* If the
ea90: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
eaa0: 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70  lock of this typ
eab0: 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69  e or more restri
eac0: 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a  ctive on the.  *
ead0: 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74  * OsFile, do not
eae0: 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20  hing. Don't use 
eaf0: 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78  the end_lock: ex
eb00: 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a  it path, as.  **
eb10: 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
eb20: 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65  utex() hasn't be
eb30: 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20  en called yet.. 
eb40: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
eb50: 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74  >locktype>=lockt
eb60: 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ype ){.    retur
eb70: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
eb80: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
eb90: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71   the locking seq
eba0: 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74  uence is correct
ebb0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
ebc0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21  pFile->locktype!
ebd0: 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b  =NO_LOCK || lock
ebe0: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
ebf0: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  K );.  assert( l
ec00: 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47  ocktype!=PENDING
ec10: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
ec20: 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53  t( locktype!=RES
ec30: 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
ec40: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53  ile->locktype==S
ec50: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  HARED_LOCK );.. 
ec60: 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e   /* Lock the PEN
ec70: 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69  DING_LOCK byte i
ec80: 66 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71  f we need to acq
ec90: 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c  uire a PENDING l
eca0: 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48  ock or.  ** a SH
ecb0: 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77  ARED lock.  If w
ecc0: 65 20 61 72 65 20 61 63 71 75 69 72 69 6e 67 20  e are acquiring 
ecd0: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  a SHARED lock, t
ece0: 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f  he acquisition o
ecf0: 66 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49  f.  ** the PENDI
ed00: 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20  NG_LOCK byte is 
ed10: 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a  temporary..  */.
ed20: 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
ed30: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b  pFile->locktype;
ed40: 0a 20 20 69 66 28 20 20 20 28 70 46 69 6c 65 2d  .  if(   (pFile-
ed50: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f  >locktype==NO_LO
ed60: 43 4b 29 0a 20 20 20 20 20 7c 7c 20 28 20 20 20  CK).     || (   
ed70: 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55  (locktype==EXCLU
ed80: 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  SIVE_LOCK).     
ed90: 20 20 20 20 26 26 20 28 70 46 69 6c 65 2d 3e 6c      && (pFile->l
eda0: 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45  ocktype==RESERVE
edb0: 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20  D_LOCK)).  ){.  
edc0: 20 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20    int cnt = 3;. 
edd0: 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e     while( cnt-->
ede0: 30 20 26 26 20 28 72 65 73 20 3d 20 6f 73 4c 6f  0 && (res = osLo
edf0: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
ee00: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30   PENDING_BYTE, 0
ee10: 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20  , 1, 0))==0 ){. 
ee20: 20 20 20 20 20 2f 2a 20 54 72 79 20 33 20 74 69       /* Try 3 ti
ee30: 6d 65 73 20 74 6f 20 67 65 74 20 74 68 65 20 70  mes to get the p
ee40: 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68  ending lock.  Th
ee50: 69 73 20 69 73 20 6e 65 65 64 65 64 20 74 6f 20  is is needed to 
ee60: 77 6f 72 6b 0a 20 20 20 20 20 20 2a 2a 20 61 72  work.      ** ar
ee70: 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63 61  ound problems ca
ee80: 75 73 65 64 20 62 79 20 69 6e 64 65 78 69 6e 67  used by indexing
ee90: 20 61 6e 64 2f 6f 72 20 61 6e 74 69 2d 76 69 72   and/or anti-vir
eea0: 75 73 20 73 6f 66 74 77 61 72 65 20 6f 6e 0a 20  us software on. 
eeb0: 20 20 20 20 20 2a 2a 20 57 69 6e 64 6f 77 73 20       ** Windows 
eec0: 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20 20 2a  systems..      *
eed0: 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 73 69  * If you are usi
eee0: 6e 67 20 74 68 69 73 20 63 6f 64 65 20 61 73 20  ng this code as 
eef0: 61 20 6d 6f 64 65 6c 20 66 6f 72 20 61 6c 74 65  a model for alte
ef00: 72 6e 61 74 69 76 65 20 56 46 53 65 73 2c 20 64  rnative VFSes, d
ef10: 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63  o not.      ** c
ef20: 6f 70 79 20 74 68 69 73 20 72 65 74 72 79 20 6c  opy this retry l
ef30: 6f 67 69 63 2e 20 20 49 74 20 69 73 20 61 20 68  ogic.  It is a h
ef40: 61 63 6b 20 69 6e 74 65 6e 64 65 64 20 66 6f 72  ack intended for
ef50: 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79 2e 0a 20   Windows only.. 
ef60: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4f 53       */.      OS
ef70: 54 52 41 43 45 28 28 22 63 6f 75 6c 64 20 6e 6f  TRACE(("could no
ef80: 74 20 67 65 74 20 61 20 50 45 4e 44 49 4e 47 20  t get a PENDING 
ef90: 6c 6f 63 6b 2e 20 63 6e 74 3d 25 64 5c 6e 22 2c  lock. cnt=%d\n",
efa0: 20 63 6e 74 29 29 3b 0a 20 20 20 20 20 20 69 66   cnt));.      if
efb0: 28 20 63 6e 74 20 29 20 70 6f 72 74 61 62 6c 65  ( cnt ) portable
efc0: 53 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a  Sleep(1);.    }.
efd0: 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f      gotPendingLo
efe0: 63 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20 69 66  ck = res;.    if
eff0: 28 20 21 72 65 73 20 29 7b 0a 20 20 20 20 20 20  ( !res ){.      
f000: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
f010: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
f020: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63    }.  }..  /* Ac
f030: 71 75 69 72 65 20 61 20 73 68 61 72 65 64 20 6c  quire a shared l
f040: 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
f050: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
f060: 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
f070: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
f080: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ->locktype==NO_L
f090: 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  OCK );.    res =
f0a0: 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69   getReadLock(pFi
f0b0: 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  le);.    if( res
f0c0: 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
f0d0: 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c  ktype = SHARED_L
f0e0: 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
f0f0: 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
f100: 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
f110: 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ();.    }.  }.. 
f120: 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45   /* Acquire a RE
f130: 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f  SERVED lock.  */
f140: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
f150: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26  =RESERVED_LOCK &
f160: 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73  & res ){.    ass
f170: 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
f180: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
f190: 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 6f  K );.    res = o
f1a0: 73 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d  sLockFile(pFile-
f1b0: 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  >h, RESERVED_BYT
f1c0: 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20  E, 0, 1, 0);.   
f1d0: 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
f1e0: 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
f1f0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20  RESERVED_LOCK;. 
f200: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f210: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
f220: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
f230: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63    }.  }..  /* Ac
f240: 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20  quire a PENDING 
f250: 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
f260: 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
f270: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20  IVE_LOCK && res 
f280: 29 7b 0a 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  ){.    newLockty
f290: 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  pe = PENDING_LOC
f2a0: 4b 3b 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e  K;.    gotPendin
f2b0: 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a  gLock = 0;.  }..
f2c0: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20    /* Acquire an 
f2d0: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 0a 20  EXCLUSIVE lock. 
f2e0: 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
f2f0: 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
f300: 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  CK && res ){.   
f310: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
f320: 6c 6f 63 6b 74 79 70 65 3e 3d 53 48 41 52 45 44  locktype>=SHARED
f330: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73  _LOCK );.    res
f340: 20 3d 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63   = unlockReadLoc
f350: 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 4f 53  k(pFile);.    OS
f360: 54 52 41 43 45 28 28 22 75 6e 72 65 61 64 6c 6f  TRACE(("unreadlo
f370: 63 6b 20 3d 20 25 64 5c 6e 22 2c 20 72 65 73 29  ck = %d\n", res)
f380: 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 6f 73 4c  );.    res = osL
f390: 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  ockFile(pFile->h
f3a0: 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
f3b0: 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20  0, SHARED_SIZE, 
f3c0: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20  0);.    if( res 
f3d0: 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b  ){.      newLock
f3e0: 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49 56 45  type = EXCLUSIVE
f3f0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
f400: 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
f410: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
f420: 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  or();.      OSTR
f430: 41 43 45 28 28 22 65 72 72 6f 72 2d 63 6f 64 65  ACE(("error-code
f440: 20 3d 20 25 64 5c 6e 22 2c 20 6c 61 73 74 45 72   = %d\n", lastEr
f450: 72 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 65 74  rno));.      get
f460: 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  ReadLock(pFile);
f470: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
f480: 20 49 66 20 77 65 20 61 72 65 20 68 6f 6c 64 69   If we are holdi
f490: 6e 67 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  ng a PENDING loc
f4a0: 6b 20 74 68 61 74 20 6f 75 67 68 74 20 74 6f 20  k that ought to 
f4b0: 62 65 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65  be released, the
f4c0: 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 69  n.  ** release i
f4d0: 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  t now..  */.  if
f4e0: 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b  ( gotPendingLock
f4f0: 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   && locktype==SH
f500: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
f510: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46   osUnlockFile(pF
f520: 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  ile->h, PENDING_
f530: 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
f540: 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
f550: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
f560: 65 20 6c 6f 63 6b 20 68 61 73 20 68 65 6c 64 20  e lock has held 
f570: 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  in the file desc
f580: 72 69 70 74 6f 72 20 74 68 65 6e 0a 20 20 2a 2a  riptor then.  **
f590: 20 72 65 74 75 72 6e 20 74 68 65 20 61 70 70 72   return the appr
f5a0: 6f 70 72 69 61 74 65 20 72 65 73 75 6c 74 20 63  opriate result c
f5b0: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ode..  */.  if( 
f5c0: 72 65 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  res ){.    rc = 
f5d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
f5e0: 73 65 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  se{.    OSTRACE(
f5f0: 28 22 4c 4f 43 4b 20 46 41 49 4c 45 44 20 25 64  ("LOCK FAILED %d
f600: 20 74 72 79 69 6e 67 20 66 6f 72 20 25 64 20 62   trying for %d b
f610: 75 74 20 67 6f 74 20 25 64 5c 6e 22 2c 20 70 46  ut got %d\n", pF
f620: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
f630: 20 20 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77     locktype, new
f640: 4c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 20 20  Locktype));.    
f650: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
f660: 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
f670: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
f680: 53 59 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  SY;.  }.  pFile-
f690: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29  >locktype = (u8)
f6a0: 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20 20 72  newLocktype;.  r
f6b0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
f6c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
f6d0: 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
f6e0: 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
f6f0: 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
f700: 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
f710: 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
f720: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
f730: 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
f740: 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a   held, return.**
f750: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72   non-zero, other
f760: 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  wise zero..*/.st
f770: 61 74 69 63 20 69 6e 74 20 77 69 6e 43 68 65 63  atic int winChec
f780: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
f790: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
f7a0: 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
f7b0: 20 69 6e 74 20 72 63 3b 0a 20 20 77 69 6e 46 69   int rc;.  winFi
f7c0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
f7d0: 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
f7e0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
f7f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
f800: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
f810: 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72  OCK; );..  asser
f820: 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 69 66  t( id!=0 );.  if
f830: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
f840: 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e>=RESERVED_LOCK
f850: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a   ){.    rc = 1;.
f860: 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
f870: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
f880: 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69   (local)\n", pFi
f890: 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d  le->h, rc));.  }
f8a0: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f  else{.    rc = o
f8b0: 73 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d  sLockFile(pFile-
f8c0: 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  >h, RESERVED_BYT
f8d0: 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20  E, 0, 1, 0);.   
f8e0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
f8f0: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46   osUnlockFile(pF
f900: 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44  ile->h, RESERVED
f910: 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
f920: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
f930: 21 72 63 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  !rc;.    OSTRACE
f940: 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
f950: 25 64 20 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e  %d %d (remote)\n
f960: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29  ", pFile->h, rc)
f970: 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75  );.  }.  *pResOu
f980: 74 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e  t = rc;.  return
f990: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
f9a0: 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
f9b0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
f9c0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
f9d0: 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20  id to locktype. 
f9e0: 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73   locktype.** mus
f9f0: 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
fa00: 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
fa10: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
fa20: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
fa30: 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
fa40: 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
fa50: 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
fa60: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
fa70: 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
fa80: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
fa90: 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  o-op..**.** It i
faa0: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
fab0: 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  or this routine 
fac0: 74 6f 20 66 61 69 6c 20 69 66 20 74 68 65 20 73  to fail if the s
fad0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a  econd argument.*
fae0: 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49  * is NO_LOCK.  I
faf0: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
fb00: 75 6d 65 6e 74 20 69 73 20 53 48 41 52 45 44 5f  ument is SHARED_
fb10: 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69 73 20 72  LOCK then this r
fb20: 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20  outine.** might 
fb30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
fb40: 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ERR;.*/.static i
fb50: 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c  nt winUnlock(sql
fb60: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
fb70: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
fb80: 69 6e 74 20 74 79 70 65 3b 0a 20 20 77 69 6e 46  int type;.  winF
fb90: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
fba0: 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  nFile*)id;.  int
fbb0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
fbc0: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
fbd0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
fbe0: 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45   locktype<=SHARE
fbf0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f 53 54 52  D_LOCK );.  OSTR
fc00: 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 64 20  ACE(("UNLOCK %d 
fc10: 74 6f 20 25 64 20 77 61 73 20 25 64 28 25 64 29  to %d was %d(%d)
fc20: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c  \n", pFile->h, l
fc30: 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 20  ocktype,.       
fc40: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
fc50: 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  pe, pFile->share
fc60: 64 4c 6f 63 6b 42 79 74 65 29 29 3b 0a 20 20 74  dLockByte));.  t
fc70: 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63  ype = pFile->loc
fc80: 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 74 79 70  ktype;.  if( typ
fc90: 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e>=EXCLUSIVE_LOC
fca0: 4b 20 29 7b 0a 20 20 20 20 6f 73 55 6e 6c 6f 63  K ){.    osUnloc
fcb0: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
fcc0: 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
fcd0: 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
fce0: 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79  ;.    if( lockty
fcf0: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
fd00: 26 26 20 21 67 65 74 52 65 61 64 4c 6f 63 6b 28  && !getReadLock(
fd10: 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20  pFile) ){.      
fd20: 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  /* This should n
fd30: 65 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65  ever happen.  We
fd40: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
fd50: 65 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  e able to.      
fd60: 2a 2a 20 72 65 61 63 71 75 69 72 65 20 74 68 65  ** reacquire the
fd70: 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20   read lock */.  
fd80: 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
fd90: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
fda0: 52 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c  R_UNLOCK, osGetL
fdb0: 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
fdc0: 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55             "winU
fdd0: 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a  nlock", pFile->z
fde0: 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Path);.    }.  }
fdf0: 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 52 45 53  .  if( type>=RES
fe00: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
fe10: 20 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 70    osUnlockFile(p
fe20: 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45  File->h, RESERVE
fe30: 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  D_BYTE, 0, 1, 0)
fe40: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b  ;.  }.  if( lock
fe50: 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26  type==NO_LOCK &&
fe60: 20 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f   type>=SHARED_LO
fe70: 43 4b 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b  CK ){.    unlock
fe80: 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  ReadLock(pFile);
fe90: 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e  .  }.  if( type>
fea0: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b  =PENDING_LOCK ){
feb0: 0a 20 20 20 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c  .    osUnlockFil
fec0: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44  e(pFile->h, PEND
fed0: 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  ING_BYTE, 0, 1, 
fee0: 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  0);.  }.  pFile-
fef0: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29  >locktype = (u8)
ff00: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75  locktype;.  retu
ff10: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
ff20: 49 66 20 2a 70 41 72 67 20 69 73 20 69 6e 69 74  If *pArg is init
ff30: 69 74 69 61 6c 6c 79 20 6e 65 67 61 74 69 76 65  itially negative
ff40: 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 20   then this is a 
ff50: 71 75 65 72 79 2e 20 20 53 65 74 20 2a 70 41 72  query.  Set *pAr
ff60: 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64  g to.** 1 or 0 d
ff70: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
ff80: 68 65 72 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d  her or not bit m
ff90: 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74  ask of pFile->ct
ffa0: 72 6c 46 6c 61 67 73 20 69 73 20 73 65 74 2e 0a  rlFlags is set..
ffb0: 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69  **.** If *pArg i
ffc0: 73 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 63  s 0 or 1, then c
ffd0: 6c 65 61 72 20 6f 72 20 73 65 74 20 74 68 65 20  lear or set the 
ffe0: 6d 61 73 6b 20 62 69 74 20 6f 66 20 70 46 69 6c  mask bit of pFil
fff0: 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f  e->ctrlFlags..*/
10000 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
10010 4d 6f 64 65 42 69 74 28 77 69 6e 46 69 6c 65 20  ModeBit(winFile 
10020 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64  *pFile, unsigned
10030 20 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20   char mask, int 
10040 2a 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a 70  *pArg){.  if( *p
10050 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41  Arg<0 ){.    *pA
10060 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72  rg = (pFile->ctr
10070 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21 3d  lFlags & mask)!=
10080 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  0;.  }else if( (
10090 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20  *pArg)==0 ){.   
100a0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
100b0 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65  s &= ~mask;.  }e
100c0 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
100d0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73  ctrlFlags |= mas
100e0 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  k;.  }.}../*.** 
100f0 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65 72  Control and quer
10100 79 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69  y of the open fi
10110 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  le handle..*/.st
10120 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65  atic int winFile
10130 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
10140 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70  file *id, int op
10150 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
10160 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
10170 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
10180 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
10190 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
101a0 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a  FCNTL_LOCKSTATE:
101b0 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
101c0 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f  pArg = pFile->lo
101d0 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 72 65  cktype;.      re
101e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
101f0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
10200 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f  QLITE_LAST_ERRNO
10210 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
10220 29 70 41 72 67 20 3d 20 28 69 6e 74 29 70 46 69  )pArg = (int)pFi
10230 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  le->lastErrno;. 
10240 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10250 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
10260 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
10270 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b  TL_CHUNK_SIZE: {
10280 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a  .      pFile->sz
10290 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29  Chunk = *(int *)
102a0 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75  pArg;.      retu
102b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
102c0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
102d0 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
102e0 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  INT: {.      if(
102f0 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e   pFile->szChunk>
10300 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
10310 69 74 65 33 5f 69 6e 74 36 34 20 6f 6c 64 53 7a  ite3_int64 oldSz
10320 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63  ;.        int rc
10330 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 69   = winFileSize(i
10340 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a 20 20 20 20  d, &oldSz);.    
10350 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
10360 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
10370 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
10380 20 6e 65 77 53 7a 20 3d 20 2a 28 73 71 6c 69 74   newSz = *(sqlit
10390 65 33 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a  e3_int64*)pArg;.
103a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 65            if( ne
103b0 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20 20  wSz>oldSz ){.   
103c0 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74           Simulat
103d0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
103e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
103f0 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28  c = winTruncate(
10400 69 64 2c 20 6e 65 77 53 7a 29 3b 0a 20 20 20 20  id, newSz);.    
10410 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65          Simulate
10420 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
10430 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
10440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10450 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
10460 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
10470 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
10480 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
10490 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57  _FCNTL_PERSIST_W
104a0 41 4c 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d  AL: {.      winM
104b0 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49  odeBit(pFile, WI
104c0 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41  NFILE_PERSIST_WA
104d0 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a  L, (int*)pArg);.
104e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
104f0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
10500 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
10510 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  NTL_POWERSAFE_OV
10520 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20  ERWRITE: {.     
10530 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c   winModeBit(pFil
10540 65 2c 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 2c  e, WINFILE_PSOW,
10550 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20   (int*)pArg);.  
10560 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10570 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
10580 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
10590 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20  L_VFSNAME: {.   
105a0 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
105b0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
105c0 74 66 28 22 77 69 6e 33 32 22 29 3b 0a 20 20 20  tf("win32");.   
105d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
105e0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
105f0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
10600 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59 3a  _WIN32_AV_RETRY:
10610 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 20   {.      int *a 
10620 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20  = (int*)pArg;.  
10630 20 20 20 20 69 66 28 20 61 5b 30 5d 3e 30 20 29      if( a[0]>0 )
10640 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 33 32 49  {.        win32I
10650 6f 65 72 72 52 65 74 72 79 20 3d 20 61 5b 30 5d  oerrRetry = a[0]
10660 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
10670 20 20 20 20 20 20 20 61 5b 30 5d 20 3d 20 77 69         a[0] = wi
10680 6e 33 32 49 6f 65 72 72 52 65 74 72 79 3b 0a 20  n32IoerrRetry;. 
10690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
106a0 20 61 5b 31 5d 3e 30 20 29 7b 0a 20 20 20 20 20   a[1]>0 ){.     
106b0 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74     win32IoerrRet
106c0 72 79 44 65 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a  ryDelay = a[1];.
106d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
106e0 20 20 20 20 20 61 5b 31 5d 20 3d 20 77 69 6e 33       a[1] = win3
106f0 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79  2IoerrRetryDelay
10700 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10710 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10720 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
10730 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
10740 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  OUND;.}../*.** R
10750 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
10760 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
10770 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
10780 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
10790 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
107a0 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
107b0 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
107c0 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
107d0 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
107e0 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
107f0 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
10800 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
10810 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
10820 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
10830 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
10840 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
10850 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
10860 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
10870 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
10880 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
10890 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
108a0 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74  e) that the sect
108b0 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
108c0 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20  the.** same for 
108d0 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  both..*/.static 
108e0 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53 69 7a  int winSectorSiz
108f0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
10900 69 64 29 7b 0a 20 20 28 76 6f 69 64 29 69 64 3b  id){.  (void)id;
10910 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10920 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f  _DEFAULT_SECTOR_
10930 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  SIZE;.}../*.** R
10940 65 74 75 72 6e 20 61 20 76 65 63 74 6f 72 20 6f  eturn a vector o
10950 66 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  f device charact
10960 65 72 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61  eristics..*/.sta
10970 74 69 63 20 69 6e 74 20 77 69 6e 44 65 76 69 63  tic int winDevic
10980 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
10990 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
109a0 64 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  d){.  winFile *p
109b0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
109c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
109d0 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
109e0 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20  LE_WHEN_OPEN |. 
109f0 20 20 20 20 20 20 20 20 28 28 70 2d 3e 63 74 72          ((p->ctr
10a00 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45  lFlags & WINFILE
10a10 5f 50 53 4f 57 29 3f 53 51 4c 49 54 45 5f 49 4f  _PSOW)?SQLITE_IO
10a20 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
10a30 45 52 57 52 49 54 45 3a 30 29 3b 0a 7d 0a 0a 23  ERWRITE:0);.}..#
10a40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10a50 49 54 5f 57 41 4c 0a 0a 2f 2a 20 0a 2a 2a 20 57  IT_WAL../* .** W
10a60 69 6e 64 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c 79  indows will only
10a70 20 6c 65 74 20 79 6f 75 20 63 72 65 61 74 65 20   let you create 
10a80 66 69 6c 65 20 76 69 65 77 20 6d 61 70 70 69 6e  file view mappin
10a90 67 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74  gs.** on allocat
10aa0 69 6f 6e 20 73 69 7a 65 20 67 72 61 6e 75 6c 61  ion size granula
10ab0 72 69 74 79 20 62 6f 75 6e 64 61 72 69 65 73 2e  rity boundaries.
10ac0 0a 2a 2a 20 44 75 72 69 6e 67 20 73 71 6c 69 74  .** During sqlit
10ad0 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 65 20  e3_os_init() we 
10ae0 64 6f 20 61 20 47 65 74 53 79 73 74 65 6d 49 6e  do a GetSystemIn
10af0 66 6f 28 29 0a 2a 2a 20 74 6f 20 67 65 74 20 74  fo().** to get t
10b00 68 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20 73  he granularity s
10b10 69 7a 65 2e 0a 2a 2f 0a 53 59 53 54 45 4d 5f 49  ize..*/.SYSTEM_I
10b20 4e 46 4f 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a  NFO winSysInfo;.
10b30 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
10b40 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69  nctions to obtai
10b50 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68  n and relinquish
10b60 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
10b70 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c  x. The.** global
10b80 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74   mutex is used t
10b90 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 77 69  o protect the wi
10ba0 6e 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74  nLockInfo object
10bb0 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68  s used by .** th
10bc0 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20  is file, all of 
10bd0 77 68 69 63 68 20 6d 61 79 20 62 65 20 73 68 61  which may be sha
10be0 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  red by multiple 
10bf0 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46  threads..**.** F
10c00 75 6e 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75  unction winShmMu
10c10 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73 65  texHeld() is use
10c20 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  d to assert() th
10c30 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  at the global mu
10c40 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20  tex .** is held 
10c50 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54  when required. T
10c60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
10c70 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72  only used as par
10c80 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a  t of assert() .*
10c90 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e  * statements. e.
10ca0 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68  g..**.**   winSh
10cb0 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a  mEnterMutex().**
10cc0 20 20 20 20 20 61 73 73 65 72 74 28 20 77 69 6e       assert( win
10cd0 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29  ShmMutexHeld() )
10ce0 3b 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 4c 65 61  ;.**   winShmLea
10cf0 76 65 4d 75 74 65 78 28 29 0a 2a 2f 0a 73 74 61  veMutex().*/.sta
10d00 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 45  tic void winShmE
10d10 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b  nterMutex(void){
10d20 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
10d30 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75  _enter(sqlite3Mu
10d40 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
10d50 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
10d60 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20  TER));.}.static 
10d70 76 6f 69 64 20 77 69 6e 53 68 6d 4c 65 61 76 65  void winShmLeave
10d80 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
10d90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
10da0 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  ve(sqlite3MutexA
10db0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
10dc0 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
10dd0 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  );.}.#ifdef SQLI
10de0 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
10df0 69 6e 74 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  int winShmMutexH
10e00 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65  eld(void) {.  re
10e10 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
10e20 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d  ex_held(sqlite3M
10e30 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
10e40 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
10e50 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  STER));.}.#endif
10e60 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75  ../*.** Object u
10e70 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
10e80 20 61 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f   a single file o
10e90 70 65 6e 65 64 20 61 6e 64 20 6d 6d 61 70 70 65  pened and mmappe
10ea0 64 20 74 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20  d to provide.** 
10eb0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20  shared memory.  
10ec0 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68  When multiple th
10ed0 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65  reads all refere
10ee0 6e 63 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  nce the same.** 
10ef0 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63  log-summary, eac
10f00 68 20 74 68 72 65 61 64 20 68 61 73 20 69 74 73  h thread has its
10f10 20 6f 77 6e 20 77 69 6e 46 69 6c 65 20 6f 62 6a   own winFile obj
10f20 65 63 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c  ect, but they al
10f30 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20  l.** point to a 
10f40 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 20  single instance 
10f50 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 2e 20  of this object. 
10f60 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
10f70 20 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d   each.** log-sum
10f80 6d 61 72 79 20 69 73 20 6f 70 65 6e 65 64 20 6f  mary is opened o
10f90 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f  nly once per pro
10fa0 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53  cess..**.** winS
10fb0 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75  hmMutexHeld() mu
10fc0 73 74 20 62 65 20 74 72 75 65 20 77 68 65 6e 20  st be true when 
10fd0 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74  creating or dest
10fe0 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f  roying.** this o
10ff0 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72  bject or while r
11000 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
11010 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
11020 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  fields:.**.**   
11030 20 20 20 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20     nRef.**      
11040 70 4e 65 78 74 20 0a 2a 2a 0a 2a 2a 20 54 68 65  pNext .**.** The
11050 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
11060 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  s are read-only 
11070 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74  after the object
11080 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20   is created:.** 
11090 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20  .**      fid.** 
110a0 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a       zFilename.*
110b0 2a 0a 2a 2a 20 45 69 74 68 65 72 20 77 69 6e 53  *.** Either winS
110c0 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73  hmNode.mutex mus
110d0 74 20 62 65 20 68 65 6c 64 20 6f 72 20 77 69 6e  t be held or win
110e0 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20  ShmNode.nRef==0 
110f0 61 6e 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74  and.** winShmMut
11100 65 78 48 65 6c 64 28 29 20 69 73 20 74 72 75 65  exHeld() is true
11110 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72   when reading or
11120 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68   writing any oth
11130 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74  er field.** in t
11140 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  his structure..*
11150 2a 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53  *.*/.struct winS
11160 68 6d 4e 6f 64 65 20 7b 0a 20 20 73 71 6c 69 74  hmNode {.  sqlit
11170 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b  e3_mutex *mutex;
11180 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74        /* Mutex t
11190 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62  o access this ob
111a0 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ject */.  char *
111b0 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
111c0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
111d0 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69  the file */.  wi
111e0 6e 46 69 6c 65 20 68 46 69 6c 65 3b 20 20 20 20  nFile hFile;    
111f0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
11200 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 77 69 6e   handle from win
11210 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20 73  Open */..  int s
11220 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  zRegion;        
11230 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
11240 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
11250 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
11260 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  nRegion;        
11270 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
11280 66 20 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e  f array apRegion
11290 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 68 6d   */.  struct Shm
112a0 52 65 67 69 6f 6e 20 7b 0a 20 20 20 20 48 41 4e  Region {.    HAN
112b0 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20  DLE hMap;       
112c0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61        /* File ha
112d0 6e 64 6c 65 20 66 72 6f 6d 20 43 72 65 61 74 65  ndle from Create
112e0 46 69 6c 65 4d 61 70 70 69 6e 67 20 2a 2f 0a 20  FileMapping */. 
112f0 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 3b 0a 20     void *pMap;. 
11300 20 7d 20 2a 61 52 65 67 69 6f 6e 3b 0a 20 20 44   } *aRegion;.  D
11310 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20  WORD lastErrno; 
11320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11330 20 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66   Windows errno f
11340 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f  rom the last I/O
11350 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74   error */..  int
11360 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
11370 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11380 72 20 6f 66 20 77 69 6e 53 68 6d 20 6f 62 6a 65  r of winShm obje
11390 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  cts pointing to 
113a0 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  this */.  winShm
113b0 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
113c0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 77 69 6e 53       /* All winS
113d0 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
113e0 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20  ing to this */. 
113f0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65   winShmNode *pNe
11400 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  xt;         /* N
11410 65 78 74 20 69 6e 20 6c 69 73 74 20 6f 66 20 61  ext in list of a
11420 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62  ll winShmNode ob
11430 6a 65 63 74 73 20 2a 2f 0a 23 69 66 64 65 66 20  jects */.#ifdef 
11440 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75  SQLITE_DEBUG.  u
11450 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20  8 nextShmId;    
11460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
11470 74 20 61 76 61 69 6c 61 62 6c 65 20 77 69 6e 53  t available winS
11480 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23  hm.id value */.#
11490 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
114a0 41 20 67 6c 6f 62 61 6c 20 61 72 72 61 79 20 6f  A global array o
114b0 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65  f all winShmNode
114c0 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20   objects..**.** 
114d0 54 68 65 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  The winShmMutexH
114e0 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72  eld() must be tr
114f0 75 65 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  ue while reading
11500 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 69 73   or writing this
11510 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
11520 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 77 69 6e   winShmNode *win
11530 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 30 3b  ShmNodeList = 0;
11540 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72  ../*.** Structur
11550 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  e used internall
11560 79 20 62 79 20 74 68 69 73 20 56 46 53 20 74 6f  y by this VFS to
11570 20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61 74   record the stat
11580 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20  e of an.** open 
11590 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f  shared memory co
115a0 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
115b0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  The following fi
115c0 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c  elds are initial
115d0 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f  ized when this o
115e0 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
115f0 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64   and.** are read
11600 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72  -only thereafter
11610 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 77 69 6e 53 68  :.**.**    winSh
11620 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20  m.pShmNode.**   
11630 20 77 69 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a   winShm.id.**.**
11640 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64   All other field
11650 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74 65  s are read/write
11660 2e 20 20 54 68 65 20 77 69 6e 53 68 6d 2e 70 53  .  The winShm.pS
11670 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 6d 75  hmNode->mutex mu
11680 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68  st be held.** wh
11690 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e  ile accessing an
116a0 79 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 65  y read/write fie
116b0 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77  lds..*/.struct w
116c0 69 6e 53 68 6d 20 7b 0a 20 20 77 69 6e 53 68 6d  inShm {.  winShm
116d0 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
116e0 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
116f0 72 6c 79 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64  rlying winShmNod
11700 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 77 69  e object */.  wi
11710 6e 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20  nShm *pNext;    
11720 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
11730 20 77 69 6e 53 68 6d 20 77 69 74 68 20 74 68 65   winShm with the
11740 20 73 61 6d 65 20 77 69 6e 53 68 6d 4e 6f 64 65   same winShmNode
11750 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65   */.  u8 hasMute
11760 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
11770 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64   /* True if hold
11780 69 6e 67 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f  ing the winShmNo
11790 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31  de mutex */.  u1
117a0 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20  6 sharedMask;   
117b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
117c0 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73   of shared locks
117d0 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65   held */.  u16 e
117e0 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  xclMask;        
117f0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
11800 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
11810 20 68 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20   held */.#ifdef 
11820 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75  SQLITE_DEBUG.  u
11830 38 20 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  8 id;           
11840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20            /* Id 
11850 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  of this connecti
11860 6f 6e 20 77 69 74 68 20 69 74 73 20 77 69 6e 53  on with its winS
11870 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66  hmNode */.#endif
11880 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  .};../*.** Const
11890 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f  ants used for lo
118a0 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65  cking.*/.#define
118b0 20 57 49 4e 5f 53 48 4d 5f 42 41 53 45 20 20 20   WIN_SHM_BASE   
118c0 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f  ((22+SQLITE_SHM_
118d0 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20  NLOCK)*4)       
118e0 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62   /* first lock b
118f0 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  yte */.#define W
11900 49 4e 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 57  IN_SHM_DMS    (W
11910 49 4e 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49  IN_SHM_BASE+SQLI
11920 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f  TE_SHM_NLOCK)  /
11930 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68  * deadman switch
11940 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79   */../*.** Apply
11950 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
11960 66 6f 72 20 61 6c 6c 20 6e 20 62 79 74 65 73 20  for all n bytes 
11970 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 6f 66 73  beginning at ofs
11980 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 53  t..*/.#define _S
11990 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23 64 65 66  HM_UNLCK  1.#def
119a0 69 6e 65 20 5f 53 48 4d 5f 52 44 4c 43 4b 20 20  ine _SHM_RDLCK  
119b0 32 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 57  2.#define _SHM_W
119c0 52 4c 43 4b 20 20 33 0a 73 74 61 74 69 63 20 69  RLCK  3.static i
119d0 6e 74 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c  nt winShmSystemL
119e0 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  ock(.  winShmNod
119f0 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a 20  e *pFile,    /* 
11a00 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74  Apply locks to t
11a10 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d  his open shared-
11a20 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a  memory segment *
11a30 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65  /.  int lockType
11a40 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 5f 53 48  ,         /* _SH
11a50 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44  M_UNLCK, _SHM_RD
11a60 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57 52 4c  LCK, or _SHM_WRL
11a70 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74  CK */.  int ofst
11a80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
11a90 20 4f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74   Offset to first
11aa0 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b   byte to be lock
11ab0 65 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20  ed/unlocked */. 
11ac0 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20 20 20   int nByte      
11ad0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11ae0 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63   of bytes to loc
11af0 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29  k or unlock */.)
11b00 7b 0a 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f  {.  OVERLAPPED o
11b10 76 6c 70 3b 0a 20 20 44 57 4f 52 44 20 64 77 46  vlp;.  DWORD dwF
11b20 6c 61 67 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d  lags;.  int rc =
11b30 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
11b40 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72   Result code for
11b50 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c  m Lock/UnlockFil
11b60 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41  eEx() */..  /* A
11b70 63 63 65 73 73 20 74 6f 20 74 68 65 20 77 69 6e  ccess to the win
11b80 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69  ShmNode object i
11b90 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20  s serialized by 
11ba0 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20  the caller */.  
11bb0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11bc0 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 69 6c 65  mutex_held(pFile
11bd0 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 46 69 6c  ->mutex) || pFil
11be0 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20  e->nRef==0 );.. 
11bf0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
11c00 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d  he locking param
11c10 65 74 65 72 73 20 2a 2f 0a 20 20 64 77 46 6c 61  eters */.  dwFla
11c20 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  gs = LOCKFILE_FA
11c30 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 3b 0a  IL_IMMEDIATELY;.
11c40 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 20 3d    if( lockType =
11c50 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 29 20 64  = _SHM_WRLCK ) d
11c60 77 46 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b 46 49  wFlags |= LOCKFI
11c70 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  LE_EXCLUSIVE_LOC
11c80 4b 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76  K;..  memset(&ov
11c90 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56  lp, 0, sizeof(OV
11ca0 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 6f 76  ERLAPPED));.  ov
11cb0 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 73 74  lp.Offset = ofst
11cc0 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 2f  ;..  /* Release/
11cd0 41 63 71 75 69 72 65 20 74 68 65 20 73 79 73 74  Acquire the syst
11ce0 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f  em-level lock */
11cf0 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d  .  if( lockType=
11d00 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20  =_SHM_UNLCK ){. 
11d10 20 20 20 72 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b     rc = osUnlock
11d20 46 69 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 46  FileEx(pFile->hF
11d30 69 6c 65 2e 68 2c 20 30 2c 20 6e 42 79 74 65 2c  ile.h, 0, nByte,
11d40 20 30 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65   0, &ovlp);.  }e
11d50 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73  lse{.    rc = os
11d60 4c 6f 63 6b 46 69 6c 65 45 78 28 70 46 69 6c 65  LockFileEx(pFile
11d70 2d 3e 68 46 69 6c 65 2e 68 2c 20 64 77 46 6c 61  ->hFile.h, dwFla
11d80 67 73 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 2c  gs, 0, nByte, 0,
11d90 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 0a 20 20 0a   &ovlp);.  }.  .
11da0 20 20 69 66 28 20 72 63 21 3d 20 30 20 29 7b 0a    if( rc!= 0 ){.
11db0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11dc0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
11dd0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
11de0 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73 74 45 72  o =  osGetLastEr
11df0 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d 20  ror();.    rc = 
11e00 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
11e10 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ..  OSTRACE(("SH
11e20 4d 2d 4c 4f 43 4b 20 25 64 20 25 73 20 25 73 20  M-LOCK %d %s %s 
11e30 30 78 25 30 38 6c 78 5c 6e 22 2c 20 0a 20 20 20  0x%08lx\n", .   
11e40 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
11e50 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20  File.h,.        
11e60 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
11e70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
11e80 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c  d",.           l
11e90 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e  ockType==_SHM_UN
11ea0 4c 43 4b 20 3f 20 22 55 6e 6c 6f 63 6b 46 69 6c  LCK ? "UnlockFil
11eb0 65 45 78 22 20 3a 20 22 4c 6f 63 6b 46 69 6c 65  eEx" : "LockFile
11ec0 45 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Ex",.           
11ed0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11ee0 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  ));..  return rc
11ef0 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
11f00 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46  references to VF
11f10 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  S methods */.sta
11f20 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28  tic int winOpen(
11f30 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 63 6f 6e  sqlite3_vfs*,con
11f40 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 33  st char*,sqlite3
11f50 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29  _file*,int,int*)
11f60 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
11f70 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f 76  Delete(sqlite3_v
11f80 66 73 20 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  fs *,const char*
11f90 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75  ,int);../*.** Pu
11fa0 72 67 65 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f  rge the winShmNo
11fb0 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61  deList list of a
11fc0 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68 20  ll entries with 
11fd0 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d  winShmNode.nRef=
11fe0 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  =0..**.** This i
11ff0 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72  s not a VFS shar
12000 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64  ed-memory method
12010 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c 69 74  ; it is a utilit
12020 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  y function calle
12030 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72  d.** by VFS shar
12040 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64  ed-memory method
12050 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
12060 64 20 77 69 6e 53 68 6d 50 75 72 67 65 28 73 71  d winShmPurge(sq
12070 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
12080 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 29   int deleteFlag)
12090 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  {.  winShmNode *
120a0 2a 70 70 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  *pp;.  winShmNod
120b0 65 20 2a 70 3b 0a 20 20 42 4f 4f 4c 20 62 52 63  e *p;.  BOOL bRc
120c0 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53  ;.  assert( winS
120d0 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  hmMutexHeld() );
120e0 0a 20 20 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e  .  pp = &winShmN
120f0 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65  odeList;.  while
12100 28 20 28 70 20 3d 20 2a 70 70 29 21 3d 30 20 29  ( (p = *pp)!=0 )
12110 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65  {.    if( p->nRe
12120 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  f==0 ){.      in
12130 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t i;.      if( p
12140 2d 3e 6d 75 74 65 78 20 29 20 73 71 6c 69 74 65  ->mutex ) sqlite
12150 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e  3_mutex_free(p->
12160 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 66 6f  mutex);.      fo
12170 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67  r(i=0; i<p->nReg
12180 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ion; i++){.     
12190 20 20 20 62 52 63 20 3d 20 6f 73 55 6e 6d 61 70     bRc = osUnmap
121a0 56 69 65 77 4f 66 46 69 6c 65 28 70 2d 3e 61 52  ViewOfFile(p->aR
121b0 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a  egion[i].pMap);.
121c0 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
121d0 28 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64 2d  ("SHM-PURGE pid-
121e0 25 64 20 75 6e 6d 61 70 20 72 65 67 69 6f 6e 3d  %d unmap region=
121f0 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
12200 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
12210 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
12220 65 73 73 49 64 28 29 2c 20 69 2c 0a 20 20 20 20  essId(), i,.    
12230 20 20 20 20 20 20 20 20 20 20 20 20 20 62 52 63               bRc
12240 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
12250 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 62 52  d"));.        bR
12260 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  c = osCloseHandl
12270 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e  e(p->aRegion[i].
12280 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f  hMap);.        O
12290 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52  STRACE(("SHM-PUR
122a0 47 45 20 70 69 64 2d 25 64 20 63 6c 6f 73 65 20  GE pid-%d close 
122b0 72 65 67 69 6f 6e 3d 25 64 20 25 73 5c 6e 22 2c  region=%d %s\n",
122c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
122d0 20 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72    (int)osGetCurr
122e0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
122f0 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i,.             
12300 20 20 20 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a      bRc ? "ok" :
12310 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
12320 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
12330 2d 3e 68 46 69 6c 65 2e 68 20 21 3d 20 49 4e 56  ->hFile.h != INV
12340 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
12350 45 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d  E ){.        Sim
12360 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
12370 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77  gn(1);.        w
12380 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  inClose((sqlite3
12390 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c  _file *)&p->hFil
123a0 65 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75  e);.        Simu
123b0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
123c0 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n(0);.      }.  
123d0 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c      if( deleteFl
123e0 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69  ag ){.        Si
123f0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
12400 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20  ign(1);.        
12410 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
12420 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
12430 20 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56      winDelete(pV
12440 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65  fs, p->zFilename
12450 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
12460 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
12470 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
12480 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
12490 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
124a0 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d  }.      *pp = p-
124b0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
124c0 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52  lite3_free(p->aR
124d0 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71  egion);.      sq
124e0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
124f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12500 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a  pp = &p->pNext;.
12510 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
12520 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72  ** Open the shar
12530 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61  ed-memory area a
12540 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64  ssociated with d
12550 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62  atabase file pDb
12560 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f  Fd..**.** When o
12570 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61  pening a new sha
12580 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
12590 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73   if no other ins
125a0 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a  tances of that.*
125b0 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65  * file are curre
125c0 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68  ntly open, in th
125d0 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e  is process or in
125e0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
125f0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69  , then.** the fi
12600 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63  le must be trunc
12610 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  ated to zero len
12620 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20  gth or have its 
12630 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a  header cleared..
12640 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
12650 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  nOpenSharedMemor
12660 79 28 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64  y(winFile *pDbFd
12670 29 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53  ){.  struct winS
12680 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  hm *p;          
12690 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
126a0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
126b0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  opened */.  stru
126c0 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  ct winShmNode *p
126d0 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f  ShmNode = 0;   /
126e0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
126f0 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f   mmapped file */
12700 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
12710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12720 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
12730 63 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  code */.  struct
12740 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65   winShmNode *pNe
12750 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  w;           /* 
12760 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  Newly allocated 
12770 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  winShmNode */.  
12780 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
12790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127a0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e     /* Size of zN
127b0 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ame in bytes */.
127c0 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64  .  assert( pDbFd
127d0 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20  ->pShm==0 );    
127e0 2f 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c  /* Not previousl
127f0 79 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f  y opened */..  /
12800 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
12810 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c   for the new sql
12820 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e  ite3_shm object.
12830 20 20 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69    Also speculati
12840 76 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  vely.  ** alloca
12850 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e  te space for a n
12860 65 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e  ew winShmNode an
12870 64 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f  d filename..  */
12880 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  p = sqlite3_m
12890 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
128a0 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ) );.  if( p==0 
128b0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
128c0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  IOERR_NOMEM;.  m
128d0 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
128e0 6f 66 28 2a 70 29 29 3b 0a 20 20 6e 4e 61 6d 65  of(*p));.  nName
128f0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
12900 33 30 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  30(pDbFd->zPath)
12910 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
12920 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
12930 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e  f(*pShmNode) + n
12940 4e 61 6d 65 20 2b 20 31 37 20 29 3b 0a 20 20 69  Name + 17 );.  i
12950 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
12960 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
12970 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
12980 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
12990 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
129a0 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  New, 0, sizeof(*
129b0 70 4e 65 77 29 20 2b 20 6e 4e 61 6d 65 20 2b 20  pNew) + nName + 
129c0 31 37 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 46 69  17);.  pNew->zFi
129d0 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
129e0 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69  &pNew[1];.  sqli
129f0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61  te3_snprintf(nNa
12a00 6d 65 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69  me+15, pNew->zFi
12a10 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22  lename, "%s-shm"
12a20 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
12a30 0a 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75  .  sqlite3FileSu
12a40 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61  ffix3(pDbFd->zPa
12a50 74 68 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e  th, pNew->zFilen
12a60 61 6d 65 29 3b 20 0a 0a 20 20 2f 2a 20 4c 6f 6f  ame); ..  /* Loo
12a70 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  k to see if ther
12a80 65 20 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67  e is an existing
12a90 20 77 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74   winShmNode that
12aa0 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20   can be used..  
12ab0 2a 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e  ** If no matchin
12ac0 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72  g winShmNode cur
12ad0 72 65 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63  rently exists, c
12ae0 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e  reate a new one.
12af0 0a 20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e  .  */.  winShmEn
12b00 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f  terMutex();.  fo
12b10 72 28 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e  r(pShmNode = win
12b20 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68  ShmNodeList; pSh
12b30 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d  mNode; pShmNode=
12b40 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29  pShmNode->pNext)
12b50 7b 0a 20 20 20 20 2f 2a 20 54 42 44 20 6e 65 65  {.    /* TBD nee
12b60 64 20 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74  d to come up wit
12b70 68 20 62 65 74 74 65 72 20 6d 61 74 63 68 20 68  h better match h
12b80 65 72 65 2e 20 20 50 65 72 68 61 70 73 0a 20 20  ere.  Perhaps.  
12b90 20 20 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49 44    ** use FILE_ID
12ba0 5f 42 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53  _BOTH_DIR_INFO S
12bb0 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  tructure..    */
12bc0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
12bd0 53 74 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65  StrICmp(pShmNode
12be0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65  ->zFilename, pNe
12bf0 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30  w->zFilename)==0
12c00 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
12c10 69 66 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a  if( pShmNode ){.
12c20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
12c30 28 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pNew);.  }else{
12c40 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  .    pShmNode = 
12c50 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d  pNew;.    pNew =
12c60 20 30 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c   0;.    ((winFil
12c70 65 2a 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  e*)(&pShmNode->h
12c80 46 69 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41  File))->h = INVA
12c90 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
12ca0 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ;.    pShmNode->
12cb0 70 4e 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f  pNext = winShmNo
12cc0 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53  deList;.    winS
12cd0 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68  hmNodeList = pSh
12ce0 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20 70 53 68 6d  mNode;..    pShm
12cf0 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71  Node->mutex = sq
12d00 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
12d10 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
12d20 41 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53  AST);.    if( pS
12d30 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30  hmNode->mutex==0
12d40 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
12d50 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
12d60 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
12d70 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
12d80 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f  }..    rc = winO
12d90 70 65 6e 28 70 44 62 46 64 2d 3e 70 56 66 73 2c  pen(pDbFd->pVfs,
12da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12db0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c    pShmNode->zFil
12dc0 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  ename,          
12dd0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
12de0 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a  e file (UTF-8) *
12df0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
12e00 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
12e10 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  *)&pShmNode->hFi
12e20 6c 65 2c 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e  le,  /* File han
12e30 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 20 20  dle here */.    
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
12e50 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 20 53  ITE_OPEN_WAL | S
12e60 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
12e70 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
12e80 45 4e 5f 43 52 45 41 54 45 2c 20 2f 2a 20 4d 6f  EN_CREATE, /* Mo
12e90 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 20 20  de flags */.    
12ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b               0);
12eb0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
12ec0 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20  OK!=rc ){.      
12ed0 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
12ee0 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  r;.    }..    /*
12ef0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12f00 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
12f10 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   is holding the 
12f20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e  dead-man switch.
12f30 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20  .    ** If not, 
12f40 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  truncate the fil
12f50 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  e to zero length
12f60 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
12f70 28 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  ( winShmSystemLo
12f80 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
12f90 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d  M_WRLCK, WIN_SHM
12fa0 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45  _DMS, 1)==SQLITE
12fb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
12fc0 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73  = winTruncate((s
12fd0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
12fe0 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
12ff0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
13000 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13010 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c         rc = winL
13020 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
13030 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f 73  OERR_SHMOPEN, os
13040 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
13050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13060 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70   "winOpenShm", p
13070 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
13080 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
13090 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
130a0 4b 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 53 68  K ){.      winSh
130b0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
130c0 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b  Node, _SHM_UNLCK
130d0 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
130e0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  );.      rc = wi
130f0 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
13100 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44  ShmNode, _SHM_RD
13110 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
13120 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
13130 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68  if( rc ) goto sh
13140 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a  m_open_err;.  }.
13150 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e  .  /* Make the n
13160 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20  ew connection a 
13170 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69 6e  child of the win
13180 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e  ShmNode */.  p->
13190 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e  pShmNode = pShmN
131a0 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ode;.#ifdef SQLI
131b0 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64  TE_DEBUG.  p->id
131c0 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78   = pShmNode->nex
131d0 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66  tShmId++;.#endif
131e0 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
131f0 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  f++;.  pDbFd->pS
13200 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d  hm = p;.  winShm
13210 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
13220 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63   /* The referenc
13230 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e  e count on pShmN
13240 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ode has already 
13250 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64  been incremented
13260 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20   under.  ** the 
13270 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77 69 6e  cover of the win
13280 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 20  ShmEnterMutex() 
13290 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f  mutex and the po
132a0 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20  inter from the. 
132b0 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20   ** new (struct 
132c0 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20 74  winShm) object t
132d0 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68  o the pShmNode h
132e0 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c  as been set. All
132f0 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65   that is.  ** le
13300 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c  ft to do is to l
13310 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65  ink the new obje
13320 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  ct into the link
13330 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
13340 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64  .  ** at pShmNod
13350 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20  e->pFirst. This 
13360 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69  must be done whi
13370 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70  le holding the p
13380 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a  ShmNode->mutex .
13390 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f    ** mutex..  */
133a0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
133b0 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
133c0 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e  >mutex);.  p->pN
133d0 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ext = pShmNode->
133e0 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f  pFirst;.  pShmNo
133f0 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a  de->pFirst = p;.
13400 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
13410 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
13420 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
13430 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
13440 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61  * Jump here on a
13450 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f  ny error */.shm_
13460 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53  open_err:.  winS
13470 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
13480 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43  mNode, _SHM_UNLC
13490 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
134a0 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72 67  1);.  winShmPurg
134b0 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 30  e(pDbFd->pVfs, 0
134c0 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  );      /* This 
134d0 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e  call frees pShmN
134e0 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20  ode if required 
134f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
13500 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  e(p);.  sqlite3_
13510 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77 69  free(pNew);.  wi
13520 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
13530 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13540 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
13550 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68  connection to sh
13560 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65  ared-memory.  De
13570 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lete the underly
13580 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20  ing .** storage 
13590 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73  if deleteFlag is
135a0 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
135b0 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70   int winShmUnmap
135c0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
135d0 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *fd,          /
135e0 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
135f0 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ng shared memory
13600 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65   */.  int delete
13610 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
13620 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74 65 72   /* Delete after
13630 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72 75 65   closing if true
13640 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65   */.){.  winFile
13650 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 2f   *pDbFd;       /
13660 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
13670 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ng shared-memory
13680 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b   */.  winShm *p;
13690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
136a0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
136b0 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20   be closed */.  
136c0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
136d0 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64  Node; /* The und
136e0 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d  erlying shared-m
136f0 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
13700 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20  winShm **pp;    
13710 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
13720 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e  ping over siblin
13730 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  g connections */
13740 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69 6e  ..  pDbFd = (win
13750 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20  File*)fd;.  p = 
13760 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69  pDbFd->pShm;.  i
13770 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
13780 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53   SQLITE_OK;.  pS
13790 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
137a0 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f  Node;..  /* Remo
137b0 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  ve connection p 
137c0 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20  from the set of 
137d0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f  connections asso
137e0 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68  ciated.  ** with
137f0 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73   pShmNode */.  s
13800 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
13810 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
13820 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70  ex);.  for(pp=&p
13830 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
13840 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20   (*pp)!=p; pp = 
13850 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d  &(*pp)->pNext){}
13860 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78  .  *pp = p->pNex
13870 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68  t;..  /* Free th
13880 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a  e connection p *
13890 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
138a0 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  (p);.  pDbFd->pS
138b0 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  hm = 0;.  sqlite
138c0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
138d0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
138e0 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64  .  /* If pShmNod
138f0 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63  e->nRef has reac
13900 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73  hed 0, then clos
13910 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
13920 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d  .  ** shared-mem
13930 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f  ory file, too */
13940 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  .  winShmEnterMu
13950 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
13960 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e   pShmNode->nRef>
13970 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  0 );.  pShmNode-
13980 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
13990 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30  ShmNode->nRef==0
139a0 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50 75   ){.    winShmPu
139b0 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c  rge(pDbFd->pVfs,
139c0 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20   deleteFlag);.  
139d0 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  }.  winShmLeaveM
139e0 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72  utex();..  retur
139f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13a00 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
13a10 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20   lock state for 
13a20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  a shared-memory 
13a30 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  segment..*/.stat
13a40 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63  ic int winShmLoc
13a50 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  k(.  sqlite3_fil
13a60 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
13a70 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
13a80 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
13a90 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
13aa0 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
13ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
13ac0 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75  rst lock to acqu
13ad0 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
13ae0 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
13af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13b00 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b  * Number of lock
13b10 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  s to acquire or 
13b20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
13b30 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
13b40 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
13b50 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c  to do with the l
13b60 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  ock */.){.  winF
13b70 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69  ile *pDbFd = (wi
13b80 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20  nFile*)fd;      
13b90 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
13ba0 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d  holding shared m
13bb0 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68  emory */.  winSh
13bc0 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  m *p = pDbFd->pS
13bd0 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
13be0 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d   /* The shared m
13bf0 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b  emory being lock
13c00 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ed */.  winShm *
13c10 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
13c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13c30 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
13c40 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a  r all siblings *
13c50 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  /.  winShmNode *
13c60 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
13c70 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63  hmNode;.  int rc
13c80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
13c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ca0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
13cb0 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20  /.  u16 mask;   
13cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
13ce0 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61  k of locks to ta
13cf0 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  ke or release */
13d00 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74  ..  assert( ofst
13d10 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53  >=0 && ofst+n<=S
13d20 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20  QLITE_SHM_NLOCK 
13d30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d  );.  assert( n>=
13d40 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  1 );.  assert( f
13d50 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
13d60 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  M_LOCK | SQLITE_
13d70 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20  SHM_SHARED).    
13d80 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
13d90 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
13da0 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
13db0 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20  SIVE).       || 
13dc0 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
13dd0 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
13de0 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
13df0 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
13e00 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  (SQLITE_SHM_UNLO
13e10 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
13e20 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20  EXCLUSIVE) );.  
13e30 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20  assert( n==1 || 
13e40 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
13e50 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  SHM_EXCLUSIVE)!=
13e60 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28  0 );..  mask = (
13e70 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b  u16)((1U<<(ofst+
13e80 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29  n)) - (1U<<ofst)
13e90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31  );.  assert( n>1
13ea0 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66   || mask==(1<<of
13eb0 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  st) );.  sqlite3
13ec0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
13ed0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
13ee0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
13ef0 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29  ITE_SHM_UNLOCK )
13f00 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73  {.    u16 allMas
13f10 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f  k = 0; /* Mask o
13f20 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
13f30 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20  siblings */..   
13f40 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73   /* See if any s
13f50 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69  iblings hold thi
13f60 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20  s same lock */. 
13f70 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
13f80 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
13f90 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
13fa0 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29       if( pX==p )
13fb0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
13fc0 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78   assert( (pX->ex
13fd0 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63  clMask & (p->exc
13fe0 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d  lMask|p->sharedM
13ff0 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ask))==0 );.    
14000 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d    allMask |= pX-
14010 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
14020 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63   }..    /* Unloc
14030 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76  k the system-lev
14040 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  el locks */.    
14050 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d  if( (mask & allM
14060 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
14070 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74   rc = winShmSyst
14080 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
14090 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73   _SHM_UNLCK, ofs
140a0 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20  t+WIN_SHM_BASE, 
140b0 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
140c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
140d0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  _OK;.    }..    
140e0 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61  /* Undo the loca
140f0 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
14100 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14110 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63   ){.      p->exc
14120 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
14130 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d        p->sharedM
14140 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
14150 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28    } .  }else if(
14160 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
14170 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  SHM_SHARED ){.  
14180 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20    u16 allShared 
14190 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f  = 0;  /* Union o
141a0 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
141b0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
141c0 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20  r than "p" */.. 
141d0 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77     /* Find out w
141e0 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b  hich shared lock
141f0 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65  s are already he
14200 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f  ld by sibling co
14210 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a  nnections..    *
14220 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67  * If any sibling
14230 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61   already holds a
14240 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
14250 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72  , go ahead and r
14260 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c  eturn.    ** SQL
14270 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f  ITE_BUSY..    */
14280 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
14290 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
142a0 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
142b0 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e  .      if( (pX->
142c0 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29  exclMask & mask)
142d0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
142e0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
142f0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
14300 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c        }.      al
14310 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73  lShared |= pX->s
14320 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d  haredMask;.    }
14330 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61  ..    /* Get sha
14340 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  red locks at the
14350 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69   system level, i
14360 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
14370 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14380 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
14390 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d  ( (allShared & m
143a0 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
143b0 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79     rc = winShmSy
143c0 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
143d0 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f  e, _SHM_RDLCK, o
143e0 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45  fst+WIN_SHM_BASE
143f0 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , n);.      }els
14400 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
14410 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
14420 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
14430 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73   Get the local s
14440 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20  hared locks */. 
14450 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14460 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
14470 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d  >sharedMask |= m
14480 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
14490 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  se{.    /* Make 
144a0 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20  sure no sibling 
144b0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64  connections hold
144c0 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c   locks that will
144d0 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20   block this.    
144e0 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79  ** lock.  If any
144f0 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49   do, return SQLI
14500 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61 77  TE_BUSY right aw
14510 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ay..    */.    f
14520 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
14530 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
14540 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
14550 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61   if( (pX->exclMa
14560 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c  sk & mask)!=0 ||
14570 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b   (pX->sharedMask
14580 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20   & mask)!=0 ){. 
14590 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
145a0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
145b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
145c0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
145d0 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  Get the exclusiv
145e0 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  e locks at the s
145f0 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68  ystem level.  Th
14600 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  en if successful
14610 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72  .    ** also mar
14620 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e  k the local conn
14630 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20  ection as being 
14640 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  locked..    */. 
14650 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14660 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
14670 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c   = winShmSystemL
14680 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
14690 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 57  HM_WRLCK, ofst+W
146a0 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IN_SHM_BASE, n);
146b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
146c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
146d0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e      assert( (p->
146e0 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
146f0 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  k)==0 );.       
14700 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20   p->exclMask |= 
14710 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mask;.      }.  
14720 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
14730 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
14740 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
14750 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
14760 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70  LOCK shmid-%d, p
14770 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c 25  id-%d got %03x,%
14780 30 33 78 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  03x %s\n",.     
14790 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 28 69 6e        p->id, (in
147a0 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  t)osGetCurrentPr
147b0 6f 63 65 73 73 49 64 28 29 2c 20 70 2d 3e 73 68  ocessId(), p->sh
147c0 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63  aredMask, p->exc
147d0 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20  lMask,.         
147e0 20 20 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20    rc ? "failed" 
147f0 3a 20 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75  : "ok"));.  retu
14800 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14810 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f  Implement a memo
14820 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65  ry barrier or me
14830 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68  mory fence on sh
14840 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a  ared memory.  .*
14850 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61  *.** All loads a
14860 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20  nd stores begun 
14870 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69  before the barri
14880 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65  er must complete
14890 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c   before.** any l
148a0 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67  oad or store beg
148b0 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72  un after the bar
148c0 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rier..*/.static 
148d0 76 6f 69 64 20 77 69 6e 53 68 6d 42 61 72 72 69  void winShmBarri
148e0 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  er(.  sqlite3_fi
148f0 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20  le *fd          
14900 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
14910 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
14920 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e  emory */.){.  UN
14930 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
14940 64 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42  d);.  /* MemoryB
14950 61 72 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65  arrier(); // doe
14960 73 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f  s not work -- do
14970 20 6e 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f   not know why no
14980 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74  t */.  winShmEnt
14990 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 77 69 6e  erMutex();.  win
149a0 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
149b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
149c0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
149d0 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f  d to obtain a po
149e0 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20  inter to region 
149f0 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a  iRegion of the .
14a00 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
14a10 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
14a20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14a30 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65  le fd. Shared-me
14a40 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a  mory regions .**
14a50 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74   are numbered st
14a60 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f  arting from zero
14a70 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65  . Each shared-me
14a80 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73  mory region is s
14a90 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65  zRegion .** byte
14aa0 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
14ab0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
14ac0 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
14ad0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
14ae0 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  nd *pp is set to
14af0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68   NULL..**.** Oth
14b00 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 69  erwise, if the i
14b10 73 57 72 69 74 65 20 70 61 72 61 6d 65 74 65 72  sWrite parameter
14b20 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65   is 0 and the re
14b30 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
14b40 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20  emory.** region 
14b50 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
14b60 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63  ocated (by any c
14b70 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67  lient, including
14b80 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20   one running in 
14b90 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72  a.** separate pr
14ba0 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70  ocess), then *pp
14bb0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
14bc0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
14bd0 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 69  turned. If .** i
14be0 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  sWrite is non-ze
14bf0 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65  ro and the reque
14c00 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
14c10 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ry region has no
14c20 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61  t yet .** been a
14c30 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20  llocated, it is 
14c40 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
14c50 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
14c60 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d  * If the shared-
14c70 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
14c80 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
14c90 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61  llocated or is a
14ca0 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
14cb0 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63  his call as desc
14cc0 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65  ribed above, the
14cd0 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69  n it is mapped i
14ce0 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
14cf0 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73  es .** address s
14d00 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e  pace (if it is n
14d10 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70  ot already), *pp
14d20 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
14d30 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a   to the mapped .
14d40 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51  ** memory and SQ
14d50 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
14d60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14d70 77 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c  winShmMap(.  sql
14d80 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
14d90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14da0 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64  Handle open on d
14db0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
14dc0 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20    int iRegion,  
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14de0 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72    /* Region to r
14df0 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74  etrieve */.  int
14e00 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20   szRegion,      
14e10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14e20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20  Size of regions 
14e30 2a 2f 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65  */.  int isWrite
14e40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14e50 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
14e60 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e  extend file if n
14e70 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f  ecessary */.  vo
14e80 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70  id volatile **pp
14e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14ea0 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d   OUT: Mapped mem
14eb0 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  ory */.){.  winF
14ec0 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69  ile *pDbFd = (wi
14ed0 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e  nFile*)fd;.  win
14ee0 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e  Shm *p = pDbFd->
14ef0 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f  pShm;.  winShmNo
14f00 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de *pShmNode;.  
14f10 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
14f20 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 20 29 7b  OK;..  if( !p ){
14f30 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65  .    rc = winOpe
14f40 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44  nSharedMemory(pD
14f50 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  bFd);.    if( rc
14f60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
14f70 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 20 3d  turn rc;.    p =
14f80 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
14f90 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  }.  pShmNode = p
14fa0 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73  ->pShmNode;..  s
14fb0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
14fc0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
14fd0 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ex);.  assert( s
14fe0 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
14ff0 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
15000 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
15010 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  ==0 );..  if( pS
15020 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
15030 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  =iRegion ){.    
15040 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e  struct ShmRegion
15050 20 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20   *apNew;        
15060 20 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f     /* New aRegio
15070 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  n[] array */.   
15080 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52   int nByte = (iR
15090 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f  egion+1)*szRegio
150a0 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72  n;  /* Minimum r
150b0 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
150c0 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
150d0 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20  _int64 sz;      
150e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
150f0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77  urrent size of w
15100 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f  al-index file */
15110 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
15120 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67  szRegion = szReg
15130 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ion;..    /* The
15140 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
15150 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20  n is not mapped 
15160 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
15170 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
15180 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20  e..    ** Check 
15190 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73  to see if it has
151a0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
151b0 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c  (i.e. if the wal
151c0 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20  -index file is. 
151d0 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75     ** large enou
151e0 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  gh to contain th
151f0 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
15200 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  on)..    */.    
15210 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65  rc = winFileSize
15220 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
15230 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
15240 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28  e, &sz);.    if(
15250 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15260 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
15270 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
15280 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f  IOERR_SHMSIZE, o
15290 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
152a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
152b0 22 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44  "winShmMap1", pD
152c0 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  bFd->zPath);.   
152d0 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
152e0 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
152f0 69 66 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a  if( sz<nByte ){.
15300 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71        /* The req
15310 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
15320 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78  gion does not ex
15330 69 73 74 2e 20 49 66 20 69 73 57 72 69 74 65 20  ist. If isWrite 
15340 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20  is set to.      
15350 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20 65 61  ** zero, exit ea
15360 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65  rly. *pp will be
15370 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
15380 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
15390 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ned..      **.  
153a0 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69      ** Alternati
153b0 76 65 6c 79 2c 20 69 66 20 69 73 57 72 69 74 65  vely, if isWrite
153c0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73   is non-zero, us
153d0 65 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f  e ftruncate() to
153e0 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20   allocate.      
153f0 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
15400 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a   memory region..
15410 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
15420 66 28 20 21 69 73 57 72 69 74 65 20 29 20 67 6f  f( !isWrite ) go
15430 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
15440 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72        rc = winTr
15450 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f  uncate((sqlite3_
15460 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65  file *)&pShmNode
15470 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b  ->hFile, nByte);
15480 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
15490 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
154a0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
154b0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
154c0 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74  R_SHMSIZE, osGet
154d0 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
154e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
154f0 69 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 46  inShmMap2", pDbF
15500 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
15510 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
15520 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
15530 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74   }..    /* Map t
15540 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
15550 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20  ory region into 
15560 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
15570 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f  ddress space. */
15580 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74  .    apNew = (st
15590 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a  ruct ShmRegion *
155a0 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
155b0 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  (.        pShmNo
155c0 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52  de->aRegion, (iR
155d0 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28  egion+1)*sizeof(
155e0 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b  apNew[0]).    );
155f0 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20  .    if( !apNew 
15600 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
15610 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
15620 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
15630 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
15640 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52      pShmNode->aR
15650 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a  egion = apNew;..
15660 20 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e      while( pShmN
15670 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52  ode->nRegion<=iR
15680 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48  egion ){.      H
15690 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20  ANDLE hMap;     
156a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69             /* fi
156b0 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c  le-mapping handl
156c0 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20  e */.      void 
156d0 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20  *pMap = 0;      
156e0 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 65 64         /* Mapped
156f0 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a   memory region *
15700 2f 0a 20 20 20 20 20 0a 20 20 20 20 20 20 68 4d  /.     .      hM
15710 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
15720 65 4d 61 70 70 69 6e 67 28 70 53 68 6d 4e 6f 64  eMapping(pShmNod
15730 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a 20 20 20  e->hFile.h, .   
15740 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47         NULL, PAG
15750 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20  E_READWRITE, 0, 
15760 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20  nByte, NULL.    
15770 20 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41    );.      OSTRA
15780 43 45 28 28 22 53 48 4d 2d 4d 41 50 20 70 69 64  CE(("SHM-MAP pid
15790 2d 25 64 20 63 72 65 61 74 65 20 72 65 67 69 6f  -%d create regio
157a0 6e 3d 25 64 20 6e 62 79 74 65 3d 25 64 20 25 73  n=%d nbyte=%d %s
157b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
157c0 20 20 20 20 28 69 6e 74 29 6f 73 47 65 74 43 75      (int)osGetCu
157d0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
157e0 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  , pShmNode->nReg
157f0 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20  ion, nByte,.    
15800 20 20 20 20 20 20 20 20 20 20 20 68 4d 61 70 20             hMap 
15810 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
15820 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68  "));.      if( h
15830 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Map ){.        i
15840 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 70 53 68  nt iOffset = pSh
15850 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73  mNode->nRegion*s
15860 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20  zRegion;.       
15870 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66   int iOffsetShif
15880 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69  t = iOffset % wi
15890 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63  nSysInfo.dwAlloc
158a0 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79  ationGranularity
158b0 3b 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d  ;.        pMap =
158c0 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
158d0 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f  (hMap, FILE_MAP_
158e0 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50  WRITE | FILE_MAP
158f0 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20  _READ,.         
15900 20 20 20 30 2c 20 69 4f 66 66 73 65 74 20 2d 20     0, iOffset - 
15910 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a  iOffsetShift, sz
15920 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74  Region + iOffset
15930 53 68 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b  Shift.        );
15940 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
15950 28 28 22 53 48 4d 2d 4d 41 50 20 70 69 64 2d 25  (("SHM-MAP pid-%
15960 64 20 6d 61 70 20 72 65 67 69 6f 6e 3d 25 64 20  d map region=%d 
15970 6f 66 66 73 65 74 3d 25 64 20 73 69 7a 65 3d 25  offset=%d size=%
15980 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
15990 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 6f            (int)o
159a0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
159b0 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65  ssId(), pShmNode
159c0 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f 66 66 73  ->nRegion, iOffs
159d0 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  et,.            
159e0 20 20 20 20 20 73 7a 52 65 67 69 6f 6e 2c 20 70       szRegion, p
159f0 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  Map ? "ok" : "fa
15a00 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d  iled"));.      }
15a10 0a 20 20 20 20 20 20 69 66 28 20 21 70 4d 61 70  .      if( !pMap
15a20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68 6d   ){.        pShm
15a30 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  Node->lastErrno 
15a40 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
15a50 28 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ();.        rc =
15a60 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
15a70 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50  ITE_IOERR_SHMMAP
15a80 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74  , pShmNode->last
15a90 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
15aa0 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d          "winShmM
15ab0 61 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  ap3", pDbFd->zPa
15ac0 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  th);.        if(
15ad0 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65 48   hMap ) osCloseH
15ae0 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20  andle(hMap);.   
15af0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
15b00 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  e_out;.      }..
15b10 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
15b20 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65  aRegion[pShmNode
15b30 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20  ->nRegion].pMap 
15b40 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20 20 70 53  = pMap;.      pS
15b50 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b  hmNode->aRegion[
15b60 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
15b70 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a  n].hMap = hMap;.
15b80 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
15b90 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d  nRegion++;.    }
15ba0 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75  .  }..shmpage_ou
15bb0 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  t:.  if( pShmNod
15bc0 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69  e->nRegion>iRegi
15bd0 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f  on ){.    int iO
15be0 66 66 73 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a  ffset = iRegion*
15bf0 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e  szRegion;.    in
15c00 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d  t iOffsetShift =
15c10 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79   iOffset % winSy
15c20 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69  sInfo.dwAllocati
15c30 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20  onGranularity;. 
15c40 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63 68     char *p = (ch
15c50 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61  ar *)pShmNode->a
15c60 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e  Region[iRegion].
15c70 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20  pMap;.    *pp = 
15c80 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66 73  (void *)&p[iOffs
15c90 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73  etShift];.  }els
15ca0 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a  e{.    *pp = 0;.
15cb0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
15cc0 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
15cd0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  de->mutex);.  re
15ce0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73  turn rc;.}..#els
15cf0 65 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68  e.# define winSh
15d00 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66  mMap     0.# def
15d10 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20  ine winShmLock  
15d20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e    0.# define win
15d30 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64  ShmBarrier 0.# d
15d40 65 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61  efine winShmUnma
15d50 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20  p   0.#endif /* 
15d60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15d70 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a  MIT_WAL */../*.*
15d80 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20  * Here ends the 
15d90 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
15da0 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69  f all sqlite3_fi
15db0 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a  le methods..**.*
15dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15dd0 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65  ***** End sqlite
15de0 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a  3_file Methods *
15df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
15e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
15e60 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f  /*.** This vecto
15e70 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68  r defines all th
15e80 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63  e methods that c
15e90 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e  an operate on an
15ea0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  .** sqlite3_file
15eb0 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73   for win32..*/.s
15ec0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
15ed0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77  te3_io_methods w
15ee0 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20  inIoMethod = {. 
15ef0 20 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   2,             
15f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f10 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
15f20 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20 20 20    winClose,     
15f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f40 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20    /* xClose */. 
15f50 20 77 69 6e 52 65 61 64 2c 20 20 20 20 20 20 20   winRead,       
15f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f70 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 77   /* xRead */.  w
15f80 69 6e 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  inWrite,        
15f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15fa0 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 77 69  * xWrite */.  wi
15fb0 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
15fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15fd0 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20   xTruncate */.  
15fe0 77 69 6e 53 79 6e 63 2c 20 20 20 20 20 20 20 20  winSync,        
15ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16000 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 77 69  /* xSync */.  wi
16010 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20  nFileSize,      
16020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16030 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20   xFileSize */.  
16040 77 69 6e 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  winLock,        
16050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16060 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69  /* xLock */.  wi
16070 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  nUnlock,        
16080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16090 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69   xUnlock */.  wi
160a0 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  nCheckReservedLo
160b0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ck,           /*
160c0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
160d0 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ock */.  winFile
160e0 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20  Control,        
160f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
16100 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77 69  eControl */.  wi
16110 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20  nSectorSize,    
16120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16130 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a   xSectorSize */.
16140 20 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61    winDeviceChara
16150 63 74 65 72 69 73 74 69 63 73 2c 20 20 20 20 20  cteristics,     
16160 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72    /* xDeviceChar
16170 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20  acteristics */. 
16180 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20 20 20   winShmMap,     
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161a0 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20   /* xShmMap */. 
161b0 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20 20   winShmLock,    
161c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161d0 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a   /* xShmLock */.
161e0 20 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 2c    winShmBarrier,
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16200 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72    /* xShmBarrier
16210 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e 6d 61   */.  winShmUnma
16220 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
16230 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d        /* xShmUnm
16240 61 70 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a  ap */.};../*****
16250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16290 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
162a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
162b0 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  **** sqlite3_vfs
162c0 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
162d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
162e0 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
162f0 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
16300 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ns the implement
16310 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73  ation of methods
16320 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   on the.** sqlit
16330 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a  e3_vfs object..*
16340 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  /../*.** Convert
16350 20 61 20 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d   a UTF-8 filenam
16360 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20  e into whatever 
16370 66 6f 72 6d 20 74 68 65 20 75 6e 64 65 72 6c 79  form the underly
16380 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67  ing.** operating
16390 20 73 79 73 74 65 6d 20 77 61 6e 74 73 20 66 69   system wants fi
163a0 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20 53 70 61  lenames in.  Spa
163b0 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
163c0 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61  esult.** is obta
163d0 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
163e0 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
163f0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
16400 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  g.** function..*
16410 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 63  /.static void *c
16420 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61  onvertUtf8Filena
16430 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  me(const char *z
16440 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69  Filename){.  voi
16450 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  d *zConverted = 
16460 30 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  0;.  if( isNT() 
16470 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65  ){.    zConverte
16480 64 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64  d = utf8ToUnicod
16490 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 2f 2a  e(zFilename);./*
164a0 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20   isNT() is 1 if 
164b0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
164c0 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65  =1, so this else
164d0 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74   is never execut
164e0 65 64 2e 20 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  ed. .*/.#if SQLI
164f0 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20  TE_OS_WINCE==0. 
16500 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e   }else{.    zCon
16510 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33  verted = sqlite3
16520 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d  _win32_utf8_to_m
16530 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  bcs(zFilename);.
16540 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 2f 2a 20  #endif.  }.  /* 
16550 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64  caller will hand
16560 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  le out of memory
16570 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f   */.  return zCo
16580 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  nverted;.}../*.*
16590 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f  * Create a tempo
165a0 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69  rary file name i
165b0 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75  n zBuf.  zBuf mu
165c0 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68  st be big enough
165d0 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 70   to.** hold at p
165e0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
165f0 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73  characters..*/.s
16600 74 61 74 69 63 20 69 6e 74 20 67 65 74 54 65 6d  tatic int getTem
16610 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20  pname(int nBuf, 
16620 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73  char *zBuf){.  s
16630 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61 72  tatic char zChar
16640 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65  s[] =.    "abcde
16650 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
16660 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44  vwxyz".    "ABCD
16670 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
16680 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32  UVWXYZ".    "012
16690 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a 65  3456789";.  size
166a0 5f 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20  _t i, j;.  char 
166b0 7a 54 65 6d 70 50 61 74 68 5b 4d 41 58 5f 50 41  zTempPath[MAX_PA
166c0 54 48 2b 32 5d 3b 0a 0a 20 20 2f 2a 20 49 74 27  TH+2];..  /* It'
166d0 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
166e0 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
166f0 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
16700 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
16710 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
16720 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
16730 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
16740 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
16750 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
16760 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f  n failing. .  */
16770 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
16780 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
16790 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 69 66  E_IOERR );..  if
167a0 28 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  ( sqlite3_temp_d
167b0 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20  irectory ){.    
167c0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
167d0 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54  (MAX_PATH-30, zT
167e0 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20 73  empPath, "%s", s
167f0 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
16800 63 74 6f 72 79 29 3b 0a 20 20 7d 65 6c 73 65 20  ctory);.  }else 
16810 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
16820 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a    char *zMulti;.
16830 20 20 20 20 57 43 48 41 52 20 7a 57 69 64 65 50      WCHAR zWideP
16840 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20  ath[MAX_PATH];. 
16850 20 20 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68     osGetTempPath
16860 57 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a  W(MAX_PATH-30, z
16870 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 7a  WidePath);.    z
16880 4d 75 6c 74 69 20 3d 20 75 6e 69 63 6f 64 65 54  Multi = unicodeT
16890 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74 68 29  oUtf8(zWidePath)
168a0 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74 69  ;.    if( zMulti
168b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
168c0 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
168d0 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74  ATH-30, zTempPat
168e0 68 2c 20 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29  h, "%s", zMulti)
168f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
16900 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20  free(zMulti);.  
16910 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
16920 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
16930 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  RR_NOMEM;.    }.
16940 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69  /* isNT() is 1 i
16950 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
16960 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c  E==1, so this el
16970 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63  se is never exec
16980 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20  uted. .** Since 
16990 74 68 65 20 41 4e 53 49 20 76 65 72 73 69 6f 6e  the ANSI version
169a0 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77   of these Window
169b0 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69  s API do not exi
169c0 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a  st for WINCE,.**
169d0 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20   it's important 
169e0 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65  to not reference
169f0 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20   them for WINCE 
16a00 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53  builds..*/.#if S
16a10 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
16a20 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  0.  }else{.    c
16a30 68 61 72 20 2a 7a 55 74 66 38 3b 0a 20 20 20 20  har *zUtf8;.    
16a40 63 68 61 72 20 7a 4d 62 63 73 50 61 74 68 5b 4d  char zMbcsPath[M
16a50 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 6f 73  AX_PATH];.    os
16a60 47 65 74 54 65 6d 70 50 61 74 68 41 28 4d 41 58  GetTempPathA(MAX
16a70 5f 50 41 54 48 2d 33 30 2c 20 7a 4d 62 63 73 50  _PATH-30, zMbcsP
16a80 61 74 68 29 3b 0a 20 20 20 20 7a 55 74 66 38 20  ath);.    zUtf8 
16a90 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
16aa0 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 4d 62  mbcs_to_utf8(zMb
16ab0 63 73 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28  csPath);.    if(
16ac0 20 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20   zUtf8 ){.      
16ad0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
16ae0 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54  (MAX_PATH-30, zT
16af0 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20 7a  empPath, "%s", z
16b00 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  Utf8);.      sql
16b10 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29  ite3_free(zUtf8)
16b20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16b30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16b40 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
16b50 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
16b60 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
16b70 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
16b80 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  r is large enoug
16b90 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72  h for the tempor
16ba0 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e  ary file .  ** n
16bb0 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ame. If it is no
16bc0 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
16bd0 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69  _ERROR..  */.  i
16be0 66 28 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65  f( (sqlite3Strle
16bf0 6e 33 30 28 7a 54 65 6d 70 50 61 74 68 29 20 2b  n30(zTempPath) +
16c00 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
16c10 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  (SQLITE_TEMP_FIL
16c20 45 5f 50 52 45 46 49 58 29 20 2b 20 31 38 29 20  E_PREFIX) + 18) 
16c30 3e 3d 20 6e 42 75 66 20 29 7b 0a 20 20 20 20 72  >= nBuf ){.    r
16c40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
16c50 4f 52 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69  OR;.  }..  for(i
16c60 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
16c70 28 7a 54 65 6d 70 50 61 74 68 29 3b 20 69 3e 30  (zTempPath); i>0
16c80 20 26 26 20 7a 54 65 6d 70 50 61 74 68 5b 69 2d   && zTempPath[i-
16c90 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d 2d 29 7b 7d  1]=='\\'; i--){}
16ca0 0a 20 20 7a 54 65 6d 70 50 61 74 68 5b 69 5d 20  .  zTempPath[i] 
16cb0 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  = 0;..  sqlite3_
16cc0 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 38  snprintf(nBuf-18
16cd0 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20 20  , zBuf,.        
16ce0 20 20 20 20 20 20 20 20 20 20 20 22 25 73 5c 5c             "%s\\
16cf0 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  "SQLITE_TEMP_FIL
16d00 45 5f 50 52 45 46 49 58 2c 20 7a 54 65 6d 70 50  E_PREFIX, zTempP
16d10 61 74 68 29 3b 0a 20 20 6a 20 3d 20 73 71 6c 69  ath);.  j = sqli
16d20 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66  te3Strlen30(zBuf
16d30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  );.  sqlite3_ran
16d40 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75  domness(15, &zBu
16d50 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  f[j]);.  for(i=0
16d60 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b  ; i<15; i++, j++
16d70 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d  ){.    zBuf[j] =
16d80 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28   (char)zChars[ (
16d90 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
16da0 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28  Buf[j])%(sizeof(
16db0 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20  zChars)-1) ];.  
16dc0 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b  }.  zBuf[j] = 0;
16dd0 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30  .  zBuf[j+1] = 0
16de0 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  ;..  OSTRACE(("T
16df0 45 4d 50 20 46 49 4c 45 4e 41 4d 45 3a 20 25 73  EMP FILENAME: %s
16e00 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20 20 72  \n", zBuf));.  r
16e10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16e20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20   .}../*.** Open 
16e30 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
16e40 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20  c int winOpen(. 
16e50 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
16e60 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  fs,        /* No
16e70 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  t used */.  cons
16e80 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
16e90 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
16ea0 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38   the file (UTF-8
16eb0 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  ) */.  sqlite3_f
16ec0 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20  ile *id,        
16ed0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 53 51   /* Write the SQ
16ee0 4c 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  Lite file handle
16ef0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
16f00 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
16f10 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64       /* Open mod
16f20 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74  e flags */.  int
16f30 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20   *pOutFlags     
16f40 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73         /* Status
16f50 20 72 65 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f   return flags */
16f60 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a  .){.  HANDLE h;.
16f70 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
16f80 6f 3b 0a 20 20 44 57 4f 52 44 20 64 77 44 65 73  o;.  DWORD dwDes
16f90 69 72 65 64 41 63 63 65 73 73 3b 0a 20 20 44 57  iredAccess;.  DW
16fa0 4f 52 44 20 64 77 53 68 61 72 65 4d 6f 64 65 3b  ORD dwShareMode;
16fb0 0a 20 20 44 57 4f 52 44 20 64 77 43 72 65 61 74  .  DWORD dwCreat
16fc0 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a  ionDisposition;.
16fd0 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 41    DWORD dwFlagsA
16fe0 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 30  ndAttributes = 0
16ff0 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
17000 57 49 4e 43 45 0a 20 20 69 6e 74 20 69 73 54 65  WINCE.  int isTe
17010 6d 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  mp = 0;.#endif. 
17020 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
17030 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
17040 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
17050 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
17060 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20   /* Filename in 
17070 4f 53 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20  OS encoding */. 
17080 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 74   const char *zUt
17090 66 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20  f8Name = zName; 
170a0 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55  /* Filename in U
170b0 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f  TF-8 encoding */
170c0 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
170d0 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e  .  /* If argumen
170e0 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c  t zPath is a NUL
170f0 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20  L pointer, this 
17100 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75  function is requ
17110 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a  ired to open.  *
17120 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  * a temporary fi
17130 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62 75 66  le. Use this buf
17140 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65  fer to store the
17150 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20   file name in.. 
17160 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e   */.  char zTmpn
17170 61 6d 65 5b 4d 41 58 5f 50 41 54 48 2b 32 5d 3b  ame[MAX_PATH+2];
17180 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75       /* Buffer u
17190 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 74 65  sed to create te
171a0 6d 70 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 0a  mp filename */..
171b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
171c0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
171d0 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74   /* Function Ret
171e0 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69 66 20  urn Code */.#if 
171f0 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
17200 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   || SQLITE_OS_WI
17210 4e 43 45 0a 20 20 69 6e 74 20 65 54 79 70 65 20  NCE.  int eType 
17220 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46  = flags&0xFFFFFF
17230 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20  00;  /* Type of 
17240 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
17250 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20 69 73  #endif..  int is
17260 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c  Exclusive  = (fl
17270 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
17280 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20  N_EXCLUSIVE);.  
17290 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20  int isDelete    
172a0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
172b0 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
172c0 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73  CLOSE);.  int is
172d0 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c  Create     = (fl
172e0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
172f0 4e 5f 43 52 45 41 54 45 29 3b 0a 23 69 66 6e 64  N_CREATE);.#ifnd
17300 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20  ef NDEBUG.  int 
17310 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28  isReadonly   = (
17320 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
17330 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 23  PEN_READONLY);.#
17340 65 6e 64 69 66 0a 20 20 69 6e 74 20 69 73 52 65  endif.  int isRe
17350 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67  adWrite  = (flag
17360 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
17370 52 45 41 44 57 52 49 54 45 29 3b 0a 0a 23 69 66  READWRITE);..#if
17380 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e  ndef NDEBUG.  in
17390 74 20 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20  t isOpenJournal 
173a0 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28  = (isCreate && (
173b0 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d  .        eType==
173c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
173d0 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  ER_JOURNAL .    
173e0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
173f0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
17400 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79  NAL .     || eTy
17410 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
17420 57 41 4c 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66  WAL.  ));.#endif
17430 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65  ..  /* Check the
17440 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65   following state
17450 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20  ments are true: 
17460 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29  .  **.  **   (a)
17470 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20   Exactly one of 
17480 74 68 65 20 52 45 41 44 57 52 49 54 45 20 61 6e  the READWRITE an
17490 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73  d READONLY flags
174a0 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e   must be set, an
174b0 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66  d .  **   (b) if
174c0 20 43 52 45 41 54 45 20 69 73 20 73 65 74 2c 20   CREATE is set, 
174d0 74 68 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d  then READWRITE m
174e0 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c  ust also be set,
174f0 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20   and.  **   (c) 
17500 69 66 20 45 58 43 4c 55 53 49 56 45 20 69 73 20  if EXCLUSIVE is 
17510 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45  set, then CREATE
17520 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
17530 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66  t..  **   (d) if
17540 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69   DELETEONCLOSE i
17550 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41  s set, then CREA
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 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  set..  */.  asse
17580 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d  rt((isReadonly==
17590 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65  0 || isReadWrite
175a0 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61 64 57  ==0) && (isReadW
175b0 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e  rite || isReadon
175c0 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ly));.  assert(i
175d0 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73  sCreate==0 || is
175e0 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73  ReadWrite);.  as
175f0 73 65 72 74 28 69 73 45 78 63 6c 75 73 69 76 65  sert(isExclusive
17600 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29  ==0 || isCreate)
17610 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44 65 6c  ;.  assert(isDel
17620 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ete==0 || isCrea
17630 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d  te);..  /* The m
17640 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75  ain DB, main jou
17650 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61  rnal, WAL file a
17660 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  nd master journa
17670 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20 20 2a  l are never .  *
17680 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
17690 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65  deleted. Nor are
176a0 20 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f   they ever tempo
176b0 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a  rary files.  */.
176c0 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
176d0 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
176e0 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
176f0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a  OPEN_MAIN_DB );.
17700 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
17710 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
17720 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
17730 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
17740 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  L );.  assert( (
17750 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
17760 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
17770 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
17780 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73  _JOURNAL );.  as
17790 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
177a0 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
177b0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
177c0 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  _WAL );..  /* As
177d0 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70  sert that the up
177e0 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65  per layer has se
177f0 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69  t one of the "fi
17800 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20  le-type" flags. 
17810 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  */.  assert( eTy
17820 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
17830 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20  MAIN_DB      || 
17840 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
17850 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20  EN_TEMP_DB .    
17860 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
17870 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
17880 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d  URNAL || eType==
17890 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
178a0 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20  _JOURNAL .      
178b0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
178c0 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
178d0 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  L   || eType==SQ
178e0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
178f0 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20  _JOURNAL .      
17900 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
17910 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54  E_OPEN_TRANSIENT
17920 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  _DB || eType==SQ
17930 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20  LITE_OPEN_WAL.  
17940 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  );..  assert( id
17950 21 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  !=0 );.  UNUSED_
17960 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
17970 0a 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 49  ..  pFile->h = I
17980 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
17990 4c 55 45 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  LUE;..  /* If th
179a0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
179b0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
179c0 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 65 6e 65  on is NULL, gene
179d0 72 61 74 65 20 61 20 0a 20 20 2a 2a 20 74 65 6d  rate a .  ** tem
179e0 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
179f0 20 74 6f 20 75 73 65 20 0a 20 20 2a 2f 0a 20 20   to use .  */.  
17a00 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 29  if( !zUtf8Name )
17a10 7b 0a 20 20 20 20 61 73 73 65 72 74 28 69 73 44  {.    assert(isD
17a20 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65 6e  elete && !isOpen
17a30 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 72 63  Journal);.    rc
17a40 20 3d 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 4d   = getTempname(M
17a50 41 58 5f 50 41 54 48 2b 32 2c 20 7a 54 6d 70 6e  AX_PATH+2, zTmpn
17a60 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
17a70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17a80 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
17a90 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e      }.    zUtf8N
17aa0 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a  ame = zTmpname;.
17ab0 20 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61    }..  /* Databa
17ac0 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65  se filenames are
17ad0 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72   double-zero ter
17ae0 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20  minated if they 
17af0 61 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52 49  are not.  ** URI
17b00 73 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  s with parameter
17b10 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20  s.  Hence, they 
17b20 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61  can always be pa
17b30 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73  ssed into.  ** s
17b40 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
17b50 65 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61  eter()..  */.  a
17b60 73 73 65 72 74 28 20 28 65 54 79 70 65 21 3d 53  ssert( (eType!=S
17b70 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
17b80 44 42 29 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  DB) || (flags & 
17b90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
17ba0 20 7c 7c 0a 20 20 20 20 20 20 20 20 7a 55 74 66   ||.        zUtf
17bb0 38 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 55 74  8Name[strlen(zUt
17bc0 66 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b  f8Name)+1]==0 );
17bd0 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74  ..  /* Convert t
17be0 68 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20 74  he filename to t
17bf0 68 65 20 73 79 73 74 65 6d 20 65 6e 63 6f 64 69  he system encodi
17c00 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72  ng. */.  zConver
17c10 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66  ted = convertUtf
17c20 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e  8Filename(zUtf8N
17c30 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ame);.  if( zCon
17c40 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
17c50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
17c60 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
17c70 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69  .  if( isReadWri
17c80 74 65 20 29 7b 0a 20 20 20 20 64 77 44 65 73 69  te ){.    dwDesi
17c90 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45  redAccess = GENE
17ca0 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52  RIC_READ | GENER
17cb0 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73  IC_WRITE;.  }els
17cc0 65 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64  e{.    dwDesired
17cd0 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43  Access = GENERIC
17ce0 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _READ;.  }..  /*
17cf0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
17d00 4c 55 53 49 56 45 20 69 73 20 75 73 65 64 20 74  LUSIVE is used t
17d10 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
17d20 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73 20 0a   a new file is .
17d30 20 20 2a 2a 20 63 72 65 61 74 65 64 2e 20 53 51    ** created. SQ
17d40 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 75 73 65  Lite doesn't use
17d50 20 69 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20   it to indicate 
17d60 22 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73  "exclusive acces
17d70 73 22 20 0a 20 20 2a 2a 20 61 73 20 69 74 20 69  s" .  ** as it i
17d80 73 20 75 73 75 61 6c 6c 79 20 75 6e 64 65 72 73  s usually unders
17d90 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tood..  */.  if(
17da0 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a   isExclusive ){.
17db0 20 20 20 20 2f 2a 20 43 72 65 61 74 65 73 20 61      /* Creates a
17dc0 20 6e 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20   new file, only 
17dd0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
17de0 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20 2a 2f  lready exist. */
17df0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
17e00 69 6c 65 20 65 78 69 73 74 73 2c 20 69 74 20 66  ile exists, it f
17e10 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43  ails. */.    dwC
17e20 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
17e30 6f 6e 20 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b  on = CREATE_NEW;
17e40 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 43  .  }else if( isC
17e50 72 65 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20  reate ){.    /* 
17e60 4f 70 65 6e 20 65 78 69 73 74 69 6e 67 20 66 69  Open existing fi
17e70 6c 65 2c 20 6f 72 20 63 72 65 61 74 65 20 69 66  le, or create if
17e80 20 69 74 20 64 6f 65 73 6e 27 74 20 65 78 69 73   it doesn't exis
17e90 74 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74  t */.    dwCreat
17ea0 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d  ionDisposition =
17eb0 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20   OPEN_ALWAYS;.  
17ec0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70  }else{.    /* Op
17ed0 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79  ens a file, only
17ee0 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 2a   if it exists. *
17ef0 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e  /.    dwCreation
17f00 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50  Disposition = OP
17f10 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d  EN_EXISTING;.  }
17f20 0a 0a 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20  ..  dwShareMode 
17f30 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41  = FILE_SHARE_REA
17f40 44 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57  D | FILE_SHARE_W
17f50 52 49 54 45 3b 0a 0a 20 20 69 66 28 20 69 73 44  RITE;..  if( isD
17f60 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 53 51 4c  elete ){.#if SQL
17f70 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20  ITE_OS_WINCE.   
17f80 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
17f90 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54  butes = FILE_ATT
17fa0 52 49 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20  RIBUTE_HIDDEN;. 
17fb0 20 20 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23     isTemp = 1;.#
17fc0 65 6c 73 65 0a 20 20 20 20 64 77 46 6c 61 67 73  else.    dwFlags
17fd0 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20  AndAttributes = 
17fe0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54  FILE_ATTRIBUTE_T
17ff0 45 4d 50 4f 52 41 52 59 0a 20 20 20 20 20 20 20  EMPORARY.       
18000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18010 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 41          | FILE_A
18020 54 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 0a  TTRIBUTE_HIDDEN.
18030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18050 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54   FILE_FLAG_DELET
18060 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64  E_ON_CLOSE;.#end
18070 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
18080 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
18090 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52  utes = FILE_ATTR
180a0 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  IBUTE_NORMAL;.  
180b0 7d 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73 20 66  }.  /* Reports f
180c0 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 65 74  rom the internet
180d0 20 61 72 65 20 74 68 61 74 20 70 65 72 66 6f 72   are that perfor
180e0 6d 61 6e 63 65 20 69 73 20 61 6c 77 61 79 73 0a  mance is always.
180f0 20 20 2a 2a 20 62 65 74 74 65 72 20 69 66 20 46    ** better if F
18100 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f  ILE_FLAG_RANDOM_
18110 41 43 43 45 53 53 20 69 73 20 75 73 65 64 2e 20  ACCESS is used. 
18120 20 54 69 63 6b 65 74 20 23 32 36 39 39 2e 20 2a   Ticket #2699. *
18130 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
18140 57 49 4e 43 45 0a 20 20 64 77 46 6c 61 67 73 41  WINCE.  dwFlagsA
18150 6e 64 41 74 74 72 69 62 75 74 65 73 20 7c 3d 20  ndAttributes |= 
18160 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d  FILE_FLAG_RANDOM
18170 5f 41 43 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a  _ACCESS;.#endif.
18180 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
18190 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d  .    while( (h =
181a0 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57 28 28   osCreateFileW((
181b0 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
181c0 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
181d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181e0 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
181f0 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
18200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18210 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55   dwShareMode, NU
18220 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
18230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18240 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
18250 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20  osition,.       
18260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18270 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e         dwFlagsAn
18280 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20  dAttributes,.   
18290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182a0 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29             NULL)
182b0 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  )==INVALID_HANDL
182c0 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20  E_VALUE &&.     
182d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182e0 20 20 20 20 20 20 20 20 20 72 65 74 72 79 49 6f           retryIo
182f0 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
18300 72 72 6e 6f 29 20 29 7b 7d 0a 2f 2a 20 69 73 4e  rrno) ){}./* isN
18310 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c 49  T() is 1 if SQLI
18320 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20  TE_OS_WINCE==1, 
18330 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73 20  so this else is 
18340 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e 20  never executed. 
18350 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41 4e  .** Since the AN
18360 53 49 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  SI version of th
18370 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50 49 20  ese Windows API 
18380 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66 6f 72  do not exist for
18390 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20   WINCE,.** it's 
183a0 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74  important to not
183b0 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 6d 20   reference them 
183c0 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c 64 73  for WINCE builds
183d0 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
183e0 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65  OS_WINCE==0.  }e
183f0 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
18400 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  (h = osCreateFil
18410 65 41 28 28 4c 50 43 53 54 52 29 7a 43 6f 6e 76  eA((LPCSTR)zConv
18420 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
18430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18440 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63       dwDesiredAc
18450 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cess,.          
18460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18470 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c      dwShareMode,
18480 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
18490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184a0 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44       dwCreationD
184b0 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20  isposition,.    
184c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184d0 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67            dwFlag
184e0 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a  sAndAttributes,.
184f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
18510 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  LL))==INVALID_HA
18520 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20  NDLE_VALUE &&.  
18530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18540 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 72              retr
18550 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
18560 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 23 65 6e  stErrno) ){}.#en
18570 64 69 66 0a 20 20 7d 0a 0a 20 20 6c 6f 67 49 6f  dif.  }..  logIo
18580 65 72 72 28 63 6e 74 29 3b 0a 0a 20 20 4f 53 54  err(cnt);..  OST
18590 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25  RACE(("OPEN %d %
185a0 73 20 30 78 25 6c 78 20 25 73 5c 6e 22 2c 20 0a  s 0x%lx %s\n", .
185b0 20 20 20 20 20 20 20 20 20 20 20 68 2c 20 7a 4e             h, zN
185c0 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64 41 63  ame, dwDesiredAc
185d0 63 65 73 73 2c 20 0a 20 20 20 20 20 20 20 20 20  cess, .         
185e0 20 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e    h==INVALID_HAN
185f0 44 4c 45 5f 56 41 4c 55 45 20 3f 20 22 66 61 69  DLE_VALUE ? "fai
18600 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a  led" : "ok"));..
18610 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44    if( h==INVALID
18620 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b  _HANDLE_VALUE ){
18630 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
18640 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
18650 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  o;.    winLogErr
18660 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
18670 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  EN, pFile->lastE
18680 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 65 6e 22 2c  rrno, "winOpen",
18690 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 20   zUtf8Name);.   
186a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
186b0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 69  onverted);.    i
186c0 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 26  f( isReadWrite &
186d0 26 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 29  & !isExclusive )
186e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  {.      return w
186f0 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61  inOpen(pVfs, zNa
18700 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20 20 20 20  me, id, .       
18710 20 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53 51        ((flags|SQ
18720 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
18730 4c 59 29 26 7e 28 53 51 4c 49 54 45 5f 4f 50 45  LY)&~(SQLITE_OPE
18740 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45 5f  N_CREATE|SQLITE_
18750 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 29  OPEN_READWRITE))
18760 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20  , pOutFlags);.  
18770 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
18780 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
18790 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
187a0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f 75  }.  }..  if( pOu
187b0 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 69 66  tFlags ){.    if
187c0 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b  ( isReadWrite ){
187d0 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  .      *pOutFlag
187e0 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
187f0 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 7d  READWRITE;.    }
18800 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75  else{.      *pOu
18810 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  tFlags = SQLITE_
18820 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
18830 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6d 65 6d 73     }.  }..  mems
18840 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a  et(pFile, 0, siz
18850 65 6f 66 28 2a 70 46 69 6c 65 29 29 3b 0a 20 20  eof(*pFile));.  
18860 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
18870 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a 20   &winIoMethod;. 
18880 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20   pFile->h = h;. 
18890 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
188a0 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20  o = NO_ERROR;.  
188b0 70 46 69 6c 65 2d 3e 70 56 66 73 20 3d 20 70 56  pFile->pVfs = pV
188c0 66 73 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 53 68  fs;.  pFile->pSh
188d0 6d 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e  m = 0;.  pFile->
188e0 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zPath = zName;. 
188f0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69   if( sqlite3_uri
18900 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20  _boolean(zName, 
18910 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50  "psow", SQLITE_P
18920 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
18930 54 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  TE) ){.    pFile
18940 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57  ->ctrlFlags |= W
18950 49 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d  INFILE_PSOW;.  }
18960 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
18970 57 49 4e 43 45 0a 20 20 69 66 28 20 69 73 52 65  WINCE.  if( isRe
18980 61 64 57 72 69 74 65 20 26 26 20 65 54 79 70 65  adWrite && eType
18990 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
189a0 49 4e 5f 44 42 0a 20 20 20 20 20 20 20 26 26 20  IN_DB.       && 
189b0 21 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b  !winceCreateLock
189c0 28 7a 4e 61 6d 65 2c 20 70 46 69 6c 65 29 0a 20  (zName, pFile). 
189d0 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48   ){.    osCloseH
189e0 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20 20 73 71  andle(h);.    sq
189f0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
18a00 65 72 74 65 64 29 3b 0a 20 20 20 20 72 65 74 75  erted);.    retu
18a10 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
18a20 45 4e 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  EN_BKPT;.  }.  i
18a30 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  f( isTemp ){.   
18a40 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f   pFile->zDeleteO
18a50 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72  nClose = zConver
18a60 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  ted;.  }else.#en
18a70 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69  dif.  {.    sqli
18a80 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
18a90 74 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 4f 70 65  ted);.  }..  Ope
18aa0 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20  nCounter(+1);.  
18ab0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18ac0 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e  .** Delete the n
18ad0 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  amed file..**.**
18ae0 20 4e 6f 74 65 20 74 68 61 74 20 57 69 6e 64 6f   Note that Windo
18af0 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f  ws does not allo
18b00 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65 20 64  w a file to be d
18b10 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  eleted if some o
18b20 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20  ther.** process 
18b30 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f  has it open.  So
18b40 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75 73 20  metimes a virus 
18b50 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78  scanner or index
18b60 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77  ing program.** w
18b70 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e  ill open a journ
18b80 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c 79 20  al file shortly 
18b90 61 66 74 65 72 20 69 74 20 69 73 20 63 72 65 61  after it is crea
18ba0 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ted in order to 
18bb0 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 20 69  do.** whatever i
18bc0 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20 74  t does.  While t
18bd0 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73  his other proces
18be0 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  s is holding the
18bf0 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77  .** file open, w
18c00 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65  e will be unable
18c10 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20   to delete it.  
18c20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
18c30 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20  his.** problem, 
18c40 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c  we delay 100 mil
18c50 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72  liseconds and tr
18c60 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69  y to delete agai
18c70 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f  n.  Up.** to MX_
18c80 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54  DELETION_ATTEMPT
18c90 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d  s deletion attem
18ca0 70 74 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f  pts are run befo
18cb0 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20  re giving.** up 
18cc0 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  and returning an
18cd0 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
18ce0 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28  c int winDelete(
18cf0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
18d00 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 2f  pVfs,          /
18d10 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69  * Not used on wi
18d20 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  n32 */.  const c
18d30 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
18d40 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
18d50 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 2a  file to delete *
18d60 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20  /.  int syncDir 
18d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d80 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
18d90 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  in32 */.){.  int
18da0 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20   cnt = 0;.  int 
18db0 72 63 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74  rc;.  DWORD last
18dc0 45 72 72 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a 7a  Errno;.  void *z
18dd0 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55  Converted;.  UNU
18de0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
18df0 66 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  fs);.  UNUSED_PA
18e00 52 41 4d 45 54 45 52 28 73 79 6e 63 44 69 72 29  RAMETER(syncDir)
18e10 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
18e20 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
18e30 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29  TE_IOERR_DELETE)
18e40 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d  ;.  zConverted =
18e50 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65   convertUtf8File
18e60 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
18e70 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
18e80 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d==0 ){.    retu
18e90 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
18ea0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
18eb0 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72   isNT() ){.    r
18ec0 63 20 3d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65  c = 1;.    while
18ed0 28 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  ( osGetFileAttri
18ee0 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74 65  butesW(zConverte
18ef0 64 29 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  d)!=INVALID_FILE
18f00 5f 41 54 54 52 49 42 55 54 45 53 20 26 26 0a 20  _ATTRIBUTES &&. 
18f10 20 20 20 20 20 20 20 20 28 72 63 20 3d 20 6f 73          (rc = os
18f20 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e  DeleteFileW(zCon
18f30 76 65 72 74 65 64 29 29 3d 3d 30 20 26 26 20 72  verted))==0 && r
18f40 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
18f50 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a  &lastErrno) ){}.
18f60 20 20 20 20 72 63 20 3d 20 72 63 20 3f 20 53 51      rc = rc ? SQ
18f70 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45  LITE_OK : SQLITE
18f80 5f 45 52 52 4f 52 3b 0a 2f 2a 20 69 73 4e 54 28  _ERROR;./* isNT(
18f90 29 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 45  ) is 1 if SQLITE
18fa0 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f  _OS_WINCE==1, so
18fb0 20 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65   this else is ne
18fc0 76 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a  ver executed. .*
18fd0 2a 20 53 69 6e 63 65 20 74 68 65 20 41 4e 53 49  * Since the ANSI
18fe0 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73   version of thes
18ff0 65 20 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f  e Windows API do
19000 20 6e 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57   not exist for W
19010 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d  INCE,.** it's im
19020 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72  portant to not r
19030 65 66 65 72 65 6e 63 65 20 74 68 65 6d 20 66 6f  eference them fo
19040 72 20 57 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a  r WINCE builds..
19050 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
19060 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73  _WINCE==0.  }els
19070 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  e{.    rc = 1;. 
19080 20 20 20 77 68 69 6c 65 28 20 6f 73 47 65 74 46     while( osGetF
19090 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 7a  ileAttributesA(z
190a0 43 6f 6e 76 65 72 74 65 64 29 21 3d 49 4e 56 41  Converted)!=INVA
190b0 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
190c0 54 45 53 20 26 26 0a 20 20 20 20 20 20 20 20 20  TES &&.         
190d0 28 72 63 20 3d 20 6f 73 44 65 6c 65 74 65 46 69  (rc = osDeleteFi
190e0 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 29  leA(zConverted))
190f0 3d 3d 30 20 26 26 20 72 65 74 72 79 49 6f 65 72  ==0 && retryIoer
19100 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
19110 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 72 63 20 3d  no) ){}.    rc =
19120 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20   rc ? SQLITE_OK 
19130 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
19140 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28  #endif.  }.  if(
19150 20 72 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20   rc ){.    rc = 
19160 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
19170 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
19180 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20   lastErrno,.    
19190 20 20 20 20 20 20 20 20 20 22 77 69 6e 44 65 6c           "winDel
191a0 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ete", zFilename)
191b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c  ;.  }else{.    l
191c0 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20 20  ogIoerr(cnt);.  
191d0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
191e0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
191f0 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45 54 45  OSTRACE(("DELETE
19200 20 5c 22 25 73 5c 22 20 25 73 5c 6e 22 2c 20 7a   \"%s\" %s\n", z
19210 46 69 6c 65 6e 61 6d 65 2c 20 28 72 63 20 3f 20  Filename, (rc ? 
19220 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 20  "failed" : "ok" 
19230 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
19240 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
19250 20 74 68 65 20 65 78 69 73 74 61 6e 63 65 20 61   the existance a
19260 6e 64 20 73 74 61 74 75 73 20 6f 66 20 61 20 66  nd status of a f
19270 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
19280 6e 74 20 77 69 6e 41 63 63 65 73 73 28 0a 20 20  nt winAccess(.  
19290 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
192a0 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  s,         /* No
192b0 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20  t used on win32 
192c0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
192d0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20  *zFilename,     
192e0 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
192f0 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e  to check */.  in
19300 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
19310 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
19320 20 6f 66 20 74 65 73 74 20 74 6f 20 6d 61 6b 65   of test to make
19330 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   on this file */
19340 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20  .  int *pResOut 
19350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19360 20 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f 0a   OUT: Result */.
19370 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b  ){.  DWORD attr;
19380 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
19390 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
193a0 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
193b0 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rted;.  UNUSED_P
193c0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
193d0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
193e0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
193f0 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20  E_IOERR_ACCESS; 
19400 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  );.  zConverted 
19410 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c  = convertUtf8Fil
19420 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  ename(zFilename)
19430 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
19440 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ed==0 ){.    ret
19450 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
19460 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
19470 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
19480 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
19490 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52   WIN32_FILE_ATTR
194a0 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72  IBUTE_DATA sAttr
194b0 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Data;.    memset
194c0 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20  (&sAttrData, 0, 
194d0 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61  sizeof(sAttrData
194e0 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21  ));.    while( !
194f0 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  (rc = osGetFileA
19500 74 74 72 69 62 75 74 65 73 45 78 57 28 28 4c 50  ttributesExW((LP
19510 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
19520 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 47                 G
19540 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e  etFileExInfoStan
19550 64 61 72 64 2c 20 0a 20 20 20 20 20 20 20 20 20  dard, .         
19560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19570 20 20 20 20 26 73 41 74 74 72 44 61 74 61 29 29      &sAttrData))
19580 20 26 26 20 72 65 74 72 79 49 6f 65 72 72 28 26   && retryIoerr(&
19590 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
195a0 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 72 63 20   ){}.    if( rc 
195b0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ){.      /* For 
195c0 61 6e 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  an SQLITE_ACCESS
195d0 5f 45 58 49 53 54 53 20 71 75 65 72 79 2c 20 74  _EXISTS query, t
195e0 72 65 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e 67  reat a zero-leng
195f0 74 68 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  th file.      **
19600 20 61 73 20 69 66 20 69 74 20 64 6f 65 73 20 6e   as if it does n
19610 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20  ot exist..      
19620 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 20 20 20  */.      if(    
19630 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43  flags==SQLITE_AC
19640 43 45 53 53 5f 45 58 49 53 54 53 0a 20 20 20 20  CESS_EXISTS.    
19650 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44 61        && sAttrDa
19660 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67 68  ta.nFileSizeHigh
19670 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26  ==0 .          &
19680 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c  & sAttrData.nFil
19690 65 53 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20  eSizeLow==0 ){. 
196a0 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e         attr = IN
196b0 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
196c0 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 65 6c  BUTES;.      }el
196d0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72  se{.        attr
196e0 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77 46   = sAttrData.dwF
196f0 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20  ileAttributes;. 
19700 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
19710 7b 0a 20 20 20 20 20 20 6c 6f 67 49 6f 65 72 72  {.      logIoerr
19720 28 63 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  (cnt);.      if(
19730 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f   lastErrno!=ERRO
19740 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44  R_FILE_NOT_FOUND
19750 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 4c   ){.        winL
19760 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
19770 4f 45 52 52 5f 41 43 43 45 53 53 2c 20 6c 61 73  OERR_ACCESS, las
19780 74 45 72 72 6e 6f 2c 20 22 77 69 6e 41 63 63 65  tErrno, "winAcce
19790 73 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  ss", zFilename);
197a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
197b0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
197c0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
197d0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
197e0 43 43 45 53 53 3b 0a 20 20 20 20 20 20 7d 65 6c  CCESS;.      }el
197f0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72  se{.        attr
19800 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f   = INVALID_FILE_
19810 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20  ATTRIBUTES;.    
19820 20 20 7d 0a 20 20 20 20 7d 0a 2f 2a 20 69 73 4e    }.    }./* isN
19830 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c 49  T() is 1 if SQLI
19840 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20  TE_OS_WINCE==1, 
19850 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73 20  so this else is 
19860 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e 20  never executed. 
19870 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41 4e  .** Since the AN
19880 53 49 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  SI version of th
19890 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50 49 20  ese Windows API 
198a0 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66 6f 72  do not exist for
198b0 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20   WINCE,.** it's 
198c0 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74  important to not
198d0 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 6d 20   reference them 
198e0 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c 64 73  for WINCE builds
198f0 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
19900 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65  OS_WINCE==0.  }e
19910 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20  lse{.    attr = 
19920 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
19930 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  tesA((char*)zCon
19940 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a  verted);.#endif.
19950 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
19960 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
19970 20 20 73 77 69 74 63 68 28 20 66 6c 61 67 73 20    switch( flags 
19980 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
19990 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a  TE_ACCESS_READ:.
199a0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
199b0 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20  ACCESS_EXISTS:. 
199c0 20 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d       rc = attr!=
199d0 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
199e0 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 62  RIBUTES;.      b
199f0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
19a00 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
19a10 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 72 63  DWRITE:.      rc
19a20 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44   = attr!=INVALID
19a30 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
19a40 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
19a50 20 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54   (attr & FILE_AT
19a60 54 52 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59  TRIBUTE_READONLY
19a70 29 3d 3d 30 3b 0a 20 20 20 20 20 20 62 72 65 61  )==0;.      brea
19a80 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
19a90 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49        assert(!"I
19aa0 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67  nvalid flags arg
19ab0 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a  ument");.  }.  *
19ac0 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20  pResOut = rc;.  
19ad0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19ae0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e  ;.}.../*.** Turn
19af0 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
19b00 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c  name into a full
19b10 20 70 61 74 68 6e 61 6d 65 2e 20 20 57 72 69 74   pathname.  Writ
19b20 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61  e the full.** pa
19b30 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74  thname into zOut
19b40 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c  [].  zOut[] will
19b50 20 62 65 20 61 74 20 6c 65 61 73 74 20 70 56 66   be at least pVf
19b60 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a  s->mxPathname.**
19b70 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
19b80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
19b90 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20  nFullPathname(. 
19ba0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
19bb0 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  fs,            /
19bc0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
19bd0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
19be0 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69  st char *zRelati
19bf0 76 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ve,        /* Po
19c00 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20  ssibly relative 
19c10 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20  input path */.  
19c20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20  int nFull,      
19c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19c40 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20   Size of output 
19c50 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20  buffer in bytes 
19c60 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  */.  char *zFull
19c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c80 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66     /* Output buf
19c90 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 0a 23 69 66  fer */.){.  .#if
19ca0 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49   defined(__CYGWI
19cb0 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49  N__).  SimulateI
19cc0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
19cd0 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20  QLITE_ERROR );. 
19ce0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
19cf0 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 63 79 67 77  R(nFull);.  cygw
19d00 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 66 75 6c 6c 5f  in_conv_to_full_
19d10 77 69 6e 33 32 5f 70 61 74 68 28 7a 52 65 6c 61  win32_path(zRela
19d20 74 69 76 65 2c 20 7a 46 75 6c 6c 29 3b 0a 20 20  tive, zFull);.  
19d30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19d40 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  ;.#endif..#if SQ
19d50 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
19d60 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
19d70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
19d80 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44  RROR );.  UNUSED
19d90 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c  _PARAMETER(nFull
19da0 29 3b 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68 61  );.  /* WinCE ha
19db0 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20  s no concept of 
19dc0 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
19dd0 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20  ame, or so I am 
19de0 74 6f 6c 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  told. */.  sqlit
19df0 65 33 5f 73 6e 70 72 69 6e 74 66 28 70 56 66 73  e3_snprintf(pVfs
19e00 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 46  ->mxPathname, zF
19e10 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52 65 6c 61  ull, "%s", zRela
19e20 74 69 76 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  tive);.  return 
19e30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
19e40 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  f..#if !SQLITE_O
19e50 53 5f 57 49 4e 43 45 20 26 26 20 21 64 65 66 69  S_WINCE && !defi
19e60 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
19e70 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 76    int nByte;.  v
19e80 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b  oid *zConverted;
19e90 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a  .  char *zOut;..
19ea0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 74    /* If this pat
19eb0 68 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69  h name begins wi
19ec0 74 68 20 22 2f 58 3a 22 2c 20 77 68 65 72 65 20  th "/X:", where 
19ed0 22 58 22 20 69 73 20 61 6e 79 20 61 6c 70 68 61  "X" is any alpha
19ee0 62 65 74 69 63 0a 20 20 2a 2a 20 63 68 61 72 61  betic.  ** chara
19ef0 63 74 65 72 2c 20 64 69 73 63 61 72 64 20 74 68  cter, discard th
19f00 65 20 69 6e 69 74 69 61 6c 20 22 2f 22 20 66 72  e initial "/" fr
19f10 6f 6d 20 74 68 65 20 70 61 74 68 6e 61 6d 65 2e  om the pathname.
19f20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6c  .  */.  if( zRel
19f30 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26  ative[0]=='/' &&
19f40 20 73 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28   sqlite3Isalpha(
19f50 7a 52 65 6c 61 74 69 76 65 5b 31 5d 29 20 26 26  zRelative[1]) &&
19f60 20 7a 52 65 6c 61 74 69 76 65 5b 32 5d 3d 3d 27   zRelative[2]=='
19f70 3a 27 20 29 7b 0a 20 20 20 20 7a 52 65 6c 61 74  :' ){.    zRelat
19f80 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ive++;.  }..  /*
19f90 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d   It's odd to sim
19fa0 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f  ulate an io-erro
19fb0 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c  r here, but real
19fc0 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a  ly this is just.
19fd0 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69    ** using the i
19fe0 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72  o-error infrastr
19ff0 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74  ucture to test t
1a000 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c  hat SQLite handl
1a010 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  es this.  ** fun
1a020 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54  ction failing. T
1a030 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75  his function cou
1a040 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20  ld fail if, for 
1a050 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a  example, the.  *
1a060 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e  * current workin
1a070 67 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20  g directory has 
1a080 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20  been unlinked.. 
1a090 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   */.  SimulateIO
1a0a0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
1a0b0 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20  LITE_ERROR );.  
1a0c0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1a0d0 28 6e 46 75 6c 6c 29 3b 0a 20 20 7a 43 6f 6e 76  (nFull);.  zConv
1a0e0 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55  erted = convertU
1a0f0 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c  tf8Filename(zRel
1a100 61 74 69 76 65 29 3b 0a 20 20 69 66 28 20 7a 43  ative);.  if( zC
1a110 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
1a120 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a130 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
1a140 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  }.  if( isNT() )
1a150 7b 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65  {.    LPWSTR zTe
1a160 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  mp;.    nByte = 
1a170 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
1a180 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  eW((LPCWSTR)zCon
1a190 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29  verted, 0, 0, 0)
1a1a0 20 2b 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20   + 3;.    zTemp 
1a1b0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
1a1c0 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a  ( nByte*sizeof(z
1a1d0 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20  Temp[0]) );.    
1a1e0 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a  if( zTemp==0 ){.
1a1f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1a200 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
1a210 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1a220 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
1a230 0a 20 20 20 20 7d 0a 20 20 20 20 6f 73 47 65 74  .    }.    osGet
1a240 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c  FullPathNameW((L
1a250 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
1a260 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c  d, nByte, zTemp,
1a270 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1a280 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
1a290 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 75 6e  );.    zOut = un
1a2a0 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d  icodeToUtf8(zTem
1a2b0 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  p);.    sqlite3_
1a2c0 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 2f 2a 20  free(zTemp);./* 
1a2d0 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53  isNT() is 1 if S
1a2e0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
1a2f0 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20  1, so this else 
1a300 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  is never execute
1a310 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65  d. .** Since the
1a320 20 41 4e 53 49 20 76 65 72 73 69 6f 6e 20 6f 66   ANSI version of
1a330 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41   these Windows A
1a340 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  PI do not exist 
1a350 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74  for WINCE,.** it
1a360 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  's important to 
1a370 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  not reference th
1a380 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69  em for WINCE bui
1a390 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  lds..*/.#if SQLI
1a3a0 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20  TE_OS_WINCE==0. 
1a3b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
1a3c0 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79   *zTemp;.    nBy
1a3d0 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61  te = osGetFullPa
1a3e0 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a  thNameA((char*)z
1a3f0 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c  Converted, 0, 0,
1a400 20 30 29 20 2b 20 33 3b 0a 20 20 20 20 7a 54 65   0) + 3;.    zTe
1a410 6d 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  mp = sqlite3_mal
1a420 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f  loc( nByte*sizeo
1a430 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20  f(zTemp[0]) );. 
1a440 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20     if( zTemp==0 
1a450 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1a460 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
1a470 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1a480 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
1a490 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 73  EM;.    }.    os
1a4a0 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
1a4b0 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
1a4c0 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70  ed, nByte, zTemp
1a4d0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1a4e0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
1a4f0 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 73  d);.    zOut = s
1a500 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63  qlite3_win32_mbc
1a510 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29  s_to_utf8(zTemp)
1a520 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1a530 65 65 28 7a 54 65 6d 70 29 3b 0a 23 65 6e 64 69  ee(zTemp);.#endi
1a540 66 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4f 75 74  f.  }.  if( zOut
1a550 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1a560 73 6e 70 72 69 6e 74 66 28 70 56 66 73 2d 3e 6d  snprintf(pVfs->m
1a570 78 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c  xPathname, zFull
1a580 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20  , "%s", zOut);. 
1a590 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1a5a0 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72  zOut);.    retur
1a5b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1a5c0 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1a5d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
1a5e0 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  MEM;.  }.#endif.
1a5f0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1a600 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
1a610 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  NSION./*.** Inte
1a620 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69  rfaces for openi
1a630 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72  ng a shared libr
1a640 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74  ary, finding ent
1a650 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74  ry points.** wit
1a660 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  hin the shared l
1a670 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73  ibrary, and clos
1a680 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
1a690 69 62 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a  ibrary..*/./*.**
1a6a0 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20   Interfaces for 
1a6b0 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64  opening a shared
1a6c0 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e   library, findin
1a6d0 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a  g entry points.*
1a6e0 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61  * within the sha
1a6f0 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64  red library, and
1a700 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61   closing the sha
1a710 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a  red library..*/.
1a720 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e  static void *win
1a730 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  DlOpen(sqlite3_v
1a740 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20  fs *pVfs, const 
1a750 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
1a760 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20  {.  HANDLE h;.  
1a770 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
1a780 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69   = convertUtf8Fi
1a790 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  lename(zFilename
1a7a0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1a7b0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 69  METER(pVfs);.  i
1a7c0 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
1a7d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1a7e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54  ;.  }.  if( isNT
1a7f0 28 29 20 29 7b 0a 20 20 20 20 68 20 3d 20 6f 73  () ){.    h = os
1a800 4c 6f 61 64 4c 69 62 72 61 72 79 57 28 28 4c 50  LoadLibraryW((LP
1a810 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
1a820 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20  );./* isNT() is 
1a830 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  1 if SQLITE_OS_W
1a840 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73  INCE==1, so this
1a850 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65   else is never e
1a860 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e  xecuted. .** Sin
1a870 63 65 20 74 68 65 20 41 4e 53 49 20 76 65 72 73  ce the ANSI vers
1a880 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e  ion of these Win
1a890 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20  dows API do not 
1a8a0 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c  exist for WINCE,
1a8b0 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61  .** it's importa
1a8c0 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65  nt to not refere
1a8d0 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e  nce them for WIN
1a8e0 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69  CE builds..*/.#i
1a8f0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
1a900 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E==0.  }else{.  
1a910 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72    h = osLoadLibr
1a920 61 72 79 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  aryA((char*)zCon
1a930 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a  verted);.#endif.
1a940 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
1a950 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
1a960 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29    return (void*)
1a970 68 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  h;.}.static void
1a980 20 77 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c 69   winDlError(sqli
1a990 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
1a9a0 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
1a9b0 42 75 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45  BufOut){.  UNUSE
1a9c0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
1a9d0 29 3b 0a 20 20 67 65 74 4c 61 73 74 45 72 72 6f  );.  getLastErro
1a9e0 72 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72  rMsg(osGetLastEr
1a9f0 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75  ror(), nBuf, zBu
1aa00 66 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20  fOut);.}.static 
1aa10 76 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28  void (*winDlSym(
1aa20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1aa30 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65  s, void *pHandle
1aa40 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
1aa50 79 6d 62 6f 6c 29 29 28 76 6f 69 64 29 7b 0a 20  ymbol))(void){. 
1aa60 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1aa70 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72  R(pVfs);.  retur
1aa80 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29  n (void(*)(void)
1aa90 29 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65 73  )osGetProcAddres
1aaa0 73 41 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64  sA((HANDLE)pHand
1aab0 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 7d 0a  le, zSymbol);.}.
1aac0 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44  static void winD
1aad0 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76  lClose(sqlite3_v
1aae0 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a  fs *pVfs, void *
1aaf0 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53  pHandle){.  UNUS
1ab00 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
1ab10 73 29 3b 0a 20 20 6f 73 46 72 65 65 4c 69 62 72  s);.  osFreeLibr
1ab20 61 72 79 28 28 48 41 4e 44 4c 45 29 70 48 61 6e  ary((HANDLE)pHan
1ab30 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  dle);.}.#else /*
1ab40 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
1ab50 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69  LOAD_EXTENSION i
1ab60 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20  s defined: */.  
1ab70 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65  #define winDlOpe
1ab80 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77  n  0.  #define w
1ab90 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64  inDlError 0.  #d
1aba0 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20  efine winDlSym  
1abb0 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e   0.  #define win
1abc0 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66  DlClose 0.#endif
1abd0 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75  .../*.** Write u
1abe0 70 20 74 6f 20 6e 42 75 66 20 62 79 74 65 73 20  p to nBuf bytes 
1abf0 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e  of randomness in
1ac00 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  to zBuf..*/.stat
1ac10 69 63 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d  ic int winRandom
1ac20 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73  ness(sqlite3_vfs
1ac30 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
1ac40 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
1ac50 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 55 4e   int n = 0;.  UN
1ac60 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
1ac70 56 66 73 29 3b 0a 23 69 66 20 64 65 66 69 6e 65  Vfs);.#if define
1ac80 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20  d(SQLITE_TEST). 
1ac90 20 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65 6d   n = nBuf;.  mem
1aca0 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75  set(zBuf, 0, nBu
1acb0 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  f);.#else.  if( 
1acc0 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54 49 4d  sizeof(SYSTEMTIM
1acd0 45 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20  E)<=nBuf-n ){.  
1ace0 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a    SYSTEMTIME x;.
1acf0 20 20 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54      osGetSystemT
1ad00 69 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d  ime(&x);.    mem
1ad10 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78  cpy(&zBuf[n], &x
1ad20 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
1ad30 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29    n += sizeof(x)
1ad40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65  ;.  }.  if( size
1ad50 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d  of(DWORD)<=nBuf-
1ad60 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 70  n ){.    DWORD p
1ad70 69 64 20 3d 20 6f 73 47 65 74 43 75 72 72 65 6e  id = osGetCurren
1ad80 74 50 72 6f 63 65 73 73 49 64 28 29 3b 0a 20 20  tProcessId();.  
1ad90 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e    memcpy(&zBuf[n
1ada0 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28  ], &pid, sizeof(
1adb0 70 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  pid));.    n += 
1adc0 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 7d  sizeof(pid);.  }
1add0 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57  .  if( sizeof(DW
1ade0 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  ORD)<=nBuf-n ){.
1adf0 20 20 20 20 44 57 4f 52 44 20 63 6e 74 20 3d 20      DWORD cnt = 
1ae00 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 28 29  osGetTickCount()
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 63 6e 74 2c 20 73 69 7a  uf[n], &cnt, siz
1ae30 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e  eof(cnt));.    n
1ae40 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b   += sizeof(cnt);
1ae50 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f  .  }.  if( sizeo
1ae60 66 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 29  f(LARGE_INTEGER)
1ae70 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20  <=nBuf-n ){.    
1ae80 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69 3b  LARGE_INTEGER i;
1ae90 0a 20 20 20 20 6f 73 51 75 65 72 79 50 65 72 66  .    osQueryPerf
1aea0 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28 26  ormanceCounter(&
1aeb0 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  i);.    memcpy(&
1aec0 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a  zBuf[n], &i, siz
1aed0 65 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e 20 2b  eof(i));.    n +
1aee0 3d 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20 7d  = sizeof(i);.  }
1aef0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
1af00 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c   n;.}.../*.** Sl
1af10 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65  eep for a little
1af20 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20   while.  Return 
1af30 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  the amount of ti
1af40 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61  me slept..*/.sta
1af50 74 69 63 20 69 6e 74 20 77 69 6e 53 6c 65 65 70  tic int winSleep
1af60 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
1af70 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63  fs, int microsec
1af80 29 7b 0a 20 20 70 6f 72 74 61 62 6c 65 53 6c 65  ){.  portableSle
1af90 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39  ep((microsec+999
1afa0 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55 53 45  )/1000);.  UNUSE
1afb0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
1afc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6d 69  );.  return ((mi
1afd0 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30  crosec+999)/1000
1afe0 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )*1000;.}../*.**
1aff0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
1b000 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20  ariable, if set 
1b010 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
1b020 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65  lue, is interpre
1b030 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75  ted as.** the nu
1b040 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20  mber of seconds 
1b050 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69  since 1970 and i
1b060 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68  s used to set th
1b070 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73  e result of.** s
1b080 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
1b090 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73  ime() during tes
1b0a0 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ting..*/.#ifdef 
1b0b0 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
1b0c0 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
1b0d0 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61  time = 0;  /* Fa
1b0e0 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69  ke system time i
1b0f0 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  n seconds since 
1b100 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  1970. */.#endif.
1b110 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
1b120 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
1b130 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
1b140 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
1b150 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
1b160 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
1b170 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
1b180 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
1b190 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30  mber times 86_40
1b1a0 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74  0_000.  In.** ot
1b1b0 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65  her words, write
1b1c0 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65   into *piNow the
1b1d0 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
1b1e0 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68  seconds since th
1b1f0 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63  e Julian.** epoc
1b200 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65  h of noon in Gre
1b210 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62  enwich on Novemb
1b220 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20  er 24, 4714 B.C 
1b230 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
1b240 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72  .** proleptic Gr
1b250 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72  egorian calendar
1b260 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
1b270 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ss, return SQLIT
1b280 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51  E_OK.  Return SQ
1b290 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68  LITE_ERROR if th
1b2a0 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
1b2b0 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  .** cannot be fo
1b2c0 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  und..*/.static i
1b2d0 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d  nt winCurrentTim
1b2e0 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76  eInt64(sqlite3_v
1b2f0 66 73 20 2a 70 56 66 73 2c 20 73 71 6c 69 74 65  fs *pVfs, sqlite
1b300 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b  3_int64 *piNow){
1b310 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73  .  /* FILETIME s
1b320 74 72 75 63 74 75 72 65 20 69 73 20 61 20 36 34  tructure is a 64
1b330 2d 62 69 74 20 76 61 6c 75 65 20 72 65 70 72 65  -bit value repre
1b340 73 65 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d 62  senting the numb
1b350 65 72 20 6f 66 20 0a 20 20 20 20 20 31 30 30 2d  er of .     100-
1b360 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72  nanosecond inter
1b370 76 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75 61  vals since Janua
1b380 72 79 20 31 2c 20 31 36 30 31 20 28 3d 20 4a 44  ry 1, 1601 (= JD
1b390 20 32 33 30 35 38 31 33 2e 35 29 2e 20 0a 20 20   2305813.5). .  
1b3a0 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45 20 66 74  */.  FILETIME ft
1b3b0 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
1b3c0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 77   sqlite3_int64 w
1b3d0 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20  inFiletimeEpoch 
1b3e0 3d 20 32 33 30 35 38 31 33 35 2a 28 73 71 6c 69  = 23058135*(sqli
1b3f0 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
1b400 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
1b410 5f 54 45 53 54 0a 20 20 73 74 61 74 69 63 20 63  _TEST.  static c
1b420 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
1b430 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32  64 unixEpoch = 2
1b440 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33  4405875*(sqlite3
1b450 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a  _int64)8640000;.
1b460 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32 5e 33 32  #endif.  /* 2^32
1b470 20 2d 20 74 6f 20 61 76 6f 69 64 20 75 73 65 20   - to avoid use 
1b480 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72 6e 69 6e  of LL and warnin
1b490 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a 20 20 73  gs in gcc */.  s
1b4a0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
1b4b0 74 65 33 5f 69 6e 74 36 34 20 6d 61 78 33 32 42  te3_int64 max32B
1b4c0 69 74 56 61 6c 75 65 20 3d 20 0a 20 20 20 20 20  itValue = .     
1b4d0 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
1b4e0 32 30 30 30 30 30 30 30 30 30 20 2b 20 28 73 71  2000000000 + (sq
1b4f0 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30  lite3_int64)2000
1b500 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65  000000 + (sqlite
1b510 33 5f 69 6e 74 36 34 29 32 39 34 39 36 37 32 39  3_int64)29496729
1b520 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  6;..#if SQLITE_O
1b530 53 5f 57 49 4e 43 45 0a 20 20 53 59 53 54 45 4d  S_WINCE.  SYSTEM
1b540 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20 6f 73 47  TIME time;.  osG
1b550 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26 74 69  etSystemTime(&ti
1b560 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53 79 73  me);.  /* if Sys
1b570 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
1b580 65 28 29 20 66 61 69 6c 73 2c 20 69 74 20 72 65  e() fails, it re
1b590 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20  turns zero. */. 
1b5a0 20 69 66 20 28 21 6f 73 53 79 73 74 65 6d 54 69   if (!osSystemTi
1b5b0 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 26 74 69  meToFileTime(&ti
1b5c0 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20 20 72 65  me,&ft)){.    re
1b5d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1b5e0 52 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 6f  R;.  }.#else.  o
1b5f0 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73  sGetSystemTimeAs
1b600 46 69 6c 65 54 69 6d 65 28 20 26 66 74 20 29 3b  FileTime( &ft );
1b610 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69 4e 6f  .#endif..  *piNo
1b620 77 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d 65 45  w = winFiletimeE
1b630 70 6f 63 68 20 2b 0a 20 20 20 20 20 20 20 20 20  poch +.         
1b640 20 20 20 28 28 28 28 73 71 6c 69 74 65 33 5f 69     ((((sqlite3_i
1b650 6e 74 36 34 29 66 74 2e 64 77 48 69 67 68 44 61  nt64)ft.dwHighDa
1b660 74 65 54 69 6d 65 29 2a 6d 61 78 33 32 42 69 74  teTime)*max32Bit
1b670 56 61 6c 75 65 29 20 2b 20 0a 20 20 20 20 20 20  Value) + .      
1b680 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
1b690 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 4c 6f 77  3_int64)ft.dwLow
1b6a0 44 61 74 65 54 69 6d 65 29 2f 28 73 71 6c 69 74  DateTime)/(sqlit
1b6b0 65 33 5f 69 6e 74 36 34 29 31 30 30 30 30 3b 0a  e3_int64)10000;.
1b6c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1b6d0 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  EST.  if( sqlite
1b6e0 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29  3_current_time )
1b6f0 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31  {.    *piNow = 1
1b700 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
1b710 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65  64)sqlite3_curre
1b720 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70  nt_time + unixEp
1b730 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  och;.  }.#endif.
1b740 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1b750 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75  ER(pVfs);.  retu
1b760 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1b770 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
1b780 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
1b790 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
1b7a0 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
1b7b0 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72  rite the.** curr
1b7c0 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
1b7d0 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
1b7e0 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  y number into *p
1b7f0 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75  rNow and.** retu
1b800 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20  rn 0.  Return 1 
1b810 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
1b820 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66  date cannot be f
1b830 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
1b840 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69  int winCurrentTi
1b850 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  me(sqlite3_vfs *
1b860 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72  pVfs, double *pr
1b870 4e 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Now){.  int rc;.
1b880 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1b890 69 3b 0a 20 20 72 63 20 3d 20 77 69 6e 43 75 72  i;.  rc = winCur
1b8a0 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56  rentTimeInt64(pV
1b8b0 66 73 2c 20 26 69 29 3b 0a 20 20 69 66 28 20 21  fs, &i);.  if( !
1b8c0 72 63 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77  rc ){.    *prNow
1b8d0 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b   = i/86400000.0;
1b8e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1b8f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  ;.}../*.** The i
1b900 64 65 61 20 69 73 20 74 68 61 74 20 74 68 69 73  dea is that this
1b910 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20   function works 
1b920 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74 69  like a combinati
1b930 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74  on of.** GetLast
1b940 45 72 72 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d  Error() and Form
1b950 61 74 4d 65 73 73 61 67 65 28 29 20 6f 6e 20 57  atMessage() on W
1b960 69 6e 64 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f  indows (or errno
1b970 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72   and.** strerror
1b980 5f 72 28 29 20 6f 6e 20 55 6e 69 78 29 2e 20 41  _r() on Unix). A
1b990 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 69 73  fter an error is
1b9a0 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20   returned by an 
1b9b0 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20  OS.** function, 
1b9c0 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69  SQLite calls thi
1b9d0 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  s function with 
1b9e0 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f  zBuf pointing to
1b9f0 0a 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 66 20  .** a buffer of 
1ba00 6e 42 75 66 20 62 79 74 65 73 2e 20 54 68 65 20  nBuf bytes. The 
1ba10 4f 53 20 6c 61 79 65 72 20 73 68 6f 75 6c 64 20  OS layer should 
1ba20 70 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20  populate the.** 
1ba30 62 75 66 66 65 72 20 77 69 74 68 20 61 20 6e 75  buffer with a nu
1ba40 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46  l-terminated UTF
1ba50 2d 38 20 65 6e 63 6f 64 65 64 20 65 72 72 6f 72  -8 encoded error
1ba60 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64 65 73 63   message.** desc
1ba70 72 69 62 69 6e 67 20 74 68 65 20 6c 61 73 74 20  ribing the last 
1ba80 49 4f 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65  IO error to have
1ba90 20 6f 63 63 75 72 72 65 64 20 77 69 74 68 69 6e   occurred within
1baa0 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
1bab0 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  thread..**.** If
1bac0 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
1bad0 67 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  ge is too large 
1bae0 66 6f 72 20 74 68 65 20 73 75 70 70 6c 69 65 64  for the supplied
1baf0 20 62 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73   buffer,.** it s
1bb00 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74  hould be truncat
1bb10 65 64 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76  ed. The return v
1bb20 61 6c 75 65 20 6f 66 20 78 47 65 74 4c 61 73 74  alue of xGetLast
1bb30 45 72 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f  Error.** is zero
1bb40 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   if the error me
1bb50 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74 68  ssage fits in th
1bb60 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e  e buffer, or non
1bb70 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69  -zero.** otherwi
1bb80 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73 61  se (if the messa
1bb90 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  ge was truncated
1bba0 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69  ). If non-zero i
1bbb0 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74  s returned,.** t
1bbc0 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  hen it is not ne
1bbd0 63 65 73 73 61 72 79 20 74 6f 20 69 6e 63 6c 75  cessary to inclu
1bbe0 64 65 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69  de the nul-termi
1bbf0 6e 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a  nator character.
1bc00 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ** in the output
1bc10 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e   buffer..**.** N
1bc20 6f 74 20 73 75 70 70 6c 79 69 6e 67 20 61 6e 20  ot supplying an 
1bc30 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69  error message wi
1bc40 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64 76 65 72  ll have no adver
1bc50 73 65 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20  se effect.** on 
1bc60 53 51 4c 69 74 65 2e 20 49 74 20 69 73 20 66 69  SQLite. It is fi
1bc70 6e 65 20 74 6f 20 68 61 76 65 20 61 6e 20 69 6d  ne to have an im
1bc80 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61  plementation tha
1bc90 74 20 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75 72  t never.** retur
1bca0 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ns an error mess
1bcb0 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74  age:.**.**   int
1bcc0 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73   xGetLastError(s
1bcd0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1bce0 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
1bcf0 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20   *zBuf){.**     
1bd00 61 73 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d  assert(zBuf[0]==
1bd10 27 5c 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65  '\0');.**     re
1bd20 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a  turn 0;.**   }.*
1bd30 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 20 69 66 20  *.** However if 
1bd40 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
1bd50 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 69 74   is supplied, it
1bd60 20 77 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f   will be incorpo
1bd70 72 61 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69  rated.** by sqli
1bd80 74 65 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f  te into the erro
1bd90 72 20 6d 65 73 73 61 67 65 20 61 76 61 69 6c 61  r message availa
1bda0 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 20  ble to the user 
1bdb0 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  using.** sqlite3
1bdc0 5f 65 72 72 6d 73 67 28 29 2c 20 70 6f 73 73 69  _errmsg(), possi
1bdd0 62 6c 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72  bly making IO er
1bde0 72 6f 72 73 20 65 61 73 69 65 72 20 74 6f 20 64  rors easier to d
1bdf0 65 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ebug..*/.static 
1be00 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72  int winGetLastEr
1be10 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
1be20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
1be30 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
1be40 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1be50 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e  (pVfs);.  return
1be60 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67   getLastErrorMsg
1be70 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28  (osGetLastError(
1be80 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 29 3b 0a  ), nBuf, zBuf);.
1be90 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
1bea0 69 7a 65 20 61 6e 64 20 64 65 69 6e 69 74 69 61  ize and deinitia
1beb0 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74 69  lize the operati
1bec0 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66  ng system interf
1bed0 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ace..*/.int sqli
1bee0 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64  te3_os_init(void
1bef0 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  ){.  static sqli
1bf00 74 65 33 5f 76 66 73 20 77 69 6e 56 66 73 20 3d  te3_vfs winVfs =
1bf10 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20   {.    3,       
1bf20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
1bf30 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73  Version */.    s
1bf40 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20  izeof(winFile), 
1bf50 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20      /* szOsFile 
1bf60 2a 2f 0a 20 20 20 20 4d 41 58 5f 50 41 54 48 2c  */.    MAX_PATH,
1bf70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6d              /* m
1bf80 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  xPathname */.   
1bf90 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
1bfa0 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a        /* pNext *
1bfb0 2f 0a 20 20 20 20 22 77 69 6e 33 32 22 2c 20 20  /.    "win32",  
1bfc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e             /* zN
1bfd0 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ame */.    0,   
1bfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bff0 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20  /* pAppData */. 
1c000 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20     winOpen,     
1c010 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
1c020 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74   */.    winDelet
1c030 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
1c040 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77  xDelete */.    w
1c050 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20 20  inAccess,       
1c060 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a      /* xAccess *
1c070 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74  /.    winFullPat
1c080 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46  hname,     /* xF
1c090 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  ullPathname */. 
1c0a0 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20     winDlOpen,   
1c0b0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70          /* xDlOp
1c0c0 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45  en */.    winDlE
1c0d0 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f  rror,          /
1c0e0 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20  * xDlError */.  
1c0f0 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20    winDlSym,     
1c100 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d         /* xDlSym
1c110 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f   */.    winDlClo
1c120 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
1c130 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20  xDlClose */.    
1c140 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20  winRandomness,  
1c150 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e       /* xRandomn
1c160 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c  ess */.    winSl
1c170 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eep,            
1c180 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20  /* xSleep */.   
1c190 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c   winCurrentTime,
1c1a0 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e        /* xCurren
1c1b0 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e  tTime */.    win
1c1c0 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20  GetLastError,   
1c1d0 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72    /* xGetLastErr
1c1e0 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  or */.    winCur
1c1f0 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f  rentTimeInt64, /
1c200 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  * xCurrentTimeIn
1c210 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65  t64 */.    winSe
1c220 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
1c230 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c  /* xSetSystemCal
1c240 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53  l */.    winGetS
1c250 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a  ystemCall,    /*
1c260 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xGetSystemCall 
1c270 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79  */.    winNextSy
1c280 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78  stemCall,   /* x
1c290 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  NextSystemCall *
1c2a0 2f 0a 20 20 7d 3b 0a 0a 20 20 2f 2a 20 44 6f 75  /.  };..  /* Dou
1c2b0 62 6c 65 2d 63 68 65 63 6b 20 74 68 61 74 20 74  ble-check that t
1c2c0 68 65 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72  he aSyscall[] ar
1c2d0 72 61 79 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  ray has been con
1c2e0 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f  structed.  ** co
1c2f0 72 72 65 63 74 6c 79 2e 20 20 53 65 65 20 74 69  rrectly.  See ti
1c300 63 6b 65 74 20 5b 62 62 33 61 38 36 65 38 39 30  cket [bb3a86e890
1c310 63 38 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73  c8e96ab] */.  as
1c320 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28  sert( ArraySize(
1c330 61 53 79 73 63 61 6c 6c 29 3d 3d 36 30 20 29 3b  aSyscall)==60 );
1c340 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
1c350 57 49 4e 52 54 0a 20 20 73 6c 65 65 70 4f 62 6a  WINRT.  sleepObj
1c360 20 3d 20 43 72 65 61 74 65 45 76 65 6e 74 45 78   = CreateEventEx
1c370 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 43 52 45  (NULL, NULL, CRE
1c380 41 54 45 5f 45 56 45 4e 54 5f 4d 41 4e 55 41 4c  ATE_EVENT_MANUAL
1c390 5f 52 45 53 45 54 2c 20 0a 20 20 20 20 20 20 20  _RESET, .       
1c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3b0 20 20 20 20 20 20 20 20 20 20 20 45 56 45 4e 54             EVENT
1c3c0 5f 41 4c 4c 5f 41 43 43 45 53 53 29 3b 0a 23 65  _ALL_ACCESS);.#e
1c3d0 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
1c3e0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
1c3f0 2f 2a 20 67 65 74 20 6d 65 6d 6f 72 79 20 6d 61  /* get memory ma
1c400 70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 67 72 61  p allocation gra
1c410 6e 75 6c 61 72 69 74 79 20 2a 2f 0a 20 20 6d 65  nularity */.  me
1c420 6d 73 65 74 28 26 77 69 6e 53 79 73 49 6e 66 6f  mset(&winSysInfo
1c430 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 59 53 54  , 0, sizeof(SYST
1c440 45 4d 5f 49 4e 46 4f 29 29 3b 0a 20 20 6f 73 47  EM_INFO));.  osG
1c450 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69  etSystemInfo(&wi
1c460 6e 53 79 73 49 6e 66 6f 29 3b 0a 20 20 61 73 73  nSysInfo);.  ass
1c470 65 72 74 28 77 69 6e 53 79 73 49 6e 66 6f 2e 64  ert(winSysInfo.d
1c480 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75  wAllocationGranu
1c490 6c 61 72 69 74 79 20 3e 20 30 29 3b 0a 23 65 6e  larity > 0);.#en
1c4a0 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76  dif..  sqlite3_v
1c4b0 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e  fs_register(&win
1c4c0 56 66 73 2c 20 31 29 3b 0a 20 20 72 65 74 75 72  Vfs, 1);.  retur
1c4d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a  n SQLITE_OK; .}.
1c4e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
1c4f0 65 6e 64 28 76 6f 69 64 29 7b 20 0a 23 69 66 20  end(void){ .#if 
1c500 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
1c510 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c    CloseHandle(sl
1c520 65 65 70 4f 62 6a 29 3b 0a 23 65 6e 64 69 66 0a  eepObj);.#endif.
1c530 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c540 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
1c550 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 2a   SQLITE_OS_WIN *
1c560 2f 0a                                            /.