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

Artifact f1057db64d481dffb15776147b06b15f4f8d7b87:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59   */..#ifdef __CY
0220: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0230: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0240: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
0250: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
0260: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
0270: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
0280: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
0290: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 53  mmon.h"../*.** S
02a0: 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f  ome Microsoft co
02b0: 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69  mpilers lack thi
02c0: 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f  s definition..*/
02d0: 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44  .#ifndef INVALID
02e0: 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
02f0: 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49  .# define INVALI
0300: 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
0310: 53 20 28 28 44 57 4f 52 44 29 2d 31 29 20 0a 23  S ((DWORD)-1) .#
0320: 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72  endif../* Forwar
0330: 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a  d references */.
0340: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
0350: 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20 20 20  inShm winShm;   
0360: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6e          /* A con
0370: 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65  nection to share
0380: 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65  d-memory */.type
0390: 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 53 68  def struct winSh
03a0: 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f 64 65  mNode winShmNode
03b0: 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f 6e 20  ;   /* A region 
03c0: 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
03d0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 43 45   */../*.** WinCE
03e0: 20 6c 61 63 6b 73 20 6e 61 74 69 76 65 20 73 75   lacks native su
03f0: 70 70 6f 72 74 20 66 6f 72 20 66 69 6c 65 20 6c  pport for file l
0400: 6f 63 6b 69 6e 67 20 73 6f 20 77 65 20 68 61 76  ocking so we hav
0410: 65 20 74 6f 20 66 61 6b 65 20 69 74 0a 2a 2a 20  e to fake it.** 
0420: 77 69 74 68 20 73 6f 6d 65 20 63 6f 64 65 20 6f  with some code o
0430: 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a 23 69  f our own..*/.#i
0440: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
0450: 45 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  E.typedef struct
0460: 20 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20 20 69   winceLock {.  i
0470: 6e 74 20 6e 52 65 61 64 65 72 73 3b 20 20 20 20  nt nReaders;    
0480: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0490: 72 65 61 64 65 72 20 6c 6f 63 6b 73 20 6f 62 74  reader locks obt
04a0: 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ained */.  BOOL 
04b0: 62 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 2f  bPending;      /
04c0: 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20 70 65  * Indicates a pe
04d0: 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62  nding lock has b
04e0: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a  een obtained */.
04f0: 20 20 42 4f 4f 4c 20 62 52 65 73 65 72 76 65 64    BOOL bReserved
0500: 3b 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74  ;     /* Indicat
0510: 65 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  es a reserved lo
0520: 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61  ck has been obta
0530: 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  ined */.  BOOL b
0540: 45 78 63 6c 75 73 69 76 65 3b 20 20 20 20 2f 2a  Exclusive;    /*
0550: 20 49 6e 64 69 63 61 74 65 73 20 61 6e 20 65 78   Indicates an ex
0560: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 68 61 73  clusive lock has
0570: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a   been obtained *
0580: 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b 0a 23  /.} winceLock;.#
0590: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
05a0: 20 77 69 6e 46 69 6c 65 20 73 74 72 75 63 74 75   winFile structu
05b0: 72 65 20 69 73 20 61 20 73 75 62 63 6c 61 73 73  re is a subclass
05c0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   of sqlite3_file
05d0: 2a 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68  * specific to th
05e0: 65 20 77 69 6e 33 32 0a 2a 2a 20 70 6f 72 74 61  e win32.** porta
05f0: 62 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a 2f  bility layer..*/
0600: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0610: 77 69 6e 46 69 6c 65 20 77 69 6e 46 69 6c 65 3b  winFile winFile;
0620: 0a 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20  .struct winFile 
0630: 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  {.  const sqlite
0640: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d  3_io_methods *pM
0650: 65 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75 73 74  ethod; /*** Must
0660: 20 62 65 20 66 69 72 73 74 20 2a 2a 2a 2f 0a 20   be first ***/. 
0670: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
0680: 66 73 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  fs;      /* The 
0690: 56 46 53 20 75 73 65 64 20 74 6f 20 6f 70 65 6e  VFS used to open
06a0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
06b0: 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20 20  HANDLE h;       
06c0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
06d0: 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20  e for accessing 
06e0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  the file */.  u8
06f0: 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20   locktype;      
0700: 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
0710: 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79 20   lock currently 
0720: 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 69 6c  held on this fil
0730: 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73 68 61  e */.  short sha
0740: 72 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20 20 2f  redLockByte;   /
0750: 2a 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f 73 65  * Randomly chose
0760: 6e 20 62 79 74 65 20 75 73 65 64 20 61 73 20 61  n byte used as a
0770: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a   shared lock */.
0780: 20 20 75 38 20 63 74 72 6c 46 6c 61 67 73 3b 20    u8 ctrlFlags; 
0790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
07a0: 67 73 2e 20 20 53 65 65 20 57 49 4e 46 49 4c 45  gs.  See WINFILE
07b0: 5f 2a 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 44 57  _* below */.  DW
07c0: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  ORD lastErrno;  
07d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e        /* The Win
07e0: 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20  dows errno from 
07f0: 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72  the last I/O err
0800: 6f 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  or */.  winShm *
0810: 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pShm;           
0820: 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20 73  /* Instance of s
0830: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e 20  hared memory on 
0840: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 63  this file */.  c
0850: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
0860: 3b 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70  ;      /* Full p
0870: 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 69 73 20  athname of this 
0880: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  file */.  int sz
0890: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
08a0: 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65 20    /* Chunk size 
08b0: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46 43  configured by FC
08c0: 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2a  NTL_CHUNK_SIZE *
08d0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
08e0: 57 49 4e 43 45 0a 20 20 4c 50 57 53 54 52 20 7a  WINCE.  LPWSTR z
08f0: 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20 20  DeleteOnClose;  
0900: 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
0910: 74 6f 20 64 65 6c 65 74 65 20 77 68 65 6e 20 63  to delete when c
0920: 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e 44  losing */.  HAND
0930: 4c 45 20 68 4d 75 74 65 78 3b 20 20 20 20 20 20  LE hMutex;      
0940: 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 75 73 65      /* Mutex use
0950: 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63  d to control acc
0960: 65 73 73 20 74 6f 20 73 68 61 72 65 64 20 6c 6f  ess to shared lo
0970: 63 6b 20 2a 2f 20 20 0a 20 20 48 41 4e 44 4c 45  ck */  .  HANDLE
0980: 20 68 53 68 61 72 65 64 3b 20 20 20 20 20 20 20   hShared;       
0990: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
09a0: 72 79 20 73 65 67 6d 65 6e 74 20 75 73 65 64 20  ry segment used 
09b0: 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20  for locking */. 
09c0: 20 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c   winceLock local
09d0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b  ;        /* Lock
09e0: 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68  s obtained by th
09f0: 69 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 77  is instance of w
0a00: 69 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 63  inFile */.  winc
0a10: 65 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20 20  eLock *shared;  
0a20: 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 68      /* Global sh
0a30: 61 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79  ared lock memory
0a40: 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 20 2a   for the file  *
0a50: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
0a60: 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  ** Allowed value
0a70: 73 20 66 6f 72 20 77 69 6e 46 69 6c 65 2e 63 74  s for winFile.ct
0a80: 72 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69  rlFlags.*/.#defi
0a90: 6e 65 20 57 49 4e 46 49 4c 45 5f 50 45 52 53 49  ne WINFILE_PERSI
0aa0: 53 54 5f 57 41 4c 20 20 20 20 20 30 78 30 34 20  ST_WAL     0x04 
0ab0: 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74 20    /* Persistent 
0ac0: 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 64 65 66  WAL mode */.#def
0ad0: 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57  ine WINFILE_PSOW
0ae0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31 30              0x10
0af0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43     /* SQLITE_IOC
0b00: 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
0b10: 52 57 52 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 20 2a  RWRITE */../*. *
0b20: 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   If compiled wit
0b30: 68 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  h SQLITE_WIN32_M
0b40: 41 4c 4c 4f 43 20 6f 6e 20 57 69 6e 64 6f 77 73  ALLOC on Windows
0b50: 2c 20 77 65 20 77 69 6c 6c 20 75 73 65 20 74 68  , we will use th
0b60: 65 0a 20 2a 20 76 61 72 69 6f 75 73 20 57 69 6e  e. * various Win
0b70: 33 32 20 41 50 49 20 68 65 61 70 20 66 75 6e 63  32 API heap func
0b80: 74 69 6f 6e 73 20 69 6e 73 74 65 61 64 20 6f 66  tions instead of
0b90: 20 6f 75 72 20 6f 77 6e 2e 0a 20 2a 2f 0a 23 69   our own.. */.#i
0ba0: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
0bb0: 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 20 2a 20 54  2_MALLOC./*. * T
0bc0: 68 65 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20  he initial size 
0bd0: 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  of the Win32-spe
0be0: 63 69 66 69 63 20 68 65 61 70 2e 20 20 54 68 69  cific heap.  Thi
0bf0: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  s value may be z
0c00: 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ero.. */.#ifndef
0c10: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
0c20: 41 50 5f 49 4e 49 54 5f 53 49 5a 45 0a 23 20 20  AP_INIT_SIZE.#  
0c30: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
0c40: 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49  N32_HEAP_INIT_SI
0c50: 5a 45 20 28 28 53 51 4c 49 54 45 5f 44 45 46 41  ZE ((SQLITE_DEFA
0c60: 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 20  ULT_CACHE_SIZE) 
0c70: 2a 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  * \.            
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c90: 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49             (SQLI
0ca0: 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
0cb0: 53 49 5a 45 29 20 2b 20 34 31 39 34 33 30 34 29  SIZE) + 4194304)
0cc0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
0cd0: 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20  he maximum size 
0ce0: 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  of the Win32-spe
0cf0: 63 69 66 69 63 20 68 65 61 70 2e 20 20 54 68 69  cific heap.  Thi
0d00: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  s value may be z
0d10: 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ero.. */.#ifndef
0d20: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
0d30: 41 50 5f 4d 41 58 5f 53 49 5a 45 0a 23 20 20 64  AP_MAX_SIZE.#  d
0d40: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
0d50: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45  32_HEAP_MAX_SIZE
0d60: 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a    (0).#endif../*
0d70: 0a 20 2a 20 54 68 65 20 65 78 74 72 61 20 66 6c  . * The extra fl
0d80: 61 67 73 20 74 6f 20 75 73 65 20 69 6e 20 63 61  ags to use in ca
0d90: 6c 6c 73 20 74 6f 20 74 68 65 20 57 69 6e 33 32  lls to the Win32
0da0: 20 68 65 61 70 20 41 50 49 73 2e 20 20 54 68 69   heap APIs.  Thi
0db0: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 0a 20  s value may be. 
0dc0: 2a 20 7a 65 72 6f 20 66 6f 72 20 74 68 65 20 64  * zero for the d
0dd0: 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f 72 2e  efault behavior.
0de0: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
0df0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
0e00: 4c 41 47 53 0a 23 20 20 64 65 66 69 6e 65 20 53  LAGS.#  define S
0e10: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
0e20: 5f 46 4c 41 47 53 20 20 20 20 20 28 30 29 0a 23  _FLAGS     (0).#
0e30: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
0e40: 20 77 69 6e 4d 65 6d 44 61 74 61 20 73 74 72 75   winMemData stru
0e50: 63 74 75 72 65 20 73 74 6f 72 65 73 20 69 6e 66  cture stores inf
0e60: 6f 72 6d 61 74 69 6f 6e 20 72 65 71 75 69 72 65  ormation require
0e70: 64 20 62 79 20 74 68 65 20 57 69 6e 33 32 2d 73  d by the Win32-s
0e80: 70 65 63 69 66 69 63 0a 2a 2a 20 73 71 6c 69 74  pecific.** sqlit
0e90: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 69  e3_mem_methods i
0ea0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a  mplementation..*
0eb0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0ec0: 20 77 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 4d   winMemData winM
0ed0: 65 6d 44 61 74 61 3b 0a 73 74 72 75 63 74 20 77  emData;.struct w
0ee0: 69 6e 4d 65 6d 44 61 74 61 20 7b 0a 23 69 66 6e  inMemData {.#ifn
0ef0: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 75 33 32  def NDEBUG.  u32
0f00: 20 6d 61 67 69 63 3b 20 20 20 20 2f 2a 20 4d 61   magic;    /* Ma
0f10: 67 69 63 20 6e 75 6d 62 65 72 20 74 6f 20 64 65  gic number to de
0f20: 74 65 63 74 20 73 74 72 75 63 74 75 72 65 20 63  tect structure c
0f30: 6f 72 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65  orruption. */.#e
0f40: 6e 64 69 66 0a 20 20 48 41 4e 44 4c 45 20 68 48  ndif.  HANDLE hH
0f50: 65 61 70 3b 20 2f 2a 20 54 68 65 20 68 61 6e 64  eap; /* The hand
0f60: 6c 65 20 74 6f 20 6f 75 72 20 68 65 61 70 2e 20  le to our heap. 
0f70: 2a 2f 0a 20 20 42 4f 4f 4c 20 62 4f 77 6e 65 64  */.  BOOL bOwned
0f80: 3b 20 20 2f 2a 20 44 6f 20 77 65 20 6f 77 6e 20  ;  /* Do we own 
0f90: 74 68 65 20 68 65 61 70 20 28 69 2e 65 2e 20 64  the heap (i.e. d
0fa0: 65 73 74 72 6f 79 20 69 74 20 6f 6e 20 73 68 75  estroy it on shu
0fb0: 74 64 6f 77 6e 29 3f 20 2a 2f 0a 7d 3b 0a 0a 23  tdown)? */.};..#
0fc0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64  ifndef NDEBUG.#d
0fd0: 65 66 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47  efine WINMEM_MAG
0fe0: 49 43 20 20 20 20 20 30 78 34 32 62 32 38 33 30  IC     0x42b2830
0ff0: 62 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63  b.#endif..static
1000: 20 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61   struct winMemDa
1010: 74 61 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 20  ta win_mem_data 
1020: 3d 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  = {.#ifndef NDEB
1030: 55 47 0a 20 20 57 49 4e 4d 45 4d 5f 4d 41 47 49  UG.  WINMEM_MAGI
1040: 43 2c 0a 23 65 6e 64 69 66 0a 20 20 4e 55 4c 4c  C,.#endif.  NULL
1050: 2c 20 46 41 4c 53 45 0a 7d 3b 0a 0a 23 69 66 6e  , FALSE.};..#ifn
1060: 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66 69  def NDEBUG.#defi
1070: 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  ne winMemAssertM
1080: 61 67 69 63 28 29 20 61 73 73 65 72 74 28 20 77  agic() assert( w
1090: 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69  in_mem_data.magi
10a0: 63 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20  c==WINMEM_MAGIC 
10b0: 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ).#else.#define 
10c0: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
10d0: 63 28 29 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66  c().#endif..#def
10e0: 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  ine winMemGetHea
10f0: 70 28 29 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61  p() win_mem_data
1100: 2e 68 48 65 61 70 0a 0a 73 74 61 74 69 63 20 76  .hHeap..static v
1110: 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f  oid *winMemMallo
1120: 63 28 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73  c(int nBytes);.s
1130: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65  tatic void winMe
1140: 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69  mFree(void *pPri
1150: 6f 72 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  or);.static void
1160: 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28   *winMemRealloc(
1170: 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e  void *pPrior, in
1180: 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69  t nBytes);.stati
1190: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65  c int winMemSize
11a0: 28 76 6f 69 64 20 2a 70 29 3b 0a 73 74 61 74 69  (void *p);.stati
11b0: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e  c int winMemRoun
11c0: 64 75 70 28 69 6e 74 20 6e 29 3b 0a 73 74 61 74  dup(int n);.stat
11d0: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69  ic int winMemIni
11e0: 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  t(void *pAppData
11f0: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  );.static void w
1200: 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f  inMemShutdown(vo
1210: 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 0a  id *pAppData);..
1220: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65  const sqlite3_me
1230: 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74  m_methods *sqlit
1240: 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f  e3MemGetWin32(vo
1250: 69 64 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  id);.#endif /* S
1260: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
1270: 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OC */../*.** The
1280: 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
1290: 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c 79  ble is (normally
12a0: 29 20 73 65 74 20 6f 6e 63 65 20 61 6e 64 20 6e  ) set once and n
12b0: 65 76 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a 20  ever changes.** 
12c0: 74 68 65 72 65 61 66 74 65 72 2e 20 20 49 74 20  thereafter.  It 
12d0: 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72 20  records whether 
12e0: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
12f0: 73 74 65 6d 20 69 73 20 57 69 6e 39 78 0a 2a 2a  stem is Win9x.**
1300: 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a   or WinNT..**.**
1310: 20 30 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20   0:   Operating 
1320: 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a  system unknown..
1330: 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61 74 69 6e  ** 1:   Operatin
1340: 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39  g system is Win9
1350: 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72 61  x..** 2:   Opera
1360: 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57  ting system is W
1370: 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  inNT..**.** In o
1380: 72 64 65 72 20 74 6f 20 66 61 63 69 6c 69 74 61  rder to facilita
1390: 74 65 20 74 65 73 74 69 6e 67 20 6f 6e 20 61 20  te testing on a 
13a0: 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74 68  WinNT system, th
13b0: 65 20 74 65 73 74 20 66 69 78 74 75 72 65 0a 2a  e test fixture.*
13c0: 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20 73  * can manually s
13d0: 65 74 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f  et this value to
13e0: 20 31 20 74 6f 20 65 6d 75 6c 61 74 65 20 57 69   1 to emulate Wi
13f0: 6e 39 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  n98 behavior..*/
1400: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1410: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
1420: 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6c  os_type = 0;.#el
1430: 73 65 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  se.static int sq
1440: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20  lite3_os_type = 
1450: 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
1460: 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61 6c   Many system cal
1470: 6c 73 20 61 72 65 20 61 63 63 65 73 73 65 64 20  ls are accessed 
1480: 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d  through pointer-
1490: 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20  to-functions so 
14a0: 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79  that.** they may
14b0: 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 61   be overridden a
14c0: 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61 63  t runtime to fac
14d0: 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69 6e  ilitate fault in
14e0: 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a  jection during.*
14f0: 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73 61  * testing and sa
1500: 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20 66  ndboxing.  The f
1510: 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68  ollowing array h
1520: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20 61  olds the names a
1530: 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74  nd pointers.** t
1540: 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61 62  o all overrideab
1550: 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e  le system calls.
1560: 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  .*/.#if !SQLITE_
1570: 4f 53 5f 57 49 4e 43 45 0a 23 20 20 64 65 66 69  OS_WINCE.#  defi
1580: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
1590: 48 41 53 5f 41 4e 53 49 0a 23 65 6e 64 69 66 0a  HAS_ANSI.#endif.
15a0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
15b0: 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  INCE || SQLITE_O
15c0: 53 5f 57 49 4e 4e 54 0a 23 20 20 64 65 66 69 6e  S_WINNT.#  defin
15d0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e SQLITE_WIN32_H
15e0: 41 53 5f 57 49 44 45 0a 23 65 6e 64 69 66 0a 0a  AS_WIDE.#endif..
15f0: 23 69 66 6e 64 65 66 20 53 59 53 43 41 4c 4c 0a  #ifndef SYSCALL.
1600: 23 20 20 64 65 66 69 6e 65 20 53 59 53 43 41 4c  #  define SYSCAL
1610: 4c 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c  L sqlite3_syscal
1620: 6c 5f 70 74 72 0a 23 65 6e 64 69 66 0a 0a 23 69  l_ptr.#endif..#i
1630: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
1640: 45 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 6d 61  E./*.** These ma
1650: 63 72 6f 73 20 61 72 65 20 6e 65 63 65 73 73 61  cros are necessa
1660: 72 79 20 62 65 63 61 75 73 65 20 57 69 6e 64 6f  ry because Windo
1670: 77 73 20 43 45 20 64 6f 65 73 20 6e 6f 74 20 6e  ws CE does not n
1680: 61 74 69 76 65 6c 79 20 73 75 70 70 6f 72 74 20  atively support 
1690: 74 68 65 0a 2a 2a 20 57 69 6e 33 32 20 41 50 49  the.** Win32 API
16a0: 73 20 4c 6f 63 6b 46 69 6c 65 2c 20 55 6e 6c 6f  s LockFile, Unlo
16b0: 63 6b 46 69 6c 65 2c 20 61 6e 64 20 4c 6f 63 6b  ckFile, and Lock
16c0: 46 69 6c 65 45 78 2e 0a 20 2a 2f 0a 0a 23 20 20  FileEx.. */..#  
16d0: 64 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 28  define LockFile(
16e0: 61 2c 62 2c 63 2c 64 2c 65 29 20 20 20 20 20 20  a,b,c,d,e)      
16f0: 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26   winceLockFile(&
1700: 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23  a, b, c, d, e).#
1710: 20 20 64 65 66 69 6e 65 20 55 6e 6c 6f 63 6b 46    define UnlockF
1720: 69 6c 65 28 61 2c 62 2c 63 2c 64 2c 65 29 20 20  ile(a,b,c,d,e)  
1730: 20 20 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69     winceUnlockFi
1740: 6c 65 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20  le(&a, b, c, d, 
1750: 65 29 0a 23 20 20 64 65 66 69 6e 65 20 4c 6f 63  e).#  define Loc
1760: 6b 46 69 6c 65 45 78 28 61 2c 62 2c 63 2c 64 2c  kFileEx(a,b,c,d,
1770: 65 2c 66 29 20 20 20 77 69 6e 63 65 4c 6f 63 6b  e,f)   winceLock
1780: 46 69 6c 65 45 78 28 26 61 2c 20 62 2c 20 63 2c  FileEx(&a, b, c,
1790: 20 64 2c 20 65 2c 20 66 29 0a 0a 2f 2a 0a 2a 2a   d, e, f)../*.**
17a0: 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20 73   These are the s
17b0: 70 65 63 69 61 6c 20 73 79 73 63 61 6c 6c 20 68  pecial syscall h
17c0: 61 63 6b 73 20 66 6f 72 20 57 69 6e 64 6f 77 73  acks for Windows
17d0: 20 43 45 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e   CE.  The lockin
17e0: 67 20 72 65 6c 61 74 65 64 0a 2a 2a 20 64 65 66  g related.** def
17f0: 69 6e 65 73 20 68 65 72 65 20 72 65 66 65 72 20  ines here refer 
1800: 74 6f 20 74 68 65 20 6d 61 63 72 6f 73 20 64 65  to the macros de
1810: 66 69 6e 65 64 20 6a 75 73 74 20 61 62 6f 76 65  fined just above
1820: 2e 0a 20 2a 2f 0a 0a 23 20 20 64 65 66 69 6e 65  .. */..#  define
1830: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
1840: 53 49 28 29 20 20 20 20 20 20 20 31 0a 23 20 20  SI()       1.#  
1850: 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c  define osLockFil
1860: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1870: 20 4c 6f 63 6b 46 69 6c 65 0a 23 20 20 64 65 66   LockFile.#  def
1880: 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65  ine osUnlockFile
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55 6e                Un
18a0: 6c 6f 63 6b 46 69 6c 65 0a 23 20 20 64 65 66 69  lockFile.#  defi
18b0: 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20  ne osLockFileEx 
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 6f 63               Loc
18d0: 6b 46 69 6c 65 45 78 0a 23 65 6e 64 69 66 0a 0a  kFileEx.#endif..
18e0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69  static struct wi
18f0: 6e 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f  n_syscall {.  co
1900: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
1910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1920: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 74 65 6d  ame of the sytem
1930: 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74   call */.  sqlit
1940: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70  e3_syscall_ptr p
1950: 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72  Current; /* Curr
1960: 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65  ent value of the
1970: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a   system call */.
1980: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
1990: 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b 20  l_ptr pDefault; 
19a0: 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65  /* Default value
19b0: 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d   */.} aSyscall[]
19c0: 20 3d 20 7b 0a 23 69 66 20 21 53 51 4c 49 54 45   = {.#if !SQLITE
19d0: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 41  _OS_WINCE.  { "A
19e0: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c  reFileApisANSI",
19f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
1a00: 4c 29 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  L)AreFileApisANS
1a10: 49 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  I,         0 },.
1a20: 0a 23 64 65 66 69 6e 65 20 6f 73 41 72 65 46 69  .#define osAreFi
1a30: 6c 65 41 70 69 73 41 4e 53 49 20 28 28 42 4f 4f  leApisANSI ((BOO
1a40: 4c 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  L(WINAPI*)(VOID)
1a50: 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75  )aSyscall[0].pCu
1a60: 72 72 65 6e 74 29 0a 23 65 6c 73 65 0a 20 20 7b  rrent).#else.  {
1a70: 20 22 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53   "AreFileApisANS
1a80: 49 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  I",         (SYS
1a90: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
1ab0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53  },.#endif..#if S
1ac0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
1ad0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
1ae0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
1af0: 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57  .  { "CharLowerW
1b00: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
1b10: 28 53 59 53 43 41 4c 4c 29 43 68 61 72 4c 6f 77  (SYSCALL)CharLow
1b20: 65 72 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  erW,            
1b30: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
1b40: 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20   "CharLowerW",  
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
1b60: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
1b80: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
1b90: 6e 65 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 20  ne osCharLowerW 
1ba0: 28 28 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a  ((LPWSTR(WINAPI*
1bb0: 29 28 4c 50 57 53 54 52 29 29 61 53 79 73 63 61  )(LPWSTR))aSysca
1bc0: 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[1].pCurrent).
1bd0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1be0: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
1bf0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
1c00: 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72  _WIDE).  { "Char
1c10: 55 70 70 65 72 57 22 2c 20 20 20 20 20 20 20 20  UpperW",        
1c20: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
1c30: 68 61 72 55 70 70 65 72 57 2c 20 20 20 20 20 20  harUpperW,      
1c40: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
1c50: 73 65 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65  se.  { "CharUppe
1c60: 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rW",            
1c70: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c90: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
1ca0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72 55  .#define osCharU
1cb0: 70 70 65 72 57 20 28 28 4c 50 57 53 54 52 28 57  pperW ((LPWSTR(W
1cc0: 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29  INAPI*)(LPWSTR))
1cd0: 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72  aSyscall[2].pCur
1ce0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 43 6c 6f 73  rent)..  { "Clos
1cf0: 65 48 61 6e 64 6c 65 22 2c 20 20 20 20 20 20 20  eHandle",       
1d00: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
1d10: 6c 6f 73 65 48 61 6e 64 6c 65 2c 20 20 20 20 20  loseHandle,     
1d20: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
1d30: 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 48 61 6e  efine osCloseHan
1d40: 64 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  dle ((BOOL(WINAP
1d50: 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73  I*)(HANDLE))aSys
1d60: 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74  call[3].pCurrent
1d70: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
1d80: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1d90: 41 4e 53 49 29 0a 20 20 7b 20 22 43 72 65 61 74  ANSI).  { "Creat
1da0: 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20  eFileA",        
1db0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
1dc0: 65 61 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20  eateFileA,      
1dd0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
1de0: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
1df0: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eA",            
1e00: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e20: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
1e30: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
1e40: 46 69 6c 65 41 20 28 28 48 41 4e 44 4c 45 28 57  FileA ((HANDLE(W
1e50: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44  INAPI*)(LPCSTR,D
1e60: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
1e70: 20 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59        LPSECURITY
1e80: 5f 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52  _ATTRIBUTES,DWOR
1e90: 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29  D,DWORD,HANDLE))
1ea0: 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72  aSyscall[4].pCur
1eb0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
1ec0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
1ed0: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43  HAS_WIDE).  { "C
1ee0: 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20  reateFileW",    
1ef0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
1f00: 4c 29 43 72 65 61 74 65 46 69 6c 65 57 2c 20 20  L)CreateFileW,  
1f10: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
1f20: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74  #else.  { "Creat
1f30: 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20  eFileW",        
1f40: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f60: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
1f70: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72  if..#define osCr
1f80: 65 61 74 65 46 69 6c 65 57 20 28 28 48 41 4e 44  eateFileW ((HAND
1f90: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  LE(WINAPI*)(LPCW
1fa0: 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  STR,DWORD,DWORD,
1fb0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43   \.        LPSEC
1fc0: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
1fd0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e  ,DWORD,DWORD,HAN
1fe0: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d  DLE))aSyscall[5]
1ff0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
2000: 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  "CreateFileMappi
2010: 6e 67 22 2c 20 20 20 20 20 20 20 28 53 59 53 43  ng",       (SYSC
2020: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61  ALL)CreateFileMa
2030: 70 70 69 6e 67 2c 20 20 20 20 20 20 20 30 20 7d  pping,       0 }
2040: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  ,..#define osCre
2050: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 20 28  ateFileMapping (
2060: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
2070: 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49  (HANDLE,LPSECURI
2080: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c  TY_ATTRIBUTES, \
2090: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44  .        DWORD,D
20a0: 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 54 53  WORD,DWORD,LPCTS
20b0: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e  TR))aSyscall[6].
20c0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
20d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
20e0: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
20f0: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70  { "CreateFileMap
2100: 70 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59  pingW",      (SY
2110: 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65  SCALL)CreateFile
2120: 4d 61 70 70 69 6e 67 57 2c 20 20 20 20 20 20 30  MappingW,      0
2130: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
2140: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
2150: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
2160: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
2170: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2180: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
2190: 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
21a0: 69 6e 67 57 20 28 28 48 41 4e 44 4c 45 28 57 49  ingW ((HANDLE(WI
21b0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
21c0: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
21d0: 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  TES, \.        D
21e0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
21f0: 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  ,LPCWSTR))aSysca
2200: 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[7].pCurrent).
2210: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
2220: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
2230: 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65 4d  DE).  { "CreateM
2240: 75 74 65 78 57 22 2c 20 20 20 20 20 20 20 20 20  utexW",         
2250: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
2260: 74 65 4d 75 74 65 78 57 2c 20 20 20 20 20 20 20  teMutexW,       
2270: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
2280: 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78    { "CreateMutex
2290: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
22a0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
22d0: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 4d 75  efine osCreateMu
22e0: 74 65 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49  texW ((HANDLE(WI
22f0: 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54  NAPI*)(LPSECURIT
2300: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 42 4f 4f  Y_ATTRIBUTES,BOO
2310: 4c 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  L, \.        LPC
2320: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 38  WSTR))aSyscall[8
2330: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
2340: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2350: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
2360: 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41    { "DeleteFileA
2370: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
2380: 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69  SYSCALL)DeleteFi
2390: 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20 20 20  leA,            
23a0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
23b0: 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20  "DeleteFileA",  
23c0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
23d0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
23f0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
2400: 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41 20  e osDeleteFileA 
2410: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
2420: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
2430: 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [9].pCurrent)..#
2440: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
2450: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
2460: 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c  ).  { "DeleteFil
2470: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eW",            
2480: 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65   (SYSCALL)Delete
2490: 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20  FileW,          
24a0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
24b0: 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c  { "DeleteFileW",
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
24d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
24f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
2500: 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65  ine osDeleteFile
2510: 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  W ((BOOL(WINAPI*
2520: 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63  )(LPCWSTR))aSysc
2530: 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74  all[10].pCurrent
2540: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
2550: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65  _WINCE.  { "File
2560: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
2570: 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 46  ime", (SYSCALL)F
2580: 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69  ileTimeToLocalFi
2590: 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c  leTime, 0 },.#el
25a0: 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65  se.  { "FileTime
25b0: 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22  ToLocalFileTime"
25c0: 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20  , (SYSCALL)0,   
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
25f0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54  .#define osFileT
2600: 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69  imeToLocalFileTi
2610: 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  me ((BOOL(WINAPI
2620: 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d  *)(CONST FILETIM
2630: 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  E*, \.        LP
2640: 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61  FILETIME))aSysca
2650: 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[11].pCurrent)
2660: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
2670: 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54  WINCE.  { "FileT
2680: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22  imeToSystemTime"
2690: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 69  ,    (SYSCALL)Fi
26a0: 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69  leTimeToSystemTi
26b0: 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  me,    0 },.#els
26c0: 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54  e.  { "FileTimeT
26d0: 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20  oSystemTime",   
26e0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2700: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
2710: 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69  #define osFileTi
2720: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 20 28  meToSystemTime (
2730: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43  (BOOL(WINAPI*)(C
2740: 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20  ONST FILETIME*, 
2750: 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59 53 54  \.        LPSYST
2760: 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  EMTIME))aSyscall
2770: 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [12].pCurrent)..
2780: 20 20 7b 20 22 46 6c 75 73 68 46 69 6c 65 42 75    { "FlushFileBu
2790: 66 66 65 72 73 22 2c 20 20 20 20 20 20 20 20 28  ffers",        (
27a0: 53 59 53 43 41 4c 4c 29 46 6c 75 73 68 46 69 6c  SYSCALL)FlushFil
27b0: 65 42 75 66 66 65 72 73 2c 20 20 20 20 20 20 20  eBuffers,       
27c0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
27d0: 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72  sFlushFileBuffer
27e0: 73 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  s ((BOOL(WINAPI*
27f0: 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61  )(HANDLE))aSysca
2800: 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[13].pCurrent)
2810: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
2820: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
2830: 4e 53 49 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74  NSI).  { "Format
2840: 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20 20 20  MessageA",      
2850: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72      (SYSCALL)For
2860: 6d 61 74 4d 65 73 73 61 67 65 41 2c 20 20 20 20  matMessageA,    
2870: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
2880: 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73  .  { "FormatMess
2890: 61 67 65 41 22 2c 20 20 20 20 20 20 20 20 20 20  ageA",          
28a0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
28d0: 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d  define osFormatM
28e0: 65 73 73 61 67 65 41 20 28 28 44 57 4f 52 44 28  essageA ((DWORD(
28f0: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c  WINAPI*)(DWORD,L
2900: 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f  PCVOID,DWORD,DWO
2910: 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20  RD,LPSTR, \.    
2920: 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73      DWORD,va_lis
2930: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d  t*))aSyscall[14]
2940: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
2950: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
2960: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
2970: 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67   { "FormatMessag
2980: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  eW",          (S
2990: 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73  YSCALL)FormatMes
29a0: 73 61 67 65 57 2c 20 20 20 20 20 20 20 20 20 20  sageW,          
29b0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
29c0: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c  FormatMessageW",
29d0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
29e0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
2a00: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
2a10: 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65   osFormatMessage
2a20: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
2a30: 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44  *)(DWORD,LPCVOID
2a40: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 57  ,DWORD,DWORD,LPW
2a50: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
2a60: 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61  WORD,va_list*))a
2a70: 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72  Syscall[15].pCur
2a80: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 46 72 65 65  rent)..  { "Free
2a90: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 20 20  Library",       
2aa0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46        (SYSCALL)F
2ab0: 72 65 65 4c 69 62 72 61 72 79 2c 20 20 20 20 20  reeLibrary,     
2ac0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
2ad0: 65 66 69 6e 65 20 6f 73 46 72 65 65 4c 69 62 72  efine osFreeLibr
2ae0: 61 72 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ary ((BOOL(WINAP
2af0: 49 2a 29 28 48 4d 4f 44 55 4c 45 29 29 61 53 79  I*)(HMODULE))aSy
2b00: 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65  scall[16].pCurre
2b10: 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 43 75 72  nt)..  { "GetCur
2b20: 72 65 6e 74 50 72 6f 63 65 73 73 49 64 22 2c 20  rentProcessId", 
2b30: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
2b40: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
2b50: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
2b60: 69 6e 65 20 6f 73 47 65 74 43 75 72 72 65 6e 74  ine osGetCurrent
2b70: 50 72 6f 63 65 73 73 49 64 20 28 28 44 57 4f 52  ProcessId ((DWOR
2b80: 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  D(WINAPI*)(VOID)
2b90: 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43  )aSyscall[17].pC
2ba0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
2bb0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
2bc0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2bd0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
2be0: 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65    { "GetDiskFree
2bf0: 53 70 61 63 65 41 22 2c 20 20 20 20 20 20 20 28  SpaceA",       (
2c00: 53 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46  SYSCALL)GetDiskF
2c10: 72 65 65 53 70 61 63 65 41 2c 20 20 20 20 20 20  reeSpaceA,      
2c20: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
2c30: 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  "GetDiskFreeSpac
2c40: 65 41 22 2c 20 20 20 20 20 20 20 28 53 59 53 43  eA",       (SYSC
2c50: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
2c70: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
2c80: 65 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53  e osGetDiskFreeS
2c90: 70 61 63 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e  paceA ((BOOL(WIN
2ca0: 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 4c 50 44  API*)(LPCSTR,LPD
2cb0: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44  WORD,LPDWORD,LPD
2cc0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
2cd0: 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  LPDWORD))aSyscal
2ce0: 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[18].pCurrent).
2cf0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
2d00: 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64  WINCE && defined
2d10: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
2d20: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74  S_WIDE).  { "Get
2d30: 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c  DiskFreeSpaceW",
2d40: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
2d50: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
2d60: 57 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  W,       0 },.#e
2d70: 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b  lse.  { "GetDisk
2d80: 46 72 65 65 53 70 61 63 65 57 22 2c 20 20 20 20  FreeSpaceW",    
2d90: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
2dc0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44  ..#define osGetD
2dd0: 69 73 6b 46 72 65 65 53 70 61 63 65 57 20 28 28  iskFreeSpaceW ((
2de0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
2df0: 43 57 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50  CWSTR,LPDWORD,LP
2e00: 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c  DWORD,LPDWORD, \
2e10: 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44  .        LPDWORD
2e20: 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70  ))aSyscall[19].p
2e30: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
2e40: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
2e50: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
2e60: 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75   "GetFileAttribu
2e70: 74 65 73 41 22 2c 20 20 20 20 20 20 28 53 59 53  tesA",      (SYS
2e80: 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72  CALL)GetFileAttr
2e90: 69 62 75 74 65 73 41 2c 20 20 20 20 20 20 30 20  ibutesA,      0 
2ea0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
2eb0: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
2ec0: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
2ed0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
2ee0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
2ef0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
2f00: 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
2f10: 65 73 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41  esA ((DWORD(WINA
2f20: 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79  PI*)(LPCSTR))aSy
2f30: 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65  scall[20].pCurre
2f40: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
2f50: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
2f60: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74  S_WIDE).  { "Get
2f70: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 22  FileAttributesW"
2f80: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
2f90: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
2fa0: 73 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  sW,      0 },.#e
2fb0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  lse.  { "GetFile
2fc0: 41 74 74 72 69 62 75 74 65 73 57 22 2c 20 20 20  AttributesW",   
2fd0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3000: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46  ..#define osGetF
3010: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 20 28  ileAttributesW (
3020: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
3030: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
3040: 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[21].pCurrent).
3050: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
3060: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
3070: 44 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  DE).  { "GetFile
3080: 41 74 74 72 69 62 75 74 65 73 45 78 57 22 2c 20  AttributesExW", 
3090: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
30a0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
30b0: 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ,    0 },.#else.
30c0: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
30d0: 69 62 75 74 65 73 45 78 57 22 2c 20 20 20 20 28  ibutesExW",    (
30e0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3100: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3110: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41  efine osGetFileA
3120: 74 74 72 69 62 75 74 65 73 45 78 57 20 28 28 42  ttributesExW ((B
3130: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
3140: 57 53 54 52 2c 47 45 54 5f 46 49 4c 45 45 58 5f  WSTR,GET_FILEEX_
3150: 49 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c 0a 20  INFO_LEVELS, \. 
3160: 20 20 20 20 20 20 20 4c 50 56 4f 49 44 29 29 61         LPVOID))a
3170: 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72  Syscall[22].pCur
3180: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 46  rent)..  { "GetF
3190: 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20 20 20  ileSize",       
31a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
31b0: 65 74 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20  etFileSize,     
31c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
31d0: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 53  efine osGetFileS
31e0: 69 7a 65 20 28 28 44 57 4f 52 44 28 57 49 4e 41  ize ((DWORD(WINA
31f0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57  PI*)(HANDLE,LPDW
3200: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 33  ORD))aSyscall[23
3210: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3220: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
3230: 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  E && defined(SQL
3240: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
3250: 53 49 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c  SI).  { "GetFull
3260: 50 61 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20  PathNameA",     
3270: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
3280: 75 6c 6c 50 61 74 68 4e 61 6d 65 41 2c 20 20 20  ullPathNameA,   
3290: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
32a0: 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68    { "GetFullPath
32b0: 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28  NameA",        (
32c0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
32f0: 65 66 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50  efine osGetFullP
3300: 61 74 68 4e 61 6d 65 41 20 28 28 44 57 4f 52 44  athNameA ((DWORD
3310: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
3320: 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a  ,DWORD,LPSTR, \.
3330: 20 20 20 20 20 20 20 20 4c 50 53 54 52 2a 29 29          LPSTR*))
3340: 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75  aSyscall[24].pCu
3350: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
3360: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
3370: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
3380: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
3390: 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e   { "GetFullPathN
33a0: 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28 53  ameW",        (S
33b0: 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61  YSCALL)GetFullPa
33c0: 74 68 4e 61 6d 65 57 2c 20 20 20 20 20 20 20 20  thNameW,        
33d0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
33e0: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
33f0: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
3400: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3410: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3420: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3430: 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
3440: 6d 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41  meW ((DWORD(WINA
3450: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f  PI*)(LPCWSTR,DWO
3460: 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20  RD,LPWSTR, \.   
3470: 20 20 20 20 20 4c 50 57 53 54 52 2a 29 29 61 53       LPWSTR*))aS
3480: 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72  yscall[25].pCurr
3490: 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 4c 61  ent)..  { "GetLa
34a0: 73 74 45 72 72 6f 72 22 2c 20 20 20 20 20 20 20  stError",       
34b0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
34c0: 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
34d0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
34e0: 66 69 6e 65 20 6f 73 47 65 74 4c 61 73 74 45 72  fine osGetLastEr
34f0: 72 6f 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41  ror ((DWORD(WINA
3500: 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63  PI*)(VOID))aSysc
3510: 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74  all[26].pCurrent
3520: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
3530: 5f 57 49 4e 43 45 0a 20 20 2f 2a 20 54 68 65 20  _WINCE.  /* The 
3540: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 28  GetProcAddressA(
3550: 29 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  ) routine is onl
3560: 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57  y available on W
3570: 69 6e 64 6f 77 73 20 43 45 2e 20 2a 2f 0a 20 20  indows CE. */.  
3580: 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65 73  { "GetProcAddres
3590: 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53 59  sA",         (SY
35a0: 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41 64 64  SCALL)GetProcAdd
35b0: 72 65 73 73 41 2c 20 20 20 20 20 20 20 20 20 30  ressA,         0
35c0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 41   },.#else.  /* A
35d0: 6c 6c 20 6f 74 68 65 72 20 57 69 6e 64 6f 77 73  ll other Windows
35e0: 20 70 6c 61 74 66 6f 72 6d 73 20 65 78 70 65 63   platforms expec
35f0: 74 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  t GetProcAddress
3600: 28 29 20 74 6f 20 74 61 6b 65 0a 20 20 2a 2a 20  () to take.  ** 
3610: 61 6e 20 41 4e 53 49 20 73 74 72 69 6e 67 20 72  an ANSI string r
3620: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
3630: 20 5f 55 4e 49 43 4f 44 45 20 73 65 74 74 69 6e   _UNICODE settin
3640: 67 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f  g */.  { "GetPro
3650: 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20  cAddressA",     
3660: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
3670: 50 72 6f 63 41 64 64 72 65 73 73 2c 20 20 20 20  ProcAddress,    
3680: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3690: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
36a0: 50 72 6f 63 41 64 64 72 65 73 73 41 20 28 28 46  ProcAddressA ((F
36b0: 41 52 50 52 4f 43 28 57 49 4e 41 50 49 2a 29 28  ARPROC(WINAPI*)(
36c0: 48 4d 4f 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20  HMODULE, \.     
36d0: 20 20 20 4c 50 43 53 54 52 29 29 61 53 79 73 63     LPCSTR))aSysc
36e0: 61 6c 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74  all[27].pCurrent
36f0: 29 0a 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65  )..  { "GetSyste
3700: 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20  mInfo",         
3710: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79    (SYSCALL)GetSy
3720: 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20  stemInfo,       
3730: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
3740: 65 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66  e osGetSystemInf
3750: 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  o ((VOID(WINAPI*
3760: 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29  )(LPSYSTEM_INFO)
3770: 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70 43  )aSyscall[28].pC
3780: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65  urrent)..  { "Ge
3790: 74 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20  tSystemTime",   
37a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
37b0: 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 2c 20  )GetSystemTime, 
37c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
37d0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73  #define osGetSys
37e0: 74 65 6d 54 69 6d 65 20 28 28 56 4f 49 44 28 57  temTime ((VOID(W
37f0: 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d  INAPI*)(LPSYSTEM
3800: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 32  TIME))aSyscall[2
3810: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
3820: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
3830: 43 45 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65  CE.  { "GetSyste
3840: 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22  mTimeAsFileTime"
3850: 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79  , (SYSCALL)GetSy
3860: 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69  stemTimeAsFileTi
3870: 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  me, 0 },.#else. 
3880: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d   { "GetSystemTim
3890: 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53  eAsFileTime", (S
38a0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
38b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38c0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
38d0: 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d  fine osGetSystem
38e0: 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 20 28  TimeAsFileTime (
38f0: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20  (VOID(WINAPI*)( 
3900: 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45  \.        LPFILE
3910: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 33  TIME))aSyscall[3
3920: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
3930: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
3940: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
3950: 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74  .  { "GetTempPat
3960: 68 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  hA",            
3970: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70  (SYSCALL)GetTemp
3980: 50 61 74 68 41 2c 20 20 20 20 20 20 20 20 20 20  PathA,          
3990: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
39a0: 20 22 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c   "GetTempPathA",
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
39c0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
39e0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
39f0: 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68  ne osGetTempPath
3a00: 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  A ((DWORD(WINAPI
3a10: 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54 52 29 29  *)(DWORD,LPSTR))
3a20: 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70 43 75  aSyscall[31].pCu
3a30: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
3a40: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3a50: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
3a60: 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20 20  GetTempPathW",  
3a70: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3a80: 4c 4c 29 47 65 74 54 65 6d 70 50 61 74 68 57 2c  LL)GetTempPathW,
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3aa0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54  .#else.  { "GetT
3ab0: 65 6d 70 50 61 74 68 57 22 2c 20 20 20 20 20 20  empPathW",      
3ac0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
3ad0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3ae0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3af0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
3b00: 65 74 54 65 6d 70 50 61 74 68 57 20 28 28 44 57  etTempPathW ((DW
3b10: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f  ORD(WINAPI*)(DWO
3b20: 52 44 2c 4c 50 57 53 54 52 29 29 61 53 79 73 63  RD,LPWSTR))aSysc
3b30: 61 6c 6c 5b 33 32 5d 2e 70 43 75 72 72 65 6e 74  all[32].pCurrent
3b40: 29 0a 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43  )..  { "GetTickC
3b50: 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  ount",          
3b60: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69    (SYSCALL)GetTi
3b70: 63 6b 43 6f 75 6e 74 2c 20 20 20 20 20 20 20 20  ckCount,        
3b80: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
3b90: 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74  e osGetTickCount
3ba0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
3bb0: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  )(VOID))aSyscall
3bc0: 5b 33 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [33].pCurrent)..
3bd0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3be0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
3bf0: 49 29 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69  I).  { "GetVersi
3c00: 6f 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20 20  onExA",         
3c10: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65    (SYSCALL)GetVe
3c20: 72 73 69 6f 6e 45 78 41 2c 20 20 20 20 20 20 20  rsionExA,       
3c30: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3c40: 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78   { "GetVersionEx
3c50: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  A",           (S
3c60: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c80: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
3c90: 66 69 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f  fine osGetVersio
3ca0: 6e 45 78 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41  nExA ((BOOL(WINA
3cb0: 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20  PI*)( \.        
3cc0: 4c 50 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41  LPOSVERSIONINFOA
3cd0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 34 5d 2e 70  ))aSyscall[34].p
3ce0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48  Current)..  { "H
3cf0: 65 61 70 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20  eapAlloc",      
3d00: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3d10: 4c 29 48 65 61 70 41 6c 6c 6f 63 2c 20 20 20 20  L)HeapAlloc,    
3d20: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3d30: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 41  .#define osHeapA
3d40: 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49  lloc ((LPVOID(WI
3d50: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
3d60: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53  ORD, \.        S
3d70: 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b  IZE_T))aSyscall[
3d80: 33 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  35].pCurrent).. 
3d90: 20 7b 20 22 48 65 61 70 43 72 65 61 74 65 22 2c   { "HeapCreate",
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
3db0: 59 53 43 41 4c 4c 29 48 65 61 70 43 72 65 61 74  YSCALL)HeapCreat
3dc0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
3dd0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
3de0: 48 65 61 70 43 72 65 61 74 65 20 28 28 48 41 4e  HeapCreate ((HAN
3df0: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 44 57 4f  DLE(WINAPI*)(DWO
3e00: 52 44 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20 20 20  RD,SIZE_T, \.   
3e10: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
3e20: 73 63 61 6c 6c 5b 33 36 5d 2e 70 43 75 72 72 65  scall[36].pCurre
3e30: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 44 65  nt)..  { "HeapDe
3e40: 73 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20  stroy",         
3e50: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
3e60: 70 44 65 73 74 72 6f 79 2c 20 20 20 20 20 20 20  pDestroy,       
3e70: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
3e80: 69 6e 65 20 6f 73 48 65 61 70 44 65 73 74 72 6f  ine osHeapDestro
3e90: 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  y ((BOOL(WINAPI*
3ea0: 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61  )(HANDLE))aSysca
3eb0: 6c 6c 5b 33 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[37].pCurrent)
3ec0: 0a 0a 20 20 7b 20 22 48 65 61 70 46 72 65 65 22  ..  { "HeapFree"
3ed0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3ee0: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 46 72   (SYSCALL)HeapFr
3ef0: 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ee,             
3f00: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
3f10: 20 6f 73 48 65 61 70 46 72 65 65 20 28 28 42 4f   osHeapFree ((BO
3f20: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
3f30: 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 29  LE,DWORD,LPVOID)
3f40: 29 61 53 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43  )aSyscall[38].pC
3f50: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65  urrent)..  { "He
3f60: 61 70 52 65 41 6c 6c 6f 63 22 2c 20 20 20 20 20  apReAlloc",     
3f70: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3f80: 29 48 65 61 70 52 65 41 6c 6c 6f 63 2c 20 20 20  )HeapReAlloc,   
3f90: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
3fa0: 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 52 65  #define osHeapRe
3fb0: 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57  Alloc ((LPVOID(W
3fc0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
3fd0: 57 4f 52 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a 20  WORD,LPVOID, \. 
3fe0: 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61         SIZE_T))a
3ff0: 53 79 73 63 61 6c 6c 5b 33 39 5d 2e 70 43 75 72  Syscall[39].pCur
4000: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70  rent)..  { "Heap
4010: 53 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20  Size",          
4020: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
4030: 65 61 70 53 69 7a 65 2c 20 20 20 20 20 20 20 20  eapSize,        
4040: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
4050: 65 66 69 6e 65 20 6f 73 48 65 61 70 53 69 7a 65  efine osHeapSize
4060: 20 28 28 53 49 5a 45 5f 54 28 57 49 4e 41 50 49   ((SIZE_T(WINAPI
4070: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
4080: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 56 4f   \.        LPCVO
4090: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 30 5d  ID))aSyscall[40]
40a0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
40b0: 22 48 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20  "HeapValidate", 
40c0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
40d0: 41 4c 4c 29 48 65 61 70 56 61 6c 69 64 61 74 65  ALL)HeapValidate
40e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
40f0: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  ,..#define osHea
4100: 70 56 61 6c 69 64 61 74 65 20 28 28 42 4f 4f 4c  pValidate ((BOOL
4110: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
4120: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
4130: 20 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63    LPCVOID))aSysc
4140: 61 6c 6c 5b 34 31 5d 2e 70 43 75 72 72 65 6e 74  all[41].pCurrent
4150: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
4160: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4170: 41 4e 53 49 29 0a 20 20 7b 20 22 4c 6f 61 64 4c  ANSI).  { "LoadL
4180: 69 62 72 61 72 79 41 22 2c 20 20 20 20 20 20 20  ibraryA",       
4190: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f       (SYSCALL)Lo
41a0: 61 64 4c 69 62 72 61 72 79 41 2c 20 20 20 20 20  adLibraryA,     
41b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
41c0: 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61  e.  { "LoadLibra
41d0: 72 79 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  ryA",           
41e0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4200: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4210: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69  #define osLoadLi
4220: 62 72 61 72 79 41 20 28 28 48 4d 4f 44 55 4c 45  braryA ((HMODULE
4230: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
4240: 29 29 61 53 79 73 63 61 6c 6c 5b 34 32 5d 2e 70  ))aSyscall[42].p
4250: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
4260: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
4270: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
4280: 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c   "LoadLibraryW",
4290: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
42a0: 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79  CALL)LoadLibrary
42b0: 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  W,            0 
42c0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f  },.#else.  { "Lo
42d0: 61 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20  adLibraryW",    
42e0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
42f0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4300: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4310: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4320: 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 20 28 28  sLoadLibraryW ((
4330: 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29  HMODULE(WINAPI*)
4340: 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  (LPCWSTR))aSysca
4350: 6c 6c 5b 34 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[43].pCurrent)
4360: 0a 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65  ..  { "LocalFree
4370: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
4380: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46   (SYSCALL)LocalF
4390: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ree,            
43a0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
43b0: 20 6f 73 4c 6f 63 61 6c 46 72 65 65 20 28 28 48   osLocalFree ((H
43c0: 4c 4f 43 41 4c 28 57 49 4e 41 50 49 2a 29 28 48  LOCAL(WINAPI*)(H
43d0: 4c 4f 43 41 4c 29 29 61 53 79 73 63 61 6c 6c 5b  LOCAL))aSyscall[
43e0: 34 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  44].pCurrent)..#
43f0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4400: 4e 43 45 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c  NCE.  { "LockFil
4410: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
4420: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b     (SYSCALL)Lock
4430: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
4440: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
4450: 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 20 28 28  ne osLockFile ((
4460: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
4470: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
4480: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
4490: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
44a0: 6c 5b 34 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[45].pCurrent).
44b0: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46  #else.  { "LockF
44c0: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
44d0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44f0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4500: 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  if..#if !SQLITE_
4510: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c 6f  OS_WINCE.  { "Lo
4520: 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20  ckFileEx",      
4530: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4540: 29 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20  )LockFileEx,    
4550: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
4560: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69  #define osLockFi
4570: 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41  leEx ((BOOL(WINA
4580: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
4590: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  D,DWORD,DWORD,DW
45a0: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
45b0: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
45c0: 73 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65  scall[46].pCurre
45d0: 6e 74 29 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c  nt).#else.  { "L
45e0: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
45f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4600: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4610: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4620: 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 4d 61 70  #endif..  { "Map
4630: 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20  ViewOfFile",    
4640: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4650: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c 20 20  MapViewOfFile,  
4660: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
4670: 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77  define osMapView
4680: 4f 66 46 69 6c 65 20 28 28 4c 50 56 4f 49 44 28  OfFile ((LPVOID(
4690: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
46a0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
46b0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  D, \.        SIZ
46c0: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 37  E_T))aSyscall[47
46d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
46e0: 20 22 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64   "MultiByteToWid
46f0: 65 43 68 61 72 22 2c 20 20 20 20 20 28 53 59 53  eChar",     (SYS
4700: 43 41 4c 4c 29 4d 75 6c 74 69 42 79 74 65 54 6f  CALL)MultiByteTo
4710: 57 69 64 65 43 68 61 72 2c 20 20 20 20 20 30 20  WideChar,     0 
4720: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75  },..#define osMu
4730: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
4740: 72 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29  r ((int(WINAPI*)
4750: 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 53  (UINT,DWORD,LPCS
4760: 54 52 2c 69 6e 74 2c 4c 50 57 53 54 52 2c 20 5c  TR,int,LPWSTR, \
4770: 0a 20 20 20 20 20 20 20 20 69 6e 74 29 29 61 53  .        int))aS
4780: 79 73 63 61 6c 6c 5b 34 38 5d 2e 70 43 75 72 72  yscall[48].pCurr
4790: 65 6e 74 29 0a 0a 20 20 7b 20 22 51 75 65 72 79  ent)..  { "Query
47a0: 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
47b0: 65 72 22 2c 20 28 53 59 53 43 41 4c 4c 29 51 75  er", (SYSCALL)Qu
47c0: 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  eryPerformanceCo
47d0: 75 6e 74 65 72 2c 20 30 20 7d 2c 0a 0a 23 64 65  unter, 0 },..#de
47e0: 66 69 6e 65 20 6f 73 51 75 65 72 79 50 65 72 66  fine osQueryPerf
47f0: 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 28  ormanceCounter (
4800: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20  (BOOL(WINAPI*)( 
4810: 5c 0a 20 20 20 20 20 20 20 20 4c 41 52 47 45 5f  \.        LARGE_
4820: 49 4e 54 45 47 45 52 2a 29 29 61 53 79 73 63 61  INTEGER*))aSysca
4830: 6c 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[49].pCurrent)
4840: 0a 0a 20 20 7b 20 22 52 65 61 64 46 69 6c 65 22  ..  { "ReadFile"
4850: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4860: 20 28 53 59 53 43 41 4c 4c 29 52 65 61 64 46 69   (SYSCALL)ReadFi
4870: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
4880: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
4890: 20 6f 73 52 65 61 64 46 69 6c 65 20 28 28 42 4f   osReadFile ((BO
48a0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
48b0: 4c 45 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 2c  LE,LPVOID,DWORD,
48c0: 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  LPDWORD, \.     
48d0: 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29     LPOVERLAPPED)
48e0: 29 61 53 79 73 63 61 6c 6c 5b 35 30 5d 2e 70 43  )aSyscall[50].pC
48f0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 65  urrent)..  { "Se
4900: 74 45 6e 64 4f 66 46 69 6c 65 22 2c 20 20 20 20  tEndOfFile",    
4910: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4920: 29 53 65 74 45 6e 64 4f 66 46 69 6c 65 2c 20 20  )SetEndOfFile,  
4930: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
4940: 23 64 65 66 69 6e 65 20 6f 73 53 65 74 45 6e 64  #define osSetEnd
4950: 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  OfFile ((BOOL(WI
4960: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61  NAPI*)(HANDLE))a
4970: 53 79 73 63 61 6c 6c 5b 35 31 5d 2e 70 43 75 72  Syscall[51].pCur
4980: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 65 74 46  rent)..  { "SetF
4990: 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20  ilePointer",    
49a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53        (SYSCALL)S
49b0: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 2c 20 20  etFilePointer,  
49c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
49d0: 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50  efine osSetFileP
49e0: 6f 69 6e 74 65 72 20 28 28 44 57 4f 52 44 28 57  ointer ((DWORD(W
49f0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
4a00: 4f 4e 47 2c 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20  ONG,PLONG, \.   
4a10: 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73       DWORD))aSys
4a20: 63 61 6c 6c 5b 35 32 5d 2e 70 43 75 72 72 65 6e  call[52].pCurren
4a30: 74 29 0a 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c  t)..  { "Sleep",
4a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a50: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 6c 65 65     (SYSCALL)Slee
4a60: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
4a70: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
4a80: 6e 65 20 6f 73 53 6c 65 65 70 20 28 28 56 4f 49  ne osSleep ((VOI
4a90: 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  D(WINAPI*)(DWORD
4aa0: 29 29 61 53 79 73 63 61 6c 6c 5b 35 33 5d 2e 70  ))aSyscall[53].p
4ab0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53  Current)..  { "S
4ac0: 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
4ad0: 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c  ime",    (SYSCAL
4ae0: 4c 29 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  L)SystemTimeToFi
4af0: 6c 65 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a  leTime,    0 },.
4b00: 0a 23 64 65 66 69 6e 65 20 6f 73 53 79 73 74 65  .#define osSyste
4b10: 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 20  mTimeToFileTime 
4b20: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4b30: 43 4f 4e 53 54 20 53 59 53 54 45 4d 54 49 4d 45  CONST SYSTEMTIME
4b40: 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46  *, \.        LPF
4b50: 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c  ILETIME))aSyscal
4b60: 6c 5b 35 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[54].pCurrent).
4b70: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
4b80: 57 49 4e 43 45 0a 20 20 7b 20 22 55 6e 6c 6f 63  WINCE.  { "Unloc
4b90: 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  kFile",         
4ba0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e       (SYSCALL)Un
4bb0: 6c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20 20  lockFile,       
4bc0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
4bd0: 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c  fine osUnlockFil
4be0: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
4bf0: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44  )(HANDLE,DWORD,D
4c00: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
4c10: 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79        DWORD))aSy
4c20: 73 63 61 6c 6c 5b 35 35 5d 2e 70 43 75 72 72 65  scall[55].pCurre
4c30: 6e 74 29 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55  nt).#else.  { "U
4c40: 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20  nlockFile",     
4c50: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4c60: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4c70: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4c80: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c  #endif..#if !SQL
4c90: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b  ITE_OS_WINCE.  {
4ca0: 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c   "UnlockFileEx",
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4cc0: 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 45  CALL)UnlockFileE
4cd0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  x,            0 
4ce0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e  },..#define osUn
4cf0: 6c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f  lockFileEx ((BOO
4d00: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
4d10: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
4d20: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
4d30: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
4d40: 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75 72 72 65  scall[56].pCurre
4d50: 6e 74 29 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55  nt).#else.  { "U
4d60: 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20  nlockFileEx",   
4d70: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4d80: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4d90: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4da0: 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 55 6e 6d  #endif..  { "Unm
4db0: 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20  apViewOfFile",  
4dc0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4dd0: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c  UnmapViewOfFile,
4de0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
4df0: 64 65 66 69 6e 65 20 6f 73 55 6e 6d 61 70 56 69  define osUnmapVi
4e00: 65 77 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28  ewOfFile ((BOOL(
4e10: 57 49 4e 41 50 49 2a 29 28 4c 50 43 56 4f 49 44  WINAPI*)(LPCVOID
4e20: 29 29 61 53 79 73 63 61 6c 6c 5b 35 37 5d 2e 70  ))aSyscall[57].p
4e30: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57  Current)..  { "W
4e40: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
4e50: 74 65 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  te",     (SYSCAL
4e60: 4c 29 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  L)WideCharToMult
4e70: 69 42 79 74 65 2c 20 20 20 20 20 30 20 7d 2c 0a  iByte,     0 },.
4e80: 0a 23 64 65 66 69 6e 65 20 6f 73 57 69 64 65 43  .#define osWideC
4e90: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 20 28  harToMultiByte (
4ea0: 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49  (int(WINAPI*)(UI
4eb0: 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52  NT,DWORD,LPCWSTR
4ec0: 2c 69 6e 74 2c 4c 50 53 54 52 2c 69 6e 74 2c 20  ,int,LPSTR,int, 
4ed0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53 54 52  \.        LPCSTR
4ee0: 2c 4c 50 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c  ,LPBOOL))aSyscal
4ef0: 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[58].pCurrent).
4f00: 0a 20 20 7b 20 22 57 72 69 74 65 46 69 6c 65 22  .  { "WriteFile"
4f10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4f20: 28 53 59 53 43 41 4c 4c 29 57 72 69 74 65 46 69  (SYSCALL)WriteFi
4f30: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
4f40: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
4f50: 6f 73 57 72 69 74 65 46 69 6c 65 20 28 28 42 4f  osWriteFile ((BO
4f60: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
4f70: 4c 45 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44  LE,LPCVOID,DWORD
4f80: 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  ,LPDWORD, \.    
4f90: 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44      LPOVERLAPPED
4fa0: 29 29 61 53 79 73 63 61 6c 6c 5b 35 39 5d 2e 70  ))aSyscall[59].p
4fb0: 43 75 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20  Current)..}; /* 
4fc0: 45 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72  End of the overr
4fd0: 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63  ideable system c
4fe0: 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  alls */../*.** T
4ff0: 68 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53  his is the xSetS
5000: 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68  ystemCall() meth
5010: 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66  od of sqlite3_vf
5020: 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  s for all of the
5030: 0a 2a 2a 20 22 77 69 6e 33 32 22 20 56 46 53 65  .** "win32" VFSe
5040: 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s.  Return SQLIT
5050: 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73  E_OK opon succes
5060: 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20  sfully updating 
5070: 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61  the.** system ca
5080: 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53  ll pointer, or S
5090: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69  QLITE_NOTFOUND i
50a0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f  f there is no co
50b0: 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79  nfigurable.** sy
50c0: 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20  stem call named 
50d0: 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  zName..*/.static
50e0: 20 69 6e 74 20 77 69 6e 53 65 74 53 79 73 74 65   int winSetSyste
50f0: 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33  mCall(.  sqlite3
5100: 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20  _vfs *pNotUsed, 
5110: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
5120: 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20  S pointer.  Not 
5130: 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  used */.  const 
5140: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
5150: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
5160: 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  of system call t
5170: 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20  o override */.  
5180: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5190: 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a  ptr pNewFunc  /*
51a0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
51b0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75  system call valu
51c0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
51d0: 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  ed int i;.  int 
51e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46  rc = SQLITE_NOTF
51f0: 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  OUND;..  UNUSED_
5200: 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73  PARAMETER(pNotUs
5210: 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ed);.  if( zName
5220: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
5230: 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76   no zName is giv
5240: 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20  en, restore all 
5250: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20  system calls to 
5260: 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20  their default.  
5270: 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e    ** settings an
5280: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20  d return NULL.  
5290: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51    */.    rc = SQ
52a0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72  LITE_OK;.    for
52b0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
52c0: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
52d0: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
52e0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53  +){.      if( aS
52f0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
5300: 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53  lt ){.        aS
5310: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
5320: 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nt = aSyscall[i]
5330: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
5340: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
5350: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  {.    /* If zNam
5360: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
5370: 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20  operate on only 
5380: 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63  the one system c
5390: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69  all.    ** speci
53a0: 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  fied..    */.   
53b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
53c0: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
53d0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
53e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
53f0: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
5400: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
5410: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
5420: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
5430: 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a  .pDefault==0 ){.
5440: 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61            aSysca
5450: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d  ll[i].pDefault =
5460: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
5470: 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d  rrent;.        }
5480: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
5490: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
54a0: 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30   if( pNewFunc==0
54b0: 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53   ) pNewFunc = aS
54c0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
54d0: 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73  lt;.        aSys
54e0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
54f0: 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20   = pNewFunc;.   
5500: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5510: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
5520: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5530: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
5540: 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d  alue of a system
5550: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
5560: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20  ULL if zName is 
5570: 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69  not a.** recogni
5580: 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  zed system call 
5590: 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61  name.  NULL is a
55a0: 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
55b0: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  the system call.
55c0: 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
55d0: 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
55e0: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73  atic sqlite3_sys
55f0: 63 61 6c 6c 5f 70 74 72 20 77 69 6e 47 65 74 53  call_ptr winGetS
5600: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
5610: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
5620: 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ed,.  const char
5630: 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73   *zName.){.  uns
5640: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20  igned int i;..  
5650: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
5660: 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f  (pNotUsed);.  fo
5670: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
5680: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
5690: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
56a0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
56b0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
56c0: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
56d0: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
56e0: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a  ll[i].pCurrent;.
56f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
5700: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5710: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
5720: 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c  first system cal
5730: 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20  l after zName.  
5740: 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a  If zName==NULL.*
5750: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  * then return th
5760: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
5770: 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  rst system call.
5780: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
5790: 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65   zName.** is the
57a0: 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c   last system cal
57b0: 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73  l or if zName is
57c0: 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   not the name of
57d0: 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74   a valid.** syst
57e0: 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  em call..*/.stat
57f0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77  ic const char *w
5800: 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c  inNextSystemCall
5810: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c  (sqlite3_vfs *p,
5820: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
5830: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d  me){.  int i = -
5840: 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  1;..  UNUSED_PAR
5850: 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28  AMETER(p);.  if(
5860: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f   zName ){.    fo
5870: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
5880: 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20  ze(aSyscall)-1; 
5890: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
58a0: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
58b0: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
58c0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
58d0: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b   }.  }.  for(i++
58e0: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53  ; i<ArraySize(aS
58f0: 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20  yscall); i++){. 
5900: 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b     if( aSyscall[
5910: 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29  i].pCurrent!=0 )
5920: 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c   return aSyscall
5930: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  [i].zName;.  }. 
5940: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
5950: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
5960: 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77 65  (non-zero) if we
5970: 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e 64   are running und
5980: 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c  er WinNT, Win2K,
5990: 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57 69   WinXP,.** or Wi
59a0: 6e 43 45 2e 20 20 52 65 74 75 72 6e 20 66 61 6c  nCE.  Return fal
59b0: 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 20 57 69  se (zero) for Wi
59c0: 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20 57  n95, Win98, or W
59d0: 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65  inME..**.** Here
59e0: 20 69 73 20 61 6e 20 69 6e 74 65 72 65 73 74 69   is an interesti
59f0: 6e 67 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a 20  ng observation: 
5a00: 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 61   Win95, Win98, a
5a10: 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a  nd WinME lack.**
5a20: 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28   the LockFileEx(
5a30: 29 20 41 50 49 2e 20 20 42 75 74 20 77 65 20 63  ) API.  But we c
5a40: 61 6e 20 73 74 69 6c 6c 20 73 74 61 74 69 63 61  an still statica
5a50: 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73 74  lly link against
5a60: 20 74 68 61 74 0a 2a 2a 20 41 50 49 20 61 73 20   that.** API as 
5a70: 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e 27 74  long as we don't
5a80: 20 63 61 6c 6c 20 69 74 20 77 68 65 6e 20 72 75   call it when ru
5a90: 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f 4d  nning Win95/98/M
5aa0: 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a  E.  A call to.**
5ab0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
5ac0: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
5ad0: 6e 65 20 69 66 20 74 68 65 20 68 6f 73 74 20 69  ne if the host i
5ae0: 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f 72  s Win95/98/ME or
5af0: 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50 20  .** WinNT/2K/XP 
5b00: 73 6f 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  so that we will 
5b10: 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20  know whether or 
5b20: 6e 6f 74 20 77 65 20 63 61 6e 20 73 61 66 65 6c  not we can safel
5b30: 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f  y call.** the Lo
5b40: 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 0a  ckFileEx() API..
5b50: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
5b60: 5f 57 49 4e 43 45 0a 23 20 64 65 66 69 6e 65 20  _WINCE.# define 
5b70: 69 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 73  isNT()  (1).#els
5b80: 65 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 69  e.  static int i
5b90: 73 4e 54 28 76 6f 69 64 29 7b 0a 20 20 20 20 69  sNT(void){.    i
5ba0: 66 28 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  f( sqlite3_os_ty
5bb0: 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f  pe==0 ){.      O
5bc0: 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 20 73 49  SVERSIONINFOA sI
5bd0: 6e 66 6f 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f  nfo;.      sInfo
5be0: 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f  .dwOSVersionInfo
5bf0: 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49  Size = sizeof(sI
5c00: 6e 66 6f 29 3b 0a 20 20 20 20 20 20 6f 73 47 65  nfo);.      osGe
5c10: 74 56 65 72 73 69 6f 6e 45 78 41 28 26 73 49 6e  tVersionExA(&sIn
5c20: 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
5c30: 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 73 49 6e  e3_os_type = sIn
5c40: 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64 3d  fo.dwPlatformId=
5c50: 3d 56 45 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49  =VER_PLATFORM_WI
5c60: 4e 33 32 5f 4e 54 20 3f 20 32 20 3a 20 31 3b 0a  N32_NT ? 2 : 1;.
5c70: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
5c80: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
5c90: 3d 3d 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  ==2;.  }.#endif 
5ca0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  /* SQLITE_OS_WIN
5cb0: 43 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  CE */..#ifdef SQ
5cc0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
5cd0: 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  C./*.** Allocate
5ce0: 20 6e 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72   nBytes of memor
5cf0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
5d00: 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28  d *winMemMalloc(
5d10: 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48  int nBytes){.  H
5d20: 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76  ANDLE hHeap;.  v
5d30: 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65  oid *p;..  winMe
5d40: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a  mAssertMagic();.
5d50: 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d    hHeap = winMem
5d60: 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73  GetHeap();.  ass
5d70: 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b  ert( hHeap!=0 );
5d80: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
5d90: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
5da0: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66  _VALUE );.#ifdef
5db0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
5dc0: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20  LLOC_VALIDATE.  
5dd0: 61 73 73 65 72 74 20 28 20 6f 73 48 65 61 70 56  assert ( osHeapV
5de0: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
5df0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
5e00: 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b  _FLAGS, NULL) );
5e10: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
5e20: 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20  ( nBytes>=0 );. 
5e30: 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63   p = osHeapAlloc
5e40: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
5e50: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
5e60: 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29   (SIZE_T)nBytes)
5e70: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
5e80: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
5e90: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
5ea0: 6c 65 64 20 74 6f 20 48 65 61 70 41 6c 6c 6f 63  led to HeapAlloc
5eb0: 20 25 75 20 62 79 74 65 73 20 28 25 64 29 2c 20   %u bytes (%d), 
5ec0: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
5ed0: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 73            nBytes
5ee0: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
5ef0: 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70  (), (void*)hHeap
5f00: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
5f10: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  p;.}../*.** Free
5f20: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
5f30: 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72  ic void winMemFr
5f40: 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 29  ee(void *pPrior)
5f50: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  {.  HANDLE hHeap
5f60: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
5f70: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
5f80: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
5f90: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
5fa0: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
5fb0: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
5fc0: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
5fd0: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
5fe0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
5ff0: 41 4c 49 44 41 54 45 0a 20 20 61 73 73 65 72 74  ALIDATE.  assert
6000: 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74   ( osHeapValidat
6010: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
6020: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
6030: 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e  , pPrior) );.#en
6040: 64 69 66 0a 20 20 69 66 28 20 21 70 50 72 69 6f  dif.  if( !pPrio
6050: 72 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 50  r ) return; /* P
6060: 61 73 73 69 6e 67 20 4e 55 4c 4c 20 74 6f 20 48  assing NULL to H
6070: 65 61 70 46 72 65 65 20 69 73 20 75 6e 64 65 66  eapFree is undef
6080: 69 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 21  ined. */.  if( !
6090: 6f 73 48 65 61 70 46 72 65 65 28 68 48 65 61 70  osHeapFree(hHeap
60a0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
60b0: 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f  EAP_FLAGS, pPrio
60c0: 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r) ){.    sqlite
60d0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
60e0: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48  EM, "failed to H
60f0: 65 61 70 46 72 65 65 20 62 6c 6f 63 6b 20 25 70  eapFree block %p
6100: 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c   (%d), heap=%p",
6110: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6120: 20 70 50 72 69 6f 72 2c 20 6f 73 47 65 74 4c 61   pPrior, osGetLa
6130: 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64  stError(), (void
6140: 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 7d 0a  *)hHeap);.  }.}.
6150: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
6160: 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 65 78 69  e size of an exi
6170: 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c  sting memory all
6180: 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
6190: 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65  c void *winMemRe
61a0: 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69  alloc(void *pPri
61b0: 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 7b  or, int nBytes){
61c0: 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b  .  HANDLE hHeap;
61d0: 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77  .  void *p;..  w
61e0: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
61f0: 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69  ();.  hHeap = wi
6200: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20  nMemGetHeap();. 
6210: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
6220: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  0 );.  assert( h
6230: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
6240: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
6250: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
6260: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
6270: 45 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73 48  E.  assert ( osH
6280: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
6290: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
62a0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69  HEAP_FLAGS, pPri
62b0: 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  or) );.#endif.  
62c0: 61 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d  assert( nBytes>=
62d0: 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50 72 69  0 );.  if( !pPri
62e0: 6f 72 20 29 7b 0a 20 20 20 20 70 20 3d 20 6f 73  or ){.    p = os
62f0: 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c  HeapAlloc(hHeap,
6300: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
6310: 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f  AP_FLAGS, (SIZE_
6320: 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d 65 6c  T)nBytes);.  }el
6330: 73 65 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65  se{.    p = osHe
6340: 61 70 52 65 41 6c 6c 6f 63 28 68 48 65 61 70 2c  apReAlloc(hHeap,
6350: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
6360: 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72  AP_FLAGS, pPrior
6370: 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73  , (SIZE_T)nBytes
6380: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 20  );.  }.  if( !p 
6390: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
63a0: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
63b0: 20 22 66 61 69 6c 65 64 20 74 6f 20 25 73 20 25   "failed to %s %
63c0: 75 20 62 79 74 65 73 20 28 25 64 29 2c 20 68 65  u bytes (%d), he
63d0: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
63e0: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 20 3f          pPrior ?
63f0: 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 20 3a   "HeapReAlloc" :
6400: 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 6e 42   "HeapAlloc", nB
6410: 79 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74 45  ytes, osGetLastE
6420: 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
6430: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68          (void*)h
6440: 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Heap);.  }.  ret
6450: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
6460: 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
6470: 6f 66 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  of an outstandin
6480: 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e  g allocation, in
6490: 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   bytes..*/.stati
64a0: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65  c int winMemSize
64b0: 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 48 41 4e  (void *p){.  HAN
64c0: 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 53 49 5a  DLE hHeap;.  SIZ
64d0: 45 5f 54 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65 6d  E_T n;..  winMem
64e0: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
64f0: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47   hHeap = winMemG
6500: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65  etHeap();.  asse
6510: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a  rt( hHeap!=0 );.
6520: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
6530: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
6540: 56 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66 20  VALUE );.#ifdef 
6550: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
6560: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20 61  LOC_VALIDATE.  a
6570: 73 73 65 72 74 20 28 20 6f 73 48 65 61 70 56 61  ssert ( osHeapVa
6580: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
6590: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
65a0: 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a  FLAGS, NULL) );.
65b0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 20  #endif.  if( !p 
65c0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20  ) return 0;.  n 
65d0: 3d 20 6f 73 48 65 61 70 53 69 7a 65 28 68 48 65  = osHeapSize(hHe
65e0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
65f0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29 3b  _HEAP_FLAGS, p);
6600: 0a 20 20 69 66 28 20 6e 3d 3d 28 53 49 5a 45 5f  .  if( n==(SIZE_
6610: 54 29 2d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  T)-1 ){.    sqli
6620: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
6630: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
6640: 20 48 65 61 70 53 69 7a 65 20 62 6c 6f 63 6b 20   HeapSize block 
6650: 25 70 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70  %p (%d), heap=%p
6660: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
6670: 20 20 20 70 2c 20 6f 73 47 65 74 4c 61 73 74 45     p, osGetLastE
6680: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68  rror(), (void*)h
6690: 48 65 61 70 29 3b 0a 20 20 20 20 72 65 74 75 72  Heap);.    retur
66a0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
66b0: 6e 20 28 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a  n (int)n;.}../*.
66c0: 2a 2a 20 52 6f 75 6e 64 20 75 70 20 61 20 72 65  ** Round up a re
66d0: 71 75 65 73 74 20 73 69 7a 65 20 74 6f 20 74 68  quest size to th
66e0: 65 20 6e 65 78 74 20 76 61 6c 69 64 20 61 6c 6c  e next valid all
66f0: 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 2a 2f  ocation size..*/
6700: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
6710: 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29  emRoundup(int n)
6720: 7b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  {.  return n;.}.
6730: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
6740: 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a  e this module..*
6750: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
6760: 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41  MemInit(void *pA
6770: 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65  ppData){.  winMe
6780: 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61  mData *pWinMemDa
6790: 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61  ta = (winMemData
67a0: 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20   *)pAppData;..  
67b0: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
67c0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
67d0: 5f 45 52 52 4f 52 3b 0a 20 20 61 73 73 65 72 74  _ERROR;.  assert
67e0: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d  ( pWinMemData->m
67f0: 61 67 69 63 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47  agic==WINMEM_MAG
6800: 49 43 20 29 3b 0a 20 20 69 66 28 20 21 70 57 69  IC );.  if( !pWi
6810: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20  nMemData->hHeap 
6820: 29 7b 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61  ){.    pWinMemDa
6830: 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 48 65  ta->hHeap = osHe
6840: 61 70 43 72 65 61 74 65 28 53 51 4c 49 54 45 5f  apCreate(SQLITE_
6850: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
6860: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6880: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57          SQLITE_W
6890: 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53  IN32_HEAP_INIT_S
68a0: 49 5a 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  IZE,.           
68b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68c0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
68d0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58  E_WIN32_HEAP_MAX
68e0: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 69 66 28 20  _SIZE);.    if( 
68f0: 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  !pWinMemData->hH
6900: 65 61 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  eap ){.      sql
6910: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
6920: 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 20  NOMEM,.         
6930: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
6940: 43 72 65 61 74 65 20 28 25 64 29 2c 20 66 6c 61  Create (%d), fla
6950: 67 73 3d 25 75 2c 20 69 6e 69 74 53 69 7a 65 3d  gs=%u, initSize=
6960: 25 75 2c 20 6d 61 78 53 69 7a 65 3d 25 75 22 2c  %u, maxSize=%u",
6970: 0a 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74  .          osGet
6980: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 53 51 4c  LastError(), SQL
6990: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
69a0: 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20  LAGS,.          
69b0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
69c0: 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 20 53 51 4c  P_INIT_SIZE, SQL
69d0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d  ITE_WIN32_HEAP_M
69e0: 41 58 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  AX_SIZE);.      
69f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6a00: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
6a10: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e  WinMemData->bOwn
6a20: 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 7d 0a 20  ed = TRUE;.  }. 
6a30: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
6a40: 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 30 20 29  Data->hHeap!=0 )
6a50: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  ;.  assert( pWin
6a60: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d  MemData->hHeap!=
6a70: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
6a80: 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66 20 53  ALUE );.#ifdef S
6a90: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
6aa0: 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20 61 73  OC_VALIDATE.  as
6ab0: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
6ac0: 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61  date(pWinMemData
6ad0: 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  ->hHeap, SQLITE_
6ae0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
6af0: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
6b00: 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
6b10: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
6b20: 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73  einitialize this
6b30: 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74   module..*/.stat
6b40: 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68  ic void winMemSh
6b50: 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70  utdown(void *pAp
6b60: 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d  pData){.  winMem
6b70: 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74  Data *pWinMemDat
6b80: 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61 20  a = (winMemData 
6b90: 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20 69  *)pAppData;..  i
6ba0: 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 20  f( !pWinMemData 
6bb0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
6bc0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
6bd0: 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ap ){.    assert
6be0: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  ( pWinMemData->h
6bf0: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
6c00: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
6c10: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
6c20: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
6c30: 45 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 73  E.    assert( os
6c40: 48 65 61 70 56 61 6c 69 64 61 74 65 28 70 57 69  HeapValidate(pWi
6c50: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c  nMemData->hHeap,
6c60: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
6c70: 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20  AP_FLAGS, NULL) 
6c80: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
6c90: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62  ( pWinMemData->b
6ca0: 4f 77 6e 65 64 20 29 7b 0a 20 20 20 20 20 20 69  Owned ){.      i
6cb0: 66 28 20 21 6f 73 48 65 61 70 44 65 73 74 72 6f  f( !osHeapDestro
6cc0: 79 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  y(pWinMemData->h
6cd0: 48 65 61 70 29 20 29 7b 0a 20 20 20 20 20 20 20  Heap) ){.       
6ce0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
6cf0: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
6d00: 65 64 20 74 6f 20 48 65 61 70 44 65 73 74 72 6f  ed to HeapDestro
6d10: 79 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22  y (%d), heap=%p"
6d20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6d30: 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
6d40: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 70  rror(), (void*)p
6d50: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
6d60: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
6d70: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62    pWinMemData->b
6d80: 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  Owned = FALSE;. 
6d90: 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d     }.    pWinMem
6da0: 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55  Data->hHeap = NU
6db0: 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  LL;.  }.}../*.**
6dc0: 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f   Populate the lo
6dd0: 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61  w-level memory a
6de0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74 69  llocation functi
6df0: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a  on pointers in.*
6e00: 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  * sqlite3GlobalC
6e10: 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20 70 6f 69  onfig.m with poi
6e20: 6e 74 65 72 73 20 74 6f 20 74 68 65 20 72 6f 75  nters to the rou
6e30: 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69  tines in this fi
6e40: 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d  le. The.** argum
6e50: 65 6e 74 73 20 73 70 65 63 69 66 79 20 74 68 65  ents specify the
6e60: 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79   block of memory
6e70: 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a   to manage..**.*
6e80: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
6e90: 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  s only called by
6ea0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
6eb0: 29 2c 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65  ), and therefore
6ec0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69  .** is not requi
6ed0: 72 65 64 20 74 6f 20 62 65 20 74 68 72 65 61 64  red to be thread
6ee0: 73 61 66 65 20 28 69 74 20 69 73 20 6e 6f 74 29  safe (it is not)
6ef0: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74  ..*/.const sqlit
6f00: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a  e3_mem_methods *
6f10: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e  sqlite3MemGetWin
6f20: 33 32 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  32(void){.  stat
6f30: 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
6f40: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69 6e  _mem_methods win
6f50: 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20  MemMethods = {. 
6f60: 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c     winMemMalloc,
6f70: 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c  .    winMemFree,
6f80: 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c  .    winMemReall
6f90: 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69  oc,.    winMemSi
6fa0: 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f  ze,.    winMemRo
6fb0: 75 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d 65  undup,.    winMe
6fc0: 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d 65  mInit,.    winMe
6fd0: 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20 26  mShutdown,.    &
6fe0: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20 7d  win_mem_data.  }
6ff0: 3b 0a 20 20 72 65 74 75 72 6e 20 26 77 69 6e 4d  ;.  return &winM
7000: 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f  emMethods;.}..vo
7010: 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74  id sqlite3MemSet
7020: 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20  Default(void){. 
7030: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
7040: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41  SQLITE_CONFIG_MA
7050: 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d  LLOC, sqlite3Mem
7060: 47 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a 23  GetWin32());.}.#
7070: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7080: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a  WIN32_MALLOC */.
7090: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
70a0: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f   UTF-8 string to
70b0: 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f   Microsoft Unico
70c0: 64 65 20 28 55 54 46 2d 31 36 3f 29 2e 20 0a 2a  de (UTF-16?). .*
70d0: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
70e0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
70f0: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
7100: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a  ed from malloc..
7110: 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52  */.static LPWSTR
7120: 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 63   utf8ToUnicode(c
7130: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
7140: 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43 68  name){.  int nCh
7150: 61 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57 69  ar;.  LPWSTR zWi
7160: 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e  deFilename;..  n
7170: 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79  Char = osMultiBy
7180: 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f  teToWideChar(CP_
7190: 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61  UTF8, 0, zFilena
71a0: 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29  me, -1, NULL, 0)
71b0: 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30  ;.  if( nChar==0
71c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
71d0: 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65 46 69 6c  ;.  }.  zWideFil
71e0: 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f  ename = sqlite3_
71f0: 6d 61 6c 6c 6f 63 28 20 6e 43 68 61 72 2a 73 69  malloc( nChar*si
7200: 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c 65 6e 61  zeof(zWideFilena
7210: 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  me[0]) );.  if( 
7220: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3d 3d 30  zWideFilename==0
7230: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
7240: 3b 0a 20 20 7d 0a 20 20 6e 43 68 61 72 20 3d 20  ;.  }.  nChar = 
7250: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  osMultiByteToWid
7260: 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30  eChar(CP_UTF8, 0
7270: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
7280: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 0a   zWideFilename,.
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72b0: 6e 43 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43  nChar);.  if( nC
72c0: 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  har==0 ){.    sq
72d0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65  lite3_free(zWide
72e0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Filename);.    z
72f0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 30  WideFilename = 0
7300: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
7310: 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  WideFilename;.}.
7320: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d  ./*.** Convert M
7330: 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65  icrosoft Unicode
7340: 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63   to UTF-8.  Spac
7350: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
7360: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
7370: 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  .** obtained fro
7380: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
7390: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ()..*/.static ch
73a0: 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 55 74 66  ar *unicodeToUtf
73b0: 38 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65 46  8(LPCWSTR zWideF
73c0: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ilename){.  int 
73d0: 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a  nByte;.  char *z
73e0: 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42 79  Filename;..  nBy
73f0: 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54  te = osWideCharT
7400: 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54  oMultiByte(CP_UT
7410: 46 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65  F8, 0, zWideFile
7420: 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20  name, -1, 0, 0, 
7430: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79  0, 0);.  if( nBy
7440: 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72  te == 0 ){.    r
7450: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
7460: 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Filename = sqlit
7470: 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65  e3_malloc( nByte
7480: 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   );.  if( zFilen
7490: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
74a0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42  turn 0;.  }.  nB
74b0: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
74c0: 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55  ToMultiByte(CP_U
74d0: 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c  TF8, 0, zWideFil
74e0: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65  ename, -1, zFile
74f0: 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20  name, nByte,.   
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7510: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
7520: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
7530: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  == 0 ){.    sqli
7540: 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61  te3_free(zFilena
7550: 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  me);.    zFilena
7560: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
7570: 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  turn zFilename;.
7580: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
7590: 20 61 6e 20 41 4e 53 49 20 73 74 72 69 6e 67 20   an ANSI string 
75a0: 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69  to Microsoft Uni
75b0: 63 6f 64 65 2c 20 62 61 73 65 64 20 6f 6e 20 74  code, based on t
75c0: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 63 6f  he.** current co
75d0: 64 65 70 61 67 65 20 73 65 74 74 69 6e 67 73 20  depage settings 
75e0: 66 6f 72 20 66 69 6c 65 20 61 70 69 73 2e 0a 2a  for file apis..*
75f0: 2a 20 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  * .** Space to h
7600: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
7610: 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69   string is obtai
7620: 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69  ned.** from sqli
7630: 74 65 33 5f 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73  te3_malloc..*/.s
7640: 74 61 74 69 63 20 4c 50 57 53 54 52 20 6d 62 63  tatic LPWSTR mbc
7650: 73 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74  sToUnicode(const
7660: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
7670: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ){.  int nByte;.
7680: 20 20 4c 50 57 53 54 52 20 7a 4d 62 63 73 46 69    LPWSTR zMbcsFi
7690: 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f  lename;.  int co
76a0: 64 65 70 61 67 65 20 3d 20 6f 73 41 72 65 46 69  depage = osAreFi
76b0: 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43  leApisANSI() ? C
76c0: 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50  P_ACP : CP_OEMCP
76d0: 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d  ;..  nByte = osM
76e0: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
76f0: 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20  ar(codepage, 0, 
7700: 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e  zFilename, -1, N
7710: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 20 20 20 20 20 30 29 2a 73 69 7a 65 6f 66 28 57       0)*sizeof(W
7740: 43 48 41 52 29 3b 0a 20 20 69 66 28 20 6e 42 79  CHAR);.  if( nBy
7750: 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  te==0 ){.    ret
7760: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62  urn 0;.  }.  zMb
7770: 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c  csFilename = sql
7780: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79  ite3_malloc( nBy
7790: 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62 63 73 46  te*sizeof(zMbcsF
77a0: 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20  ilename[0]) );. 
77b0: 20 69 66 28 20 7a 4d 62 63 73 46 69 6c 65 6e 61   if( zMbcsFilena
77c0: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
77d0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
77e0: 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65  te = osMultiByte
77f0: 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65 70  ToWideChar(codep
7800: 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  age, 0, zFilenam
7810: 65 2c 20 2d 31 2c 20 7a 4d 62 63 73 46 69 6c 65  e, -1, zMbcsFile
7820: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
7830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7840: 20 20 20 20 20 20 6e 42 79 74 65 29 3b 0a 20 20        nByte);.  
7850: 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a  if( nByte==0 ){.
7860: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
7870: 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 29 3b  (zMbcsFilename);
7880: 0a 20 20 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61  .    zMbcsFilena
7890: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
78a0: 74 75 72 6e 20 7a 4d 62 63 73 46 69 6c 65 6e 61  turn zMbcsFilena
78b0: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
78c0: 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55  vert Microsoft U
78d0: 6e 69 63 6f 64 65 20 74 6f 20 6d 75 6c 74 69 2d  nicode to multi-
78e0: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
78f0: 74 72 69 6e 67 2c 20 62 61 73 65 64 20 6f 6e 20  tring, based on 
7900: 74 68 65 0a 2a 2a 20 75 73 65 72 27 73 20 41 4e  the.** user's AN
7910: 53 49 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a 0a  SI codepage..**.
7920: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
7930: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
7940: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
7950: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
7960: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74  _malloc()..*/.st
7970: 61 74 69 63 20 63 68 61 72 20 2a 75 6e 69 63 6f  atic char *unico
7980: 64 65 54 6f 4d 62 63 73 28 4c 50 43 57 53 54 52  deToMbcs(LPCWSTR
7990: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b   zWideFilename){
79a0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
79b0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
79c0: 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20  .  int codepage 
79d0: 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41  = osAreFileApisA
79e0: 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a  NSI() ? CP_ACP :
79f0: 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42   CP_OEMCP;..  nB
7a00: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
7a10: 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65  ToMultiByte(code
7a20: 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69  page, 0, zWideFi
7a30: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30  lename, -1, 0, 0
7a40: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  , 0, 0);.  if( n
7a50: 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Byte == 0 ){.   
7a60: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
7a70: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   zFilename = sql
7a80: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79  ite3_malloc( nBy
7a90: 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c  te );.  if( zFil
7aa0: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ename==0 ){.    
7ab0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
7ac0: 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68  nByte = osWideCh
7ad0: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f  arToMultiByte(co
7ae0: 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65  depage, 0, zWide
7af0: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46  Filename, -1, zF
7b00: 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b20: 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 2c 20           nByte, 
7b30: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79  0, 0);.  if( nBy
7b40: 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73  te == 0 ){.    s
7b50: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c  qlite3_free(zFil
7b60: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c  ename);.    zFil
7b70: 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  ename = 0;.  }. 
7b80: 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d   return zFilenam
7b90: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  e;.}../*.** Conv
7ba0: 65 72 74 20 6d 75 6c 74 69 62 79 74 65 20 63 68  ert multibyte ch
7bb0: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 20 74  aracter string t
7bc0: 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20  o UTF-8.  Space 
7bd0: 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72  to hold the.** r
7be0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
7bf0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
7c00: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
7c10: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
7c20: 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
7c30: 5f 75 74 66 38 28 63 6f 6e 73 74 20 63 68 61 72  _utf8(const char
7c40: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
7c50: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 55  char *zFilenameU
7c60: 74 66 38 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54  tf8;.  LPWSTR zT
7c70: 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57  mpWide;..  zTmpW
7c80: 69 64 65 20 3d 20 6d 62 63 73 54 6f 55 6e 69 63  ide = mbcsToUnic
7c90: 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
7ca0: 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d    if( zTmpWide==
7cb0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
7cc0: 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61  0;.  }.  zFilena
7cd0: 6d 65 55 74 66 38 20 3d 20 75 6e 69 63 6f 64 65  meUtf8 = unicode
7ce0: 54 6f 55 74 66 38 28 7a 54 6d 70 57 69 64 65 29  ToUtf8(zTmpWide)
7cf0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
7d00: 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65  (zTmpWide);.  re
7d10: 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74  turn zFilenameUt
7d20: 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  f8;.}../*.** Con
7d30: 76 65 72 74 20 55 54 46 2d 38 20 74 6f 20 6d 75  vert UTF-8 to mu
7d40: 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74 65  ltibyte characte
7d50: 72 20 73 74 72 69 6e 67 2e 20 20 53 70 61 63 65  r string.  Space
7d60: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a   to hold the .**
7d70: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
7d80: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
7d90: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
7da0: 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  ()..*/.char *sql
7db0: 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f  ite3_win32_utf8_
7dc0: 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74 20 63 68  to_mbcs(const ch
7dd0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
7de0: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
7df0: 65 4d 62 63 73 3b 0a 20 20 4c 50 57 53 54 52 20  eMbcs;.  LPWSTR 
7e00: 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d  zTmpWide;..  zTm
7e10: 70 57 69 64 65 20 3d 20 75 74 66 38 54 6f 55 6e  pWide = utf8ToUn
7e20: 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
7e30: 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65  ;.  if( zTmpWide
7e40: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
7e50: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  n 0;.  }.  zFile
7e60: 6e 61 6d 65 4d 62 63 73 20 3d 20 75 6e 69 63 6f  nameMbcs = unico
7e70: 64 65 54 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64  deToMbcs(zTmpWid
7e80: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
7e90: 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  ee(zTmpWide);.  
7ea0: 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65  return zFilename
7eb0: 4d 62 63 73 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Mbcs;.}.../*.** 
7ec0: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
7ed0: 20 6f 66 20 67 65 74 4c 61 73 74 45 72 72 6f 72   of getLastError
7ee0: 4d 73 67 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69  Msg.** is zero i
7ef0: 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
7f00: 61 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20  age fits in the 
7f10: 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a  buffer, or non-z
7f20: 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ero.** otherwise
7f30: 20 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65   (if the message
7f40: 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e   was truncated).
7f50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
7f60: 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 44  etLastErrorMsg(D
7f70: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20  WORD lastErrno, 
7f80: 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
7f90: 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d  zBuf){.  /* Form
7fa0: 61 74 4d 65 73 73 61 67 65 20 72 65 74 75 72 6e  atMessage return
7fb0: 73 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20  s 0 on failure. 
7fc0: 20 4f 74 68 65 72 77 69 73 65 20 69 74 0a 20 20   Otherwise it.  
7fd0: 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ** returns the n
7fe0: 75 6d 62 65 72 20 6f 66 20 54 43 48 41 52 73 20  umber of TCHARs 
7ff0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f  written to the o
8000: 75 74 70 75 74 0a 20 20 2a 2a 20 62 75 66 66 65  utput.  ** buffe
8010: 72 2c 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65  r, excluding the
8020: 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c   terminating nul
8030: 6c 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44  l char..  */.  D
8040: 57 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a  WORD dwLen = 0;.
8050: 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30    char *zOut = 0
8060: 3b 0a 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  ;..  if( isNT() 
8070: 29 7b 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54  ){.    LPWSTR zT
8080: 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a  empWide = NULL;.
8090: 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f      dwLen = osFo
80a0: 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52  rmatMessageW(FOR
80b0: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f  MAT_MESSAGE_ALLO
80c0: 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20  CATE_BUFFER |.  
80d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80e0: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
80f0: 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53  T_MESSAGE_FROM_S
8100: 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20  YSTEM |.        
8110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8120: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
8130: 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52  AGE_IGNORE_INSER
8140: 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TS,.            
8150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8160: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
8170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8180: 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20      lastErrno,. 
8190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 28 4c 50 57              (LPW
81d0: 53 54 52 29 20 26 7a 54 65 6d 70 57 69 64 65 2c  STR) &zTempWide,
81e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
8200: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
8220: 3b 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20  ;.    if( dwLen 
8230: 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  > 0 ){.      /* 
8240: 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65  allocate a buffe
8250: 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f  r and convert to
8260: 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73   UTF8 */.      s
8270: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
8280: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
8290: 20 7a 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65 54   zOut = unicodeT
82a0: 6f 55 74 66 38 28 7a 54 65 6d 70 57 69 64 65 29  oUtf8(zTempWide)
82b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
82c0: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
82d0: 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20  ;.      /* free 
82e0: 74 68 65 20 73 79 73 74 65 6d 20 62 75 66 66 65  the system buffe
82f0: 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46  r allocated by F
8300: 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a  ormatMessage */.
8310: 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65        osLocalFre
8320: 65 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20  e(zTempWide);.  
8330: 20 20 7d 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73    }./* isNT() is
8340: 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f   1 if SQLITE_OS_
8350: 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69  WINCE==1, so thi
8360: 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20  s else is never 
8370: 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69  executed. .** Si
8380: 6e 63 65 20 74 68 65 20 41 4e 53 49 20 76 65 72  nce the ANSI ver
8390: 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69  sion of these Wi
83a0: 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74  ndows API do not
83b0: 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45   exist for WINCE
83c0: 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74  ,.** it's import
83d0: 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72  ant to not refer
83e0: 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49  ence them for WI
83f0: 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23  NCE builds..*/.#
8400: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
8410: 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20  CE==0.  }else{. 
8420: 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 20 3d     char *zTemp =
8430: 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e   NULL;.    dwLen
8440: 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61   = osFormatMessa
8450: 67 65 41 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41  geA(FORMAT_MESSA
8460: 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46  GE_ALLOCATE_BUFF
8470: 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ER |.           
8480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8490: 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45    FORMAT_MESSAGE
84a0: 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20  _FROM_SYSTEM |. 
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d              FORM
84d0: 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52  AT_MESSAGE_IGNOR
84e0: 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20  E_INSERTS,.     
84f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8500: 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20          NULL,.  
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8520: 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 45             lastE
8530: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8550: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20     0,.          
8560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8570: 20 20 20 28 4c 50 53 54 52 29 20 26 7a 54 65 6d     (LPSTR) &zTem
8580: 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
8590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85a0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85c0: 30 29 3b 0a 20 20 20 20 69 66 28 20 64 77 4c 65  0);.    if( dwLe
85d0: 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f  n > 0 ){.      /
85e0: 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66  * allocate a buf
85f0: 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20  fer and convert 
8600: 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20  to UTF8 */.     
8610: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
8620: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
8630: 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65     zOut = sqlite
8640: 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
8650: 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20  utf8(zTemp);.   
8660: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
8670: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
8680: 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73     /* free the s
8690: 79 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c  ystem buffer all
86a0: 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74  ocated by Format
86b0: 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20  Message */.     
86c0: 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65   osLocalFree(zTe
86d0: 6d 70 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  mp);.    }.#endi
86e0: 66 0a 20 20 7d 0a 20 20 69 66 28 20 30 20 3d 3d  f.  }.  if( 0 ==
86f0: 20 64 77 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71   dwLen ){.    sq
8700: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
8710: 42 75 66 2c 20 7a 42 75 66 2c 20 22 4f 73 45 72  Buf, zBuf, "OsEr
8720: 72 6f 72 20 30 78 25 78 20 28 25 75 29 22 2c 20  ror 0x%x (%u)", 
8730: 6c 61 73 74 45 72 72 6e 6f 2c 20 6c 61 73 74 45  lastErrno, lastE
8740: 72 72 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rrno);.  }else{.
8750: 20 20 20 20 2f 2a 20 63 6f 70 79 20 61 20 6d 61      /* copy a ma
8760: 78 69 6d 75 6d 20 6f 66 20 6e 42 75 66 20 63 68  ximum of nBuf ch
8770: 61 72 73 20 74 6f 20 6f 75 74 70 75 74 20 62 75  ars to output bu
8780: 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ffer */.    sqli
8790: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
87a0: 66 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a  f, zBuf, "%s", z
87b0: 4f 75 74 29 3b 0a 20 20 20 20 2f 2a 20 66 72 65  Out);.    /* fre
87c0: 65 20 74 68 65 20 55 54 46 38 20 62 75 66 66 65  e the UTF8 buffe
87d0: 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  r */.    sqlite3
87e0: 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d  _free(zOut);.  }
87f0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
8800: 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /*.**.** This fu
8810: 6e 63 74 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45  nction - winLogE
8820: 72 72 6f 72 41 74 4c 69 6e 65 28 29 20 2d 20 69  rrorAtLine() - i
8830: 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c  s only ever call
8840: 65 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f  ed via the macro
8850: 0a 2a 2a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  .** winLogError(
8860: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
8870: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
8880: 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20   after an error 
8890: 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20  occurs in an OS 
88a0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20  function..** It 
88b0: 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75  logs a message u
88c0: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67  sing sqlite3_log
88d0: 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  () containing th
88e0: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
88f0: 6f 66 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  of.** error code
8900: 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c   and, if possibl
8910: 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61  e, the human-rea
8920: 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74  dable equivalent
8930: 20 66 72 6f 6d 20 0a 2a 2a 20 46 6f 72 6d 61 74   from .** Format
8940: 4d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  Message..**.** T
8950: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
8960: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
8970: 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20  macro should be 
8980: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
8990: 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72  hat.** will be r
89a0: 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74  eturned to SQLit
89b0: 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49  e (e.g. SQLITE_I
89c0: 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c  OERR_DELETE, SQL
89d0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a  ITE_CANTOPEN). .
89e0: 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73 65  ** The two subse
89f0: 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20  quent arguments 
8a00: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61  should be the na
8a10: 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e  me of the OS fun
8a20: 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61  ction that.** fa
8a30: 69 6c 65 64 20 61 6e 64 20 74 68 65 20 74 68 65  iled and the the
8a40: 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
8a50: 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 20 69 66  -system path, if
8a60: 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65   any..*/.#define
8a70: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 61 2c 62   winLogError(a,b
8a80: 2c 63 2c 64 29 20 20 20 77 69 6e 4c 6f 67 45 72  ,c,d)   winLogEr
8a90: 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c  rorAtLine(a,b,c,
8aa0: 64 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74  d,__LINE__).stat
8ab0: 69 63 20 69 6e 74 20 77 69 6e 4c 6f 67 45 72 72  ic int winLogErr
8ac0: 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20  orAtLine(.  int 
8ad0: 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20  errcode,        
8ae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8af0: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
8b00: 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   */.  DWORD last
8b10: 45 72 72 6e 6f 2c 20 20 20 20 20 20 20 20 20 20  Errno,          
8b20: 20 20 20 20 20 20 2f 2a 20 57 69 6e 33 32 20 6c        /* Win32 l
8b30: 61 73 74 20 65 72 72 6f 72 20 2a 2f 0a 20 20 63  ast error */.  c
8b40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
8b50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
8b60: 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e  * Name of OS fun
8b70: 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65  ction that faile
8b80: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
8b90: 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
8ba0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70         /* File p
8bb0: 61 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 77  ath associated w
8bc0: 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69  ith error */.  i
8bd0: 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20  nt iLine        
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8bf0: 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75  * Source line nu
8c00: 6d 62 65 72 20 77 68 65 72 65 20 65 72 72 6f 72  mber where error
8c10: 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a   occurred */.){.
8c20: 20 20 63 68 61 72 20 7a 4d 73 67 5b 35 30 30 5d    char zMsg[500]
8c30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8c40: 20 20 2f 2a 20 48 75 6d 61 6e 20 72 65 61 64 61    /* Human reada
8c50: 62 6c 65 20 65 72 72 6f 72 20 74 65 78 74 20 2a  ble error text *
8c60: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
8c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c80: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
8c90: 74 65 72 20 2a 2f 0a 0a 20 20 7a 4d 73 67 5b 30  ter */..  zMsg[0
8ca0: 5d 20 3d 20 30 3b 0a 20 20 67 65 74 4c 61 73 74  ] = 0;.  getLast
8cb0: 45 72 72 6f 72 4d 73 67 28 6c 61 73 74 45 72 72  ErrorMsg(lastErr
8cc0: 6e 6f 2c 20 73 69 7a 65 6f 66 28 7a 4d 73 67 29  no, sizeof(zMsg)
8cd0: 2c 20 7a 4d 73 67 29 3b 0a 20 20 61 73 73 65 72  , zMsg);.  asser
8ce0: 74 28 20 65 72 72 63 6f 64 65 21 3d 53 51 4c 49  t( errcode!=SQLI
8cf0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a  TE_OK );.  if( z
8d00: 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20  Path==0 ) zPath 
8d10: 3d 20 22 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = "";.  for(i=0;
8d20: 20 7a 4d 73 67 5b 69 5d 20 26 26 20 7a 4d 73 67   zMsg[i] && zMsg
8d30: 5b 69 5d 21 3d 27 5c 72 27 20 26 26 20 7a 4d 73  [i]!='\r' && zMs
8d40: 67 5b 69 5d 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29  g[i]!='\n'; i++)
8d50: 7b 7d 0a 20 20 7a 4d 73 67 5b 69 5d 20 3d 20 30  {}.  zMsg[i] = 0
8d60: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ;.  sqlite3_log(
8d70: 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20 22  errcode,.      "
8d80: 6f 73 5f 77 69 6e 2e 63 3a 25 64 3a 20 28 25 64  os_win.c:%d: (%d
8d90: 29 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a  ) %s(%s) - %s",.
8da0: 20 20 20 20 20 20 69 4c 69 6e 65 2c 20 6c 61 73        iLine, las
8db0: 74 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a  tErrno, zFunc, z
8dc0: 50 61 74 68 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a  Path, zMsg.  );.
8dd0: 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64  .  return errcod
8de0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  e;.}../*.** The 
8df0: 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  number of times 
8e00: 74 68 61 74 20 61 20 52 65 61 64 46 69 6c 65 28  that a ReadFile(
8e10: 29 2c 20 57 72 69 74 65 46 69 6c 65 28 29 2c 20  ), WriteFile(), 
8e20: 61 6e 64 20 44 65 6c 65 74 65 46 69 6c 65 28 29  and DeleteFile()
8e30: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 72  .** will be retr
8e40: 69 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20  ied following a 
8e50: 6c 6f 63 6b 69 6e 67 20 65 72 72 6f 72 20 2d 20  locking error - 
8e60: 70 72 6f 62 61 62 6c 79 20 63 61 75 73 65 64 20  probably caused 
8e70: 62 79 20 0a 2a 2a 20 61 6e 74 69 76 69 72 75 73  by .** antivirus
8e80: 20 73 6f 66 74 77 61 72 65 2e 20 20 41 6c 73 6f   software.  Also
8e90: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 64 65 6c   the initial del
8ea0: 61 79 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  ay before the fi
8eb0: 72 73 74 20 72 65 74 72 79 2e 0a 2a 2a 20 54 68  rst retry..** Th
8ec0: 65 20 64 65 6c 61 79 20 69 6e 63 72 65 61 73 65  e delay increase
8ed0: 73 20 6c 69 6e 65 61 72 6c 79 20 77 69 74 68 20  s linearly with 
8ee0: 65 61 63 68 20 72 65 74 72 79 2e 0a 2a 2f 0a 23  each retry..*/.#
8ef0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
8f00: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 0a  N32_IOERR_RETRY.
8f10: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
8f20: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
8f30: 59 20 31 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  Y 10.#endif.#ifn
8f40: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
8f50: 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c  _IOERR_RETRY_DEL
8f60: 41 59 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  AY.# define SQLI
8f70: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
8f80: 45 54 52 59 5f 44 45 4c 41 59 20 32 35 0a 23 65  ETRY_DELAY 25.#e
8f90: 6e 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20  ndif.static int 
8fa0: 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 20  win32IoerrRetry 
8fb0: 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  = SQLITE_WIN32_I
8fc0: 4f 45 52 52 5f 52 45 54 52 59 3b 0a 73 74 61 74  OERR_RETRY;.stat
8fd0: 69 63 20 69 6e 74 20 77 69 6e 33 32 49 6f 65 72  ic int win32Ioer
8fe0: 72 52 65 74 72 79 44 65 6c 61 79 20 3d 20 53 51  rRetryDelay = SQ
8ff0: 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52  LITE_WIN32_IOERR
9000: 5f 52 45 54 52 59 5f 44 45 4c 41 59 3b 0a 0a 2f  _RETRY_DELAY;../
9010: 2a 0a 2a 2a 20 49 66 20 61 20 52 65 61 64 46 69  *.** If a ReadFi
9020: 6c 65 28 29 20 6f 72 20 57 72 69 74 65 46 69 6c  le() or WriteFil
9030: 65 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73  e() error occurs
9040: 2c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  , invoke this ro
9050: 75 74 69 6e 65 0a 2a 2a 20 74 6f 20 73 65 65 20  utine.** to see 
9060: 69 66 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20  if it should be 
9070: 72 65 74 72 69 65 64 2e 20 20 52 65 74 75 72 6e  retried.  Return
9080: 20 54 52 55 45 20 74 6f 20 72 65 74 72 79 2e 20   TRUE to retry. 
9090: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
90a0: 20 74 6f 20 67 69 76 65 20 75 70 20 77 69 74 68   to give up with
90b0: 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74   an error..*/.st
90c0: 61 74 69 63 20 69 6e 74 20 72 65 74 72 79 49 6f  atic int retryIo
90d0: 65 72 72 28 69 6e 74 20 2a 70 6e 52 65 74 72 79  err(int *pnRetry
90e0: 2c 20 44 57 4f 52 44 20 2a 70 45 72 72 6f 72 29  , DWORD *pError)
90f0: 7b 0a 20 20 44 57 4f 52 44 20 65 20 3d 20 6f 73  {.  DWORD e = os
9100: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
9110: 20 20 69 66 28 20 2a 70 6e 52 65 74 72 79 3e 3d    if( *pnRetry>=
9120: 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 20  win32IoerrRetry 
9130: 29 7b 0a 20 20 20 20 69 66 28 20 70 45 72 72 6f  ){.    if( pErro
9140: 72 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 72 72  r ){.      *pErr
9150: 6f 72 20 3d 20 65 3b 0a 20 20 20 20 7d 0a 20 20  or = e;.    }.  
9160: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
9170: 20 20 69 66 28 20 65 3d 3d 45 52 52 4f 52 5f 41    if( e==ERROR_A
9180: 43 43 45 53 53 5f 44 45 4e 49 45 44 20 7c 7c 0a  CCESS_DENIED ||.
9190: 20 20 20 20 20 20 65 3d 3d 45 52 52 4f 52 5f 4c        e==ERROR_L
91a0: 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f 4e 20 7c 7c  OCK_VIOLATION ||
91b0: 0a 20 20 20 20 20 20 65 3d 3d 45 52 52 4f 52 5f  .      e==ERROR_
91c0: 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f  SHARING_VIOLATIO
91d0: 4e 20 29 7b 0a 20 20 20 20 6f 73 53 6c 65 65 70  N ){.    osSleep
91e0: 28 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79  (win32IoerrRetry
91f0: 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72  Delay*(1+*pnRetr
9200: 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65  y));.    ++*pnRe
9210: 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  try;.    return 
9220: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 72  1;.  }.  if( pEr
9230: 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72 72  ror ){.    *pErr
9240: 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65  or = e;.  }.  re
9250: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
9260: 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72   Log a I/O error
9270: 20 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a   retry episode..
9280: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
9290: 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e 52 65 74  ogIoerr(int nRet
92a0: 72 79 29 7b 0a 20 20 69 66 28 20 6e 52 65 74 72  ry){.  if( nRetr
92b0: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
92c0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 49 4f 45 52  _log(SQLITE_IOER
92d0: 52 2c 20 0a 20 20 20 20 20 20 22 64 65 6c 61 79  R, .      "delay
92e0: 65 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b  ed %dms for lock
92f0: 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63  /sharing conflic
9300: 74 22 2c 0a 20 20 20 20 20 20 77 69 6e 33 32 49  t",.      win32I
9310: 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 6e  oerrRetryDelay*n
9320: 52 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31 29  Retry*(nRetry+1)
9330: 2f 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a  /2.    );.  }.}.
9340: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
9350: 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  INCE./**********
9360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
93a0: 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
93b0: 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66 6f  contains code fo
93c0: 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f  r WinCE only..*/
93d0: 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 43  ./*.** Windows C
93e0: 45 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  E does not have 
93f0: 61 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 66 75  a localtime() fu
9400: 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 63 72 65 61  nction.  So crea
9410: 74 65 20 61 0a 2a 2a 20 73 75 62 73 74 69 74 75  te a.** substitu
9420: 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  te..*/.#include 
9430: 3c 74 69 6d 65 2e 68 3e 0a 73 74 72 75 63 74 20  <time.h>.struct 
9440: 74 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f 63 61  tm *__cdecl loca
9450: 6c 74 69 6d 65 28 63 6f 6e 73 74 20 74 69 6d 65  ltime(const time
9460: 5f 74 20 2a 74 29 0a 7b 0a 20 20 73 74 61 74 69  _t *t).{.  stati
9470: 63 20 73 74 72 75 63 74 20 74 6d 20 79 3b 0a 20  c struct tm y;. 
9480: 20 46 49 4c 45 54 49 4d 45 20 75 54 6d 2c 20 6c   FILETIME uTm, l
9490: 54 6d 3b 0a 20 20 53 59 53 54 45 4d 54 49 4d 45  Tm;.  SYSTEMTIME
94a0: 20 70 54 6d 3b 0a 20 20 73 71 6c 69 74 65 33 5f   pTm;.  sqlite3_
94b0: 69 6e 74 36 34 20 74 36 34 3b 0a 20 20 74 36 34  int64 t64;.  t64
94c0: 20 3d 20 2a 74 3b 0a 20 20 74 36 34 20 3d 20 28   = *t;.  t64 = (
94d0: 74 36 34 20 2b 20 31 31 36 34 34 34 37 33 36 30  t64 + 1164447360
94e0: 30 29 2a 31 30 30 30 30 30 30 30 3b 0a 20 20 75  0)*10000000;.  u
94f0: 54 6d 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65  Tm.dwLowDateTime
9500: 20 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20 26   = (DWORD)(t64 &
9510: 20 30 78 46 46 46 46 46 46 46 46 29 3b 0a 20 20   0xFFFFFFFF);.  
9520: 75 54 6d 2e 64 77 48 69 67 68 44 61 74 65 54 69  uTm.dwHighDateTi
9530: 6d 65 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20  me= (DWORD)(t64 
9540: 3e 3e 20 33 32 29 3b 0a 20 20 6f 73 46 69 6c 65  >> 32);.  osFile
9550: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
9560: 69 6d 65 28 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a  ime(&uTm,&lTm);.
9570: 20 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53 79    osFileTimeToSy
9580: 73 74 65 6d 54 69 6d 65 28 26 6c 54 6d 2c 26 70  stemTime(&lTm,&p
9590: 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f 79 65 61 72  Tm);.  y.tm_year
95a0: 20 3d 20 70 54 6d 2e 77 59 65 61 72 20 2d 20 31   = pTm.wYear - 1
95b0: 39 30 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20  900;.  y.tm_mon 
95c0: 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31  = pTm.wMonth - 1
95d0: 3b 0a 20 20 79 2e 74 6d 5f 77 64 61 79 20 3d 20  ;.  y.tm_wday = 
95e0: 70 54 6d 2e 77 44 61 79 4f 66 57 65 65 6b 3b 0a  pTm.wDayOfWeek;.
95f0: 20 20 79 2e 74 6d 5f 6d 64 61 79 20 3d 20 70 54    y.tm_mday = pT
9600: 6d 2e 77 44 61 79 3b 0a 20 20 79 2e 74 6d 5f 68  m.wDay;.  y.tm_h
9610: 6f 75 72 20 3d 20 70 54 6d 2e 77 48 6f 75 72 3b  our = pTm.wHour;
9620: 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54  .  y.tm_min = pT
9630: 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20 20 79 2e 74  m.wMinute;.  y.t
9640: 6d 5f 73 65 63 20 3d 20 70 54 6d 2e 77 53 65 63  m_sec = pTm.wSec
9650: 6f 6e 64 3b 0a 20 20 72 65 74 75 72 6e 20 26 79  ond;.  return &y
9660: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e  ;.}..#define HAN
9670: 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61  DLE_TO_WINFILE(a
9680: 29 20 28 77 69 6e 46 69 6c 65 2a 29 26 28 28 63  ) (winFile*)&((c
9690: 68 61 72 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66  har*)a)[-(int)of
96a0: 66 73 65 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68  fsetof(winFile,h
96b0: 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  )]../*.** Acquir
96c0: 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  e a lock on the 
96d0: 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74  handle h.*/.stat
96e0: 69 63 20 76 6f 69 64 20 77 69 6e 63 65 4d 75 74  ic void winceMut
96f0: 65 78 41 63 71 75 69 72 65 28 48 41 4e 44 4c 45  exAcquire(HANDLE
9700: 20 68 29 7b 0a 20 20 20 44 57 4f 52 44 20 64 77   h){.   DWORD dw
9710: 45 72 72 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20  Err;.   do {.   
9720: 20 20 64 77 45 72 72 20 3d 20 57 61 69 74 46 6f    dwErr = WaitFo
9730: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c  rSingleObject(h,
9740: 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d   INFINITE);.   }
9750: 20 77 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d   while (dwErr !=
9760: 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26   WAIT_OBJECT_0 &
9770: 26 20 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f  & dwErr != WAIT_
9780: 41 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a  ABANDONED);.}./*
9790: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f  .** Release a lo
97a0: 63 6b 20 61 63 71 75 69 72 65 64 20 62 79 20 77  ck acquired by w
97b0: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
97c0: 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69  ().*/.#define wi
97d0: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
97e0: 68 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28  h) ReleaseMutex(
97f0: 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  h)../*.** Create
9800: 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73   the mutex and s
9810: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65  hared memory use
9820: 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e  d for locking in
9830: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73   the file.** des
9840: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f  criptor pFile.*/
9850: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
9860: 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e  ceCreateLock(con
9870: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
9880: 6d 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  me, winFile *pFi
9890: 6c 65 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54  le){.  LPWSTR zT
98a0: 6f 6b 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61  ok;.  LPWSTR zNa
98b0: 6d 65 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74  me;.  BOOL bInit
98c0: 20 3d 20 54 52 55 45 3b 0a 0a 20 20 7a 4e 61 6d   = TRUE;..  zNam
98d0: 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64  e = utf8ToUnicod
98e0: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
98f0: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  if( zName==0 ){.
9900: 20 20 20 20 2f 2a 20 6f 75 74 20 6f 66 20 6d 65      /* out of me
9910: 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 72 65 74 75  mory */.    retu
9920: 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20  rn FALSE;.  }.. 
9930: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
9940: 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74  he local lockdat
9950: 61 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70  a */.  memset(&p
9960: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2c 20 30 2c 20  File->local, 0, 
9970: 73 69 7a 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f  sizeof(pFile->lo
9980: 63 61 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70  cal));..  /* Rep
9990: 6c 61 63 65 20 74 68 65 20 62 61 63 6b 73 6c 61  lace the backsla
99a0: 73 68 65 73 20 66 72 6f 6d 20 74 68 65 20 66 69  shes from the fi
99b0: 6c 65 6e 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72  lename and lower
99c0: 63 61 73 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20  case it.  ** to 
99d0: 64 65 72 69 76 65 20 61 20 6d 75 74 65 78 20 6e  derive a mutex n
99e0: 61 6d 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d  ame. */.  zTok =
99f0: 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e   osCharLowerW(zN
9a00: 61 6d 65 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a  ame);.  for (;*z
9a10: 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20  Tok;zTok++){.   
9a20: 20 69 66 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c   if (*zTok == '\
9a30: 5c 27 29 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b  \') *zTok = '_';
9a40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74  .  }..  /* Creat
9a50: 65 2f 6f 70 65 6e 20 74 68 65 20 6e 61 6d 65 64  e/open the named
9a60: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c   mutex */.  pFil
9a70: 65 2d 3e 68 4d 75 74 65 78 20 3d 20 6f 73 43 72  e->hMutex = osCr
9a80: 65 61 74 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c  eateMutexW(NULL,
9a90: 20 46 41 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a   FALSE, zName);.
9aa0: 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d    if (!pFile->hM
9ab0: 75 74 65 78 29 7b 0a 20 20 20 20 70 46 69 6c 65  utex){.    pFile
9ac0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
9ad0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
9ae0: 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
9af0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 70 46  SQLITE_ERROR, pF
9b00: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20  ile->lastErrno, 
9b10: 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b  "winceCreateLock
9b20: 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  1", zFilename);.
9b30: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9b40: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  (zName);.    ret
9b50: 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a  urn FALSE;.  }..
9b60: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65    /* Acquire the
9b70: 20 6d 75 74 65 78 20 62 65 66 6f 72 65 20 63 6f   mutex before co
9b80: 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77 69  ntinuing */.  wi
9b90: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
9ba0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
9bb0: 20 20 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74 68    .  /* Since th
9bc0: 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64  e names of named
9bd0: 20 6d 75 74 65 78 65 73 2c 20 73 65 6d 61 70 68   mutexes, semaph
9be0: 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61 70 70 69  ores, file mappi
9bf0: 6e 67 73 20 65 74 63 20 61 72 65 20 0a 20 20 2a  ngs etc are .  *
9c00: 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65  * case-sensitive
9c10: 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65  , take advantage
9c20: 20 6f 66 20 74 68 61 74 20 62 79 20 75 70 70 65   of that by uppe
9c30: 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65  rcasing the mute
9c40: 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20  x name.  ** and 
9c50: 75 73 69 6e 67 20 74 68 61 74 20 61 73 20 74 68  using that as th
9c60: 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d 61 70  e shared filemap
9c70: 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a  ping name..  */.
9c80: 20 20 6f 73 43 68 61 72 55 70 70 65 72 57 28 7a    osCharUpperW(z
9c90: 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e  Name);.  pFile->
9ca0: 68 53 68 61 72 65 64 20 3d 20 6f 73 43 72 65 61  hShared = osCrea
9cb0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 49  teFileMappingW(I
9cc0: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
9cd0: 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20  LUE, NULL,.     
9ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d00: 20 20 20 50 41 47 45 5f 52 45 41 44 57 52 49 54     PAGE_READWRIT
9d10: 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e  E, 0, sizeof(win
9d20: 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20  ceLock),.       
9d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d50: 20 7a 4e 61 6d 65 29 3b 20 20 0a 0a 20 20 2f 2a   zName);  ..  /*
9d60: 20 53 65 74 20 61 20 66 6c 61 67 20 74 68 61 74   Set a flag that
9d70: 20 69 6e 64 69 63 61 74 65 73 20 77 65 27 72 65   indicates we're
9d80: 20 74 68 65 20 66 69 72 73 74 20 74 6f 20 63 72   the first to cr
9d90: 65 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  eate the memory 
9da0: 73 6f 20 69 74 20 0a 20 20 2a 2a 20 6d 75 73 74  so it .  ** must
9db0: 20 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c   be zero-initial
9dc0: 69 7a 65 64 20 2a 2f 0a 20 20 69 66 20 28 6f 73  ized */.  if (os
9dd0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 3d  GetLastError() =
9de0: 3d 20 45 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f  = ERROR_ALREADY_
9df0: 45 58 49 53 54 53 29 7b 0a 20 20 20 20 62 49 6e  EXISTS){.    bIn
9e00: 69 74 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a  it = FALSE;.  }.
9e10: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
9e20: 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66  zName);..  /* If
9e30: 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e   we succeeded in
9e40: 20 6d 61 6b 69 6e 67 20 74 68 65 20 73 68 61 72   making the shar
9e50: 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65  ed memory handle
9e60: 2c 20 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69  , map it. */.  i
9e70: 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  f (pFile->hShare
9e80: 64 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73  d){.    pFile->s
9e90: 68 61 72 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f  hared = (winceLo
9ea0: 63 6b 2a 29 6f 73 4d 61 70 56 69 65 77 4f 66 46  ck*)osMapViewOfF
9eb0: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72  ile(pFile->hShar
9ec0: 65 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ed, .           
9ed0: 20 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c    FILE_MAP_READ|
9ee0: 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20  FILE_MAP_WRITE, 
9ef0: 30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e  0, 0, sizeof(win
9f00: 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a  ceLock));.    /*
9f10: 20 49 66 20 6d 61 70 70 69 6e 67 20 66 61 69 6c   If mapping fail
9f20: 65 64 2c 20 63 6c 6f 73 65 20 74 68 65 20 73 68  ed, close the sh
9f30: 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64  ared memory hand
9f40: 6c 65 20 61 6e 64 20 65 72 61 73 65 20 69 74 20  le and erase it 
9f50: 2a 2f 0a 20 20 20 20 69 66 20 28 21 70 46 69 6c  */.    if (!pFil
9f60: 65 2d 3e 73 68 61 72 65 64 29 7b 0a 20 20 20 20  e->shared){.    
9f70: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
9f80: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
9f90: 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e  ror();.      win
9fa0: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
9fb0: 45 52 52 4f 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  ERROR, pFile->la
9fc0: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
9fd0: 20 20 20 20 20 20 20 20 22 77 69 6e 63 65 43 72          "winceCr
9fe0: 65 61 74 65 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c  eateLock2", zFil
9ff0: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6f 73  ename);.      os
a000: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
a010: 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20 20 20  e->hShared);.   
a020: 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65     pFile->hShare
a030: 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  d = NULL;.    }.
a040: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61    }..  /* If sha
a050: 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64  red memory could
a060: 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64 2c   not be created,
a070: 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20   then close the 
a080: 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c 20 2a  mutex and fail *
a090: 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68  /.  if (pFile->h
a0a0: 53 68 61 72 65 64 20 3d 3d 20 4e 55 4c 4c 29 7b  Shared == NULL){
a0b0: 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52  .    winceMutexR
a0c0: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
a0d0: 75 74 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f  utex);.    osClo
a0e0: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
a0f0: 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69  hMutex);.    pFi
a100: 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c  le->hMutex = NUL
a110: 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41  L;.    return FA
a120: 4c 53 45 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  LSE;.  }.  .  /*
a130: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
a140: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66  shared memory if
a150: 20 77 65 27 72 65 20 73 75 70 70 6f 73 65 64 20   we're supposed 
a160: 74 6f 20 2a 2f 0a 20 20 69 66 20 28 62 49 6e 69  to */.  if (bIni
a170: 74 29 20 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  t) {.    memset(
a180: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30  pFile->shared, 0
a190: 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f  , sizeof(winceLo
a1a0: 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e  ck));.  }..  win
a1b0: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
a1c0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
a1d0: 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 7d 0a   return TRUE;.}.
a1e0: 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74  ./*.** Destroy t
a1f0: 68 65 20 70 61 72 74 20 6f 66 20 77 69 6e 46 69  he part of winFi
a200: 6c 65 20 74 68 61 74 20 64 65 61 6c 73 20 77 69  le that deals wi
a210: 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a  th wince locks.*
a220: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
a230: 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77  nceDestroyLock(w
a240: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
a250: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75    if (pFile->hMu
a260: 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71  tex){.    /* Acq
a270: 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20 2a  uire the mutex *
a280: 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78  /.    winceMutex
a290: 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
a2a0: 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20  Mutex);..    /* 
a2b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
a2c0: 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f 62  ocks should prob
a2d0: 61 62 6c 79 20 61 73 73 65 72 74 20 69 6e 20 64  ably assert in d
a2e0: 65 62 75 67 20 6d 6f 64 65 2c 20 62 75 74 20 74  ebug mode, but t
a2f0: 68 65 79 0a 20 20 20 20 20 20 20 61 72 65 20 74  hey.       are t
a300: 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20 63 61 73  o cleanup in cas
a310: 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61  e any locks rema
a320: 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20  ined open */.   
a330: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
a340: 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20  l.nReaders){.   
a350: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
a360: 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20  ->nReaders --;. 
a370: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69     }.    if (pFi
a380: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
a390: 76 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ved){.      pFil
a3a0: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
a3b0: 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  rved = FALSE;.  
a3c0: 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c    }.    if (pFil
a3d0: 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e  e->local.bPendin
a3e0: 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  g){.      pFile-
a3f0: 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
a400: 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d  g = FALSE;.    }
a410: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
a420: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
a430: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
a440: 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
a450: 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ve = FALSE;.    
a460: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65 66  }..    /* De-ref
a470: 65 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65  erence and close
a480: 20 6f 75 72 20 63 6f 70 79 20 6f 66 20 74 68 65   our copy of the
a490: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68   shared memory h
a4a0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 6f 73 55  andle */.    osU
a4b0: 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  nmapViewOfFile(p
a4c0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20  File->shared);. 
a4d0: 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
a4e0: 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29  (pFile->hShared)
a4f0: 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77  ;..    /* Done w
a500: 69 74 68 20 74 68 65 20 6d 75 74 65 78 20 2a 2f  ith the mutex */
a510: 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52  .    winceMutexR
a520: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
a530: 75 74 65 78 29 3b 20 20 20 20 0a 20 20 20 20 6f  utex);    .    o
a540: 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
a550: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20  le->hMutex);.   
a560: 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d   pFile->hMutex =
a570: 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   NULL;.  }.}../*
a580: 20 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e   .** An implemen
a590: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f  tation of the Lo
a5a0: 63 6b 46 69 6c 65 28 29 20 41 50 49 20 6f 66 20  ckFile() API of 
a5b0: 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a  Windows for CE.*
a5c0: 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  /.static BOOL wi
a5d0: 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 48  nceLockFile(.  H
a5e0: 41 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a 20  ANDLE *phFile,. 
a5f0: 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66   DWORD dwFileOff
a600: 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
a610: 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
a620: 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
a630: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
a640: 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62  w,.  DWORD nNumb
a650: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48  erOfBytesToLockH
a660: 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65  igh.){.  winFile
a670: 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45   *pFile = HANDLE
a680: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69  _TO_WINFILE(phFi
a690: 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74  le);.  BOOL bRet
a6a0: 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20  urn = FALSE;..  
a6b0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
a6c0: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67  (dwFileOffsetHig
a6d0: 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  h);.  UNUSED_PAR
a6e0: 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66  AMETER(nNumberOf
a6f0: 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29  BytesToLockHigh)
a700: 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d  ;..  if (!pFile-
a710: 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20  >hMutex) return 
a720: 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74  TRUE;.  winceMut
a730: 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
a740: 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  >hMutex);..  /* 
a750: 57 61 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75  Wanting an exclu
a760: 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  sive lock? */.  
a770: 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
a780: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
a790: 41 52 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20  ARED_FIRST.     
a7a0: 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79    && nNumberOfBy
a7b0: 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
a7c0: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49  (DWORD)SHARED_SI
a7d0: 5a 45 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69  ZE){.    if (pFi
a7e0: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61  le->shared->nRea
a7f0: 64 65 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69  ders == 0 && pFi
a800: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63  le->shared->bExc
a810: 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20  lusive == 0){.  
a820: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
a830: 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
a840: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46   TRUE;.       pF
a850: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
a860: 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20  usive = TRUE;.  
a870: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
a880: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
a890: 20 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64    /* Want a read
a8a0: 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  -only lock? */. 
a8b0: 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
a8c0: 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
a8d0: 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54  ORD)SHARED_FIRST
a8e0: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e   &&.           n
a8f0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
a900: 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
a910: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61    if (pFile->sha
a920: 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
a930: 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69  == 0){.      pFi
a940: 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
a950: 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20  rs ++;.      if 
a960: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
a970: 65 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20  eaders == 1){.  
a980: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
a990: 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b  red->nReaders ++
a9a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a9b0: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
a9c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
a9d0: 57 61 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c  Want a pending l
a9e0: 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69  ock? */.  else i
a9f0: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
aa00: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e  ow == (DWORD)PEN
aa10: 44 49 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e 75  DING_BYTE && nNu
aa20: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
aa30: 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
aa40: 2f 2a 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67  /* If no pending
aa50: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61   lock has been a
aa60: 63 71 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63  cquired, then ac
aa70: 71 75 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20  quire it */.    
aa80: 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
aa90: 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30  d->bPending == 0
aaa0: 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
aab0: 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
aac0: 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  g = TRUE;.      
aad0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
aae0: 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20  nding = TRUE;.  
aaf0: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
ab00: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
ab10: 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72   /* Want a reser
ab20: 76 65 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65  ved lock? */.  e
ab30: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
ab40: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
ab50: 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 20  D)RESERVED_BYTE 
ab60: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
ab70: 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  sToLockLow == 1)
ab80: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
ab90: 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
aba0: 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20  ed == 0) {.     
abb0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
abc0: 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45  bReserved = TRUE
abd0: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
abe0: 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d  ocal.bReserved =
abf0: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65   TRUE;.      bRe
ac00: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
ac10: 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d   }.  }..  winceM
ac20: 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
ac30: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65  e->hMutex);.  re
ac40: 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a  turn bReturn;.}.
ac50: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  ./*.** An implem
ac60: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
ac70: 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f  UnlockFile API o
ac80: 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45  f Windows for CE
ac90: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
aca0: 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28  winceUnlockFile(
acb0: 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69 6c  .  HANDLE *phFil
acc0: 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  e,.  DWORD dwFil
acd0: 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57  eOffsetLow,.  DW
ace0: 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
acf0: 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  High,.  DWORD nN
ad00: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
ad10: 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  lockLow,.  DWORD
ad20: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
ad30: 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20  oUnlockHigh.){. 
ad40: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
ad50: 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46  = HANDLE_TO_WINF
ad60: 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42  ILE(phFile);.  B
ad70: 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41  OOL bReturn = FA
ad80: 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  LSE;..  UNUSED_P
ad90: 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65 4f  ARAMETER(dwFileO
ada0: 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55 4e  ffsetHigh);.  UN
adb0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
adc0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
add0: 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69  nlockHigh);..  i
ade0: 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65  f (!pFile->hMute
adf0: 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a  x) return TRUE;.
ae00: 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
ae10: 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
ae20: 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73  x);..  /* Releas
ae30: 69 6e 67 20 61 20 72 65 61 64 65 72 20 6c 6f 63  ing a reader loc
ae40: 6b 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76  k or an exclusiv
ae50: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20 28  e lock */.  if (
ae60: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
ae70: 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
ae80: 5f 46 49 52 53 54 29 7b 0a 20 20 20 20 2f 2a 20  _FIRST){.    /* 
ae90: 44 69 64 20 77 65 20 68 61 76 65 20 61 6e 20 65  Did we have an e
aea0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a  xclusive lock? *
aeb0: 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  /.    if (pFile-
aec0: 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
aed0: 65 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e){.      assert
aee0: 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54  (nNumberOfBytesT
aef0: 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44  oUnlockLow == (D
af00: 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45  WORD)SHARED_SIZE
af10: 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
af20: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
af30: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
af40: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
af50: 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53  Exclusive = FALS
af60: 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
af70: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 0a   = TRUE;.    }..
af80: 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 6a 75      /* Did we ju
af90: 73 74 20 68 61 76 65 20 61 20 72 65 61 64 65 72  st have a reader
afa0: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c   lock? */.    el
afb0: 73 65 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f  se if (pFile->lo
afc0: 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20  cal.nReaders){. 
afd0: 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d       assert(nNum
afe0: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
aff0: 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  ckLow == (DWORD)
b000: 53 48 41 52 45 44 5f 53 49 5a 45 20 7c 7c 20 6e  SHARED_SIZE || n
b010: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
b020: 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b 0a  nlockLow == 1);.
b030: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
b040: 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a  al.nReaders --;.
b050: 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d        if (pFile-
b060: 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
b070: 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 20 20  == 0).      {.  
b080: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
b090: 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d  red->nReaders --
b0a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b0b0: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
b0c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
b0d0: 52 65 6c 65 61 73 69 6e 67 20 61 20 70 65 6e 64  Releasing a pend
b0e0: 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c  ing lock */.  el
b0f0: 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
b100: 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
b110: 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 26 26  )PENDING_BYTE &&
b120: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
b130: 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  oUnlockLow == 1)
b140: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
b150: 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29  >local.bPending)
b160: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
b170: 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20  ocal.bPending = 
b180: 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69  FALSE;.      pFi
b190: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e  le->shared->bPen
b1a0: 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20  ding = FALSE;.  
b1b0: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
b1c0: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  UE;.    }.  }.  
b1d0: 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72  /* Releasing a r
b1e0: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a  eserved lock */.
b1f0: 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c    else if (dwFil
b200: 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44  eOffsetLow == (D
b210: 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f 42 59  WORD)RESERVED_BY
b220: 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42  TE && nNumberOfB
b230: 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
b240: 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
b250: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73  File->local.bRes
b260: 65 72 76 65 64 29 20 7b 0a 20 20 20 20 20 20 70  erved) {.      p
b270: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73  File->local.bRes
b280: 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  erved = FALSE;. 
b290: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
b2a0: 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20  ed->bReserved = 
b2b0: 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65  FALSE;.      bRe
b2c0: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
b2d0: 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d   }.  }..  winceM
b2e0: 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
b2f0: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65  e->hMutex);.  re
b300: 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a  turn bReturn;.}.
b310: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  ./*.** An implem
b320: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
b330: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49  LockFileEx() API
b340: 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20   of Windows for 
b350: 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  CE.*/.static BOO
b360: 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45  L winceLockFileE
b370: 78 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46  x(.  HANDLE *phF
b380: 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  ile,.  DWORD dwF
b390: 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 64 77  lags,.  DWORD dw
b3a0: 52 65 73 65 72 76 65 64 2c 0a 20 20 44 57 4f 52  Reserved,.  DWOR
b3b0: 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
b3c0: 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f  ToLockLow,.  DWO
b3d0: 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
b3e0: 73 54 6f 4c 6f 63 6b 48 69 67 68 2c 0a 20 20 4c  sToLockHigh,.  L
b3f0: 50 4f 56 45 52 4c 41 50 50 45 44 20 6c 70 4f 76  POVERLAPPED lpOv
b400: 65 72 6c 61 70 70 65 64 0a 29 7b 0a 20 20 55 4e  erlapped.){.  UN
b410: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
b420: 77 52 65 73 65 72 76 65 64 29 3b 0a 20 20 55 4e  wReserved);.  UN
b430: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
b440: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
b450: 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 2f 2a 20  ockHigh);..  /* 
b460: 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 77 61  If the caller wa
b470: 6e 74 73 20 61 20 73 68 61 72 65 64 20 72 65 61  nts a shared rea
b480: 64 20 6c 6f 63 6b 2c 20 66 6f 72 77 61 72 64 20  d lock, forward 
b490: 74 68 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20 74  this call.  ** t
b4a0: 6f 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 20  o winceLockFile 
b4b0: 2a 2f 0a 20 20 69 66 20 28 6c 70 4f 76 65 72 6c  */.  if (lpOverl
b4c0: 61 70 70 65 64 2d 3e 4f 66 66 73 65 74 20 3d 3d  apped->Offset ==
b4d0: 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46   (DWORD)SHARED_F
b4e0: 49 52 53 54 20 26 26 0a 20 20 20 20 20 20 64 77  IRST &&.      dw
b4f0: 46 6c 61 67 73 20 3d 3d 20 31 20 26 26 0a 20 20  Flags == 1 &&.  
b500: 20 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74      nNumberOfByt
b510: 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  esToLockLow == (
b520: 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
b530: 45 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  E){.    return w
b540: 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70 68 46  inceLockFile(phF
b550: 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ile, SHARED_FIRS
b560: 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  T, 0, 1, 0);.  }
b570: 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b  .  return FALSE;
b580: 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20  .}./*.** End of 
b590: 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f 64 65  the special code
b5a0: 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a   for wince.*****
b5b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b5c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b5d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b5e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b5f0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66  ********/.#endif
b600: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   /* SQLITE_OS_WI
b610: 4e 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  NCE */../*******
b620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b660: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ******.** The ne
b670: 78 74 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  xt group of rout
b680: 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74  ines implement t
b690: 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 73  he I/O methods s
b6a0: 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 74  pecified.** by t
b6b0: 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
b6c0: 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a  thods object..**
b6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
b720: 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f 73  *.** Some Micros
b730: 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61  oft compilers la
b740: 63 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74 69  ck this definiti
b750: 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49  on..*/.#ifndef I
b760: 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
b770: 50 4f 49 4e 54 45 52 0a 23 20 64 65 66 69 6e 65  POINTER.# define
b780: 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c   INVALID_SET_FIL
b790: 45 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 4f 52  E_POINTER ((DWOR
b7a0: 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  D)-1).#endif../*
b7b0: 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
b7c0: 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66  rent position of
b7d0: 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65   the file handle
b7e0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
b7f0: 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  irst .** argumen
b800: 74 20 74 6f 20 6f 66 66 73 65 74 20 69 4f 66 66  t to offset iOff
b810: 73 65 74 20 77 69 74 68 69 6e 20 74 68 65 20 66  set within the f
b820: 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66  ile. If successf
b830: 75 6c 2c 20 72 65 74 75 72 6e 20 30 2e 20 0a 2a  ul, return 0. .*
b840: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74  * Otherwise, set
b850: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
b860: 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e  o and return non
b870: 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  -zero..*/.static
b880: 20 69 6e 74 20 73 65 65 6b 57 69 6e 46 69 6c 65   int seekWinFile
b890: 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c  (winFile *pFile,
b8a0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
b8b0: 4f 66 66 73 65 74 29 7b 0a 20 20 4c 4f 4e 47 20  Offset){.  LONG 
b8c0: 75 70 70 65 72 42 69 74 73 3b 20 20 20 20 20 20  upperBits;      
b8d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f             /* Mo
b8e0: 73 74 20 73 69 67 2e 20 33 32 20 62 69 74 73 20  st sig. 32 bits 
b8f0: 6f 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f  of new offset */
b900: 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74  .  LONG lowerBit
b910: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
b920: 20 20 20 2f 2a 20 4c 65 61 73 74 20 73 69 67 2e     /* Least sig.
b930: 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20   32 bits of new 
b940: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 44 57 4f 52  offset */.  DWOR
b950: 44 20 64 77 52 65 74 3b 20 20 20 20 20 20 20 20  D dwRet;        
b960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
b970: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
b980: 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28   SetFilePointer(
b990: 29 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73  ) */.  DWORD las
b9a0: 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20  tErrno;         
b9b0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
b9c0: 72 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c  returned by GetL
b9d0: 61 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20  astError() */.. 
b9e0: 20 75 70 70 65 72 42 69 74 73 20 3d 20 28 4c 4f   upperBits = (LO
b9f0: 4e 47 29 28 28 69 4f 66 66 73 65 74 3e 3e 33 32  NG)((iOffset>>32
ba00: 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) & 0x7fffffff);
ba10: 0a 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 28  .  lowerBits = (
ba20: 4c 4f 4e 47 29 28 69 4f 66 66 73 65 74 20 26 20  LONG)(iOffset & 
ba30: 30 78 66 66 66 66 66 66 66 66 29 3b 0a 0a 20 20  0xffffffff);..  
ba40: 2f 2a 20 41 50 49 20 6f 64 64 69 74 79 3a 20 49  /* API oddity: I
ba50: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 65  f successful, Se
ba60: 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 72  tFilePointer() r
ba70: 65 74 75 72 6e 73 20 61 20 64 77 6f 72 64 20 0a  eturns a dword .
ba80: 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20    ** containing 
ba90: 74 68 65 20 6c 6f 77 65 72 20 33 32 2d 62 69 74  the lower 32-bit
baa0: 73 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c  s of the new fil
bab0: 65 2d 6f 66 66 73 65 74 2e 20 4f 72 2c 20 69 66  e-offset. Or, if
bac0: 20 69 74 20 66 61 69 6c 73 2c 0a 20 20 2a 2a 20   it fails,.  ** 
bad0: 69 74 20 72 65 74 75 72 6e 73 20 49 4e 56 41 4c  it returns INVAL
bae0: 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e  ID_SET_FILE_POIN
baf0: 54 45 52 2e 20 48 6f 77 65 76 65 72 20 61 63 63  TER. However acc
bb00: 6f 72 64 69 6e 67 20 74 6f 20 4d 53 44 4e 2c 20  ording to MSDN, 
bb10: 0a 20 20 2a 2a 20 49 4e 56 41 4c 49 44 5f 53 45  .  ** INVALID_SE
bb20: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 6d  T_FILE_POINTER m
bb30: 61 79 20 61 6c 73 6f 20 62 65 20 61 20 76 61 6c  ay also be a val
bb40: 69 64 20 6e 65 77 20 6f 66 66 73 65 74 2e 20 53  id new offset. S
bb50: 6f 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a  o to determine .
bb60: 20 20 2a 2a 20 77 68 65 74 68 65 72 20 61 6e 20    ** whether an 
bb70: 65 72 72 6f 72 20 68 61 73 20 61 63 74 75 61 6c  error has actual
bb80: 6c 79 20 6f 63 63 75 72 65 64 2c 20 69 74 20 69  ly occured, it i
bb90: 73 20 61 6c 73 6f 20 6e 65 63 65 73 73 61 72 79  s also necessary
bba0: 20 74 6f 20 63 61 6c 6c 20 0a 20 20 2a 2a 20 47   to call .  ** G
bbb0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2e 0a 20  etLastError().. 
bbc0: 20 2a 2f 0a 20 20 64 77 52 65 74 20 3d 20 6f 73   */.  dwRet = os
bbd0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 70  SetFilePointer(p
bbe0: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69  File->h, lowerBi
bbf0: 74 73 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20  ts, &upperBits, 
bc00: 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20  FILE_BEGIN);..  
bc10: 69 66 28 20 28 64 77 52 65 74 3d 3d 49 4e 56 41  if( (dwRet==INVA
bc20: 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
bc30: 4e 54 45 52 0a 20 20 20 20 20 20 26 26 20 28 28  NTER.      && ((
bc40: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
bc50: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e  tLastError())!=N
bc60: 4f 5f 45 52 52 4f 52 29 29 20 29 7b 0a 20 20 20  O_ERROR)) ){.   
bc70: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
bc80: 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
bc90: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
bca0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b  QLITE_IOERR_SEEK
bcb0: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
bcc0: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
bcd0: 20 22 73 65 65 6b 57 69 6e 46 69 6c 65 22 2c 20   "seekWinFile", 
bce0: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
bcf0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
bd00: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
bd10: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
bd20: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  ile..**.** It is
bd30: 20 72 65 70 6f 72 74 65 64 20 74 68 61 74 20 61   reported that a
bd40: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f  n attempt to clo
bd50: 73 65 20 61 20 68 61 6e 64 6c 65 20 6d 69 67 68  se a handle migh
bd60: 74 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 66  t sometimes.** f
bd70: 61 69 6c 2e 20 20 54 68 69 73 20 69 73 20 61 20  ail.  This is a 
bd80: 76 65 72 79 20 75 6e 72 65 61 73 6f 6e 61 62 6c  very unreasonabl
bd90: 65 20 72 65 73 75 6c 74 2c 20 62 75 74 20 57 69  e result, but Wi
bda0: 6e 64 6f 77 73 20 69 73 20 6e 6f 74 6f 72 69 6f  ndows is notorio
bdb0: 75 73 0a 2a 2a 20 66 6f 72 20 62 65 69 6e 67 20  us.** for being 
bdc0: 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 73 6f 20  unreasonable so 
bdd0: 49 20 64 6f 20 6e 6f 74 20 64 6f 75 62 74 20 74  I do not doubt t
bde0: 68 61 74 20 69 74 20 6d 69 67 68 74 20 68 61 70  hat it might hap
bdf0: 70 65 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20  pen.  If.** the 
be00: 63 6c 6f 73 65 20 66 61 69 6c 73 2c 20 77 65 20  close fails, we 
be10: 70 61 75 73 65 20 66 6f 72 20 31 30 30 20 6d 69  pause for 100 mi
be20: 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74  lliseconds and t
be30: 72 79 20 61 67 61 69 6e 2e 20 20 41 73 0a 2a 2a  ry again.  As.**
be40: 20 6d 61 6e 79 20 61 73 20 4d 58 5f 43 4c 4f 53   many as MX_CLOS
be50: 45 5f 41 54 54 45 4d 50 54 20 61 74 74 65 6d 70  E_ATTEMPT attemp
be60: 74 73 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20  ts to close the 
be70: 68 61 6e 64 6c 65 20 61 72 65 20 6d 61 64 65 20  handle are made 
be80: 62 65 66 6f 72 65 0a 2a 2a 20 67 69 76 69 6e 67  before.** giving
be90: 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e   up and returnin
bea0: 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23  g an error..*/.#
beb0: 64 65 66 69 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f  define MX_CLOSE_
bec0: 41 54 54 45 4d 50 54 20 33 0a 73 74 61 74 69 63  ATTEMPT 3.static
bed0: 20 69 6e 74 20 77 69 6e 43 6c 6f 73 65 28 73 71   int winClose(sq
bee0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
bef0: 0a 20 20 69 6e 74 20 72 63 2c 20 63 6e 74 20 3d  .  int rc, cnt =
bf00: 20 30 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70   0;.  winFile *p
bf10: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
bf20: 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )id;..  assert( 
bf30: 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  id!=0 );.  asser
bf40: 74 28 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d  t( pFile->pShm==
bf50: 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  0 );.  OSTRACE((
bf60: 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 70 46  "CLOSE %d\n", pF
bf70: 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 64 6f 7b 0a  ile->h));.  do{.
bf80: 20 20 20 20 72 63 20 3d 20 6f 73 43 6c 6f 73 65      rc = osClose
bf90: 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29  Handle(pFile->h)
bfa0: 3b 0a 20 20 20 20 2f 2a 20 53 69 6d 75 6c 61 74  ;.    /* Simulat
bfb0: 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 30 3b 20  eIOError( rc=0; 
bfc0: 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54 54  cnt=MX_CLOSE_ATT
bfd0: 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d 77  EMPT; ); */.  }w
bfe0: 68 69 6c 65 28 20 72 63 3d 3d 30 20 26 26 20 2b  hile( rc==0 && +
bff0: 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f  +cnt < MX_CLOSE_
c000: 41 54 54 45 4d 50 54 20 26 26 20 28 6f 73 53 6c  ATTEMPT && (osSl
c010: 65 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a  eep(100), 1) );.
c020: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
c030: 4e 43 45 0a 23 64 65 66 69 6e 65 20 57 49 4e 43  NCE.#define WINC
c040: 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d  E_DELETION_ATTEM
c050: 50 54 53 20 33 0a 20 20 77 69 6e 63 65 44 65 73  PTS 3.  winceDes
c060: 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  troyLock(pFile);
c070: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44  .  if( pFile->zD
c080: 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a  eleteOnClose ){.
c090: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
c0a0: 0a 20 20 20 20 77 68 69 6c 65 28 0a 20 20 20 20  .    while(.    
c0b0: 20 20 20 20 20 20 20 6f 73 44 65 6c 65 74 65 46         osDeleteF
c0c0: 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c  ileW(pFile->zDel
c0d0: 65 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20  eteOnClose)==0. 
c0e0: 20 20 20 20 20 20 20 26 26 20 6f 73 47 65 74 46         && osGetF
c0f0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 70  ileAttributesW(p
c100: 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
c110: 6c 6f 73 65 29 21 3d 30 78 66 66 66 66 66 66 66  lose)!=0xfffffff
c120: 66 20 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e  f .        && cn
c130: 74 2b 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45  t++ < WINCE_DELE
c140: 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20  TION_ATTEMPTS.  
c150: 20 20 29 7b 0a 20 20 20 20 20 20 20 6f 73 53 6c    ){.       osSl
c160: 65 65 70 28 31 30 30 29 3b 20 20 2f 2a 20 57 61  eep(100);  /* Wa
c170: 69 74 20 61 20 6c 69 74 74 6c 65 20 62 65 66 6f  it a little befo
c180: 72 65 20 74 72 79 69 6e 67 20 61 67 61 69 6e 20  re trying again 
c190: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  */.    }.    sql
c1a0: 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
c1b0: 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29  >zDeleteOnClose)
c1c0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f  ;.  }.#endif.  O
c1d0: 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  STRACE(("CLOSE %
c1e0: 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d %s\n", pFile->
c1f0: 68 2c 20 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22  h, rc ? "ok" : "
c200: 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 4f 70 65  failed"));.  Ope
c210: 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20  nCounter(-1);.  
c220: 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49  return rc ? SQLI
c230: 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20  TE_OK.          
c240: 20 20 3a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28    : winLogError(
c250: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
c260: 53 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  SE, osGetLastErr
c270: 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
c280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c290: 22 77 69 6e 43 6c 6f 73 65 22 2c 20 70 46 69 6c  "winClose", pFil
c2a0: 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a  e->zPath);.}../*
c2b0: 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72  .** Read data fr
c2c0: 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61  om a file into a
c2d0: 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e   buffer.  Return
c2e0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c   SQLITE_OK if al
c2f0: 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20  l.** bytes were 
c300: 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
c310: 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45  y and SQLITE_IOE
c320: 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  RR if anything g
c330: 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f  oes.** wrong..*/
c340: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52  .static int winR
c350: 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ead(.  sqlite3_f
c360: 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20  ile *id,        
c370: 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65 61    /* File to rea
c380: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64  d from */.  void
c390: 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
c3a0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
c3b0: 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68 69  content into thi
c3c0: 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  s buffer */.  in
c3d0: 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20  t amt,          
c3e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
c3f0: 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72  er of bytes to r
c400: 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ead */.  sqlite3
c410: 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20  _int64 offset   
c420: 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61      /* Begin rea
c430: 64 69 6e 67 20 61 74 20 74 68 69 73 20 6f 66 66  ding at this off
c440: 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  set */.){.  winF
c450: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
c460: 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66  nFile*)id;  /* f
c470: 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ile handle */.  
c480: 44 57 4f 52 44 20 6e 52 65 61 64 3b 20 20 20 20  DWORD nRead;    
c490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
c4b0: 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
c4c0: 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20 20   from file */.  
c4d0: 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20  int nRetry = 0; 
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74  /* Number of ret
c500: 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  rys */..  assert
c510: 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d  ( id!=0 );.  Sim
c520: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
c530: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
c540: 5f 52 45 41 44 29 3b 0a 20 20 4f 53 54 52 41 43  _READ);.  OSTRAC
c550: 45 28 28 22 52 45 41 44 20 25 64 20 6c 6f 63 6b  E(("READ %d lock
c560: 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
c570: 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
c580: 65 29 29 3b 0a 0a 20 20 69 66 28 20 73 65 65 6b  e));..  if( seek
c590: 57 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f  WinFile(pFile, o
c5a0: 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20 72 65  ffset) ){.    re
c5b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
c5c0: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 21  ;.  }.  while( !
c5d0: 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65  osReadFile(pFile
c5e0: 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20  ->h, pBuf, amt, 
c5f0: 26 6e 52 65 61 64 2c 20 30 29 20 29 7b 0a 20 20  &nRead, 0) ){.  
c600: 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
c610: 6f 3b 0a 20 20 20 20 69 66 28 20 72 65 74 72 79  o;.    if( retry
c620: 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26  Ioerr(&nRetry, &
c630: 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e  lastErrno) ) con
c640: 74 69 6e 75 65 3b 0a 20 20 20 20 70 46 69 6c 65  tinue;.    pFile
c650: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
c660: 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74  stErrno;.    ret
c670: 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
c680: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
c690: 44 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  D, pFile->lastEr
c6a0: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
c6b0: 20 20 22 77 69 6e 52 65 61 64 22 2c 20 70 46 69    "winRead", pFi
c6c0: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
c6d0: 20 20 6c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72    logIoerr(nRetr
c6e0: 79 29 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 3c  y);.  if( nRead<
c6f0: 28 44 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20  (DWORD)amt ){.  
c700: 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74    /* Unread part
c710: 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
c720: 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c  must be zero-fil
c730: 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  led */.    memse
c740: 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  t(&((char*)pBuf)
c750: 5b 6e 52 65 61 64 5d 2c 20 30 2c 20 61 6d 74 2d  [nRead], 0, amt-
c760: 6e 52 65 61 64 29 3b 0a 20 20 20 20 72 65 74 75  nRead);.    retu
c770: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
c780: 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a  SHORT_READ;.  }.
c790: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c7a0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  _OK;.}../*.** Wr
c7b0: 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ite data from a 
c7c0: 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69  buffer into a fi
c7d0: 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
c7e0: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
c7f0: 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
c800: 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20  r error code on 
c810: 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
c820: 69 63 20 69 6e 74 20 77 69 6e 57 72 69 74 65 28  ic int winWrite(
c830: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
c840: 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *id,            
c850: 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 77 72     /* File to wr
c860: 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f  ite into */.  co
c870: 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
c880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c890: 20 54 68 65 20 62 79 74 65 73 20 74 6f 20 62 65   The bytes to be
c8a0: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
c8b0: 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20  t amt,          
c8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c8d0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
c8e0: 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 73   to write */.  s
c8f0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
c900: 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  set            /
c910: 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68  * Offset into th
c920: 65 20 66 69 6c 65 20 74 6f 20 62 65 67 69 6e 20  e file to begin 
c930: 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a 29 7b  writing at */.){
c940: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
c950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c960: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65 72     /* True if er
c970: 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 2c  ror has occured,
c980: 20 65 6c 73 65 20 66 61 6c 73 65 20 2a 2f 0a 20   else false */. 
c990: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
c9a0: 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20  = (winFile*)id; 
c9b0: 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20   /* File handle 
c9c0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20  */.  int nRetry 
c9d0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
c9e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
c9f0: 66 20 72 65 74 72 69 65 73 20 2a 2f 0a 0a 20 20  f retries */..  
ca00: 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b  assert( amt>0 );
ca10: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
ca20: 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
ca30: 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
ca40: 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 29  ITE_IOERR_WRITE)
ca50: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b  ;.  SimulateDisk
ca60: 66 75 6c 6c 45 72 72 6f 72 28 72 65 74 75 72 6e  fullError(return
ca70: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 0a   SQLITE_FULL);..
ca80: 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54    OSTRACE(("WRIT
ca90: 45 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  E %d lock=%d\n",
caa0: 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
cab0: 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20  ->locktype));.. 
cac0: 20 72 63 20 3d 20 73 65 65 6b 57 69 6e 46 69 6c   rc = seekWinFil
cad0: 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 29  e(pFile, offset)
cae0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
caf0: 0a 20 20 20 20 75 38 20 2a 61 52 65 6d 20 3d 20  .    u8 *aRem = 
cb00: 28 75 38 20 2a 29 70 42 75 66 3b 20 20 20 20 20  (u8 *)pBuf;     
cb10: 20 20 20 2f 2a 20 44 61 74 61 20 79 65 74 20 74     /* Data yet t
cb20: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a  o be written */.
cb30: 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 61      int nRem = a
cb40: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mt;             
cb50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
cb60: 79 74 65 73 20 79 65 74 20 74 6f 20 62 65 20 77  ytes yet to be w
cb70: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 44 57  ritten */.    DW
cb80: 4f 52 44 20 6e 57 72 69 74 65 3b 20 20 20 20 20  ORD nWrite;     
cb90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
cba0: 79 74 65 73 20 77 72 69 74 74 65 6e 20 62 79 20  ytes written by 
cbb0: 65 61 63 68 20 57 72 69 74 65 46 69 6c 65 28 29  each WriteFile()
cbc0: 20 63 61 6c 6c 20 2a 2f 0a 20 20 20 20 44 57 4f   call */.    DWO
cbd0: 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e  RD lastErrno = N
cbe0: 4f 5f 45 52 52 4f 52 3b 20 20 20 2f 2a 20 56 61  O_ERROR;   /* Va
cbf0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
cc00: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 2a  GetLastError() *
cc10: 2f 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 52  /..    while( nR
cc20: 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66  em>0 ){.      if
cc30: 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70  ( !osWriteFile(p
cc40: 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e  File->h, aRem, n
cc50: 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 30 29  Rem, &nWrite, 0)
cc60: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
cc70: 72 65 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74  retryIoerr(&nRet
cc80: 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  ry, &lastErrno) 
cc90: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
cca0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ccb0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 57 72   }.      if( nWr
ccc0: 69 74 65 3c 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ite<=0 ) break;.
ccd0: 20 20 20 20 20 20 61 52 65 6d 20 2b 3d 20 6e 57        aRem += nW
cce0: 72 69 74 65 3b 0a 20 20 20 20 20 20 6e 52 65 6d  rite;.      nRem
ccf0: 20 2d 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20   -= nWrite;.    
cd00: 7d 0a 20 20 20 20 69 66 28 20 6e 52 65 6d 3e 30  }.    if( nRem>0
cd10: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
cd20: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
cd30: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63  tErrno;.      rc
cd40: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
cd50: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
cd60: 20 69 66 28 20 20 20 28 20 70 46 69 6c 65 2d 3e   if(   ( pFile->
cd70: 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
cd80: 5f 48 41 4e 44 4c 45 5f 44 49 53 4b 5f 46 55 4c  _HANDLE_DISK_FUL
cd90: 4c 20 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 20  L ).       || ( 
cda0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
cdb0: 3d 3d 45 52 52 4f 52 5f 44 49 53 4b 5f 46 55 4c  ==ERROR_DISK_FUL
cdc0: 4c 20 29 29 7b 0a 20 20 20 20 20 20 72 65 74 75  L )){.      retu
cdd0: 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
cde0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
cdf0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
ce00: 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 2c  ITE_IOERR_WRITE,
ce10: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
ce20: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
ce30: 22 77 69 6e 57 72 69 74 65 22 2c 20 70 46 69 6c  "winWrite", pFil
ce40: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  e->zPath);.  }el
ce50: 73 65 7b 0a 20 20 20 20 6c 6f 67 49 6f 65 72 72  se{.    logIoerr
ce60: 28 6e 52 65 74 72 79 29 3b 0a 20 20 7d 0a 20 20  (nRetry);.  }.  
ce70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ce80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
ce90: 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65  ate an open file
cea0: 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20   to a specified 
ceb0: 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  size.*/.static i
cec0: 6e 74 20 77 69 6e 54 72 75 6e 63 61 74 65 28 73  nt winTruncate(s
ced0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
cee0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
cef0: 42 79 74 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65  Byte){.  winFile
cf00: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
cf10: 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65  le*)id;  /* File
cf20: 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 20 2a   handle object *
cf30: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
cf40: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
cf50: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
cf60: 64 65 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63  de for this func
cf70: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tion */..  asser
cf80: 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 4f  t( pFile );..  O
cf90: 53 54 52 41 43 45 28 28 22 54 52 55 4e 43 41 54  STRACE(("TRUNCAT
cfa0: 45 20 25 64 20 25 6c 6c 64 5c 6e 22 2c 20 70 46  E %d %lld\n", pF
cfb0: 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 29 3b  ile->h, nByte));
cfc0: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
cfd0: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
cfe0: 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 29  _IOERR_TRUNCATE)
cff0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75  ;..  /* If the u
d000: 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72  ser has configur
d010: 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20  ed a chunk-size 
d020: 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74  for this file, t
d030: 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a  runcate the.  **
d040: 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74   file so that it
d050: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20   consists of an 
d060: 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f  integer number o
d070: 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74  f chunks (i.e. t
d080: 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66  he.  ** actual f
d090: 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20 74  ile size after t
d0a0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79  he operation may
d0b0: 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
d0c0: 74 68 65 20 72 65 71 75 65 73 74 65 64 0a 20 20  the requested.  
d0d0: 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20  ** size)..  */. 
d0e0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68   if( pFile->szCh
d0f0: 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79  unk>0 ){.    nBy
d100: 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70  te = ((nByte + p
d110: 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20  File->szChunk - 
d120: 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  1)/pFile->szChun
d130: 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68  k) * pFile->szCh
d140: 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  unk;.  }..  /* S
d150: 65 74 45 6e 64 4f 66 46 69 6c 65 28 29 20 72 65  etEndOfFile() re
d160: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77  turns non-zero w
d170: 68 65 6e 20 73 75 63 63 65 73 73 66 75 6c 2c 20  hen successful, 
d180: 6f 72 20 7a 65 72 6f 20 77 68 65 6e 20 69 74 20  or zero when it 
d190: 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 69 66 28 20  fails. */.  if( 
d1a0: 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c  seekWinFile(pFil
d1b0: 65 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20  e, nByte) ){.   
d1c0: 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
d1d0: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  r(SQLITE_IOERR_T
d1e0: 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e  RUNCATE, pFile->
d1f0: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
d200: 20 20 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e          "winTrun
d210: 63 61 74 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a  cate1", pFile->z
d220: 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 20 69  Path);.  }else i
d230: 66 28 20 30 3d 3d 6f 73 53 65 74 45 6e 64 4f 66  f( 0==osSetEndOf
d240: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29 20 29  File(pFile->h) )
d250: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
d260: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
d270: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72  stError();.    r
d280: 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
d290: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
d2a0: 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61  NCATE, pFile->la
d2b0: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
d2c0: 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61        "winTrunca
d2d0: 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  te2", pFile->zPa
d2e0: 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  th);.  }..  OSTR
d2f0: 41 43 45 28 28 22 54 52 55 4e 43 41 54 45 20 25  ACE(("TRUNCATE %
d300: 64 20 25 6c 6c 64 20 25 73 5c 6e 22 2c 20 70 46  d %lld %s\n", pF
d310: 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 72  ile->h, nByte, r
d320: 63 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22  c ? "failed" : "
d330: 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ok"));.  return 
d340: 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
d350: 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
d360: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
d370: 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e   of fullsyncs an
d380: 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20  d normal syncs. 
d390: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
d3a0: 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79   test.** that sy
d3b0: 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63  ncs and fullsync
d3c0: 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20 61  s are occuring a
d3d0: 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65  t the right time
d3e0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
d3f0: 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  3_sync_count = 0
d400: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75  ;.int sqlite3_fu
d410: 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  llsync_count = 0
d420: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
d430: 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
d440: 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
d450: 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
d460: 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
d470: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
d480: 69 6e 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66  inSync(sqlite3_f
d490: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61  ile *id, int fla
d4a0: 67 73 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  gs){.#ifndef SQL
d4b0: 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f 2a  ITE_NO_SYNC.  /*
d4c0: 0a 20 20 2a 2a 20 55 73 65 64 20 6f 6e 6c 79 20  .  ** Used only 
d4d0: 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  when SQLITE_NO_S
d4e0: 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  YNC is not defin
d4f0: 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f 4c  ed..   */.  BOOL
d500: 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20   rc;.#endif.#if 
d510: 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
d520: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
d530: 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20  ITE_NO_SYNC) || 
d540: 5c 0a 20 20 20 20 28 64 65 66 69 6e 65 64 28 53  \.    (defined(S
d550: 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64  QLITE_TEST) && d
d560: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
d570: 42 55 47 29 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  BUG)).  /*.  ** 
d580: 55 73 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45  Used when SQLITE
d590: 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20  _NO_SYNC is not 
d5a0: 64 65 66 69 6e 65 64 20 61 6e 64 20 62 79 20 74  defined and by t
d5b0: 68 65 20 61 73 73 65 72 74 28 29 20 61 6e 64 2f  he assert() and/
d5c0: 6f 72 0a 20 20 2a 2a 20 4f 53 54 52 41 43 45 28  or.  ** OSTRACE(
d5d0: 29 20 6d 61 63 72 6f 73 2e 0a 20 20 20 2a 2f 0a  ) macros..   */.
d5e0: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
d5f0: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
d600: 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
d610: 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 23  PARAMETER(id);.#
d620: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
d630: 20 70 46 69 6c 65 20 29 3b 0a 20 20 2f 2a 20 43   pFile );.  /* C
d640: 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66  heck that one of
d650: 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
d660: 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20  MAL or FULL was 
d670: 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65  passed */.  asse
d680: 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d  rt((flags&0x0F)=
d690: 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  =SQLITE_SYNC_NOR
d6a0: 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c  MAL.      || (fl
d6b0: 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
d6c0: 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b  E_SYNC_FULL.  );
d6d0: 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59  ..  OSTRACE(("SY
d6e0: 4e 43 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22  NC %d lock=%d\n"
d6f0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c  , pFile->h, pFil
d700: 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a  e->locktype));..
d710: 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74    /* Unix cannot
d720: 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65  , but some syste
d730: 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ms may return SQ
d740: 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68  LITE_FULL from h
d750: 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c  ere. This.  ** l
d760: 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20 74  ine is to test t
d770: 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65  hat doing so doe
d780: 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20  s not cause any 
d790: 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20  problems..  */. 
d7a0: 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
d7b0: 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  lError( return S
d7c0: 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 23  QLITE_FULL );..#
d7d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54 45  ifndef SQLITE_TE
d7e0: 53 54 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ST.  UNUSED_PARA
d7f0: 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 23 65  METER(flags);.#e
d800: 6c 73 65 0a 20 20 69 66 28 20 28 66 6c 61 67 73  lse.  if( (flags
d810: 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
d820: 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  YNC_FULL ){.    
d830: 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
d840: 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20  _count++;.  }.  
d850: 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
d860: 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nt++;.#endif..  
d870: 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65  /* If we compile
d880: 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  d with the SQLIT
d890: 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20  E_NO_SYNC flag, 
d8a0: 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20  then syncing is 
d8b0: 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a  a.  ** no-op.  *
d8c0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
d8d0: 4e 4f 5f 53 59 4e 43 0a 20 20 72 65 74 75 72 6e  NO_SYNC.  return
d8e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73   SQLITE_OK;.#els
d8f0: 65 0a 20 20 72 63 20 3d 20 6f 73 46 6c 75 73 68  e.  rc = osFlush
d900: 46 69 6c 65 42 75 66 66 65 72 73 28 70 46 69 6c  FileBuffers(pFil
d910: 65 2d 3e 68 29 3b 0a 20 20 53 69 6d 75 6c 61 74  e->h);.  Simulat
d920: 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 46 41 4c  eIOError( rc=FAL
d930: 53 45 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29  SE );.  if( rc )
d940: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
d950: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
d960: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
d970: 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
d980: 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 65  tError();.    re
d990: 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
d9a0: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
d9b0: 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  YNC, pFile->last
d9c0: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
d9d0: 20 20 20 20 22 77 69 6e 53 79 6e 63 22 2c 20 70      "winSync", p
d9e0: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
d9f0: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
da00: 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
da10: 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
da20: 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a  a file in bytes.
da30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
da40: 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  nFileSize(sqlite
da50: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69  3_file *id, sqli
da60: 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65  te3_int64 *pSize
da70: 29 7b 0a 20 20 44 57 4f 52 44 20 75 70 70 65 72  ){.  DWORD upper
da80: 42 69 74 73 3b 0a 20 20 44 57 4f 52 44 20 6c 6f  Bits;.  DWORD lo
da90: 77 65 72 42 69 74 73 3b 0a 20 20 77 69 6e 46 69  werBits;.  winFi
daa0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
dab0: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52  File*)id;.  DWOR
dac0: 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20  D lastErrno;..  
dad0: 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
dae0: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
daf0: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
db00: 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a 20  _IOERR_FSTAT);. 
db10: 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 6f 73 47   lowerBits = osG
db20: 65 74 46 69 6c 65 53 69 7a 65 28 70 46 69 6c 65  etFileSize(pFile
db30: 2d 3e 68 2c 20 26 75 70 70 65 72 42 69 74 73 29  ->h, &upperBits)
db40: 3b 0a 20 20 69 66 28 20 20 20 28 6c 6f 77 65 72  ;.  if(   (lower
db50: 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c 49 44 5f  Bits == INVALID_
db60: 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20 20 20 20  FILE_SIZE).     
db70: 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d  && ((lastErrno =
db80: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
db90: 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 20 29 0a  ))!=NO_ERROR) ).
dba0: 20 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c    {.    pFile->l
dbb0: 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
dbc0: 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
dbd0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
dbe0: 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c  ITE_IOERR_FSTAT,
dbf0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
dc00: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
dc10: 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70  "winFileSize", p
dc20: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
dc30: 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 28 28 28  }.  *pSize = (((
dc40: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 75 70  sqlite3_int64)up
dc50: 70 65 72 42 69 74 73 29 3c 3c 33 32 29 20 2b 20  perBits)<<32) + 
dc60: 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 72 65 74  lowerBits;.  ret
dc70: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
dc80: 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45  ../*.** LOCKFILE
dc90: 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
dca0: 59 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 6f  Y is undefined o
dcb0: 6e 20 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73  n some Windows s
dcc0: 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64  ystems..*/.#ifnd
dcd0: 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ef LOCKFILE_FAIL
dce0: 5f 49 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20 64  _IMMEDIATELY.# d
dcf0: 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46  efine LOCKFILE_F
dd00: 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20  AIL_IMMEDIATELY 
dd10: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
dd20: 41 63 71 75 69 72 65 20 61 20 72 65 61 64 65 72  Acquire a reader
dd30: 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72   lock..** Differ
dd40: 65 6e 74 20 41 50 49 20 72 6f 75 74 69 6e 65 73  ent API routines
dd50: 20 61 72 65 20 63 61 6c 6c 65 64 20 64 65 70 65   are called depe
dd60: 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
dd70: 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20   or not this.** 
dd80: 69 73 20 57 69 6e 39 78 20 6f 72 20 57 69 6e 4e  is Win9x or WinN
dd90: 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T..*/.static int
dda0: 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 77 69 6e   getReadLock(win
ddb0: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
ddc0: 69 6e 74 20 72 65 73 3b 0a 20 20 69 66 28 20 69  int res;.  if( i
ddd0: 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45  sNT() ){.    OVE
dde0: 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20  RLAPPED ovlp;.  
ddf0: 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20    ovlp.Offset = 
de00: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
de10: 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67    ovlp.OffsetHig
de20: 68 20 3d 20 30 3b 0a 20 20 20 20 6f 76 6c 70 2e  h = 0;.    ovlp.
de30: 68 45 76 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  hEvent = 0;.    
de40: 72 65 73 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65  res = osLockFile
de50: 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  Ex(pFile->h, LOC
de60: 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
de70: 49 41 54 45 4c 59 2c 0a 20 20 20 20 20 20 20 20  IATELY,.        
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
de90: 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30  , SHARED_SIZE, 0
dea0: 2c 20 26 6f 76 6c 70 29 3b 0a 2f 2a 20 69 73 4e  , &ovlp);./* isN
deb0: 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c 49  T() is 1 if SQLI
dec0: 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20  TE_OS_WINCE==1, 
ded0: 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73 20  so this else is 
dee0: 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e 20  never executed. 
def0: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
df00: 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c  S_WINCE==0.  }el
df10: 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 3b 0a  se{.    int lk;.
df20: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
df30: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 6c 6b  omness(sizeof(lk
df40: 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 70 46 69  ), &lk);.    pFi
df50: 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
df60: 74 65 20 3d 20 28 73 68 6f 72 74 29 28 28 6c 6b  te = (short)((lk
df70: 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25 28   & 0x7fffffff)%(
df80: 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29  SHARED_SIZE - 1)
df90: 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 6f 73 4c  );.    res = osL
dfa0: 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  ockFile(pFile->h
dfb0: 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70  , SHARED_FIRST+p
dfc0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
dfd0: 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  Byte, 0, 1, 0);.
dfe0: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28  #endif.  }.  if(
dff0: 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20 20 20   res == 0 ){.   
e000: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
e010: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
e020: 6f 72 28 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 20  or();.    /* No 
e030: 6e 65 65 64 20 74 6f 20 6c 6f 67 20 61 20 66 61  need to log a fa
e040: 69 6c 75 72 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f  ilure to lock */
e050: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
e060: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f  s;.}../*.** Undo
e070: 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73   a readlock.*/.s
e080: 74 61 74 69 63 20 69 6e 74 20 75 6e 6c 6f 63 6b  tatic int unlock
e090: 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65  ReadLock(winFile
e0a0: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
e0b0: 72 65 73 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  res;.  DWORD las
e0c0: 74 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 69 73  tErrno;.  if( is
e0d0: 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65 73 20  NT() ){.    res 
e0e0: 3d 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 70  = osUnlockFile(p
e0f0: 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
e100: 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44  FIRST, 0, SHARED
e110: 5f 53 49 5a 45 2c 20 30 29 3b 0a 2f 2a 20 69 73  _SIZE, 0);./* is
e120: 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c  NT() is 1 if SQL
e130: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c  ITE_OS_WINCE==1,
e140: 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73   so this else is
e150: 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e   never executed.
e160: 20 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f   .*/.#if SQLITE_
e170: 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65  OS_WINCE==0.  }e
e180: 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 6f  lse{.    res = o
e190: 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c  sUnlockFile(pFil
e1a0: 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
e1b0: 53 54 20 2b 20 70 46 69 6c 65 2d 3e 73 68 61 72  ST + pFile->shar
e1c0: 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31  edLockByte, 0, 1
e1d0: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  , 0);.#endif.  }
e1e0: 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26  .  if( res==0 &&
e1f0: 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f   ((lastErrno = o
e200: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29  sGetLastError())
e210: 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b  !=ERROR_NOT_LOCK
e220: 45 44 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  ED) ){.    pFile
e230: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
e240: 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e  stErrno;.    win
e250: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
e260: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 70 46  IOERR_UNLOCK, pF
e270: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
e280: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 75 6e               "un
e290: 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22 2c 20 70  lockReadLock", p
e2a0: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
e2b0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  }.  return res;.
e2c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
e2d0: 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
e2e0: 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
e2f0: 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b  y parameter lock
e300: 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  type - one.** of
e310: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
e320: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
e330: 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
e340: 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
e350: 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
e360: 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
e370: 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
e380: 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
e390: 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
e3a0: 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
e3b0: 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
e3c0: 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
e3d0: 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
e3e0: 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
e3f0: 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
e400: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
e410: 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
e420: 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
e430: 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
e440: 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
e450: 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
e460: 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
e470: 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
e480: 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
e490: 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
e4a0: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
e4b0: 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
e4c0: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
e4d0: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
e4e0: 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
e4f0: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
e500: 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
e510: 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
e520: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
e530: 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
e540: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
e550: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
e560: 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
e570: 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
e580: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
e590: 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
e5a0: 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63  k.  The winUnloc
e5b0: 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65  k() routine.** e
e5c0: 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20  rases all locks 
e5d0: 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65 74 75  at once and retu
e5e0: 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61 74 65  rns us immediate
e5f0: 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65  ly to locking le
e600: 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20  vel 0..** It is 
e610: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
e620: 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  lower the lockin
e630: 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65 70  g level one step
e640: 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59 6f 75   at a time.  You
e650: 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72 61  .** must go stra
e660: 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20  ight to locking 
e670: 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74  level 0..*/.stat
e680: 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73  ic int winLock(s
e690: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
e6a0: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
e6b0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e6c0: 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75  E_OK;    /* Retu
e6d0: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
e6e0: 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e  routines */.  in
e6f0: 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20  t res = 1;      
e700: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
e710: 66 20 61 20 57 69 6e 64 6f 77 73 20 6c 6f 63 6b  f a Windows lock
e720: 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e   call */.  int n
e730: 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20  ewLocktype;     
e740: 20 20 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e    /* Set pFile->
e750: 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68 69 73  locktype to this
e760: 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 65 78   value before ex
e770: 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67  iting */.  int g
e780: 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
e790: 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20  0;/* True if we 
e7a0: 61 63 71 75 69 72 65 64 20 61 20 50 45 4e 44 49  acquired a PENDI
e7b0: 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d  NG lock this tim
e7c0: 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a  e */.  winFile *
e7d0: 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
e7e0: 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61  *)id;.  DWORD la
e7f0: 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52  stErrno = NO_ERR
e800: 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  OR;..  assert( i
e810: 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43  d!=0 );.  OSTRAC
e820: 45 28 28 22 4c 4f 43 4b 20 25 64 20 25 64 20 77  E(("LOCK %d %d w
e830: 61 73 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20  as %d(%d)\n",.  
e840: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
e850: 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69  h, locktype, pFi
e860: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46  le->locktype, pF
e870: 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
e880: 79 74 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  yte));..  /* If 
e890: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
e8a0: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
e8b0: 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
e8c0: 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
e8d0: 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20    ** OsFile, do 
e8e0: 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
e8f0: 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a  se the end_lock:
e900: 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
e910: 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74   ** sqlite3OsEnt
e920: 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
e930: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
e940: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
e950: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f  le->locktype>=lo
e960: 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65  cktype ){.    re
e970: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e980: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
e990: 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ure the locking 
e9a0: 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72  sequence is corr
e9b0: 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ect.  */.  asser
e9c0: 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
e9d0: 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c  pe!=NO_LOCK || l
e9e0: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
e9f0: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
ea00: 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44  ( locktype!=PEND
ea10: 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ING_LOCK );.  as
ea20: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d  sert( locktype!=
ea30: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
ea40: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
ea50: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
ea60: 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20  ..  /* Lock the 
ea70: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74  PENDING_LOCK byt
ea80: 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  e if we need to 
ea90: 61 63 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e  acquire a PENDIN
eaa0: 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61  G lock or.  ** a
eab0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49   SHARED lock.  I
eac0: 66 20 77 65 20 61 72 65 20 61 63 71 75 69 72 69  f we are acquiri
ead0: 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
eae0: 2c 20 74 68 65 20 61 63 71 75 69 73 69 74 69 6f  , the acquisitio
eaf0: 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50 45  n of.  ** the PE
eb00: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20  NDING_LOCK byte 
eb10: 69 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20  is temporary..  
eb20: 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65  */.  newLocktype
eb30: 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   = pFile->lockty
eb40: 70 65 3b 0a 20 20 69 66 28 20 20 20 28 70 46 69  pe;.  if(   (pFi
eb50: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  le->locktype==NO
eb60: 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 7c 7c 20 28  _LOCK).     || (
eb70: 20 20 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58     (locktype==EX
eb80: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
eb90: 20 20 20 20 20 20 20 26 26 20 28 70 46 69 6c 65         && (pFile
eba0: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45  ->locktype==RESE
ebb0: 52 56 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b  RVED_LOCK)).  ){
ebc0: 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 33  .    int cnt = 3
ebd0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6e 74  ;.    while( cnt
ebe0: 2d 2d 3e 30 20 26 26 20 28 72 65 73 20 3d 20 6f  -->0 && (res = o
ebf0: 73 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d  sLockFile(pFile-
ec00: 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  >h, PENDING_BYTE
ec10: 2c 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29  , 0, 1, 0))==0 )
ec20: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 33  {.      /* Try 3
ec30: 20 74 69 6d 65 73 20 74 6f 20 67 65 74 20 74 68   times to get th
ec40: 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20  e pending lock. 
ec50: 20 54 68 69 73 20 69 73 20 6e 65 65 64 65 64 20   This is needed 
ec60: 74 6f 20 77 6f 72 6b 0a 20 20 20 20 20 20 2a 2a  to work.      **
ec70: 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73   around problems
ec80: 20 63 61 75 73 65 64 20 62 79 20 69 6e 64 65 78   caused by index
ec90: 69 6e 67 20 61 6e 64 2f 6f 72 20 61 6e 74 69 2d  ing and/or anti-
eca0: 76 69 72 75 73 20 73 6f 66 74 77 61 72 65 20 6f  virus software o
ecb0: 6e 0a 20 20 20 20 20 20 2a 2a 20 57 69 6e 64 6f  n.      ** Windo
ecc0: 77 73 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20  ws systems..    
ecd0: 20 20 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20    ** If you are 
ece0: 75 73 69 6e 67 20 74 68 69 73 20 63 6f 64 65 20  using this code 
ecf0: 61 73 20 61 20 6d 6f 64 65 6c 20 66 6f 72 20 61  as a model for a
ed00: 6c 74 65 72 6e 61 74 69 76 65 20 56 46 53 65 73  lternative VFSes
ed10: 2c 20 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a  , do not.      *
ed20: 2a 20 63 6f 70 79 20 74 68 69 73 20 72 65 74 72  * copy this retr
ed30: 79 20 6c 6f 67 69 63 2e 20 20 49 74 20 69 73 20  y logic.  It is 
ed40: 61 20 68 61 63 6b 20 69 6e 74 65 6e 64 65 64 20  a hack intended 
ed50: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
ed60: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
ed70: 20 4f 53 54 52 41 43 45 28 28 22 63 6f 75 6c 64   OSTRACE(("could
ed80: 20 6e 6f 74 20 67 65 74 20 61 20 50 45 4e 44 49   not get a PENDI
ed90: 4e 47 20 6c 6f 63 6b 2e 20 63 6e 74 3d 25 64 5c  NG lock. cnt=%d\
eda0: 6e 22 2c 20 63 6e 74 29 29 3b 0a 20 20 20 20 20  n", cnt));.     
edb0: 20 69 66 28 20 63 6e 74 20 29 20 6f 73 53 6c 65   if( cnt ) osSle
edc0: 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ep(1);.    }.   
edd0: 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
ede0: 3d 20 72 65 73 3b 0a 20 20 20 20 69 66 28 20 21  = res;.    if( !
edf0: 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6c 61 73  res ){.      las
ee00: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
ee10: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d  stError();.    }
ee20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
ee30: 72 65 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  re a shared lock
ee40: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
ee50: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
ee60: 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
ee70: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
ee80: 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
ee90: 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 67 65   );.    res = ge
eea0: 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  tReadLock(pFile)
eeb0: 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b  ;.    if( res ){
eec0: 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  .      newLockty
eed0: 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  pe = SHARED_LOCK
eee0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
eef0: 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
ef00: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
ef10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
ef20: 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52   Acquire a RESER
ef30: 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  VED lock.  */.  
ef40: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45  if( locktype==RE
ef50: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72  SERVED_LOCK && r
ef60: 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
ef70: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
ef80: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
ef90: 3b 0a 20 20 20 20 72 65 73 20 3d 20 6f 73 4c 6f  ;.    res = osLo
efa0: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
efb0: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
efc0: 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 1, 0);.    if
efd0: 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e  ( res ){.      n
efe0: 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52 45 53  ewLocktype = RES
eff0: 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  ERVED_LOCK;.    
f000: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73  }else{.      las
f010: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
f020: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d  stError();.    }
f030: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
f040: 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  re a PENDING loc
f050: 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  k.  */.  if( loc
f060: 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
f070: 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
f080: 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20      newLocktype 
f090: 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
f0a0: 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f      gotPendingLo
f0b0: 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ck = 0;.  }..  /
f0c0: 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58 43  * Acquire an EXC
f0d0: 4c 55 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f  LUSIVE lock.  */
f0e0: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
f0f0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
f100: 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73  && res ){.    as
f110: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
f120: 6b 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f  ktype>=SHARED_LO
f130: 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  CK );.    res = 
f140: 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70  unlockReadLock(p
f150: 46 69 6c 65 29 3b 0a 20 20 20 20 4f 53 54 52 41  File);.    OSTRA
f160: 43 45 28 28 22 75 6e 72 65 61 64 6c 6f 63 6b 20  CE(("unreadlock 
f170: 3d 20 25 64 5c 6e 22 2c 20 72 65 73 29 29 3b 0a  = %d\n", res));.
f180: 20 20 20 20 72 65 73 20 3d 20 6f 73 4c 6f 63 6b      res = osLock
f190: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53  File(pFile->h, S
f1a0: 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20  HARED_FIRST, 0, 
f1b0: 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
f1c0: 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a  .    if( res ){.
f1d0: 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70        newLocktyp
f1e0: 65 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  e = EXCLUSIVE_LO
f1f0: 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CK;.    }else{. 
f200: 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
f210: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
f220: 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
f230: 28 28 22 65 72 72 6f 72 2d 63 6f 64 65 20 3d 20  (("error-code = 
f240: 25 64 5c 6e 22 2c 20 6c 61 73 74 45 72 72 6e 6f  %d\n", lastErrno
f250: 29 29 3b 0a 20 20 20 20 20 20 67 65 74 52 65 61  ));.      getRea
f260: 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
f270: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
f280: 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20   we are holding 
f290: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74  a PENDING lock t
f2a0: 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20  hat ought to be 
f2b0: 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e 0a 20  released, then. 
f2c0: 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74 20 6e   ** release it n
f2d0: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 67  ow..  */.  if( g
f2e0: 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 26 26  otPendingLock &&
f2f0: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
f300: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 6f 73  D_LOCK ){.    os
f310: 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65  UnlockFile(pFile
f320: 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ->h, PENDING_BYT
f330: 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  E, 0, 1, 0);.  }
f340: 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
f350: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 6c  e state of the l
f360: 6f 63 6b 20 68 61 73 20 68 65 6c 64 20 69 6e 20  ock has held in 
f370: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
f380: 74 6f 72 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65  tor then.  ** re
f390: 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72  turn the appropr
f3a0: 69 61 74 65 20 72 65 73 75 6c 74 20 63 6f 64 65  iate result code
f3b0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73  ..  */.  if( res
f3c0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
f3d0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
f3e0: 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c  .    OSTRACE(("L
f3f0: 4f 43 4b 20 46 41 49 4c 45 44 20 25 64 20 74 72  OCK FAILED %d tr
f400: 79 69 6e 67 20 66 6f 72 20 25 64 20 62 75 74 20  ying for %d but 
f410: 67 6f 74 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65  got %d\n", pFile
f420: 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
f430: 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63  locktype, newLoc
f440: 6b 74 79 70 65 29 29 3b 0a 20 20 20 20 70 46 69  ktype));.    pFi
f450: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
f460: 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72  lastErrno;.    r
f470: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
f480: 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f  .  }.  pFile->lo
f490: 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6e 65 77  cktype = (u8)new
f4a0: 4c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75  Locktype;.  retu
f4b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
f4c0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
f4d0: 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
f4e0: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
f4f0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
f500: 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
f510: 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
f520: 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
f530: 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
f540: 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  ld, return.** no
f550: 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73  n-zero, otherwis
f560: 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  e zero..*/.stati
f570: 63 20 69 6e 74 20 77 69 6e 43 68 65 63 6b 52 65  c int winCheckRe
f580: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
f590: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
f5a0: 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
f5b0: 74 20 72 63 3b 0a 20 20 77 69 6e 46 69 6c 65 20  t rc;.  winFile 
f5c0: 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
f5d0: 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
f5e0: 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
f5f0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
f600: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
f610: 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ; );..  assert( 
f620: 69 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  id!=0 );.  if( p
f630: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
f640: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
f650: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
f660: 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
f670: 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 6c  WR-LOCK %d %d (l
f680: 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  ocal)\n", pFile-
f690: 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d 65 6c 73  >h, rc));.  }els
f6a0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4c 6f  e{.    rc = osLo
f6b0: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
f6c0: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
f6d0: 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 1, 0);.    if
f6e0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 6f 73  ( rc ){.      os
f6f0: 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65  UnlockFile(pFile
f700: 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ->h, RESERVED_BY
f710: 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
f720: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 21 72 63    }.    rc = !rc
f730: 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
f740: 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
f750: 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20  %d (remote)\n", 
f760: 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a  pFile->h, rc));.
f770: 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d    }.  *pResOut =
f780: 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 53 51   rc;.  return SQ
f790: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
f7a0: 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
f7b0: 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
f7c0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 64 20  e descriptor id 
f7d0: 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f  to locktype.  lo
f7e0: 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62  cktype.** must b
f7f0: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
f800: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
f810: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
f820: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
f830: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
f840: 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
f850: 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
f860: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
f870: 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
f880: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
f890: 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e  p..**.** It is n
f8a0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
f8b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
f8c0: 66 61 69 6c 20 69 66 20 74 68 65 20 73 65 63 6f  fail if the seco
f8d0: 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
f8e0: 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74  s NO_LOCK.  If t
f8f0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
f900: 6e 74 20 69 73 20 53 48 41 52 45 44 5f 4c 4f 43  nt is SHARED_LOC
f910: 4b 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  K then this rout
f920: 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74  ine.** might ret
f930: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
f940: 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.*/.static int 
f950: 77 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  winUnlock(sqlite
f960: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
f970: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
f980: 20 74 79 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65   type;.  winFile
f990: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
f9a0: 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
f9b0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
f9c0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30  assert( pFile!=0
f9d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
f9e0: 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c  cktype<=SHARED_L
f9f0: 4f 43 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  OCK );.  OSTRACE
fa00: 28 28 22 55 4e 4c 4f 43 4b 20 25 64 20 74 6f 20  (("UNLOCK %d to 
fa10: 25 64 20 77 61 73 20 25 64 28 25 64 29 5c 6e 22  %d was %d(%d)\n"
fa20: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b  , pFile->h, lock
fa30: 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20 20  type,.          
fa40: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
fa50: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f   pFile->sharedLo
fa60: 63 6b 42 79 74 65 29 29 3b 0a 20 20 74 79 70 65  ckByte));.  type
fa70: 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   = pFile->lockty
fa80: 70 65 3b 0a 20 20 69 66 28 20 74 79 70 65 3e 3d  pe;.  if( type>=
fa90: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
faa0: 7b 0a 20 20 20 20 6f 73 55 6e 6c 6f 63 6b 46 69  {.    osUnlockFi
fab0: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  le(pFile->h, SHA
fac0: 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48  RED_FIRST, 0, SH
fad0: 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20  ARED_SIZE, 0);. 
fae0: 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d     if( locktype=
faf0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
fb00: 21 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69  !getReadLock(pFi
fb10: 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  le) ){.      /* 
fb20: 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65  This should neve
fb30: 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20 73 68  r happen.  We sh
fb40: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 61  ould always be a
fb50: 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
fb60: 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65  reacquire the re
fb70: 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ad lock */.     
fb80: 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
fb90: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  r(SQLITE_IOERR_U
fba0: 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c 61 73 74  NLOCK, osGetLast
fbb0: 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
fbc0: 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f          "winUnlo
fbd0: 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ck", pFile->zPat
fbe0: 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  h);.    }.  }.  
fbf0: 69 66 28 20 74 79 70 65 3e 3d 52 45 53 45 52 56  if( type>=RESERV
fc00: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 6f  ED_LOCK ){.    o
fc10: 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c  sUnlockFile(pFil
fc20: 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
fc30: 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
fc40: 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70   }.  if( locktyp
fc50: 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79  e==NO_LOCK && ty
fc60: 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe>=SHARED_LOCK 
fc70: 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 52 65 61  ){.    unlockRea
fc80: 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
fc90: 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50 45  }.  if( type>=PE
fca0: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20  NDING_LOCK ){.  
fcb0: 20 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 70    osUnlockFile(p
fcc0: 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47  File->h, PENDING
fcd0: 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
fce0: 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f  .  }.  pFile->lo
fcf0: 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6c 6f 63  cktype = (u8)loc
fd00: 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20  ktype;.  return 
fd10: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
fd20: 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69 74 69  *pArg is inititi
fd30: 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68  ally negative th
fd40: 65 6e 20 74 68 69 73 20 69 73 20 61 20 71 75 65  en this is a que
fd50: 72 79 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74  ry.  Set *pArg t
fd60: 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65  o.** 1 or 0 depe
fd70: 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
fd80: 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b   or not bit mask
fd90: 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46   of pFile->ctrlF
fda0: 6c 61 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a  lags is set..**.
fdb0: 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 30  ** If *pArg is 0
fdc0: 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61   or 1, then clea
fdd0: 72 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73  r or set the mas
fde0: 6b 20 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e  k bit of pFile->
fdf0: 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74  ctrlFlags..*/.st
fe00: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 6f 64  atic void winMod
fe10: 65 42 69 74 28 77 69 6e 46 69 6c 65 20 2a 70 46  eBit(winFile *pF
fe20: 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ile, unsigned ch
fe30: 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41  ar mask, int *pA
fe40: 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67  rg){.  if( *pArg
fe50: 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20  <0 ){.    *pArg 
fe60: 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  = (pFile->ctrlFl
fe70: 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a  ags & mask)!=0;.
fe80: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41    }else if( (*pA
fe90: 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  rg)==0 ){.    pF
fea0: 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
feb0: 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65  = ~mask;.  }else
fec0: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
fed0: 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a  lFlags |= mask;.
fee0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e    }.}../*.** Con
fef0: 74 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20 6f  trol and query o
ff00: 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  f the open file 
ff10: 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
ff20: 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e  c int winFileCon
ff30: 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
ff40: 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76  e *id, int op, v
ff50: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 69  oid *pArg){.  wi
ff60: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
ff70: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  winFile*)id;.  s
ff80: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
ff90: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
ffa0: 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a  TL_LOCKSTATE: {.
ffb0: 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
ffc0: 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  g = pFile->lockt
ffd0: 79 70 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ype;.      retur
ffe0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
fff0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
10000 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b  TE_LAST_ERRNO: {
10010 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
10020 72 67 20 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d  rg = (int)pFile-
10030 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20  >lastErrno;.    
10040 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10050 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
10060 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
10070 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20  CHUNK_SIZE: {.  
10080 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75      pFile->szChu
10090 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72  nk = *(int *)pAr
100a0 67 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  g;.      return 
100b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
100c0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
100d0 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
100e0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46  : {.      if( pF
100f0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29  ile->szChunk>0 )
10100 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10110 33 5f 69 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a 20  3_int64 oldSz;. 
10120 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
10130 77 69 6e 46 69 6c 65 53 69 7a 65 28 69 64 2c 20  winFileSize(id, 
10140 26 6f 6c 64 53 7a 29 3b 0a 20 20 20 20 20 20 20  &oldSz);.       
10150 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10160 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
10170 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 65  sqlite3_int64 ne
10180 77 53 7a 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f  wSz = *(sqlite3_
10190 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20 20 20  int64*)pArg;.   
101a0 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 53 7a         if( newSz
101b0 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20 20 20 20 20  >oldSz ){.      
101c0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
101d0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
101e0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
101f0 20 77 69 6e 54 72 75 6e 63 61 74 65 28 69 64 2c   winTruncate(id,
10200 20 6e 65 77 53 7a 29 3b 0a 20 20 20 20 20 20 20   newSz);.       
10210 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
10220 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
10230 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
10240 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
10250 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
10260 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
10270 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
10280 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
10290 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a  NTL_PERSIST_WAL:
102a0 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65   {.      winMode
102b0 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49  Bit(pFile, WINFI
102c0 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20  LE_PERSIST_WAL, 
102d0 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20  (int*)pArg);.   
102e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
102f0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
10300 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
10310 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
10320 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 77 69  RITE: {.      wi
10330 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20  nModeBit(pFile, 
10340 57 49 4e 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69  WINFILE_PSOW, (i
10350 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20  nt*)pArg);.     
10360 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10370 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
10380 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56  e SQLITE_FCNTL_V
10390 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20  FSNAME: {.      
103a0 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
103b0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
103c0 22 77 69 6e 33 32 22 29 3b 0a 20 20 20 20 20 20  "win32");.      
103d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
103e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
103f0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 59   SQLITE_FCNTL_SY
10400 4e 43 5f 4f 4d 49 54 54 45 44 3a 20 7b 0a 20 20  NC_OMITTED: {.  
10410 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10420 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
10430 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
10440 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59  L_WIN32_AV_RETRY
10450 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61  : {.      int *a
10460 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20   = (int*)pArg;. 
10470 20 20 20 20 20 69 66 28 20 61 5b 30 5d 3e 30 20       if( a[0]>0 
10480 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 33 32  ){.        win32
10490 49 6f 65 72 72 52 65 74 72 79 20 3d 20 61 5b 30  IoerrRetry = a[0
104a0 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ];.      }else{.
104b0 20 20 20 20 20 20 20 20 61 5b 30 5d 20 3d 20 77          a[0] = w
104c0 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 3b 0a  in32IoerrRetry;.
104d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
104e0 28 20 61 5b 31 5d 3e 30 20 29 7b 0a 20 20 20 20  ( a[1]>0 ){.    
104f0 20 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52 65      win32IoerrRe
10500 74 72 79 44 65 6c 61 79 20 3d 20 61 5b 31 5d 3b  tryDelay = a[1];
10510 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10520 20 20 20 20 20 20 61 5b 31 5d 20 3d 20 77 69 6e        a[1] = win
10530 33 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  32IoerrRetryDela
10540 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  y;.      }.     
10550 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10560 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
10570 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
10580 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  FOUND;.}../*.** 
10590 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f  Return the secto
105a0 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  r size in bytes 
105b0 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
105c0 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66  g block device f
105d0 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66  or.** the specif
105e0 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69  ied file. This i
105f0 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20  s almost always 
10600 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d  512 bytes, but m
10610 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20  ay be.** larger 
10620 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73  for some devices
10630 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63  ..**.** SQLite c
10640 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73  ode assumes this
10650 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74   function cannot
10660 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61   fail. It also a
10670 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69  ssumes that.** i
10680 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20  f two files are 
10690 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73  created in the s
106a0 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ame file-system 
106b0 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a  directory (i.e..
106c0 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e  ** a database an
106d0 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  d its journal fi
106e0 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63  le) that the sec
106f0 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
10700 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72   the.** same for
10710 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63   both..*/.static
10720 20 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53 69   int winSectorSi
10730 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
10740 2a 69 64 29 7b 0a 20 20 28 76 6f 69 64 29 69 64  *id){.  (void)id
10750 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
10760 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52  E_DEFAULT_SECTOR
10770 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _SIZE;.}../*.** 
10780 52 65 74 75 72 6e 20 61 20 76 65 63 74 6f 72 20  Return a vector 
10790 6f 66 20 64 65 76 69 63 65 20 63 68 61 72 61 63  of device charac
107a0 74 65 72 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74  teristics..*/.st
107b0 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 76 69  atic int winDevi
107c0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
107d0 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
107e0 69 64 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  id){.  winFile *
107f0 70 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  p = (winFile*)id
10800 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
10810 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41  E_IOCAP_UNDELETA
10820 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a  BLE_WHEN_OPEN |.
10830 20 20 20 20 20 20 20 20 20 28 28 70 2d 3e 63 74           ((p->ct
10840 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c  rlFlags & WINFIL
10850 45 5f 50 53 4f 57 29 3f 53 51 4c 49 54 45 5f 49  E_PSOW)?SQLITE_I
10860 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
10870 56 45 52 57 52 49 54 45 3a 30 29 3b 0a 7d 0a 0a  VERWRITE:0);.}..
10880 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10890 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 20 0a 2a 2a 20  MIT_WAL../* .** 
108a0 57 69 6e 64 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c  Windows will onl
108b0 79 20 6c 65 74 20 79 6f 75 20 63 72 65 61 74 65  y let you create
108c0 20 66 69 6c 65 20 76 69 65 77 20 6d 61 70 70 69   file view mappi
108d0 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61  ngs.** on alloca
108e0 74 69 6f 6e 20 73 69 7a 65 20 67 72 61 6e 75 6c  tion size granul
108f0 61 72 69 74 79 20 62 6f 75 6e 64 61 72 69 65 73  arity boundaries
10900 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 73 71 6c 69  ..** During sqli
10910 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 65  te3_os_init() we
10920 20 64 6f 20 61 20 47 65 74 53 79 73 74 65 6d 49   do a GetSystemI
10930 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20 67 65 74 20  nfo().** to get 
10940 74 68 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20  the granularity 
10950 73 69 7a 65 2e 0a 2a 2f 0a 53 59 53 54 45 4d 5f  size..*/.SYSTEM_
10960 49 4e 46 4f 20 77 69 6e 53 79 73 49 6e 66 6f 3b  INFO winSysInfo;
10970 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66  ../*.** Helper f
10980 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61  unctions to obta
10990 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73  in and relinquis
109a0 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74  h the global mut
109b0 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61  ex. The.** globa
109c0 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20  l mutex is used 
109d0 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 77  to protect the w
109e0 69 6e 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63  inLockInfo objec
109f0 74 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74  ts used by .** t
10a00 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66  his file, all of
10a10 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 73 68   which may be sh
10a20 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65  ared by multiple
10a30 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20   threads..**.** 
10a40 46 75 6e 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d  Function winShmM
10a50 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73  utexHeld() is us
10a60 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  ed to assert() t
10a70 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  hat the global m
10a80 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64  utex .** is held
10a90 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20   when required. 
10aa0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
10ab0 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61   only used as pa
10ac0 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a  rt of assert() .
10ad0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65  ** statements. e
10ae0 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53  .g..**.**   winS
10af0 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a  hmEnterMutex().*
10b00 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 77 69  *     assert( wi
10b10 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
10b20 29 3b 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 4c 65  );.**   winShmLe
10b30 61 76 65 4d 75 74 65 78 28 29 0a 2a 2f 0a 73 74  aveMutex().*/.st
10b40 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d  atic void winShm
10b50 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29  EnterMutex(void)
10b60 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
10b70 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d  x_enter(sqlite3M
10b80 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
10b90 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
10ba0 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63  STER));.}.static
10bb0 20 76 6f 69 64 20 77 69 6e 53 68 6d 4c 65 61 76   void winShmLeav
10bc0 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20  eMutex(void){.  
10bd0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
10be0 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78  ave(sqlite3Mutex
10bf0 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
10c00 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
10c10 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c  ));.}.#ifdef SQL
10c20 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
10c30 20 69 6e 74 20 77 69 6e 53 68 6d 4d 75 74 65 78   int winShmMutex
10c40 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72  Held(void) {.  r
10c50 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75  eturn sqlite3_mu
10c60 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33  tex_held(sqlite3
10c70 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
10c80 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
10c90 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69  ASTER));.}.#endi
10ca0 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20  f../*.** Object 
10cb0 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
10cc0 74 20 61 20 73 69 6e 67 6c 65 20 66 69 6c 65 20  t a single file 
10cd0 6f 70 65 6e 65 64 20 61 6e 64 20 6d 6d 61 70 70  opened and mmapp
10ce0 65 64 20 74 6f 20 70 72 6f 76 69 64 65 0a 2a 2a  ed to provide.**
10cf0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20   shared memory. 
10d00 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74   When multiple t
10d10 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72  hreads all refer
10d20 65 6e 63 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a  ence the same.**
10d30 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c 20 65 61   log-summary, ea
10d40 63 68 20 74 68 72 65 61 64 20 68 61 73 20 69 74  ch thread has it
10d50 73 20 6f 77 6e 20 77 69 6e 46 69 6c 65 20 6f 62  s own winFile ob
10d60 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79 20 61  ject, but they a
10d70 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61  ll.** point to a
10d80 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65   single instance
10d90 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 2e   of this object.
10da0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
10db0 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75  , each.** log-su
10dc0 6d 6d 61 72 79 20 69 73 20 6f 70 65 6e 65 64 20  mmary is opened 
10dd0 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72  only once per pr
10de0 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e  ocess..**.** win
10df0 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d  ShmMutexHeld() m
10e00 75 73 74 20 62 65 20 74 72 75 65 20 77 68 65 6e  ust be true when
10e10 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73   creating or des
10e20 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20  troying.** this 
10e30 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20  object or while 
10e40 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
10e50 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
10e60 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20   fields:.**.**  
10e70 20 20 20 20 6e 52 65 66 0a 2a 2a 20 20 20 20 20      nRef.**     
10e80 20 70 4e 65 78 74 20 0a 2a 2a 0a 2a 2a 20 54 68   pNext .**.** Th
10e90 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
10ea0 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79  ds are read-only
10eb0 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63   after the objec
10ec0 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a  t is created:.**
10ed0 20 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a   .**      fid.**
10ee0 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a        zFilename.
10ef0 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 77 69 6e  **.** Either win
10f00 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75  ShmNode.mutex mu
10f10 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20 77 69  st be held or wi
10f20 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30  nShmNode.nRef==0
10f30 20 61 6e 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75   and.** winShmMu
10f40 74 65 78 48 65 6c 64 28 29 20 69 73 20 74 72 75  texHeld() is tru
10f50 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f  e when reading o
10f60 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74  r writing any ot
10f70 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20  her field.** in 
10f80 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a  this structure..
10f90 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e  **.*/.struct win
10fa0 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 73 71 6c 69  ShmNode {.  sqli
10fb0 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
10fc0 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20  ;      /* Mutex 
10fd0 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f  to access this o
10fe0 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20  bject */.  char 
10ff0 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
11000 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
11010 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 77   the file */.  w
11020 69 6e 46 69 6c 65 20 68 46 69 6c 65 3b 20 20 20  inFile hFile;   
11030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
11040 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 77 69  e handle from wi
11050 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20  nOpen */..  int 
11060 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  szRegion;       
11070 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
11080 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  f shared-memory 
11090 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  regions */.  int
110a0 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20   nRegion;       
110b0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
110c0 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69 6f  of array apRegio
110d0 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 68  n */.  struct Sh
110e0 6d 52 65 67 69 6f 6e 20 7b 0a 20 20 20 20 48 41  mRegion {.    HA
110f0 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20  NDLE hMap;      
11100 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68         /* File h
11110 61 6e 64 6c 65 20 66 72 6f 6d 20 43 72 65 61 74  andle from Creat
11120 65 46 69 6c 65 4d 61 70 70 69 6e 67 20 2a 2f 0a  eFileMapping */.
11130 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 3b 0a      void *pMap;.
11140 20 20 7d 20 2a 61 52 65 67 69 6f 6e 3b 0a 20 20    } *aRegion;.  
11150 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
11160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11170 65 20 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20  e Windows errno 
11180 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f  from the last I/
11190 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e  O error */..  in
111a0 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
111b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
111c0 65 72 20 6f 66 20 77 69 6e 53 68 6d 20 6f 62 6a  er of winShm obj
111d0 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ects pointing to
111e0 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68   this */.  winSh
111f0 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  m *pFirst;      
11200 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 77 69 6e        /* All win
11210 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
11220 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
11230 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e    winShmNode *pN
11240 65 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ext;         /* 
11250 4e 65 78 74 20 69 6e 20 6c 69 73 74 20 6f 66 20  Next in list of 
11260 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f  all winShmNode o
11270 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66 64 65 66  bjects */.#ifdef
11280 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
11290 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20  u8 nextShmId;   
112a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
112b0 78 74 20 61 76 61 69 6c 61 62 6c 65 20 77 69 6e  xt available win
112c0 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a  Shm.id value */.
112d0 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
112e0 20 41 20 67 6c 6f 62 61 6c 20 61 72 72 61 79 20   A global array 
112f0 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64  of all winShmNod
11300 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a  e objects..**.**
11310 20 54 68 65 20 77 69 6e 53 68 6d 4d 75 74 65 78   The winShmMutex
11320 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74  Held() must be t
11330 72 75 65 20 77 68 69 6c 65 20 72 65 61 64 69 6e  rue while readin
11340 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 69  g or writing thi
11350 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  s list..*/.stati
11360 63 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 77 69  c winShmNode *wi
11370 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 30  nShmNodeList = 0
11380 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75  ;../*.** Structu
11390 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  re used internal
113a0 6c 79 20 62 79 20 74 68 69 73 20 56 46 53 20 74  ly by this VFS t
113b0 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61  o record the sta
113c0 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e  te of an.** open
113d0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63   shared memory c
113e0 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  onnection..**.**
113f0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
11400 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61  ields are initia
11410 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20  lized when this 
11420 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
11430 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61  d and.** are rea
11440 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65  d-only thereafte
11450 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 77 69 6e 53  r:.**.**    winS
11460 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20  hm.pShmNode.**  
11470 20 20 77 69 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a    winShm.id.**.*
11480 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c  * All other fiel
11490 64 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74  ds are read/writ
114a0 65 2e 20 20 54 68 65 20 77 69 6e 53 68 6d 2e 70  e.  The winShm.p
114b0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 6d  ShmNode->mutex m
114c0 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
114d0 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61  hile accessing a
114e0 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20 66 69  ny read/write fi
114f0 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  elds..*/.struct 
11500 77 69 6e 53 68 6d 20 7b 0a 20 20 77 69 6e 53 68  winShm {.  winSh
11510 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
11520 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
11530 65 72 6c 79 69 6e 67 20 77 69 6e 53 68 6d 4e 6f  erlying winShmNo
11540 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 77  de object */.  w
11550 69 6e 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20  inShm *pNext;   
11560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
11570 74 20 77 69 6e 53 68 6d 20 77 69 74 68 20 74 68  t winShm with th
11580 65 20 73 61 6d 65 20 77 69 6e 53 68 6d 4e 6f 64  e same winShmNod
11590 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74  e */.  u8 hasMut
115a0 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
115b0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c    /* True if hol
115c0 64 69 6e 67 20 74 68 65 20 77 69 6e 53 68 6d 4e  ding the winShmN
115d0 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75  ode mutex */.  u
115e0 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  16 sharedMask;  
115f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
11600 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b  k of shared lock
11610 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20  s held */.  u16 
11620 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20  exclMask;       
11630 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
11640 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  f exclusive lock
11650 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66  s held */.#ifdef
11660 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
11670 75 38 20 69 64 3b 20 20 20 20 20 20 20 20 20 20  u8 id;          
11680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64             /* Id
11690 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   of this connect
116a0 69 6f 6e 20 77 69 74 68 20 69 74 73 20 77 69 6e  ion with its win
116b0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69  ShmNode */.#endi
116c0 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  f.};../*.** Cons
116d0 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c  tants used for l
116e0 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e  ocking.*/.#defin
116f0 65 20 57 49 4e 5f 53 48 4d 5f 42 41 53 45 20 20  e WIN_SHM_BASE  
11700 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d   ((22+SQLITE_SHM
11710 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20  _NLOCK)*4)      
11720 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20    /* first lock 
11730 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  byte */.#define 
11740 57 49 4e 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28  WIN_SHM_DMS    (
11750 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c  WIN_SHM_BASE+SQL
11760 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20  ITE_SHM_NLOCK)  
11770 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63  /* deadman switc
11780 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c  h */../*.** Appl
11790 79 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  y advisory locks
117a0 20 66 6f 72 20 61 6c 6c 20 6e 20 62 79 74 65 73   for all n bytes
117b0 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 6f 66   beginning at of
117c0 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 5f  st..*/.#define _
117d0 53 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23 64 65  SHM_UNLCK  1.#de
117e0 66 69 6e 65 20 5f 53 48 4d 5f 52 44 4c 43 4b 20  fine _SHM_RDLCK 
117f0 20 32 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f   2.#define _SHM_
11800 57 52 4c 43 4b 20 20 33 0a 73 74 61 74 69 63 20  WRLCK  3.static 
11810 69 6e 74 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  int winShmSystem
11820 4c 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e 6f  Lock(.  winShmNo
11830 64 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a  de *pFile,    /*
11840 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20   Apply locks to 
11850 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64  this open shared
11860 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20  -memory segment 
11870 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70  */.  int lockTyp
11880 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 5f 53  e,         /* _S
11890 48 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52  HM_UNLCK, _SHM_R
118a0 44 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57 52  DLCK, or _SHM_WR
118b0 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  LCK */.  int ofs
118c0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
118d0 2a 20 4f 66 66 73 65 74 20 74 6f 20 66 69 72 73  * Offset to firs
118e0 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63  t byte to be loc
118f0 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a  ked/unlocked */.
11900 20 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20 20    int nByte     
11910 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11920 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
11930 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a  ck or unlock */.
11940 29 7b 0a 20 20 4f 56 45 52 4c 41 50 50 45 44 20  ){.  OVERLAPPED 
11950 6f 76 6c 70 3b 0a 20 20 44 57 4f 52 44 20 64 77  ovlp;.  DWORD dw
11960 46 6c 61 67 73 3b 0a 20 20 69 6e 74 20 72 63 20  Flags;.  int rc 
11970 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
11980 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f  * Result code fo
11990 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69  rm Lock/UnlockFi
119a0 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20  leEx() */..  /* 
119b0 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 77 69  Access to the wi
119c0 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  nShmNode object 
119d0 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79  is serialized by
119e0 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20   the caller */. 
119f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11a00 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 69 6c  _mutex_held(pFil
11a10 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 46 69  e->mutex) || pFi
11a20 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  le->nRef==0 );..
11a30 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
11a40 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61  the locking para
11a50 6d 65 74 65 72 73 20 2a 2f 0a 20 20 64 77 46 6c  meters */.  dwFl
11a60 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46  ags = LOCKFILE_F
11a70 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 3b  AIL_IMMEDIATELY;
11a80 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 20  .  if( lockType 
11a90 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 29 20  == _SHM_WRLCK ) 
11aa0 64 77 46 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b 46  dwFlags |= LOCKF
11ab0 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ILE_EXCLUSIVE_LO
11ac0 43 4b 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 6f  CK;..  memset(&o
11ad0 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f  vlp, 0, sizeof(O
11ae0 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 6f  VERLAPPED));.  o
11af0 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 73  vlp.Offset = ofs
11b00 74 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65  t;..  /* Release
11b10 2f 41 63 71 75 69 72 65 20 74 68 65 20 73 79 73  /Acquire the sys
11b20 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a  tem-level lock *
11b30 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65  /.  if( lockType
11b40 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a  ==_SHM_UNLCK ){.
11b50 20 20 20 20 72 63 20 3d 20 6f 73 55 6e 6c 6f 63      rc = osUnloc
11b60 6b 46 69 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68  kFileEx(pFile->h
11b70 46 69 6c 65 2e 68 2c 20 30 2c 20 6e 42 79 74 65  File.h, 0, nByte
11b80 2c 20 30 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d  , 0, &ovlp);.  }
11b90 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f  else{.    rc = o
11ba0 73 4c 6f 63 6b 46 69 6c 65 45 78 28 70 46 69 6c  sLockFileEx(pFil
11bb0 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 64 77 46 6c  e->hFile.h, dwFl
11bc0 61 67 73 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30  ags, 0, nByte, 0
11bd0 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 0a 20 20  , &ovlp);.  }.  
11be0 0a 20 20 69 66 28 20 72 63 21 3d 20 30 20 29 7b  .  if( rc!= 0 ){
11bf0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
11c00 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
11c10 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
11c20 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73 74 45  no =  osGetLastE
11c30 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d  rror();.    rc =
11c40 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
11c50 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  }..  OSTRACE(("S
11c60 48 4d 2d 4c 4f 43 4b 20 25 64 20 25 73 20 25 73  HM-LOCK %d %s %s
11c70 20 30 78 25 30 38 6c 78 5c 6e 22 2c 20 0a 20 20   0x%08lx\n", .  
11c80 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
11c90 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20  hFile.h,.       
11ca0 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
11cb0 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
11cc0 65 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ed",.           
11cd0 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55  lockType==_SHM_U
11ce0 4e 4c 43 4b 20 3f 20 22 55 6e 6c 6f 63 6b 46 69  NLCK ? "UnlockFi
11cf0 6c 65 45 78 22 20 3a 20 22 4c 6f 63 6b 46 69 6c  leEx" : "LockFil
11d00 65 45 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20  eEx",.          
11d10 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
11d20 6f 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  o));..  return r
11d30 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
11d40 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56   references to V
11d50 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74  FS methods */.st
11d60 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e  atic int winOpen
11d70 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 63 6f  (sqlite3_vfs*,co
11d80 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65  nst char*,sqlite
11d90 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a  3_file*,int,int*
11da0 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  );.static int wi
11db0 6e 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f  nDelete(sqlite3_
11dc0 76 66 73 20 2a 2c 63 6f 6e 73 74 20 63 68 61 72  vfs *,const char
11dd0 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50  *,int);../*.** P
11de0 75 72 67 65 20 74 68 65 20 77 69 6e 53 68 6d 4e  urge the winShmN
11df0 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20  odeList list of 
11e00 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68  all entries with
11e10 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66   winShmNode.nRef
11e20 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ==0..**.** This 
11e30 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61  is not a VFS sha
11e40 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f  red-memory metho
11e50 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c 69  d; it is a utili
11e60 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ty function call
11e70 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61  ed.** by VFS sha
11e80 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f  red-memory metho
11e90 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
11ea0 69 64 20 77 69 6e 53 68 6d 50 75 72 67 65 28 73  id winShmPurge(s
11eb0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
11ec0 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67  , int deleteFlag
11ed0 29 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ){.  winShmNode 
11ee0 2a 2a 70 70 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f  **pp;.  winShmNo
11ef0 64 65 20 2a 70 3b 0a 20 20 42 4f 4f 4c 20 62 52  de *p;.  BOOL bR
11f00 63 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e  c;.  assert( win
11f10 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29  ShmMutexHeld() )
11f20 3b 0a 20 20 70 70 20 3d 20 26 77 69 6e 53 68 6d  ;.  pp = &winShm
11f30 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c  NodeList;.  whil
11f40 65 28 20 28 70 20 3d 20 2a 70 70 29 21 3d 30 20  e( (p = *pp)!=0 
11f50 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52  ){.    if( p->nR
11f60 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ef==0 ){.      i
11f70 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20  nt i;.      if( 
11f80 70 2d 3e 6d 75 74 65 78 20 29 20 73 71 6c 69 74  p->mutex ) sqlit
11f90 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d  e3_mutex_free(p-
11fa0 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 66  >mutex);.      f
11fb0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65  or(i=0; i<p->nRe
11fc0 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  gion; i++){.    
11fd0 20 20 20 20 62 52 63 20 3d 20 6f 73 55 6e 6d 61      bRc = osUnma
11fe0 70 56 69 65 77 4f 66 46 69 6c 65 28 70 2d 3e 61  pViewOfFile(p->a
11ff0 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b  Region[i].pMap);
12000 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
12010 28 28 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64  (("SHM-PURGE pid
12020 2d 25 64 20 75 6e 6d 61 70 20 72 65 67 69 6f 6e  -%d unmap region
12030 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  =%d %s\n",.     
12040 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
12050 29 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f  )osGetCurrentPro
12060 63 65 73 73 49 64 28 29 2c 20 69 2c 0a 20 20 20  cessId(), i,.   
12070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 52                bR
12080 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  c ? "ok" : "fail
12090 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 62  ed"));.        b
120a0 52 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64  Rc = osCloseHand
120b0 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d  le(p->aRegion[i]
120c0 2e 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  .hMap);.        
120d0 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55  OSTRACE(("SHM-PU
120e0 52 47 45 20 70 69 64 2d 25 64 20 63 6c 6f 73 65  RGE pid-%d close
120f0 20 72 65 67 69 6f 6e 3d 25 64 20 25 73 5c 6e 22   region=%d %s\n"
12100 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12110 20 20 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72     (int)osGetCur
12120 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
12130 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   i,.            
12140 20 20 20 20 20 62 52 63 20 3f 20 22 6f 6b 22 20       bRc ? "ok" 
12150 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
12160 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
12170 70 2d 3e 68 46 69 6c 65 2e 68 20 21 3d 20 49 4e  p->hFile.h != IN
12180 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
12190 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69  UE ){.        Si
121a0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
121b0 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20  ign(1);.        
121c0 77 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74 65  winClose((sqlite
121d0 33 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69  3_file *)&p->hFi
121e0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d  le);.        Sim
121f0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
12200 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  gn(0);.      }. 
12210 20 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46       if( deleteF
12220 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 53  lag ){.        S
12230 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
12240 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20  nign(1);.       
12250 20 77 69 6e 44 65 6c 65 74 65 28 70 56 66 73 2c   winDelete(pVfs,
12260 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 30   p->zFilename, 0
12270 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c  );.        Simul
12280 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
12290 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (0);.      }.   
122a0 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78     *pp = p->pNex
122b0 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
122c0 5f 66 72 65 65 28 70 2d 3e 61 52 65 67 69 6f 6e  _free(p->aRegion
122d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
122e0 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 65  _free(p);.    }e
122f0 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 20 3d 20  lse{.      pp = 
12300 26 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  &p->pNext;.    }
12310 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  .  }.}../*.** Op
12320 65 6e 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  en the shared-me
12330 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63 69  mory area associ
12340 61 74 65 64 20 77 69 74 68 20 64 61 74 61 62 61  ated with databa
12350 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e 0a 2a  se file pDbFd..*
12360 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e  *.** When openin
12370 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d  g a new shared-m
12380 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e  emory file, if n
12390 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65  o other instance
123a0 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c  s of that.** fil
123b0 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  e are currently 
123c0 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72  open, in this pr
123d0 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65  ocess or in othe
123e0 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65  r processes, the
123f0 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75  n.** the file mu
12400 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  st be truncated 
12410 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f  to zero length o
12420 72 20 68 61 76 65 20 69 74 73 20 68 65 61 64 65  r have its heade
12430 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74  r cleared..*/.st
12440 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e  atic int winOpen
12450 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 77 69 6e  SharedMemory(win
12460 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20  File *pDbFd){.  
12470 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 2a 70  struct winShm *p
12480 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12490 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
124a0 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65  tion to be opene
124b0 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69  d */.  struct wi
124c0 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  nShmNode *pShmNo
124d0 64 65 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65  de = 0;   /* The
124e0 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70   underlying mmap
124f0 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ped file */.  in
12500 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
12510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12520 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
12530 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53  */.  struct winS
12540 68 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b 20 20 20  hmNode *pNew;   
12550 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79          /* Newly
12560 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 6e 53 68   allocated winSh
12570 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  mNode */.  int n
12580 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
12590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
125a0 20 53 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69   Size of zName i
125b0 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 61 73  n bytes */..  as
125c0 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68  sert( pDbFd->pSh
125d0 6d 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e 6f  m==0 );    /* No
125e0 74 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65  t previously ope
125f0 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  ned */..  /* All
12600 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
12610 74 68 65 20 6e 65 77 20 73 71 6c 69 74 65 33 5f  the new sqlite3_
12620 73 68 6d 20 6f 62 6a 65 63 74 2e 20 20 41 6c 73  shm object.  Als
12630 6f 20 73 70 65 63 75 6c 61 74 69 76 65 6c 79 0a  o speculatively.
12640 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70    ** allocate sp
12650 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 77 69  ace for a new wi
12660 6e 53 68 6d 4e 6f 64 65 20 61 6e 64 20 66 69 6c  nShmNode and fil
12670 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 20  ename..  */.  p 
12680 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
12690 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
126a0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
126b0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
126c0 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74  _NOMEM;.  memset
126d0 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  (p, 0, sizeof(*p
126e0 29 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71  ));.  nName = sq
126f0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44  lite3Strlen30(pD
12700 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 70  bFd->zPath);.  p
12710 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  New = sqlite3_ma
12720 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 53  lloc( sizeof(*pS
12730 68 6d 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20  hmNode) + nName 
12740 2b 20 31 36 20 29 3b 0a 20 20 69 66 28 20 70 4e  + 16 );.  if( pN
12750 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ew==0 ){.    sql
12760 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
12770 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12780 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
12790 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20  .  memset(pNew, 
127a0 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  0, sizeof(*pNew)
127b0 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 46 69 6c 65  );.  pNew->zFile
127c0 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
127d0 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69 74 65  New[1];.  sqlite
127e0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61 6d 65  3_snprintf(nName
127f0 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65  +15, pNew->zFile
12800 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20  name, "%s-shm", 
12810 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
12820 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
12830 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  ix3(pDbFd->zPath
12840 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d  , pNew->zFilenam
12850 65 29 3b 20 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  e); ..  /* Look 
12860 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
12870 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 77  is an existing w
12880 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74 20 63  inShmNode that c
12890 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a  an be used..  **
128a0 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   If no matching 
128b0 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72 72 65  winShmNode curre
128c0 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63 72 65  ntly exists, cre
128d0 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20  ate a new one.. 
128e0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65   */.  winShmEnte
128f0 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28  rMutex();.  for(
12900 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e 53 68  pShmNode = winSh
12910 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68 6d 4e  mNodeList; pShmN
12920 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d 70 53  ode; pShmNode=pS
12930 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29 7b 0a  hmNode->pNext){.
12940 20 20 20 20 2f 2a 20 54 42 44 20 6e 65 65 64 20      /* TBD need 
12950 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74 68 20  to come up with 
12960 62 65 74 74 65 72 20 6d 61 74 63 68 20 68 65 72  better match her
12970 65 2e 20 20 50 65 72 68 61 70 73 0a 20 20 20 20  e.  Perhaps.    
12980 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49 44 5f 42  ** use FILE_ID_B
12990 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53 74 72  OTH_DIR_INFO Str
129a0 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ucture..    */. 
129b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
129c0 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65 2d 3e  rICmp(pShmNode->
129d0 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 2d  zFilename, pNew-
129e0 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 29  >zFilename)==0 )
129f0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
12a00 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20  ( pShmNode ){.  
12a10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
12a20 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  New);.  }else{. 
12a30 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 4e     pShmNode = pN
12a40 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  ew;.    pNew = 0
12a50 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c 65 2a  ;.    ((winFile*
12a60 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  )(&pShmNode->hFi
12a70 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41 4c 49  le))->h = INVALI
12a80 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a  D_HANDLE_VALUE;.
12a90 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e      pShmNode->pN
12aa0 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65  ext = winShmNode
12ab0 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53 68 6d  List;.    winShm
12ac0 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68 6d 4e  NodeList = pShmN
12ad0 6f 64 65 3b 0a 0a 20 20 20 20 70 53 68 6d 4e 6f  ode;..    pShmNo
12ae0 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  de->mutex = sqli
12af0 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
12b00 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
12b10 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d  T);.    if( pShm
12b20 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29  Node->mutex==0 )
12b30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
12b40 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
12b50 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
12b60 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
12b70 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65  .    rc = winOpe
12b80 6e 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 0a 20  n(pDbFd->pVfs,. 
12b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ba0 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
12bb0 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ame,            
12bc0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
12bd0 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a  file (UTF-8) */.
12be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bf0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
12c00 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
12c10 2c 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c  ,  /* File handl
12c20 65 20 68 65 72 65 20 2a 2f 0a 20 20 20 20 20 20  e here */.      
12c30 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
12c40 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 20 53 51 4c  E_OPEN_WAL | SQL
12c50 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
12c60 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
12c70 5f 43 52 45 41 54 45 2c 20 2f 2a 20 4d 6f 64 65  _CREATE, /* Mode
12c80 20 66 6c 61 67 73 20 2a 2f 0a 20 20 20 20 20 20   flags */.      
12c90 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20             0);. 
12ca0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
12cb0 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 72 63  !=rc ){.      rc
12cc0 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
12cd0 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  EN_BKPT;.      g
12ce0 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
12cf0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
12d00 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
12d10 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
12d20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64  is holding the d
12d30 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a  ead-man switch..
12d40 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74      ** If not, t
12d50 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65  runcate the file
12d60 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e   to zero length.
12d70 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
12d80 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
12d90 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
12da0 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f  _WRLCK, WIN_SHM_
12db0 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f  DMS, 1)==SQLITE_
12dc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
12dd0 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71   winTruncate((sq
12de0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53  lite3_file *)&pS
12df0 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 30  hmNode->hFile, 0
12e00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
12e10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12e20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
12e30 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
12e40 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f 73 47  ERR_SHMOPEN, osG
12e50 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
12e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e70 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70 44  "winOpenShm", pD
12e80 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  bFd->zPath);.   
12e90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
12ea0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12eb0 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 53 68 6d   ){.      winShm
12ec0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
12ed0 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c  ode, _SHM_UNLCK,
12ee0 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29   WIN_SHM_DMS, 1)
12ef0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
12f00 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
12f10 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c  hmNode, _SHM_RDL
12f20 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
12f30 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   1);.    }.    i
12f40 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d  f( rc ) goto shm
12f50 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a  _open_err;.  }..
12f60 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65    /* Make the ne
12f70 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63  w connection a c
12f80 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69 6e 53  hild of the winS
12f90 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70  hmNode */.  p->p
12fa0 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f  ShmNode = pShmNo
12fb0 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  de;.#ifdef SQLIT
12fc0 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20  E_DEBUG.  p->id 
12fd0 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74  = pShmNode->next
12fe0 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a  ShmId++;.#endif.
12ff0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66    pShmNode->nRef
13000 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68  ++;.  pDbFd->pSh
13010 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d 4c  m = p;.  winShmL
13020 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20  eaveMutex();..  
13030 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63 65  /* The reference
13040 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f   count on pShmNo
13050 64 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  de has already b
13060 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20  een incremented 
13070 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63  under.  ** the c
13080 6f 76 65 72 20 6f 66 20 74 68 65 20 77 69 6e 53  over of the winS
13090 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d  hmEnterMutex() m
130a0 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69  utex and the poi
130b0 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20  nter from the.  
130c0 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20 77  ** new (struct w
130d0 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f  inShm) object to
130e0 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61   the pShmNode ha
130f0 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20  s been set. All 
13100 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66  that is.  ** lef
13110 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69  t to do is to li
13120 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63  nk the new objec
13130 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65  t into the linke
13140 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a  d list starting.
13150 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65    ** at pShmNode
13160 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d  ->pFirst. This m
13170 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c  ust be done whil
13180 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53  e holding the pS
13190 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20  hmNode->mutex . 
131a0 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a   ** mutex..  */.
131b0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
131c0 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
131d0 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65  mutex);.  p->pNe
131e0 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  xt = pShmNode->p
131f0 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64  First;.  pShmNod
13200 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20  e->pFirst = p;. 
13210 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
13220 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
13230 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
13240 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
13250 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e   Jump here on an
13260 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f  y error */.shm_o
13270 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53 68  pen_err:.  winSh
13280 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
13290 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b  Node, _SHM_UNLCK
132a0 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
132b0 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72 67 65  );.  winShmPurge
132c0 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 30 29  (pDbFd->pVfs, 0)
132d0 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ;      /* This c
132e0 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f  all frees pShmNo
132f0 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  de if required *
13300 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
13310 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  (p);.  sqlite3_f
13320 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77 69 6e  ree(pNew);.  win
13330 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
13340 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13350 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
13360 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61  onnection to sha
13370 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c  red-memory.  Del
13380 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ete the underlyi
13390 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69  ng .** storage i
133a0 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20  f deleteFlag is 
133b0 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  true..*/.static 
133c0 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70 28  int winShmUnmap(
133d0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
133e0 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *fd,          /*
133f0 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   Database holdin
13400 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  g shared memory 
13410 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46  */.  int deleteF
13420 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
13430 2f 2a 20 44 65 6c 65 74 65 20 61 66 74 65 72 20  /* Delete after 
13440 63 6c 6f 73 69 6e 67 20 69 66 20 74 72 75 65 20  closing if true 
13450 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  */.){.  winFile 
13460 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 2f 2a  *pDbFd;       /*
13470 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   Database holdin
13480 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  g shared-memory 
13490 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b 20  */.  winShm *p; 
134a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
134b0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
134c0 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 77  be closed */.  w
134d0 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
134e0 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64 65  ode; /* The unde
134f0 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65  rlying shared-me
13500 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 77  mory file */.  w
13510 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20  inShm **pp;     
13520 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
13530 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67  ing over sibling
13540 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
13550 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69 6e 46  .  pDbFd = (winF
13560 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70  ile*)fd;.  p = p
13570 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66  DbFd->pShm;.  if
13580 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
13590 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68  SQLITE_OK;.  pSh
135a0 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
135b0 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  ode;..  /* Remov
135c0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66  e connection p f
135d0 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63  rom the set of c
135e0 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63  onnections assoc
135f0 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20  iated.  ** with 
13600 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71  pShmNode */.  sq
13610 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
13620 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
13630 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53  x);.  for(pp=&pS
13640 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
13650 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26  (*pp)!=p; pp = &
13660 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a  (*pp)->pNext){}.
13670 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74    *pp = p->pNext
13680 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65  ;..  /* Free the
13690 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f   connection p */
136a0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
136b0 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68  p);.  pDbFd->pSh
136c0 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  m = 0;.  sqlite3
136d0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
136e0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a  mNode->mutex);..
136f0 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65    /* If pShmNode
13700 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68  ->nRef has reach
13710 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65  ed 0, then close
13720 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
13730 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f    ** shared-memo
13740 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a  ry file, too */.
13750 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74    winShmEnterMut
13760 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ex();.  assert( 
13770 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30  pShmNode->nRef>0
13780 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e   );.  pShmNode->
13790 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53  nRef--;.  if( pS
137a0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20  hmNode->nRef==0 
137b0 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50 75 72  ){.    winShmPur
137c0 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20  ge(pDbFd->pVfs, 
137d0 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20 7d  deleteFlag);.  }
137e0 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  .  winShmLeaveMu
137f0 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e  tex();..  return
13800 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13810 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
13820 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61  lock state for a
13830 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
13840 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  egment..*/.stati
13850 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63 6b  c int winShmLock
13860 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
13870 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *fd,          /
13880 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20  * Database file 
13890 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72  holding the shar
138a0 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  ed memory */.  i
138b0 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20  nt ofst,        
138c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
138d0 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69  st lock to acqui
138e0 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  re or release */
138f0 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20  .  int n,       
13900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13910 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   Number of locks
13920 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
13930 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
13940 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
13950 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74         /* What t
13960 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f  o do with the lo
13970 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69  ck */.){.  winFi
13980 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e  le *pDbFd = (win
13990 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 20  File*)fd;       
139a0 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68   /* Connection h
139b0 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65  olding shared me
139c0 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  mory */.  winShm
139d0 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68   *p = pDbFd->pSh
139e0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
139f0 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d 65  /* The shared me
13a00 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65  mory being locke
13a10 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  d */.  winShm *p
13a20 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
13a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13a40 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
13a50 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f   all siblings */
13a60 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
13a70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
13a80 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20  mNode;.  int rc 
13a90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
13aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13ab0 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
13ac0 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20  .  u16 mask;    
13ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
13af0 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b   of locks to tak
13b00 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
13b10 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e  .  assert( ofst>
13b20 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51  =0 && ofst+n<=SQ
13b30 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29  LITE_SHM_NLOCK )
13b40 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31  ;.  assert( n>=1
13b50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c   );.  assert( fl
13b60 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
13b70 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  _LOCK | SQLITE_S
13b80 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  HM_SHARED).     
13b90 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
13ba0 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53  ITE_SHM_LOCK | S
13bb0 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
13bc0 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  IVE).       || f
13bd0 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
13be0 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  M_UNLOCK | SQLIT
13bf0 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
13c00 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
13c10 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
13c20 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  K | SQLITE_SHM_E
13c30 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61  XCLUSIVE) );.  a
13c40 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28  ssert( n==1 || (
13c50 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
13c60 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30  HM_EXCLUSIVE)!=0
13c70 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 75   );..  mask = (u
13c80 31 36 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b 6e  16)((1U<<(ofst+n
13c90 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29 29  )) - (1U<<ofst))
13ca0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20  ;.  assert( n>1 
13cb0 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73  || mask==(1<<ofs
13cc0 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t) );.  sqlite3_
13cd0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
13ce0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
13cf0 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
13d00 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b  TE_SHM_UNLOCK ){
13d10 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b  .    u16 allMask
13d20 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66   = 0; /* Mask of
13d30 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73   locks held by s
13d40 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20  iblings */..    
13d50 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69  /* See if any si
13d60 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73  blings hold this
13d70 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20   same lock */.  
13d80 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
13d90 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
13da0 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
13db0 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20      if( pX==p ) 
13dc0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
13dd0 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63  assert( (pX->exc
13de0 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c  lMask & (p->excl
13df0 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61  Mask|p->sharedMa
13e00 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  sk))==0 );.     
13e10 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e   allMask |= pX->
13e20 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
13e30 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b  }..    /* Unlock
13e40 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65   the system-leve
13e50 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
13e60 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61  f( (mask & allMa
13e70 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
13e80 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
13e90 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
13ea0 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74  _SHM_UNLCK, ofst
13eb0 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  +WIN_SHM_BASE, n
13ec0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
13ed0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13ee0 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OK;.    }..    /
13ef0 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c  * Undo the local
13f00 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
13f10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13f20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c  ){.      p->excl
13f30 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
13f40 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
13f50 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
13f60 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   } .  }else if( 
13f70 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
13f80 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  HM_SHARED ){.   
13f90 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d   u16 allShared =
13fa0 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66   0;  /* Union of
13fb0 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63   locks held by c
13fc0 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72  onnections other
13fd0 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20   than "p" */..  
13fe0 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68    /* Find out wh
13ff0 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  ich shared locks
14000 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c   are already hel
14010 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e  d by sibling con
14020 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  nections..    **
14030 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20   If any sibling 
14040 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e  already holds an
14050 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c   exclusive lock,
14060 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65   go ahead and re
14070 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49  turn.    ** SQLI
14080 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a  TE_BUSY..    */.
14090 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
140a0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
140b0 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
140c0 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65        if( (pX->e
140d0 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  xclMask & mask)!
140e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
140f0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
14100 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
14110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c       }.      all
14120 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68  Shared |= pX->sh
14130 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  aredMask;.    }.
14140 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72  .    /* Get shar
14150 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ed locks at the 
14160 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66  system level, if
14170 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
14180 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14190 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
141a0 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61   (allShared & ma
141b0 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
141c0 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73    rc = winShmSys
141d0 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
141e0 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66  , _SHM_RDLCK, of
141f0 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c  st+WIN_SHM_BASE,
14200 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   n);.      }else
14210 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
14220 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
14230 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
14240 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68  Get the local sh
14250 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ared locks */.  
14260 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14270 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
14280 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61  sharedMask |= ma
14290 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  sk;.    }.  }els
142a0 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  e{.    /* Make s
142b0 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63  ure no sibling c
142c0 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20  onnections hold 
142d0 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20  locks that will 
142e0 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a  block this.    *
142f0 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20  * lock.  If any 
14300 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  do, return SQLIT
14310 45 5f 42 55 53 59 20 72 69 67 68 74 20 61 77 61  E_BUSY right awa
14320 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  y..    */.    fo
14330 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
14340 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
14350 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
14360 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  if( (pX->exclMas
14370 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20  k & mask)!=0 || 
14380 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  (pX->sharedMask 
14390 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
143a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
143b0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
143c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
143d0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47     }.  .    /* G
143e0 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  et the exclusive
143f0 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79   locks at the sy
14400 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65  stem level.  The
14410 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a  n if successful.
14420 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b      ** also mark
14430 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65   the local conne
14440 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c  ction as being l
14450 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ocked..    */.  
14460 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14470 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
14480 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  = winShmSystemLo
14490 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
144a0 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 57 49  M_WRLCK, ofst+WI
144b0 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  N_SHM_BASE, n);.
144c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
144d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
144e0 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73     assert( (p->s
144f0 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b  haredMask & mask
14500 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
14510 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d  p->exclMask |= m
14520 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ask;.      }.   
14530 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
14540 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
14550 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
14560 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
14570 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69  OCK shmid-%d, pi
14580 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c 25 30  d-%d got %03x,%0
14590 33 78 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  3x %s\n",.      
145a0 20 20 20 20 20 70 2d 3e 69 64 2c 20 28 69 6e 74       p->id, (int
145b0 29 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f  )osGetCurrentPro
145c0 63 65 73 73 49 64 28 29 2c 20 70 2d 3e 73 68 61  cessId(), p->sha
145d0 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c  redMask, p->excl
145e0 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Mask,.          
145f0 20 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20 3a   rc ? "failed" :
14600 20 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75 72   "ok"));.  retur
14610 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
14620 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72  mplement a memor
14630 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d  y barrier or mem
14640 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61  ory fence on sha
14650 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a  red memory.  .**
14660 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e  .** All loads an
14670 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62  d stores begun b
14680 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65  efore the barrie
14690 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20  r must complete 
146a0 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f  before.** any lo
146b0 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75  ad or store begu
146c0 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72  n after the barr
146d0 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ier..*/.static v
146e0 6f 69 64 20 77 69 6e 53 68 6d 42 61 72 72 69 65  oid winShmBarrie
146f0 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  r(.  sqlite3_fil
14700 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 2f  e *fd          /
14710 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
14720 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
14730 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55  mory */.){.  UNU
14740 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64  SED_PARAMETER(fd
14750 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42 61  );.  /* MemoryBa
14760 72 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65 73  rrier(); // does
14770 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f 20   not work -- do 
14780 6e 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f 74  not know why not
14790 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65   */.  winShmEnte
147a0 72 4d 75 74 65 78 28 29 3b 0a 20 20 77 69 6e 53  rMutex();.  winS
147b0 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  hmLeaveMutex();.
147c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
147d0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
147e0 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69   to obtain a poi
147f0 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69  nter to region i
14800 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a  Region of the .*
14810 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  * shared-memory 
14820 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
14830 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14840 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d  e fd. Shared-mem
14850 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20  ory regions .** 
14860 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61  are numbered sta
14870 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e  rting from zero.
14880 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d   Each shared-mem
14890 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a  ory region is sz
148a0 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73  Region .** bytes
148b0 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
148c0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
148d0 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
148e0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
148f0 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  d *pp is set to 
14900 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  NULL..**.** Othe
14910 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 69 73  rwise, if the is
14920 57 72 69 74 65 20 70 61 72 61 6d 65 74 65 72 20  Write parameter 
14930 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71  is 0 and the req
14940 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65  uested shared-me
14950 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68  mory.** region h
14960 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
14970 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c  cated (by any cl
14980 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ient, including 
14990 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61  one running in a
149a0 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f  .** separate pro
149b0 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20  cess), then *pp 
149c0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  is set to NULL a
149d0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
149e0 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 69 73  urned. If .** is
149f0 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  Write is non-zer
14a00 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  o and the reques
14a10 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
14a20 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  y region has not
14a30 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c   yet .** been al
14a40 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61  located, it is a
14a50 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
14a60 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
14a70 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d   If the shared-m
14a80 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73  emory region has
14a90 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
14aa0 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c  located or is al
14ab0 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
14ac0 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72  is call as descr
14ad0 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e  ibed above, then
14ae0 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e   it is mapped in
14af0 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
14b00 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70  s .** address sp
14b10 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f  ace (if it is no
14b20 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20  t already), *pp 
14b30 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
14b40 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a  to the mapped .*
14b50 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c  * memory and SQL
14b60 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
14b70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
14b80 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69  inShmMap(.  sqli
14b90 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
14ba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
14bb0 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61  andle open on da
14bc0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
14bd0 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20   int iRegion,   
14be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bf0 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65   /* Region to re
14c00 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20  trieve */.  int 
14c10 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20  szRegion,       
14c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
14c30 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a  ize of regions *
14c40 2f 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c  /.  int isWrite,
14c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c60 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65      /* True to e
14c70 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65  xtend file if ne
14c80 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69  cessary */.  voi
14c90 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20  d volatile **pp 
14ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14cb0 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f  OUT: Mapped memo
14cc0 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69  ry */.){.  winFi
14cd0 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e  le *pDbFd = (win
14ce0 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53  File*)fd;.  winS
14cf0 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70  hm *p = pDbFd->p
14d00 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  Shm;.  winShmNod
14d10 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69  e *pShmNode;.  i
14d20 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14d30 4b 3b 0a 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  K;..  if( !p ){.
14d40 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e      rc = winOpen
14d50 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62  SharedMemory(pDb
14d60 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Fd);.    if( rc!
14d70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
14d80 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 20 3d 20  urn rc;.    p = 
14d90 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d  pDbFd->pShm;.  }
14da0 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  .  pShmNode = p-
14db0 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71  >pShmNode;..  sq
14dc0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
14dd0 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
14de0 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a  x);.  assert( sz
14df0 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65  Region==pShmNode
14e00 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53  ->szRegion || pS
14e10 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d  hmNode->nRegion=
14e20 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68  =0 );..  if( pSh
14e30 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d  mNode->nRegion<=
14e40 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73  iRegion ){.    s
14e50 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20  truct ShmRegion 
14e60 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20  *apNew;         
14e70 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e    /* New aRegion
14e80 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  [] array */.    
14e90 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65  int nByte = (iRe
14ea0 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e  gion+1)*szRegion
14eb0 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65  ;  /* Minimum re
14ec0 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65  quired file size
14ed0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
14ee0 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20 20  int64 sz;       
14ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
14f00 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77 61  rrent size of wa
14f10 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a  l-index file */.
14f20 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73  .    pShmNode->s
14f30 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69  zRegion = szRegi
14f40 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  on;..    /* The 
14f50 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
14f60 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69   is not mapped i
14f70 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
14f80 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
14f90 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74  ..    ** Check t
14fa0 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20  o see if it has 
14fb0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28  been allocated (
14fc0 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d  i.e. if the wal-
14fd0 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20  index file is.  
14fe0 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67    ** large enoug
14ff0 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  h to contain the
15000 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
15010 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  n)..    */.    r
15020 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28  c = winFileSize(
15030 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
15040 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
15050 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28 20  , &sz);.    if( 
15060 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15070 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
15080 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
15090 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73  OERR_SHMSIZE, os
150a0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
150b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
150c0 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44 62  winShmMap1", pDb
150d0 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
150e0 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
150f0 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ut;.    }..    i
15100 66 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a 20  f( sz<nByte ){. 
15110 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75       /* The requ
15120 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
15130 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ion does not exi
15140 73 74 2e 20 49 66 20 69 73 57 72 69 74 65 20 69  st. If isWrite i
15150 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20 2a  s set to.      *
15160 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20 65 61 72  * zero, exit ear
15170 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20  ly. *pp will be 
15180 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
15190 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
151a0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
151b0 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76     ** Alternativ
151c0 65 6c 79 2c 20 69 66 20 69 73 57 72 69 74 65 20  ely, if isWrite 
151d0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73 65  is non-zero, use
151e0 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20   ftruncate() to 
151f0 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20 2a  allocate.      *
15200 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
15210 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20  memory region.. 
15220 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
15230 28 20 21 69 73 57 72 69 74 65 20 29 20 67 6f 74  ( !isWrite ) got
15240 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
15250 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75       rc = winTru
15260 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66  ncate((sqlite3_f
15270 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  ile *)&pShmNode-
15280 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a  >hFile, nByte);.
15290 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
152a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
152b0 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
152c0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
152d0 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c  _SHMSIZE, osGetL
152e0 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
152f0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
15300 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 46 64  nShmMap2", pDbFd
15310 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
15320 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
15330 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
15340 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68  }..    /* Map th
15350 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
15360 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74  ry region into t
15370 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64  his processes ad
15380 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a  dress space. */.
15390 20 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74 72      apNew = (str
153a0 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29  uct ShmRegion *)
153b0 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
153c0 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  .        pShmNod
153d0 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52 65  e->aRegion, (iRe
153e0 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61  gion+1)*sizeof(a
153f0 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a  pNew[0]).    );.
15400 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20 29      if( !apNew )
15410 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
15420 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
15430 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70  .      goto shmp
15440 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
15450 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65     pShmNode->aRe
15460 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20  gion = apNew;.. 
15470 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f     while( pShmNo
15480 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65  de->nRegion<=iRe
15490 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48 41  gion ){.      HA
154a0 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20  NDLE hMap;      
154b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c            /* fil
154c0 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c 65  e-mapping handle
154d0 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a   */.      void *
154e0 70 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20  pMap = 0;       
154f0 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 65 64 20        /* Mapped 
15500 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f  memory region */
15510 0a 20 20 20 20 20 0a 20 20 20 20 20 20 68 4d 61  .     .      hMa
15520 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  p = osCreateFile
15530 4d 61 70 70 69 6e 67 28 70 53 68 6d 4e 6f 64 65  Mapping(pShmNode
15540 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a 20 20 20 20  ->hFile.h, .    
15550 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45        NULL, PAGE
15560 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20 6e  _READWRITE, 0, n
15570 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20  Byte, NULL.     
15580 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   );.      OSTRAC
15590 45 28 28 22 53 48 4d 2d 4d 41 50 20 70 69 64 2d  E(("SHM-MAP pid-
155a0 25 64 20 63 72 65 61 74 65 20 72 65 67 69 6f 6e  %d create region
155b0 3d 25 64 20 6e 62 79 74 65 3d 25 64 20 25 73 5c  =%d nbyte=%d %s\
155c0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
155d0 20 20 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72     (int)osGetCur
155e0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
155f0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
15600 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20  on, nByte,.     
15610 20 20 20 20 20 20 20 20 20 20 68 4d 61 70 20 3f            hMap ?
15620 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
15630 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 4d  ));.      if( hM
15640 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ap ){.        in
15650 74 20 69 4f 66 66 73 65 74 20 3d 20 70 53 68 6d  t iOffset = pShm
15660 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a  Node->nRegion*sz
15670 52 65 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  Region;.        
15680 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74  int iOffsetShift
15690 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e   = iOffset % win
156a0 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61  SysInfo.dwAlloca
156b0 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b  tionGranularity;
156c0 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20  .        pMap = 
156d0 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  osMapViewOfFile(
156e0 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57  hMap, FILE_MAP_W
156f0 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f  RITE | FILE_MAP_
15700 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20  READ,.          
15710 20 20 30 2c 20 69 4f 66 66 73 65 74 20 2d 20 69    0, iOffset - i
15720 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52  OffsetShift, szR
15730 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53  egion + iOffsetS
15740 68 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a  hift.        );.
15750 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
15760 28 22 53 48 4d 2d 4d 41 50 20 70 69 64 2d 25 64  ("SHM-MAP pid-%d
15770 20 6d 61 70 20 72 65 67 69 6f 6e 3d 25 64 20 6f   map region=%d o
15780 66 66 73 65 74 3d 25 64 20 73 69 7a 65 3d 25 64  ffset=%d size=%d
15790 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
157a0 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73           (int)os
157b0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
157c0 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d  sId(), pShmNode-
157d0 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f 66 66 73 65  >nRegion, iOffse
157e0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
157f0 20 20 20 20 73 7a 52 65 67 69 6f 6e 2c 20 70 4d      szRegion, pM
15800 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  ap ? "ok" : "fai
15810 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  led"));.      }.
15820 20 20 20 20 20 20 69 66 28 20 21 70 4d 61 70 20        if( !pMap 
15830 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  ){.        pShmN
15840 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ode->lastErrno =
15850 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
15860 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
15870 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
15880 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c  TE_IOERR_SHMMAP,
15890 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45   pShmNode->lastE
158a0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
158b0 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61         "winShmMa
158c0 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  p3", pDbFd->zPat
158d0 68 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  h);.        if( 
158e0 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65 48 61  hMap ) osCloseHa
158f0 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20 20  ndle(hMap);.    
15900 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
15910 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _out;.      }.. 
15920 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
15930 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d  Region[pShmNode-
15940 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d  >nRegion].pMap =
15950 20 70 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68   pMap;.      pSh
15960 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70  mNode->aRegion[p
15970 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
15980 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a 20  ].hMap = hMap;. 
15990 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e       pShmNode->n
159a0 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a  Region++;.    }.
159b0 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74    }..shmpage_out
159c0 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  :.  if( pShmNode
159d0 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f  ->nRegion>iRegio
159e0 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66  n ){.    int iOf
159f0 66 73 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a 73  fset = iRegion*s
15a00 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e 74  zRegion;.    int
15a10 20 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20   iOffsetShift = 
15a20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79 73  iOffset % winSys
15a30 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f  Info.dwAllocatio
15a40 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20  nGranularity;.  
15a50 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63 68 61    char *p = (cha
15a60 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61 52  r *)pShmNode->aR
15a70 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70  egion[iRegion].p
15a80 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28  Map;.    *pp = (
15a90 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66 73 65  void *)&p[iOffse
15aa0 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73 65  tShift];.  }else
15ab0 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20  {.    *pp = 0;. 
15ac0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
15ad0 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
15ae0 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  e->mutex);.  ret
15af0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65  urn rc;.}..#else
15b00 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
15b10 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69  Map     0.# defi
15b20 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 20  ne winShmLock   
15b30 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53   0.# define winS
15b40 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65  hmBarrier 0.# de
15b50 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61 70  fine winShmUnmap
15b60 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23     0.#endif /* #
15b70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15b80 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  IT_WAL */../*.**
15b90 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69   Here ends the i
15ba0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
15bb0 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c   all sqlite3_fil
15bc0 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a  e methods..**.**
15bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15be0 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33  **** End sqlite3
15bf0 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a  _file Methods **
15c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
15c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
15c70 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72  *.** This vector
15c80 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65   defines all the
15c90 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63 61   methods that ca
15ca0 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 0a  n operate on an.
15cb0 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ** sqlite3_file 
15cc0 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74  for win32..*/.st
15cd0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
15ce0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77 69  e3_io_methods wi
15cf0 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20  nIoMethod = {.  
15d00 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2,              
15d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
15d30 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20 20 20 20   winClose,      
15d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d50 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20   /* xClose */.  
15d60 77 69 6e 52 65 61 64 2c 20 20 20 20 20 20 20 20  winRead,        
15d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d80 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 77 69  /* xRead */.  wi
15d90 6e 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20  nWrite,         
15da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15db0 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 77 69 6e   xWrite */.  win
15dc0 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20  Truncate,       
15dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15de0 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20 77  xTruncate */.  w
15df0 69 6e 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20  inSync,         
15e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15e10 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 77 69 6e  * xSync */.  win
15e20 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20  FileSize,       
15e30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15e40 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 77  xFileSize */.  w
15e50 69 6e 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  inLock,         
15e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15e70 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  * xLock */.  win
15e80 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
15e90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15ea0 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  xUnlock */.  win
15eb0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
15ec0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  k,           /* 
15ed0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
15ee0 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 43  ck */.  winFileC
15ef0 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20  ontrol,         
15f00 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
15f10 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e  Control */.  win
15f20 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20  SectorSize,     
15f30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15f40 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20  xSectorSize */. 
15f50 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63   winDeviceCharac
15f60 74 65 72 69 73 74 69 63 73 2c 20 20 20 20 20 20  teristics,      
15f70 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72 61   /* xDeviceChara
15f80 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20  cteristics */.  
15f90 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20 20 20 20  winShmMap,      
15fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fb0 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20  /* xShmMap */.  
15fc0 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20  winShmLock,     
15fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fe0 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20  /* xShmLock */. 
15ff0 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 2c 20   winShmBarrier, 
16000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16010 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20   /* xShmBarrier 
16020 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e 6d 61 70  */.  winShmUnmap
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16040 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61       /* xShmUnma
16050 70 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  p */.};../******
16060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
160a0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
160b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
160c0 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  *** sqlite3_vfs 
160d0 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  methods ********
160e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
160f0 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
16100 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  division contain
16110 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
16120 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20  tion of methods 
16130 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  on the.** sqlite
16140 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f  3_vfs object..*/
16150 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
16160 61 20 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d 65  a UTF-8 filename
16170 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66   into whatever f
16180 6f 72 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69  orm the underlyi
16190 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  ng.** operating 
161a0 73 79 73 74 65 6d 20 77 61 6e 74 73 20 66 69 6c  system wants fil
161b0 65 6e 61 6d 65 73 20 69 6e 2e 20 20 53 70 61 63  enames in.  Spac
161c0 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
161d0 73 75 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61 69  sult.** is obtai
161e0 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20  ned from malloc 
161f0 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
16200 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
16210 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  .** function..*/
16220 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 63 6f  .static void *co
16230 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d  nvertUtf8Filenam
16240 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
16250 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69 64  ilename){.  void
16260 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30   *zConverted = 0
16270 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  ;.  if( isNT() )
16280 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64  {.    zConverted
16290 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65   = utf8ToUnicode
162a0 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 2f 2a 20  (zFilename);./* 
162b0 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53  isNT() is 1 if S
162c0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
162d0 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20  1, so this else 
162e0 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  is never execute
162f0 64 2e 20 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  d. .*/.#if SQLIT
16300 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20  E_OS_WINCE==0.  
16310 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76  }else{.    zConv
16320 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f  erted = sqlite3_
16330 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62  win32_utf8_to_mb
16340 63 73 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 23  cs(zFilename);.#
16350 65 6e 64 69 66 0a 20 20 7d 0a 20 20 2f 2a 20 63  endif.  }.  /* c
16360 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c  aller will handl
16370 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20  e out of memory 
16380 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e  */.  return zCon
16390 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  verted;.}../*.**
163a0 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72   Create a tempor
163b0 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  ary file name in
163c0 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73   zBuf.  zBuf mus
163d0 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20  t be big enough 
163e0 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 70 56  to.** hold at pV
163f0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 63  fs->mxPathname c
16400 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74  haracters..*/.st
16410 61 74 69 63 20 69 6e 74 20 67 65 74 54 65 6d 70  atic int getTemp
16420 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63  name(int nBuf, c
16430 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74  har *zBuf){.  st
16440 61 74 69 63 20 63 68 61 72 20 7a 43 68 61 72 73  atic char zChars
16450 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66  [] =.    "abcdef
16460 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
16470 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45  wxyz".    "ABCDE
16480 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55  FGHIJKLMNOPQRSTU
16490 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33  VWXYZ".    "0123
164a0 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a 65 5f  456789";.  size_
164b0 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 7a  t i, j;.  char z
164c0 54 65 6d 70 50 61 74 68 5b 4d 41 58 5f 50 41 54  TempPath[MAX_PAT
164d0 48 2b 31 5d 3b 0a 0a 20 20 2f 2a 20 49 74 27 73  H+1];..  /* It's
164e0 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
164f0 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
16500 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
16510 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
16520 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
16530 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
16540 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
16550 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
16560 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
16570 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a   failing. .  */.
16580 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
16590 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
165a0 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 69 66 28  _IOERR );..  if(
165b0 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
165c0 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73  rectory ){.    s
165d0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
165e0 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65  MAX_PATH-30, zTe
165f0 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20 73 71  mpPath, "%s", sq
16600 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
16610 74 6f 72 79 29 3b 0a 20 20 7d 65 6c 73 65 20 69  tory);.  }else i
16620 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
16630 20 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20   char *zMulti;. 
16640 20 20 20 57 43 48 41 52 20 7a 57 69 64 65 50 61     WCHAR zWidePa
16650 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20  th[MAX_PATH];.  
16660 20 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57    osGetTempPathW
16670 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 57  (MAX_PATH-30, zW
16680 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 7a 4d  idePath);.    zM
16690 75 6c 74 69 20 3d 20 75 6e 69 63 6f 64 65 54 6f  ulti = unicodeTo
166a0 55 74 66 38 28 7a 57 69 64 65 50 61 74 68 29 3b  Utf8(zWidePath);
166b0 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74 69 20  .    if( zMulti 
166c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
166d0 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41  _snprintf(MAX_PA
166e0 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68  TH-30, zTempPath
166f0 2c 20 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b  , "%s", zMulti);
16700 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
16710 72 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20  ree(zMulti);.   
16720 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
16730 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
16740 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 2f  R_NOMEM;.    }./
16750 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66  * isNT() is 1 if
16760 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
16770 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73  ==1, so this els
16780 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75  e is never execu
16790 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74  ted. .** Since t
167a0 68 65 20 41 4e 53 49 20 76 65 72 73 69 6f 6e 20  he ANSI version 
167b0 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73  of these Windows
167c0 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73   API do not exis
167d0 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20  t for WINCE,.** 
167e0 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  it's important t
167f0 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20  o not reference 
16800 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62  them for WINCE b
16810 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51  uilds..*/.#if SQ
16820 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30  LITE_OS_WINCE==0
16830 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
16840 61 72 20 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63  ar *zUtf8;.    c
16850 68 61 72 20 7a 4d 62 63 73 50 61 74 68 5b 4d 41  har zMbcsPath[MA
16860 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 6f 73 47  X_PATH];.    osG
16870 65 74 54 65 6d 70 50 61 74 68 41 28 4d 41 58 5f  etTempPathA(MAX_
16880 50 41 54 48 2d 33 30 2c 20 7a 4d 62 63 73 50 61  PATH-30, zMbcsPa
16890 74 68 29 3b 0a 20 20 20 20 7a 55 74 66 38 20 3d  th);.    zUtf8 =
168a0 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d   sqlite3_win32_m
168b0 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 4d 62 63  bcs_to_utf8(zMbc
168c0 73 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  sPath);.    if( 
168d0 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 73  zUtf8 ){.      s
168e0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
168f0 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65  MAX_PATH-30, zTe
16900 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20 7a 55  mpPath, "%s", zU
16910 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tf8);.      sqli
16920 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b  te3_free(zUtf8);
16930 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16940 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16950 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
16960 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
16970 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
16980 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
16990 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
169a0 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61   for the tempora
169b0 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61  ry file .  ** na
169c0 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  me. If it is not
169d0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
169e0 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66  ERROR..  */.  if
169f0 28 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  ( (sqlite3Strlen
16a00 33 30 28 7a 54 65 6d 70 50 61 74 68 29 20 2b 20  30(zTempPath) + 
16a10 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
16a20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
16a30 5f 50 52 45 46 49 58 29 20 2b 20 31 37 29 20 3e  _PREFIX) + 17) >
16a40 3d 20 6e 42 75 66 20 29 7b 0a 20 20 20 20 72 65  = nBuf ){.    re
16a50 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
16a60 52 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  R;.  }..  for(i=
16a70 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
16a80 7a 54 65 6d 70 50 61 74 68 29 3b 20 69 3e 30 20  zTempPath); i>0 
16a90 26 26 20 7a 54 65 6d 70 50 61 74 68 5b 69 2d 31  && zTempPath[i-1
16aa0 5d 3d 3d 27 5c 5c 27 3b 20 69 2d 2d 29 7b 7d 0a  ]=='\\'; i--){}.
16ab0 20 20 7a 54 65 6d 70 50 61 74 68 5b 69 5d 20 3d    zTempPath[i] =
16ac0 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73   0;..  sqlite3_s
16ad0 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 37 2c  nprintf(nBuf-17,
16ae0 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20 20 20   zBuf,.         
16af0 20 20 20 20 20 20 20 20 20 20 22 25 73 5c 5c 22            "%s\\"
16b00 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
16b10 5f 50 52 45 46 49 58 2c 20 7a 54 65 6d 70 50 61  _PREFIX, zTempPa
16b20 74 68 29 3b 0a 20 20 6a 20 3d 20 73 71 6c 69 74  th);.  j = sqlit
16b30 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29  e3Strlen30(zBuf)
16b40 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64  ;.  sqlite3_rand
16b50 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66  omness(15, &zBuf
16b60 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  [j]);.  for(i=0;
16b70 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29   i<15; i++, j++)
16b80 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20  {.    zBuf[j] = 
16b90 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28  (char)zChars[ ((
16ba0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42  unsigned char)zB
16bb0 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a  uf[j])%(sizeof(z
16bc0 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 7d  Chars)-1) ];.  }
16bd0 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a  .  zBuf[j] = 0;.
16be0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d  .  OSTRACE(("TEM
16bf0 50 20 46 49 4c 45 4e 41 4d 45 3a 20 25 73 5c 6e  P FILENAME: %s\n
16c00 22 2c 20 7a 42 75 66 29 29 3b 0a 20 20 72 65 74  ", zBuf));.  ret
16c10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a  urn SQLITE_OK; .
16c20 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
16c30 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
16c40 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73  int winOpen(.  s
16c50 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
16c60 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20  ,        /* Not 
16c70 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  used */.  const 
16c80 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
16c90 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
16ca0 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20  he file (UTF-8) 
16cb0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
16cc0 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 2f  e *id,         /
16cd0 2a 20 57 72 69 74 65 20 74 68 65 20 53 51 4c 69  * Write the SQLi
16ce0 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 68  te file handle h
16cf0 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
16d00 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
16d10 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65 20     /* Open mode 
16d20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  flags */.  int *
16d30 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20  pOutFlags       
16d40 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 72       /* Status r
16d50 65 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f 0a 29  eturn flags */.)
16d60 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20  {.  HANDLE h;.  
16d70 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
16d80 0a 20 20 44 57 4f 52 44 20 64 77 44 65 73 69 72  .  DWORD dwDesir
16d90 65 64 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52  edAccess;.  DWOR
16da0 44 20 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20  D dwShareMode;. 
16db0 20 44 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f   DWORD dwCreatio
16dc0 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20  nDisposition;.  
16dd0 44 57 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64  DWORD dwFlagsAnd
16de0 41 74 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a  Attributes = 0;.
16df0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
16e00 4e 43 45 0a 20 20 69 6e 74 20 69 73 54 65 6d 70  NCE.  int isTemp
16e10 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77   = 0;.#endif.  w
16e20 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
16e30 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
16e40 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
16e50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
16e60 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53  * Filename in OS
16e70 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63   encoding */.  c
16e80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38  onst char *zUtf8
16e90 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a  Name = zName; /*
16ea0 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46   Filename in UTF
16eb0 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20  -8 encoding */. 
16ec0 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20   int cnt = 0;.. 
16ed0 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20   /* If argument 
16ee0 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20  zPath is a NULL 
16ef0 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75  pointer, this fu
16f00 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  nction is requir
16f10 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20  ed to open.  ** 
16f20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
16f30 2e 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65  . Use this buffe
16f40 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66  r to store the f
16f50 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a  ile name in..  *
16f60 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d  /.  char zTmpnam
16f70 65 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 20 20  e[MAX_PATH+1];  
16f80 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65     /* Buffer use
16f90 64 20 74 6f 20 63 72 65 61 74 65 20 74 65 6d 70  d to create temp
16fa0 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 0a 20 20   filename */..  
16fb0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16fc0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  OK;            /
16fd0 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72  * Function Retur
16fe0 6e 20 43 6f 64 65 20 2a 2f 0a 23 69 66 20 21 64  n Code */.#if !d
16ff0 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
17000 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  | SQLITE_OS_WINC
17010 45 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20  E.  int eType = 
17020 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30  flags&0xFFFFFF00
17030 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69  ;  /* Type of fi
17040 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65  le to open */.#e
17050 6e 64 69 66 0a 0a 20 20 69 6e 74 20 69 73 45 78  ndif..  int isEx
17060 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67  clusive  = (flag
17070 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
17080 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e  EXCLUSIVE);.  in
17090 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d  t isDelete     =
170a0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
170b0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
170c0 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72  OSE);.  int isCr
170d0 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  eate     = (flag
170e0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
170f0 43 52 45 41 54 45 29 3b 0a 23 69 66 6e 64 65 66  CREATE);.#ifndef
17100 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69 73   NDEBUG.  int is
17110 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c  Readonly   = (fl
17120 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
17130 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 23 65 6e  N_READONLY);.#en
17140 64 69 66 0a 20 20 69 6e 74 20 69 73 52 65 61 64  dif.  int isRead
17150 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20  Write  = (flags 
17160 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
17170 41 44 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64  ADWRITE);..#ifnd
17180 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20  ef NDEBUG.  int 
17190 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20  isOpenJournal = 
171a0 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20  (isCreate && (. 
171b0 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51         eType==SQ
171c0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
171d0 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c  _JOURNAL .     |
171e0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
171f0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
17200 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  L .     || eType
17210 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
17220 4c 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a  L.  ));.#endif..
17230 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66    /* Check the f
17240 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
17250 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20  nts are true: . 
17260 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45   **.  **   (a) E
17270 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68  xactly one of th
17280 65 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20  e READWRITE and 
17290 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d  READONLY flags m
172a0 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20  ust be set, and 
172b0 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43  .  **   (b) if C
172c0 52 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68  REATE is set, th
172d0 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73  en READWRITE mus
172e0 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61  t also be set, a
172f0 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66  nd.  **   (c) if
17300 20 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 65   EXCLUSIVE is se
17310 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
17320 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
17330 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44  .  **   (d) if D
17340 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20  ELETEONCLOSE is 
17350 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45  set, then CREATE
17360 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
17370 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
17380 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20  ((isReadonly==0 
17390 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d  || isReadWrite==
173a0 30 29 20 26 26 20 28 69 73 52 65 61 64 57 72 69  0) && (isReadWri
173b0 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79  te || isReadonly
173c0 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43  ));.  assert(isC
173d0 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65  reate==0 || isRe
173e0 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65  adWrite);.  asse
173f0 72 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d  rt(isExclusive==
17400 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
17410 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74    assert(isDelet
17420 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65  e==0 || isCreate
17430 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69  );..  /* The mai
17440 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e  n DB, main journ
17450 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64  al, WAL file and
17460 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
17470 61 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20  are never .  ** 
17480 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
17490 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74  leted. Nor are t
174a0 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61  hey ever tempora
174b0 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20  ry files.  */.  
174c0 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
174d0 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
174e0 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
174f0 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20  EN_MAIN_DB );.  
17500 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
17510 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
17520 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
17530 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
17540 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
17550 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
17560 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
17570 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
17580 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65  OURNAL );.  asse
17590 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
175a0 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
175b0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e!=SQLITE_OPEN_W
175c0 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65  AL );..  /* Asse
175d0 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65  rt that the uppe
175e0 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20  r layer has set 
175f0 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65  one of the "file
17600 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f  -type" flags. */
17610 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
17620 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
17630 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54  IN_DB      || eT
17640 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
17650 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20  _TEMP_DB .      
17660 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
17670 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
17680 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  NAL || eType==SQ
17690 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
176a0 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c  OURNAL .       |
176b0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
176c0 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
176d0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
176e0 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
176f0 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c  OURNAL .       |
17700 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
17710 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44  OPEN_TRANSIENT_D
17720 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  B || eType==SQLI
17730 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b  TE_OPEN_WAL.  );
17740 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
17750 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  0 );.  UNUSED_PA
17760 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a  RAMETER(pVfs);..
17770 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 49 4e 56    pFile->h = INV
17780 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
17790 45 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  E;..  /* If the 
177a0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
177b0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
177c0 20 69 73 20 4e 55 4c 4c 2c 20 67 65 6e 65 72 61   is NULL, genera
177d0 74 65 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f  te a .  ** tempo
177e0 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 74  rary file name t
177f0 6f 20 75 73 65 20 0a 20 20 2a 2f 0a 20 20 69 66  o use .  */.  if
17800 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 29 7b 0a  ( !zUtf8Name ){.
17810 20 20 20 20 61 73 73 65 72 74 28 69 73 44 65 6c      assert(isDel
17820 65 74 65 20 26 26 20 21 69 73 4f 70 65 6e 4a 6f  ete && !isOpenJo
17830 75 72 6e 61 6c 29 3b 0a 20 20 20 20 72 63 20 3d  urnal);.    rc =
17840 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58   getTempname(MAX
17850 5f 50 41 54 48 2b 31 2c 20 7a 54 6d 70 6e 61 6d  _PATH+1, zTmpnam
17860 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
17870 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17880 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17890 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e 61 6d    }.    zUtf8Nam
178a0 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20  e = zTmpname;.  
178b0 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  }..  /* Convert 
178c0 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20  the filename to 
178d0 74 68 65 20 73 79 73 74 65 6d 20 65 6e 63 6f 64  the system encod
178e0 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65  ing. */.  zConve
178f0 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74  rted = convertUt
17900 66 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38  f8Filename(zUtf8
17910 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  Name);.  if( zCo
17920 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
17930 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17940 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
17950 0a 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72  ..  if( isReadWr
17960 69 74 65 20 29 7b 0a 20 20 20 20 64 77 44 65 73  ite ){.    dwDes
17970 69 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e  iredAccess = GEN
17980 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45  ERIC_READ | GENE
17990 52 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c  RIC_WRITE;.  }el
179a0 73 65 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65  se{.    dwDesire
179b0 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49  dAccess = GENERI
179c0 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f  C_READ;.  }..  /
179d0 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  * SQLITE_OPEN_EX
179e0 43 4c 55 53 49 56 45 20 69 73 20 75 73 65 64 20  CLUSIVE is used 
179f0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
17a00 74 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73 20  t a new file is 
17a10 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 2e 20 53  .  ** created. S
17a20 51 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 75 73  QLite doesn't us
17a30 65 20 69 74 20 74 6f 20 69 6e 64 69 63 61 74 65  e it to indicate
17a40 20 22 65 78 63 6c 75 73 69 76 65 20 61 63 63 65   "exclusive acce
17a50 73 73 22 20 0a 20 20 2a 2a 20 61 73 20 69 74 20  ss" .  ** as it 
17a60 69 73 20 75 73 75 61 6c 6c 79 20 75 6e 64 65 72  is usually under
17a70 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  stood..  */.  if
17a80 28 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b  ( isExclusive ){
17a90 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 73 20  .    /* Creates 
17aa0 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79  a new file, only
17ab0 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20   if it does not 
17ac0 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20 2a  already exist. *
17ad0 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  /.    /* If the 
17ae0 66 69 6c 65 20 65 78 69 73 74 73 2c 20 69 74 20  file exists, it 
17af0 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77  fails. */.    dw
17b00 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
17b10 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f 4e 45 57  ion = CREATE_NEW
17b20 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73  ;.  }else if( is
17b30 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a  Create ){.    /*
17b40 20 4f 70 65 6e 20 65 78 69 73 74 69 6e 67 20 66   Open existing f
17b50 69 6c 65 2c 20 6f 72 20 63 72 65 61 74 65 20 69  ile, or create i
17b60 66 20 69 74 20 64 6f 65 73 6e 27 74 20 65 78 69  f it doesn't exi
17b70 73 74 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61  st */.    dwCrea
17b80 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20  tionDisposition 
17b90 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20  = OPEN_ALWAYS;. 
17ba0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f   }else{.    /* O
17bb0 70 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c  pens a file, onl
17bc0 79 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20  y if it exists. 
17bd0 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f  */.    dwCreatio
17be0 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f  nDisposition = O
17bf0 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20  PEN_EXISTING;.  
17c00 7d 0a 0a 20 20 64 77 53 68 61 72 65 4d 6f 64 65  }..  dwShareMode
17c10 20 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45   = FILE_SHARE_RE
17c20 41 44 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f  AD | FILE_SHARE_
17c30 57 52 49 54 45 3b 0a 0a 20 20 69 66 28 20 69 73  WRITE;..  if( is
17c40 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 53 51  Delete ){.#if SQ
17c50 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
17c60 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
17c70 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54  ibutes = FILE_AT
17c80 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a  TRIBUTE_HIDDEN;.
17c90 20 20 20 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a      isTemp = 1;.
17ca0 23 65 6c 73 65 0a 20 20 20 20 64 77 46 6c 61 67  #else.    dwFlag
17cb0 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
17cc0 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
17cd0 54 45 4d 50 4f 52 41 52 59 0a 20 20 20 20 20 20  TEMPORARY.      
17ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cf0 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f           | FILE_
17d00 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e  ATTRIBUTE_HIDDEN
17d10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d30 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45  | FILE_FLAG_DELE
17d40 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e  TE_ON_CLOSE;.#en
17d50 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
17d60 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
17d70 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54  butes = FILE_ATT
17d80 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20  RIBUTE_NORMAL;. 
17d90 20 7d 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73 20   }.  /* Reports 
17da0 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 65  from the interne
17db0 74 20 61 72 65 20 74 68 61 74 20 70 65 72 66 6f  t are that perfo
17dc0 72 6d 61 6e 63 65 20 69 73 20 61 6c 77 61 79 73  rmance is always
17dd0 0a 20 20 2a 2a 20 62 65 74 74 65 72 20 69 66 20  .  ** better if 
17de0 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d  FILE_FLAG_RANDOM
17df0 5f 41 43 43 45 53 53 20 69 73 20 75 73 65 64 2e  _ACCESS is used.
17e00 20 20 54 69 63 6b 65 74 20 23 32 36 39 39 2e 20    Ticket #2699. 
17e10 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
17e20 5f 57 49 4e 43 45 0a 20 20 64 77 46 6c 61 67 73  _WINCE.  dwFlags
17e30 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 7c 3d  AndAttributes |=
17e40 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f   FILE_FLAG_RANDO
17e50 4d 5f 41 43 43 45 53 53 3b 0a 23 65 6e 64 69 66  M_ACCESS;.#endif
17e60 0a 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  ..  if( isNT() )
17e70 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68 20  {.    while( (h 
17e80 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57 28  = osCreateFileW(
17e90 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
17ea0 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
17eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ec0 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
17ed0 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ss,.            
17ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ef0 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e    dwShareMode, N
17f00 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
17f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
17f30 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20  position,.      
17f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f50 20 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41          dwFlagsA
17f60 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20  ndAttributes,.  
17f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f80 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
17f90 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ))==INVALID_HAND
17fa0 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20  LE_VALUE &&.    
17fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fc0 20 20 20 20 20 20 20 20 20 20 72 65 74 72 79 49            retryI
17fd0 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
17fe0 45 72 72 6e 6f 29 20 29 7b 7d 0a 2f 2a 20 69 73  Errno) ){}./* is
17ff0 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c  NT() is 1 if SQL
18000 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c  ITE_OS_WINCE==1,
18010 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73   so this else is
18020 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e   never executed.
18030 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41   .** Since the A
18040 4e 53 49 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  NSI version of t
18050 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50 49  hese Windows API
18060 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66 6f   do not exist fo
18070 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73  r WINCE,.** it's
18080 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f   important to no
18090 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 6d  t reference them
180a0 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c 64   for WINCE build
180b0 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  s..*/.#if SQLITE
180c0 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d  _OS_WINCE==0.  }
180d0 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
180e0 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69   (h = osCreateFi
180f0 6c 65 41 28 28 4c 50 43 53 54 52 29 7a 43 6f 6e  leA((LPCSTR)zCon
18100 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
18110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18120 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
18130 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20  ccess,.         
18140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18150 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65       dwShareMode
18160 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  , NULL,.        
18170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18180 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e        dwCreation
18190 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20  Disposition,.   
181a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181b0 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61             dwFla
181c0 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c  gsAndAttributes,
181d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
181e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
181f0 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48  ULL))==INVALID_H
18200 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20  ANDLE_VALUE &&. 
18210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18220 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
18230 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
18240 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 23 65  astErrno) ){}.#e
18250 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 6c 6f 67 49  ndif.  }..  logI
18260 6f 65 72 72 28 63 6e 74 29 3b 0a 0a 20 20 4f 53  oerr(cnt);..  OS
18270 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20  TRACE(("OPEN %d 
18280 25 73 20 30 78 25 6c 78 20 25 73 5c 6e 22 2c 20  %s 0x%lx %s\n", 
18290 0a 20 20 20 20 20 20 20 20 20 20 20 68 2c 20 7a  .           h, z
182a0 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64 41  Name, dwDesiredA
182b0 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20 20 20  ccess, .        
182c0 20 20 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41     h==INVALID_HA
182d0 4e 44 4c 45 5f 56 41 4c 55 45 20 3f 20 22 66 61  NDLE_VALUE ? "fa
182e0 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a  iled" : "ok"));.
182f0 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49  .  if( h==INVALI
18300 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
18310 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
18320 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
18330 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  no;.    winLogEr
18340 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
18350 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  PEN, pFile->last
18360 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 65 6e 22  Errno, "winOpen"
18370 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20  , zUtf8Name);.  
18380 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
18390 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
183a0 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
183b0 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65 20  && !isExclusive 
183c0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
183d0 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e  winOpen(pVfs, zN
183e0 61 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20 20 20  ame, id, .      
183f0 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53         ((flags|S
18400 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
18410 4e 4c 59 29 26 7e 28 53 51 4c 49 54 45 5f 4f 50  NLY)&~(SQLITE_OP
18420 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45  EN_CREATE|SQLITE
18430 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
18440 29 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20  ), pOutFlags);. 
18450 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18460 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
18470 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
18480 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f   }.  }..  if( pO
18490 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 69  utFlags ){.    i
184a0 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29  f( isReadWrite )
184b0 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61  {.      *pOutFla
184c0 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
184d0 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20  _READWRITE;.    
184e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f  }else{.      *pO
184f0 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  utFlags = SQLITE
18500 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
18510 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6d 65 6d      }.  }..  mem
18520 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69  set(pFile, 0, si
18530 7a 65 6f 66 28 2a 70 46 69 6c 65 29 29 3b 0a 20  zeof(*pFile));. 
18540 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20   pFile->pMethod 
18550 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a  = &winIoMethod;.
18560 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a    pFile->h = h;.
18570 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
18580 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20  no = NO_ERROR;. 
18590 20 70 46 69 6c 65 2d 3e 70 56 66 73 20 3d 20 70   pFile->pVfs = p
185a0 56 66 73 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 53  Vfs;.  pFile->pS
185b0 68 6d 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d  hm = 0;.  pFile-
185c0 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a  >zPath = zName;.
185d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72    if( sqlite3_ur
185e0 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c  i_boolean(zName,
185f0 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f   "psow", SQLITE_
18600 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
18610 49 54 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  ITE) ){.    pFil
18620 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  e->ctrlFlags |= 
18630 57 49 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20  WINFILE_PSOW;.  
18640 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  }..#if SQLITE_OS
18650 5f 57 49 4e 43 45 0a 20 20 69 66 28 20 69 73 52  _WINCE.  if( isR
18660 65 61 64 57 72 69 74 65 20 26 26 20 65 54 79 70  eadWrite && eTyp
18670 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
18680 41 49 4e 5f 44 42 0a 20 20 20 20 20 20 20 26 26  AIN_DB.       &&
18690 20 21 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63   !winceCreateLoc
186a0 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 6c 65 29 0a  k(zName, pFile).
186b0 20 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65    ){.    osClose
186c0 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20 20 73  Handle(h);.    s
186d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
186e0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 72 65 74  verted);.    ret
186f0 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
18700 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  PEN_BKPT;.  }.  
18710 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20  if( isTemp ){.  
18720 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65    pFile->zDelete
18730 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65  OnClose = zConve
18740 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  rted;.  }else.#e
18750 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ndif.  {.    sql
18760 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
18770 72 74 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 4f 70  rted);.  }..  Op
18780 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20  enCounter(+1);. 
18790 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
187a0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
187b0 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  named file..**.*
187c0 2a 20 4e 6f 74 65 20 74 68 61 74 20 57 69 6e 64  * Note that Wind
187d0 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c  ows does not all
187e0 6f 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65 20  ow a file to be 
187f0 64 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 20  deleted if some 
18800 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73  other.** process
18810 20 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 53   has it open.  S
18820 6f 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75 73  ometimes a virus
18830 20 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65   scanner or inde
18840 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  xing program.** 
18850 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72  will open a jour
18860 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c 79  nal file shortly
18870 20 61 66 74 65 72 20 69 74 20 69 73 20 63 72 65   after it is cre
18880 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  ated in order to
18890 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 20   do.** whatever 
188a0 69 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20  it does.  While 
188b0 74 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65  this other proce
188c0 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  ss is holding th
188d0 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20  e.** file open, 
188e0 77 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c  we will be unabl
188f0 65 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20  e to delete it. 
18900 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
18910 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c  this.** problem,
18920 20 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69   we delay 100 mi
18930 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74  lliseconds and t
18940 72 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61  ry to delete aga
18950 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58  in.  Up.** to MX
18960 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
18970 54 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65  Ts deletion atte
18980 6d 70 74 73 20 61 72 65 20 72 75 6e 20 62 65 66  mpts are run bef
18990 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70  ore giving.** up
189a0 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
189b0 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  n error..*/.stat
189c0 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65  ic int winDelete
189d0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
189e0 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
189f0 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
18a00 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  in32 */.  const 
18a10 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
18a20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
18a30 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20   file to delete 
18a40 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72  */.  int syncDir
18a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a60 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20   /* Not used on 
18a70 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e  win32 */.){.  in
18a80 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74  t cnt = 0;.  int
18a90 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73   rc;.  DWORD las
18aa0 74 45 72 72 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a  tErrno;.  void *
18ab0 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e  zConverted;.  UN
18ac0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
18ad0 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Vfs);.  UNUSED_P
18ae0 41 52 41 4d 45 54 45 52 28 73 79 6e 63 44 69 72  ARAMETER(syncDir
18af0 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  );..  SimulateIO
18b00 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
18b10 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
18b20 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  );.  zConverted 
18b30 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c  = convertUtf8Fil
18b40 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  ename(zFilename)
18b50 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
18b60 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ed==0 ){.    ret
18b70 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
18b80 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
18b90 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
18ba0 72 63 20 3d 20 31 3b 0a 20 20 20 20 77 68 69 6c  rc = 1;.    whil
18bb0 65 28 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72  e( osGetFileAttr
18bc0 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74  ibutesW(zConvert
18bd0 65 64 29 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ed)!=INVALID_FIL
18be0 45 5f 41 54 54 52 49 42 55 54 45 53 20 26 26 0a  E_ATTRIBUTES &&.
18bf0 20 20 20 20 20 20 20 20 20 28 72 63 20 3d 20 6f           (rc = o
18c00 73 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f  sDeleteFileW(zCo
18c10 6e 76 65 72 74 65 64 29 29 3d 3d 30 20 26 26 20  nverted))==0 && 
18c20 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  retryIoerr(&cnt,
18c30 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d   &lastErrno) ){}
18c40 0a 20 20 20 20 72 63 20 3d 20 72 63 20 3f 20 53  .    rc = rc ? S
18c50 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54  QLITE_OK : SQLIT
18c60 45 5f 45 52 52 4f 52 3b 0a 2f 2a 20 69 73 4e 54  E_ERROR;./* isNT
18c70 28 29 20 69 73 20 31 20 69 66 20 53 51 4c 49 54  () is 1 if SQLIT
18c80 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73  E_OS_WINCE==1, s
18c90 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e  o this else is n
18ca0 65 76 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a  ever executed. .
18cb0 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41 4e 53  ** Since the ANS
18cc0 49 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  I version of the
18cd0 73 65 20 57 69 6e 64 6f 77 73 20 41 50 49 20 64  se Windows API d
18ce0 6f 20 6e 6f 74 20 65 78 69 73 74 20 66 6f 72 20  o not exist for 
18cf0 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69  WINCE,.** it's i
18d00 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20  mportant to not 
18d10 72 65 66 65 72 65 6e 63 65 20 74 68 65 6d 20 66  reference them f
18d20 6f 72 20 57 49 4e 43 45 20 62 75 69 6c 64 73 2e  or WINCE builds.
18d30 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
18d40 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c  S_WINCE==0.  }el
18d50 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  se{.    rc = 1;.
18d60 20 20 20 20 77 68 69 6c 65 28 20 6f 73 47 65 74      while( osGet
18d70 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28  FileAttributesA(
18d80 7a 43 6f 6e 76 65 72 74 65 64 29 21 3d 49 4e 56  zConverted)!=INV
18d90 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
18da0 55 54 45 53 20 26 26 0a 20 20 20 20 20 20 20 20  UTES &&.        
18db0 20 28 72 63 20 3d 20 6f 73 44 65 6c 65 74 65 46   (rc = osDeleteF
18dc0 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65 64 29  ileA(zConverted)
18dd0 29 3d 3d 30 20 26 26 20 72 65 74 72 79 49 6f 65  )==0 && retryIoe
18de0 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
18df0 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 72 63 20  rno) ){}.    rc 
18e00 3d 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  = rc ? SQLITE_OK
18e10 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
18e20 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66  .#endif.  }.  if
18e30 28 20 72 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  ( rc ){.    rc =
18e40 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
18e50 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
18e60 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  , lastErrno,.   
18e70 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 44 65            "winDe
18e80 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  lete", zFilename
18e90 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
18ea0 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20  logIoerr(cnt);. 
18eb0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
18ec0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
18ed0 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45 54   OSTRACE(("DELET
18ee0 45 20 5c 22 25 73 5c 22 20 25 73 5c 6e 22 2c 20  E \"%s\" %s\n", 
18ef0 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 72 63 20 3f  zFilename, (rc ?
18f00 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22   "failed" : "ok"
18f10 20 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72   )));.  return r
18f20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  c;.}../*.** Chec
18f30 6b 20 74 68 65 20 65 78 69 73 74 61 6e 63 65 20  k the existance 
18f40 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20 61 20  and status of a 
18f50 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
18f60 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28 0a 20  int winAccess(. 
18f70 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
18f80 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  fs,         /* N
18f90 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32  ot used on win32
18fa0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
18fb0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20   *zFilename,    
18fc0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
18fd0 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69   to check */.  i
18fe0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
18ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70            /* Typ
19000 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d 61 6b  e of test to mak
19010 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  e on this file *
19020 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  /.  int *pResOut
19030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19040 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f  * OUT: Result */
19050 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72  .){.  DWORD attr
19060 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
19070 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
19080 6f 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  o;.  void *zConv
19090 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f  erted;.  UNUSED_
190a0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
190b0 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
190c0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
190d0 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b  TE_IOERR_ACCESS;
190e0 20 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64   );.  zConverted
190f0 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69   = convertUtf8Fi
19100 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  lename(zFilename
19110 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  );.  if( zConver
19120 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ted==0 ){.    re
19130 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
19140 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  R_NOMEM;.  }.  i
19150 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
19160 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
19170 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54    WIN32_FILE_ATT
19180 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74  RIBUTE_DATA sAtt
19190 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65  rData;.    memse
191a0 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c  t(&sAttrData, 0,
191b0 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74   sizeof(sAttrDat
191c0 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  a));.    while( 
191d0 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65  !(rc = osGetFile
191e0 41 74 74 72 69 62 75 74 65 73 45 78 57 28 28 4c  AttributesExW((L
191f0 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
19200 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
19210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19220 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61  GetFileExInfoSta
19230 6e 64 61 72 64 2c 20 0a 20 20 20 20 20 20 20 20  ndard, .        
19240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19250 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61 29       &sAttrData)
19260 29 20 26 26 20 72 65 74 72 79 49 6f 65 72 72 28  ) && retryIoerr(
19270 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
19280 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 72 63  ) ){}.    if( rc
19290 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72   ){.      /* For
192a0 20 61 6e 20 53 51 4c 49 54 45 5f 41 43 43 45 53   an SQLITE_ACCES
192b0 53 5f 45 58 49 53 54 53 20 71 75 65 72 79 2c 20  S_EXISTS query, 
192c0 74 72 65 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e  treat a zero-len
192d0 67 74 68 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  gth file.      *
192e0 2a 20 61 73 20 69 66 20 69 74 20 64 6f 65 73 20  * as if it does 
192f0 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20  not exist..     
19300 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 20 20   */.      if(   
19310 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41   flags==SQLITE_A
19320 43 43 45 53 53 5f 45 58 49 53 54 53 0a 20 20 20  CCESS_EXISTS.   
19330 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44         && sAttrD
19340 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67  ata.nFileSizeHig
19350 68 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  h==0 .          
19360 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69  && sAttrData.nFi
19370 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a  leSizeLow==0 ){.
19380 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 49          attr = I
19390 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
193a0 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 65  IBUTES;.      }e
193b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74  lse{.        att
193c0 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77  r = sAttrData.dw
193d0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a  FileAttributes;.
193e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
193f0 65 7b 0a 20 20 20 20 20 20 6c 6f 67 49 6f 65 72  e{.      logIoer
19400 72 28 63 6e 74 29 3b 0a 20 20 20 20 20 20 69 66  r(cnt);.      if
19410 28 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52  ( lastErrno!=ERR
19420 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e  OR_FILE_NOT_FOUN
19430 44 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e  D ){.        win
19440 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
19450 49 4f 45 52 52 5f 41 43 43 45 53 53 2c 20 6c 61  IOERR_ACCESS, la
19460 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 41 63 63  stErrno, "winAcc
19470 65 73 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ess", zFilename)
19480 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
19490 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
194a0 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  d);.        retu
194b0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
194c0 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20 7d 65  ACCESS;.      }e
194d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74  lse{.        att
194e0 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  r = INVALID_FILE
194f0 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20  _ATTRIBUTES;.   
19500 20 20 20 7d 0a 20 20 20 20 7d 0a 2f 2a 20 69 73     }.    }./* is
19510 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c  NT() is 1 if SQL
19520 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c  ITE_OS_WINCE==1,
19530 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73   so this else is
19540 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e   never executed.
19550 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41   .** Since the A
19560 4e 53 49 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  NSI version of t
19570 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50 49  hese Windows API
19580 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66 6f   do not exist fo
19590 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73  r WINCE,.** it's
195a0 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f   important to no
195b0 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 6d  t reference them
195c0 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c 64   for WINCE build
195d0 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  s..*/.#if SQLITE
195e0 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d  _OS_WINCE==0.  }
195f0 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d  else{.    attr =
19600 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
19610 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f  utesA((char*)zCo
19620 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66  nverted);.#endif
19630 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
19640 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
19650 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61 67 73  .  switch( flags
19660 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
19670 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a  ITE_ACCESS_READ:
19680 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
19690 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a  _ACCESS_EXISTS:.
196a0 20 20 20 20 20 20 72 63 20 3d 20 61 74 74 72 21        rc = attr!
196b0 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54  =INVALID_FILE_AT
196c0 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20  TRIBUTES;.      
196d0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
196e0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
196f0 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 72  ADWRITE:.      r
19700 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49  c = attr!=INVALI
19710 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
19720 53 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  S &&.           
19730 20 20 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41    (attr & FILE_A
19740 54 54 52 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c  TTRIBUTE_READONL
19750 59 29 3d 3d 30 3b 0a 20 20 20 20 20 20 62 72 65  Y)==0;.      bre
19760 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
19770 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22  .      assert(!"
19780 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72  Invalid flags ar
19790 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20  gument");.  }.  
197a0 2a 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20  *pResOut = rc;. 
197b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
197c0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72  K;.}.../*.** Tur
197d0 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  n a relative pat
197e0 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c  hname into a ful
197f0 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 57 72 69  l pathname.  Wri
19800 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70  te the full.** p
19810 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75  athname into zOu
19820 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c  t[].  zOut[] wil
19830 6c 20 62 65 20 61 74 20 6c 65 61 73 74 20 70 56  l be at least pV
19840 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a  fs->mxPathname.*
19850 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  * bytes in size.
19860 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
19870 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a  inFullPathname(.
19880 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
19890 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  Vfs,            
198a0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66  /* Pointer to vf
198b0 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  s object */.  co
198c0 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74  nst char *zRelat
198d0 69 76 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ive,        /* P
198e0 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65  ossibly relative
198f0 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20   input path */. 
19900 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20   int nFull,     
19910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19920 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74  * Size of output
19930 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73   buffer in bytes
19940 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c   */.  char *zFul
19950 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
19960 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75      /* Output bu
19970 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 0a 23 69  ffer */.){.  .#i
19980 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57  f defined(__CYGW
19990 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65  IN__).  Simulate
199a0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
199b0 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
199c0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
199d0 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 63 79 67  ER(nFull);.  cyg
199e0 77 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 66 75 6c 6c  win_conv_to_full
199f0 5f 77 69 6e 33 32 5f 70 61 74 68 28 7a 52 65 6c  _win32_path(zRel
19a00 61 74 69 76 65 2c 20 7a 46 75 6c 6c 29 3b 0a 20  ative, zFull);. 
19a10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19a20 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53  K;.#endif..#if S
19a30 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
19a40 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
19a50 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
19a60 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45  ERROR );.  UNUSE
19a70 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c  D_PARAMETER(nFul
19a80 6c 29 3b 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68  l);.  /* WinCE h
19a90 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66  as no concept of
19aa0 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
19ab0 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d  name, or so I am
19ac0 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 73 71 6c 69   told. */.  sqli
19ad0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 70 56 66  te3_snprintf(pVf
19ae0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a  s->mxPathname, z
19af0 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52 65 6c  Full, "%s", zRel
19b00 61 74 69 76 65 29 3b 0a 20 20 72 65 74 75 72 6e  ative);.  return
19b10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
19b20 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  if..#if !SQLITE_
19b30 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64 65 66  OS_WINCE && !def
19b40 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
19b50 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
19b60 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
19b70 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a  ;.  char *zOut;.
19b80 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61  .  /* If this pa
19b90 74 68 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77  th name begins w
19ba0 69 74 68 20 22 2f 58 3a 22 2c 20 77 68 65 72 65  ith "/X:", where
19bb0 20 22 58 22 20 69 73 20 61 6e 79 20 61 6c 70 68   "X" is any alph
19bc0 61 62 65 74 69 63 0a 20 20 2a 2a 20 63 68 61 72  abetic.  ** char
19bd0 61 63 74 65 72 2c 20 64 69 73 63 61 72 64 20 74  acter, discard t
19be0 68 65 20 69 6e 69 74 69 61 6c 20 22 2f 22 20 66  he initial "/" f
19bf0 72 6f 6d 20 74 68 65 20 70 61 74 68 6e 61 6d 65  rom the pathname
19c00 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65  ..  */.  if( zRe
19c10 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26  lative[0]=='/' &
19c20 26 20 73 71 6c 69 74 65 33 49 73 61 6c 70 68 61  & sqlite3Isalpha
19c30 28 7a 52 65 6c 61 74 69 76 65 5b 31 5d 29 20 26  (zRelative[1]) &
19c40 26 20 7a 52 65 6c 61 74 69 76 65 5b 32 5d 3d 3d  & zRelative[2]==
19c50 27 3a 27 20 29 7b 0a 20 20 20 20 7a 52 65 6c 61  ':' ){.    zRela
19c60 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f  tive++;.  }..  /
19c70 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
19c80 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
19c90 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
19ca0 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
19cb0 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
19cc0 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
19cd0 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
19ce0 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
19cf0 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
19d00 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
19d10 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
19d20 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72  uld fail if, for
19d30 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20   example, the.  
19d40 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69  ** current worki
19d50 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ng directory has
19d60 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a   been unlinked..
19d70 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
19d80 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
19d90 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20  QLITE_ERROR );. 
19da0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
19db0 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 7a 43 6f 6e  R(nFull);.  zCon
19dc0 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74  verted = convert
19dd0 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65  Utf8Filename(zRe
19de0 6c 61 74 69 76 65 29 3b 0a 20 20 69 66 28 20 7a  lative);.  if( z
19df0 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
19e00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19e10 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
19e20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20   }.  if( isNT() 
19e30 29 7b 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54  ){.    LPWSTR zT
19e40 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  emp;.    nByte =
19e50 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
19e60 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  meW((LPCWSTR)zCo
19e70 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30  nverted, 0, 0, 0
19e80 29 20 2b 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70  ) + 3;.    zTemp
19e90 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
19ea0 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28  c( nByte*sizeof(
19eb0 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20  zTemp[0]) );.   
19ec0 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b   if( zTemp==0 ){
19ed0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
19ee0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
19ef0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
19f00 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
19f10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 73 47 65  ;.    }.    osGe
19f20 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28  tFullPathNameW((
19f30 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
19f40 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70  ed, nByte, zTemp
19f50 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
19f60 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
19f70 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 75  d);.    zOut = u
19f80 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65  nicodeToUtf8(zTe
19f90 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mp);.    sqlite3
19fa0 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 2f 2a  _free(zTemp);./*
19fb0 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20   isNT() is 1 if 
19fc0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
19fd0 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65  =1, so this else
19fe0 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74   is never execut
19ff0 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68  ed. .** Since th
1a000 65 20 41 4e 53 49 20 76 65 72 73 69 6f 6e 20 6f  e ANSI version o
1a010 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20  f these Windows 
1a020 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  API do not exist
1a030 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69   for WINCE,.** i
1a040 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f  t's important to
1a050 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74   not reference t
1a060 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75  hem for WINCE bu
1a070 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  ilds..*/.#if SQL
1a080 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a  ITE_OS_WINCE==0.
1a090 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
1a0a0 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42  r *zTemp;.    nB
1a0b0 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50  yte = osGetFullP
1a0c0 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29  athNameA((char*)
1a0d0 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30  zConverted, 0, 0
1a0e0 2c 20 30 29 20 2b 20 33 3b 0a 20 20 20 20 7a 54  , 0) + 3;.    zT
1a0f0 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  emp = sqlite3_ma
1a100 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a 65  lloc( nByte*size
1a110 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a  of(zTemp[0]) );.
1a120 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30      if( zTemp==0
1a130 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1a140 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
1a150 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
1a160 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
1a170 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  MEM;.    }.    o
1a180 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
1a190 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
1a1a0 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d  ted, nByte, zTem
1a1b0 70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, 0);.    sqlit
1a1c0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
1a1d0 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20  ed);.    zOut = 
1a1e0 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62  sqlite3_win32_mb
1a1f0 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70  cs_to_utf8(zTemp
1a200 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1a210 72 65 65 28 7a 54 65 6d 70 29 3b 0a 23 65 6e 64  ree(zTemp);.#end
1a220 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4f 75  if.  }.  if( zOu
1a230 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
1a240 5f 73 6e 70 72 69 6e 74 66 28 70 56 66 73 2d 3e  _snprintf(pVfs->
1a250 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c  mxPathname, zFul
1a260 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a  l, "%s", zOut);.
1a270 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1a280 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75  (zOut);.    retu
1a290 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1a2a0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
1a2b0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
1a2c0 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  OMEM;.  }.#endif
1a2d0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1a2e0 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
1a2f0 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74  ENSION./*.** Int
1a300 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e  erfaces for open
1a310 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62  ing a shared lib
1a320 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e  rary, finding en
1a330 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69  try points.** wi
1a340 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  thin the shared 
1a350 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f  library, and clo
1a360 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  sing the shared 
1a370 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a  library..*/./*.*
1a380 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72  * Interfaces for
1a390 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65   opening a share
1a3a0 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69  d library, findi
1a3b0 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a  ng entry points.
1a3c0 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68  ** within the sh
1a3d0 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e  ared library, an
1a3e0 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68  d closing the sh
1a3f0 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f  ared library..*/
1a400 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
1a410 6e 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  nDlOpen(sqlite3_
1a420 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74  vfs *pVfs, const
1a430 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1a440 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20  ){.  HANDLE h;. 
1a450 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
1a460 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46  d = convertUtf8F
1a470 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  ilename(zFilenam
1a480 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e);.  UNUSED_PAR
1a490 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
1a4a0 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
1a4b0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1a4c0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e  0;.  }.  if( isN
1a4d0 54 28 29 20 29 7b 0a 20 20 20 20 68 20 3d 20 6f  T() ){.    h = o
1a4e0 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 28 28 4c  sLoadLibraryW((L
1a4f0 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
1a500 64 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73  d);./* isNT() is
1a510 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f   1 if SQLITE_OS_
1a520 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69  WINCE==1, so thi
1a530 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20  s else is never 
1a540 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69  executed. .** Si
1a550 6e 63 65 20 74 68 65 20 41 4e 53 49 20 76 65 72  nce the ANSI ver
1a560 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69  sion of these Wi
1a570 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74  ndows API do not
1a580 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45   exist for WINCE
1a590 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74  ,.** it's import
1a5a0 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72  ant to not refer
1a5b0 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49  ence them for WI
1a5c0 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23  NCE builds..*/.#
1a5d0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1a5e0 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20  CE==0.  }else{. 
1a5f0 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62     h = osLoadLib
1a600 72 61 72 79 41 28 28 63 68 61 72 2a 29 7a 43 6f  raryA((char*)zCo
1a610 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66  nverted);.#endif
1a620 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
1a630 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
1a640 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a  .  return (void*
1a650 29 68 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  )h;.}.static voi
1a660 64 20 77 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c  d winDlError(sql
1a670 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
1a680 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
1a690 7a 42 75 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53  zBufOut){.  UNUS
1a6a0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
1a6b0 73 29 3b 0a 20 20 67 65 74 4c 61 73 74 45 72 72  s);.  getLastErr
1a6c0 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45  orMsg(osGetLastE
1a6d0 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42  rror(), nBuf, zB
1a6e0 75 66 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63  ufOut);.}.static
1a6f0 20 76 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d   void (*winDlSym
1a700 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
1a710 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c  fs, void *pHandl
1a720 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1a730 53 79 6d 62 6f 6c 29 29 28 76 6f 69 64 29 7b 0a  Symbol))(void){.
1a740 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1a750 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75  ER(pVfs);.  retu
1a760 72 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64  rn (void(*)(void
1a770 29 29 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65  ))osGetProcAddre
1a780 73 73 41 28 28 48 41 4e 44 4c 45 29 70 48 61 6e  ssA((HANDLE)pHan
1a790 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 7d  dle, zSymbol);.}
1a7a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
1a7b0 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  DlClose(sqlite3_
1a7c0 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20  vfs *pVfs, void 
1a7d0 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55  *pHandle){.  UNU
1a7e0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
1a7f0 66 73 29 3b 0a 20 20 6f 73 46 72 65 65 4c 69 62  fs);.  osFreeLib
1a800 72 61 72 79 28 28 48 41 4e 44 4c 45 29 70 48 61  rary((HANDLE)pHa
1a810 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f  ndle);.}.#else /
1a820 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  * if SQLITE_OMIT
1a830 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20  _LOAD_EXTENSION 
1a840 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20  is defined: */. 
1a850 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70   #define winDlOp
1a860 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  en  0.  #define 
1a870 77 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23  winDlError 0.  #
1a880 64 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20  define winDlSym 
1a890 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69    0.  #define wi
1a8a0 6e 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69  nDlClose 0.#endi
1a8b0 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  f.../*.** Write 
1a8c0 75 70 20 74 6f 20 6e 42 75 66 20 62 79 74 65 73  up to nBuf bytes
1a8d0 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69   of randomness i
1a8e0 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61  nto zBuf..*/.sta
1a8f0 74 69 63 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f  tic int winRando
1a900 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
1a910 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
1a920 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
1a930 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 55    int n = 0;.  U
1a940 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1a950 70 56 66 73 29 3b 0a 23 69 66 20 64 65 66 69 6e  pVfs);.#if defin
1a960 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
1a970 20 20 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65    n = nBuf;.  me
1a980 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42  mset(zBuf, 0, nB
1a990 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  uf);.#else.  if(
1a9a0 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54 49   sizeof(SYSTEMTI
1a9b0 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20  ME)<=nBuf-n ){. 
1a9c0 20 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78 3b     SYSTEMTIME x;
1a9d0 0a 20 20 20 20 6f 73 47 65 74 53 79 73 74 65 6d  .    osGetSystem
1a9e0 54 69 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d 65  Time(&x);.    me
1a9f0 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26  mcpy(&zBuf[n], &
1aa00 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20  x, sizeof(x));. 
1aa10 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 78     n += sizeof(x
1aa20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a  );.  }.  if( siz
1aa30 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66  eof(DWORD)<=nBuf
1aa40 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20  -n ){.    DWORD 
1aa50 70 69 64 20 3d 20 6f 73 47 65 74 43 75 72 72 65  pid = osGetCurre
1aa60 6e 74 50 72 6f 63 65 73 73 49 64 28 29 3b 0a 20  ntProcessId();. 
1aa70 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
1aa80 6e 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66  n], &pid, sizeof
1aa90 28 70 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  (pid));.    n +=
1aaa0 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20   sizeof(pid);.  
1aab0 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44  }.  if( sizeof(D
1aac0 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b  WORD)<=nBuf-n ){
1aad0 0a 20 20 20 20 44 57 4f 52 44 20 63 6e 74 20 3d  .    DWORD cnt =
1aae0 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 28   osGetTickCount(
1aaf0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
1ab00 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69  Buf[n], &cnt, si
1ab10 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20  zeof(cnt));.    
1ab20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29  n += sizeof(cnt)
1ab30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65  ;.  }.  if( size
1ab40 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52  of(LARGE_INTEGER
1ab50 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
1ab60 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69   LARGE_INTEGER i
1ab70 3b 0a 20 20 20 20 6f 73 51 75 65 72 79 50 65 72  ;.    osQueryPer
1ab80 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28  formanceCounter(
1ab90 26 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  &i);.    memcpy(
1aba0 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69  &zBuf[n], &i, si
1abb0 7a 65 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e 20  zeof(i));.    n 
1abc0 2b 3d 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20  += sizeof(i);.  
1abd0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
1abe0 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  n n;.}.../*.** S
1abf0 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
1ac00 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
1ac10 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
1ac20 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74  ime slept..*/.st
1ac30 61 74 69 63 20 69 6e 74 20 77 69 6e 53 6c 65 65  atic int winSlee
1ac40 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  p(sqlite3_vfs *p
1ac50 56 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65  Vfs, int microse
1ac60 63 29 7b 0a 20 20 6f 73 53 6c 65 65 70 28 28 6d  c){.  osSleep((m
1ac70 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30  icrosec+999)/100
1ac80 30 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  0);.  UNUSED_PAR
1ac90 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
1aca0 72 65 74 75 72 6e 20 28 28 6d 69 63 72 6f 73 65  return ((microse
1acb0 63 2b 39 39 39 29 2f 31 30 30 30 29 2a 31 30 30  c+999)/1000)*100
1acc0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  0;.}../*.** The 
1acd0 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
1ace0 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20  le, if set to a 
1acf0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20  non-zero value, 
1ad00 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
1ad10 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  s.** the number 
1ad20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  of seconds since
1ad30 20 31 39 37 30 20 61 6e 64 20 69 73 20 75 73 65   1970 and is use
1ad40 64 20 74 6f 20 73 65 74 20 74 68 65 20 72 65 73  d to set the res
1ad50 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  ult of.** sqlite
1ad60 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29  3OsCurrentTime()
1ad70 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e   during testing.
1ad80 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1ad90 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
1ada0 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
1adb0 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79  = 0;  /* Fake sy
1adc0 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63  stem time in sec
1add0 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e  onds since 1970.
1ade0 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   */.#endif../*.*
1adf0 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
1ae00 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
1ae10 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
1ae20 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
1ae30 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74  into *piNow.** t
1ae40 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
1ae50 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75  and date as a Ju
1ae60 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
1ae70 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30  times 86_400_000
1ae80 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77  .  In.** other w
1ae90 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f  ords, write into
1aea0 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62   *piNow the numb
1aeb0 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
1aec0 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c  ds since the Jul
1aed0 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20  ian.** epoch of 
1aee0 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63  noon in Greenwic
1aef0 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34  h on November 24
1af00 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72  , 4714 B.C accor
1af10 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70  ding to the.** p
1af20 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69  roleptic Gregori
1af30 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a  an calendar..**.
1af40 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72  ** On success, r
1af50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
1af60 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1af70 45 52 52 4f 52 20 69 66 20 74 68 65 20 74 69 6d  ERROR if the tim
1af80 65 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63  e and date .** c
1af90 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
1afa0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1afb0 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  nCurrentTimeInt6
1afc0 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  4(sqlite3_vfs *p
1afd0 56 66 73 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  Vfs, sqlite3_int
1afe0 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f 2a  64 *piNow){.  /*
1aff0 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74   FILETIME struct
1b000 75 72 65 20 69 73 20 61 20 36 34 2d 62 69 74 20  ure is a 64-bit 
1b010 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74 69  value representi
1b020 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
1b030 20 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73   .     100-nanos
1b040 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 20  econd intervals 
1b050 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31 2c  since January 1,
1b060 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30 35   1601 (= JD 2305
1b070 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20 20  813.5). .  */.  
1b080 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 73  FILETIME ft;.  s
1b090 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
1b0a0 74 65 33 5f 69 6e 74 36 34 20 77 69 6e 46 69 6c  te3_int64 winFil
1b0b0 65 74 69 6d 65 45 70 6f 63 68 20 3d 20 32 33 30  etimeEpoch = 230
1b0c0 35 38 31 33 35 2a 28 73 71 6c 69 74 65 33 5f 69  58135*(sqlite3_i
1b0d0 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 69  nt64)8640000;.#i
1b0e0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1b0f0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
1b100 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e  sqlite3_int64 un
1b110 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38  ixEpoch = 244058
1b120 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  75*(sqlite3_int6
1b130 34 29 38 36 34 30 30 30 30 3b 0a 23 65 6e 64 69  4)8640000;.#endi
1b140 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74 6f  f.  /* 2^32 - to
1b150 20 61 76 6f 69 64 20 75 73 65 20 6f 66 20 4c 4c   avoid use of LL
1b160 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20 69 6e   and warnings in
1b170 20 67 63 63 20 2a 2f 0a 20 20 73 74 61 74 69 63   gcc */.  static
1b180 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
1b190 6e 74 36 34 20 6d 61 78 33 32 42 69 74 56 61 6c  nt64 max32BitVal
1b1a0 75 65 20 3d 20 0a 20 20 20 20 20 20 28 73 71 6c  ue = .      (sql
1b1b0 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30  ite3_int64)20000
1b1c0 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33  00000 + (sqlite3
1b1d0 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 30 30  _int64)200000000
1b1e0 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  0 + (sqlite3_int
1b1f0 36 34 29 32 39 34 39 36 37 32 39 36 3b 0a 0a 23  64)294967296;..#
1b200 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1b210 43 45 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20  CE.  SYSTEMTIME 
1b220 74 69 6d 65 3b 0a 20 20 6f 73 47 65 74 53 79 73  time;.  osGetSys
1b230 74 65 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a  temTime(&time);.
1b240 20 20 2f 2a 20 69 66 20 53 79 73 74 65 6d 54 69    /* if SystemTi
1b250 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 29 20 66  meToFileTime() f
1b260 61 69 6c 73 2c 20 69 74 20 72 65 74 75 72 6e 73  ails, it returns
1b270 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28   zero. */.  if (
1b280 21 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46  !osSystemTimeToF
1b290 69 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c 26 66  ileTime(&time,&f
1b2a0 74 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t)){.    return 
1b2b0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1b2c0 7d 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53  }.#else.  osGetS
1b2d0 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
1b2e0 69 6d 65 28 20 26 66 74 20 29 3b 0a 23 65 6e 64  ime( &ft );.#end
1b2f0 69 66 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77  if..  *piNow = w
1b300 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20  inFiletimeEpoch 
1b310 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28  +.            ((
1b320 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  ((sqlite3_int64)
1b330 66 74 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d  ft.dwHighDateTim
1b340 65 29 2a 6d 61 78 33 32 42 69 74 56 61 6c 75 65  e)*max32BitValue
1b350 29 20 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20  ) + .           
1b360 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74      (sqlite3_int
1b370 36 34 29 66 74 2e 64 77 4c 6f 77 44 61 74 65 54  64)ft.dwLowDateT
1b380 69 6d 65 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e  ime)/(sqlite3_in
1b390 74 36 34 29 31 30 30 30 30 3b 0a 0a 23 69 66 64  t64)10000;..#ifd
1b3a0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1b3b0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72   if( sqlite3_cur
1b3c0 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20  rent_time ){.   
1b3d0 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28   *piNow = 1000*(
1b3e0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71  sqlite3_int64)sq
1b3f0 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
1b400 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a  me + unixEpoch;.
1b410 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55    }.#endif.  UNU
1b420 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
1b430 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  fs);.  return SQ
1b440 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1b450 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
1b460 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
1b470 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
1b480 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
1b490 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74  the.** current t
1b4a0 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
1b4b0 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
1b4c0 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20  ber into *prNow 
1b4d0 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e  and.** return 0.
1b4e0 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
1b4f0 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
1b500 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
1b510 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1b520 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71  inCurrentTime(sq
1b530 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
1b540 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b   double *prNow){
1b550 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
1b560 69 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20  ite3_int64 i;.  
1b570 72 63 20 3d 20 77 69 6e 43 75 72 72 65 6e 74 54  rc = winCurrentT
1b580 69 6d 65 49 6e 74 36 34 28 70 56 66 73 2c 20 26  imeInt64(pVfs, &
1b590 69 29 3b 0a 20 20 69 66 28 20 21 72 63 20 29 7b  i);.  if( !rc ){
1b5a0 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f  .    *prNow = i/
1b5b0 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a  86400000.0;.  }.
1b5c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b5d0 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 69  /*.** The idea i
1b5e0 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  s that this func
1b5f0 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20  tion works like 
1b600 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  a combination of
1b610 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72  .** GetLastError
1b620 28 29 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73  () and FormatMes
1b630 73 61 67 65 28 29 20 6f 6e 20 57 69 6e 64 6f 77  sage() on Window
1b640 73 20 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a  s (or errno and.
1b650 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20  ** strerror_r() 
1b660 6f 6e 20 55 6e 69 78 29 2e 20 41 66 74 65 72 20  on Unix). After 
1b670 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
1b680 72 6e 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a  rned by an OS.**
1b690 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74   function, SQLit
1b6a0 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e  e calls this fun
1b6b0 63 74 69 6f 6e 20 77 69 74 68 20 7a 42 75 66 20  ction with zBuf 
1b6c0 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61  pointing to.** a
1b6d0 20 62 75 66 66 65 72 20 6f 66 20 6e 42 75 66 20   buffer of nBuf 
1b6e0 62 79 74 65 73 2e 20 54 68 65 20 4f 53 20 6c 61  bytes. The OS la
1b6f0 79 65 72 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c  yer should popul
1b700 61 74 65 20 74 68 65 0a 2a 2a 20 62 75 66 66 65  ate the.** buffe
1b710 72 20 77 69 74 68 20 61 20 6e 75 6c 2d 74 65 72  r with a nul-ter
1b720 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 65 6e  minated UTF-8 en
1b730 63 6f 64 65 64 20 65 72 72 6f 72 20 6d 65 73 73  coded error mess
1b740 61 67 65 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e  age.** describin
1b750 67 20 74 68 65 20 6c 61 73 74 20 49 4f 20 65 72  g the last IO er
1b760 72 6f 72 20 74 6f 20 68 61 76 65 20 6f 63 63 75  ror to have occu
1b770 72 72 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  rred within the 
1b780 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61  calling.** threa
1b790 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
1b7a0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
1b7b0 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20 74   too large for t
1b7c0 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66  he supplied buff
1b7d0 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64  er,.** it should
1b7e0 20 62 65 20 74 72 75 6e 63 61 74 65 64 2e 20 54   be truncated. T
1b7f0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
1b800 6f 66 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  of xGetLastError
1b810 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74  .** is zero if t
1b820 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
1b830 20 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66   fits in the buf
1b840 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  fer, or non-zero
1b850 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69  .** otherwise (i
1b860 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61  f the message wa
1b870 73 20 74 72 75 6e 63 61 74 65 64 29 2e 20 49 66  s truncated). If
1b880 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74   non-zero is ret
1b890 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69  urned,.** then i
1b8a0 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
1b8b0 72 79 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68  ry to include th
1b8c0 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  e nul-terminator
1b8d0 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e   character.** in
1b8e0 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
1b8f0 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75  er..**.** Not su
1b900 70 70 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f 72  pplying an error
1b910 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 68 61   message will ha
1b920 76 65 20 6e 6f 20 61 64 76 65 72 73 65 20 65 66  ve no adverse ef
1b930 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74  fect.** on SQLit
1b940 65 2e 20 49 74 20 69 73 20 66 69 6e 65 20 74 6f  e. It is fine to
1b950 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65   have an impleme
1b960 6e 74 61 74 69 6f 6e 20 74 68 61 74 20 6e 65 76  ntation that nev
1b970 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e  er.** returns an
1b980 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a   error message:.
1b990 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65 74  **.**   int xGet
1b9a0 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65  LastError(sqlite
1b9b0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
1b9c0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
1b9d0 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65 72  f){.**     asser
1b9e0 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29  t(zBuf[0]=='\0')
1b9f0 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20  ;.**     return 
1ba00 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  0;.**   }.**.** 
1ba10 48 6f 77 65 76 65 72 20 69 66 20 61 6e 20 65 72  However if an er
1ba20 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73  ror message is s
1ba30 75 70 70 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c  upplied, it will
1ba40 20 62 65 20 69 6e 63 6f 72 70 6f 72 61 74 65 64   be incorporated
1ba50 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 20 69 6e  .** by sqlite in
1ba60 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  to the error mes
1ba70 73 61 67 65 20 61 76 61 69 6c 61 62 6c 65 20 74  sage available t
1ba80 6f 20 74 68 65 20 75 73 65 72 20 75 73 69 6e 67  o the user using
1ba90 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  .** sqlite3_errm
1baa0 73 67 28 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d  sg(), possibly m
1bab0 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f 72 73 20  aking IO errors 
1bac0 65 61 73 69 65 72 20 74 6f 20 64 65 62 75 67 2e  easier to debug.
1bad0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1bae0 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73  inGetLastError(s
1baf0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1bb00 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
1bb10 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45   *zBuf){.  UNUSE
1bb20 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
1bb30 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 4c  );.  return getL
1bb40 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65  astErrorMsg(osGe
1bb50 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42  tLastError(), nB
1bb60 75 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a  uf, zBuf);.}../*
1bb70 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
1bb80 6e 64 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20  nd deinitialize 
1bb90 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
1bba0 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a  stem interface..
1bbb0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
1bbc0 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20  s_init(void){.  
1bbd0 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76  static sqlite3_v
1bbe0 66 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20  fs winVfs = {.  
1bbf0 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20    3,            
1bc00 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
1bc10 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66  on */.    sizeof
1bc20 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f  (winFile),     /
1bc30 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20  * szOsFile */.  
1bc40 20 20 4d 41 58 5f 50 41 54 48 2c 20 20 20 20 20    MAX_PATH,     
1bc50 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68         /* mxPath
1bc60 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20  name */.    0,  
1bc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc80 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20   /* pNext */.   
1bc90 20 22 77 69 6e 33 32 22 2c 20 20 20 20 20 20 20   "win32",       
1bca0 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a        /* zName *
1bcb0 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
1bcc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41             /* pA
1bcd0 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69  ppData */.    wi
1bce0 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  nOpen,          
1bcf0 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20     /* xOpen */. 
1bd00 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20     winDelete,   
1bd10 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65          /* xDele
1bd20 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63  te */.    winAcc
1bd30 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ess,           /
1bd40 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20  * xAccess */.   
1bd50 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65   winFullPathname
1bd60 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61  ,     /* xFullPa
1bd70 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69  thname */.    wi
1bd80 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  nDlOpen,        
1bd90 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f     /* xDlOpen */
1bda0 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c  .    winDlError,
1bdb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
1bdc0 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e  Error */.    win
1bdd0 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20  DlSym,          
1bde0 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20    /* xDlSym */. 
1bdf0 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20     winDlClose,  
1be00 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c          /* xDlCl
1be10 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61  ose */.    winRa
1be20 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20  ndomness,       
1be30 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a  /* xRandomness *
1be40 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20  /.    winSleep, 
1be50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
1be60 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43  leep */.    winC
1be70 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20  urrentTime,     
1be80 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
1be90 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61   */.    winGetLa
1bea0 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20  stError,     /* 
1beb0 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f  xGetLastError */
1bec0 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54  .    winCurrentT
1bed0 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75  imeInt64, /* xCu
1bee0 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a  rrentTimeInt64 *
1bef0 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73 74  /.    winSetSyst
1bf00 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53  emCall,    /* xS
1bf10 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  etSystemCall */.
1bf20 20 20 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d      winGetSystem
1bf30 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74  Call,    /* xGet
1bf40 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
1bf50 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43    winNextSystemC
1bf60 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53  all,   /* xNextS
1bf70 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d  ystemCall */.  }
1bf80 3b 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63  ;..  /* Double-c
1bf90 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 53  heck that the aS
1bfa0 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68  yscall[] array h
1bfb0 61 73 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63  as been construc
1bfc0 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74  ted.  ** correct
1bfd0 6c 79 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20  ly.  See ticket 
1bfe0 5b 62 62 33 61 38 36 65 38 39 30 63 38 65 39 36  [bb3a86e890c8e96
1bff0 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ab] */.  assert(
1c000 20 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63   ArraySize(aSysc
1c010 61 6c 6c 29 3d 3d 36 30 20 29 3b 0a 0a 23 69 66  all)==60 );..#if
1c020 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c030 5f 57 41 4c 0a 20 20 2f 2a 20 67 65 74 20 6d 65  _WAL.  /* get me
1c040 6d 6f 72 79 20 6d 61 70 20 61 6c 6c 6f 63 61 74  mory map allocat
1c050 69 6f 6e 20 67 72 61 6e 75 6c 61 72 69 74 79 20  ion granularity 
1c060 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 77 69 6e  */.  memset(&win
1c070 53 79 73 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  SysInfo, 0, size
1c080 6f 66 28 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29  of(SYSTEM_INFO))
1c090 3b 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 49  ;.  osGetSystemI
1c0a0 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29  nfo(&winSysInfo)
1c0b0 3b 0a 20 20 61 73 73 65 72 74 28 77 69 6e 53 79  ;.  assert(winSy
1c0c0 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69  sInfo.dwAllocati
1c0d0 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 20 3e 20  onGranularity > 
1c0e0 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71  0);.#endif..  sq
1c0f0 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
1c100 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29 3b 0a  er(&winVfs, 1);.
1c110 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c120 4f 4b 3b 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69  OK; .}..int sqli
1c130 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29  te3_os_end(void)
1c140 7b 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  { .  return SQLI
1c150 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66  TE_OK;.}..#endif
1c160 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   /* SQLITE_OS_WI
1c170 4e 20 2a 2f 0a                                   N */.