/ Hex Artifact Content
Login

Artifact f45f03e4585c31b5124771eb07ecce5b37a5c30a:


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 44 57 4f 52 44 20 73 65  or */.  DWORD se
0810: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
0820: 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 6f  /* Sector size o
0830: 66 20 74 68 65 20 64 65 76 69 63 65 20 66 69 6c  f the device fil
0840: 65 20 69 73 20 6f 6e 20 2a 2f 0a 20 20 77 69 6e  e is on */.  win
0850: 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20  Shm *pShm;      
0860: 20 20 20 20 20 2f 2a 20 49 6e 73 74 61 6e 63 65       /* Instance
0870: 20 6f 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   of shared memor
0880: 79 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  y on this file *
0890: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
08a0: 7a 50 61 74 68 3b 20 20 20 20 20 20 2f 2a 20 46  zPath;      /* F
08b0: 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
08c0: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69  this file */.  i
08d0: 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20  nt szChunk;     
08e0: 20 20 20 20 20 20 20 2f 2a 20 43 68 75 6e 6b 20         /* Chunk 
08f0: 73 69 7a 65 20 63 6f 6e 66 69 67 75 72 65 64 20  size configured 
0900: 62 79 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53  by FCNTL_CHUNK_S
0910: 49 5a 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  IZE */.#if SQLIT
0920: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 4c 50 57  E_OS_WINCE.  LPW
0930: 53 54 52 20 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  STR zDeleteOnClo
0940: 73 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  se;  /* Name of 
0950: 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 77  file to delete w
0960: 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20  hen closing */. 
0970: 20 48 41 4e 44 4c 45 20 68 4d 75 74 65 78 3b 20   HANDLE hMutex; 
0980: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 74 65           /* Mute
0990: 78 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f  x used to contro
09a0: 6c 20 61 63 63 65 73 73 20 74 6f 20 73 68 61 72  l access to shar
09b0: 65 64 20 6c 6f 63 6b 20 2a 2f 20 20 0a 20 20 48  ed lock */  .  H
09c0: 41 4e 44 4c 45 20 68 53 68 61 72 65 64 3b 20 20  ANDLE hShared;  
09d0: 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
09e0: 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20   memory segment 
09f0: 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
0a00: 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20   */.  winceLock 
0a10: 6c 6f 63 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a  local;        /*
0a20: 20 4c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20   Locks obtained 
0a30: 62 79 20 74 68 69 73 20 69 6e 73 74 61 6e 63 65  by this instance
0a40: 20 6f 66 20 77 69 6e 46 69 6c 65 20 2a 2f 0a 20   of winFile */. 
0a50: 20 77 69 6e 63 65 4c 6f 63 6b 20 2a 73 68 61 72   winceLock *shar
0a60: 65 64 3b 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62  ed;      /* Glob
0a70: 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6d  al shared lock m
0a80: 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 66 69  emory for the fi
0a90: 6c 65 20 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  le  */.#endif.};
0aa0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20  ../*.** Allowed 
0ab0: 76 61 6c 75 65 73 20 66 6f 72 20 77 69 6e 46 69  values for winFi
0ac0: 6c 65 2e 63 74 72 6c 46 6c 61 67 73 0a 2a 2f 0a  le.ctrlFlags.*/.
0ad0: 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f  #define WINFILE_
0ae0: 50 45 52 53 49 53 54 5f 57 41 4c 20 20 20 20 20  PERSIST_WAL     
0af0: 30 78 30 34 20 20 20 2f 2a 20 50 65 72 73 69 73  0x04   /* Persis
0b00: 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f  tent WAL mode */
0b10: 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c 45  .#define WINFILE
0b20: 5f 5a 45 52 4f 5f 44 41 4d 41 47 45 20 20 20 20  _ZERO_DAMAGE    
0b30: 20 30 78 31 30 20 20 20 2f 2a 20 54 72 75 65 20   0x10   /* True 
0b40: 69 66 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  if SQLITE_IOCAP_
0b50: 5a 45 52 4f 5f 44 41 4d 41 47 45 20 2a 2f 0a 0a  ZERO_DAMAGE */..
0b60: 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65  /*. * If compile
0b70: 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 57 49  d with SQLITE_WI
0b80: 4e 33 32 5f 4d 41 4c 4c 4f 43 20 6f 6e 20 57 69  N32_MALLOC on Wi
0b90: 6e 64 6f 77 73 2c 20 77 65 20 77 69 6c 6c 20 75  ndows, we will u
0ba0: 73 65 20 74 68 65 0a 20 2a 20 76 61 72 69 6f 75  se the. * variou
0bb0: 73 20 57 69 6e 33 32 20 41 50 49 20 68 65 61 70  s Win32 API heap
0bc0: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 73 74 65   functions inste
0bd0: 61 64 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 20  ad of our own.. 
0be0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0bf0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a  _WIN32_MALLOC./*
0c00: 0a 20 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20  . * The initial 
0c10: 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33  size of the Win3
0c20: 32 2d 73 70 65 63 69 66 69 63 20 68 65 61 70 2e  2-specific heap.
0c30: 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79    This value may
0c40: 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69   be zero.. */.#i
0c50: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
0c60: 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a  32_HEAP_INIT_SIZ
0c70: 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  E.#  define SQLI
0c80: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e  TE_WIN32_HEAP_IN
0c90: 49 54 5f 53 49 5a 45 20 28 28 53 51 4c 49 54 45  IT_SIZE ((SQLITE
0ca0: 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53  _DEFAULT_CACHE_S
0cb0: 49 5a 45 29 20 2a 20 5c 0a 20 20 20 20 20 20 20  IZE) * \.       
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ce0: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
0cf0: 50 41 47 45 5f 53 49 5a 45 29 20 2b 20 34 31 39  PAGE_SIZE) + 419
0d00: 34 33 30 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  4304).#endif../*
0d10: 0a 20 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  . * The maximum 
0d20: 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33  size of the Win3
0d30: 32 2d 73 70 65 63 69 66 69 63 20 68 65 61 70 2e  2-specific heap.
0d40: 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79    This value may
0d50: 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69   be zero.. */.#i
0d60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
0d70: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45  32_HEAP_MAX_SIZE
0d80: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
0d90: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58  E_WIN32_HEAP_MAX
0da0: 5f 53 49 5a 45 20 20 28 30 29 0a 23 65 6e 64 69  _SIZE  (0).#endi
0db0: 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 65 78 74  f../*. * The ext
0dc0: 72 61 20 66 6c 61 67 73 20 74 6f 20 75 73 65 20  ra flags to use 
0dd0: 69 6e 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20  in calls to the 
0de0: 57 69 6e 33 32 20 68 65 61 70 20 41 50 49 73 2e  Win32 heap APIs.
0df0: 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79    This value may
0e00: 20 62 65 0a 20 2a 20 7a 65 72 6f 20 66 6f 72 20   be. * zero for 
0e10: 74 68 65 20 64 65 66 61 75 6c 74 20 62 65 68 61  the default beha
0e20: 76 69 6f 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65  vior.. */.#ifnde
0e30: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
0e40: 45 41 50 5f 46 4c 41 47 53 0a 23 20 20 64 65 66  EAP_FLAGS.#  def
0e50: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
0e60: 5f 48 45 41 50 5f 46 4c 41 47 53 20 20 20 20 20  _HEAP_FLAGS     
0e70: 28 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (0).#endif../*.*
0e80: 2a 20 54 68 65 20 77 69 6e 4d 65 6d 44 61 74 61  * The winMemData
0e90: 20 73 74 72 75 63 74 75 72 65 20 73 74 6f 72 65   structure store
0ea0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65  s information re
0eb0: 71 75 69 72 65 64 20 62 79 20 74 68 65 20 57 69  quired by the Wi
0ec0: 6e 33 32 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20  n32-specific.** 
0ed0: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
0ee0: 6f 64 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ods implementati
0ef0: 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  on..*/.typedef s
0f00: 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61  truct winMemData
0f10: 20 77 69 6e 4d 65 6d 44 61 74 61 3b 0a 73 74 72   winMemData;.str
0f20: 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 7b  uct winMemData {
0f30: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
0f40: 20 20 75 33 32 20 6d 61 67 69 63 3b 20 20 20 20    u32 magic;    
0f50: 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20  /* Magic number 
0f60: 74 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74  to detect struct
0f70: 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ure corruption. 
0f80: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 48 41 4e 44  */.#endif.  HAND
0f90: 4c 45 20 68 48 65 61 70 3b 20 2f 2a 20 54 68 65  LE hHeap; /* The
0fa0: 20 68 61 6e 64 6c 65 20 74 6f 20 6f 75 72 20 68   handle to our h
0fb0: 65 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  eap. */.  BOOL b
0fc0: 4f 77 6e 65 64 3b 20 20 2f 2a 20 44 6f 20 77 65  Owned;  /* Do we
0fd0: 20 6f 77 6e 20 74 68 65 20 68 65 61 70 20 28 69   own the heap (i
0fe0: 2e 65 2e 20 64 65 73 74 72 6f 79 20 69 74 20 6f  .e. destroy it o
0ff0: 6e 20 73 68 75 74 64 6f 77 6e 29 3f 20 2a 2f 0a  n shutdown)? */.
1000: 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  };..#ifndef NDEB
1010: 55 47 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45  UG.#define WINME
1020: 4d 5f 4d 41 47 49 43 20 20 20 20 20 30 78 34 32  M_MAGIC     0x42
1030: 62 32 38 33 30 62 0a 23 65 6e 64 69 66 0a 0a 73  b2830b.#endif..s
1040: 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e  tatic struct win
1050: 4d 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65 6d 5f  MemData win_mem_
1060: 64 61 74 61 20 3d 20 7b 0a 23 69 66 6e 64 65 66  data = {.#ifndef
1070: 20 4e 44 45 42 55 47 0a 20 20 57 49 4e 4d 45 4d   NDEBUG.  WINMEM
1080: 5f 4d 41 47 49 43 2c 0a 23 65 6e 64 69 66 0a 20  _MAGIC,.#endif. 
1090: 20 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a 7d 3b 0a   NULL, FALSE.};.
10a0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
10b0: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73  #define winMemAs
10c0: 73 65 72 74 4d 61 67 69 63 28 29 20 61 73 73 65  sertMagic() asse
10d0: 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61  rt( win_mem_data
10e0: 2e 6d 61 67 69 63 3d 3d 57 49 4e 4d 45 4d 5f 4d  .magic==WINMEM_M
10f0: 41 47 49 43 20 29 0a 23 65 6c 73 65 0a 23 64 65  AGIC ).#else.#de
1100: 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72  fine winMemAsser
1110: 74 4d 61 67 69 63 28 29 0a 23 65 6e 64 69 66 0a  tMagic().#endif.
1120: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47  .#define winMemG
1130: 65 74 48 65 61 70 28 29 20 77 69 6e 5f 6d 65 6d  etHeap() win_mem
1140: 5f 64 61 74 61 2e 68 48 65 61 70 0a 0a 73 74 61  _data.hHeap..sta
1150: 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d  tic void *winMem
1160: 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65  Malloc(int nByte
1170: 73 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  s);.static void 
1180: 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20  winMemFree(void 
1190: 2a 70 50 72 69 6f 72 29 3b 0a 73 74 61 74 69 63  *pPrior);.static
11a0: 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61   void *winMemRea
11b0: 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f  lloc(void *pPrio
11c0: 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a  r, int nBytes);.
11d0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
11e0: 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 3b 0a  mSize(void *p);.
11f0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
1200: 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 3b  mRoundup(int n);
1210: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
1220: 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70  emInit(void *pAp
1230: 70 44 61 74 61 29 3b 0a 73 74 61 74 69 63 20 76  pData);.static v
1240: 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f  oid winMemShutdo
1250: 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74  wn(void *pAppDat
1260: 61 29 3b 0a 0a 63 6f 6e 73 74 20 73 71 6c 69 74  a);..const sqlit
1270: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a  e3_mem_methods *
1280: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e  sqlite3MemGetWin
1290: 33 32 28 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66  32(void);.#endif
12a0: 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   /* SQLITE_WIN32
12b0: 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a  _MALLOC */../*.*
12c0: 2a 20 46 6f 72 77 61 72 64 20 70 72 6f 74 6f 74  * Forward protot
12d0: 79 70 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ypes..*/.static 
12e0: 69 6e 74 20 67 65 74 53 65 63 74 6f 72 53 69 7a  int getSectorSiz
12f0: 65 28 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  e(.    sqlite3_v
1300: 66 73 20 2a 70 56 66 73 2c 0a 20 20 20 20 63 6f  fs *pVfs,.    co
1310: 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74  nst char *zRelat
1320: 69 76 65 20 20 20 20 20 2f 2a 20 55 54 46 2d 38  ive     /* UTF-8
1330: 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 29 3b   file name */.);
1340: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
1350: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69  owing variable i
1360: 73 20 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65 74  s (normally) set
1370: 20 6f 6e 63 65 20 61 6e 64 20 6e 65 76 65 72 20   once and never 
1380: 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72 65  changes.** there
1390: 61 66 74 65 72 2e 20 20 49 74 20 72 65 63 6f 72  after.  It recor
13a0: 64 73 20 77 68 65 74 68 65 72 20 74 68 65 20 6f  ds whether the o
13b0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
13c0: 69 73 20 57 69 6e 39 78 0a 2a 2a 20 6f 72 20 57  is Win9x.** or W
13d0: 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20  inNT..**.** 0:  
13e0: 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   Operating syste
13f0: 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a  m unknown..** 1:
1400: 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73     Operating sys
1410: 74 65 6d 20 69 73 20 57 69 6e 39 78 2e 0a 2a 2a  tem is Win9x..**
1420: 20 32 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20   2:   Operating 
1430: 73 79 73 74 65 6d 20 69 73 20 57 69 6e 4e 54 2e  system is WinNT.
1440: 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20  .**.** In order 
1450: 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 65  to facilitate te
1460: 73 74 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e 54  sting on a WinNT
1470: 20 73 79 73 74 65 6d 2c 20 74 68 65 20 74 65 73   system, the tes
1480: 74 20 66 69 78 74 75 72 65 0a 2a 2a 20 63 61 6e  t fixture.** can
1490: 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20 74 68   manually set th
14a0: 69 73 20 76 61 6c 75 65 20 74 6f 20 31 20 74 6f  is value to 1 to
14b0: 20 65 6d 75 6c 61 74 65 20 57 69 6e 39 38 20 62   emulate Win98 b
14c0: 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66 64  ehavior..*/.#ifd
14d0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
14e0: 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  nt sqlite3_os_ty
14f0: 70 65 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  pe = 0;.#else.st
1500: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
1510: 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65  _os_type = 0;.#e
1520: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79  ndif../*.** Many
1530: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72   system calls ar
1540: 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f 75  e accessed throu
1550: 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75  gh pointer-to-fu
1560: 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a  nctions so that.
1570: 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f  ** they may be o
1580: 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e  verridden at run
1590: 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61  time to facilita
15a0: 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69  te fault injecti
15b0: 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73  on during.** tes
15c0: 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78  ting and sandbox
15d0: 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ing.  The follow
15e0: 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20  ing array holds 
15f0: 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f  the names and po
1600: 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c  inters.** to all
1610: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
1620: 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 23  stem calls..*/.#
1630: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
1640: 4e 43 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  NCE.#  define SQ
1650: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
1660: 4e 53 49 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  NSI.#endif..#if 
1670: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
1680: 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  || SQLITE_OS_WIN
1690: 4e 54 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  NT.#  define SQL
16a0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
16b0: 44 45 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  DE.#endif..#ifnd
16c0: 65 66 20 53 59 53 43 41 4c 4c 0a 23 20 20 64 65  ef SYSCALL.#  de
16d0: 66 69 6e 65 20 53 59 53 43 41 4c 4c 20 73 71 6c  fine SYSCALL sql
16e0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
16f0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
1700: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 2f 2a 0a  ITE_OS_WINCE./*.
1710: 2a 2a 20 54 68 65 73 65 20 6d 61 63 72 6f 73 20  ** These macros 
1720: 61 72 65 20 6e 65 63 65 73 73 61 72 79 20 62 65  are necessary be
1730: 63 61 75 73 65 20 57 69 6e 64 6f 77 73 20 43 45  cause Windows CE
1740: 20 64 6f 65 73 20 6e 6f 74 20 6e 61 74 69 76 65   does not native
1750: 6c 79 20 73 75 70 70 6f 72 74 20 74 68 65 0a 2a  ly support the.*
1760: 2a 20 57 69 6e 33 32 20 41 50 49 73 20 4c 6f 63  * Win32 APIs Loc
1770: 6b 46 69 6c 65 2c 20 55 6e 6c 6f 63 6b 46 69 6c  kFile, UnlockFil
1780: 65 2c 20 61 6e 64 20 4c 6f 63 6b 46 69 6c 65 45  e, and LockFileE
1790: 78 2e 0a 20 2a 2f 0a 0a 23 20 20 64 65 66 69 6e  x.. */..#  defin
17a0: 65 20 4c 6f 63 6b 46 69 6c 65 28 61 2c 62 2c 63  e LockFile(a,b,c
17b0: 2c 64 2c 65 29 20 20 20 20 20 20 20 77 69 6e 63  ,d,e)       winc
17c0: 65 4c 6f 63 6b 46 69 6c 65 28 26 61 2c 20 62 2c  eLockFile(&a, b,
17d0: 20 63 2c 20 64 2c 20 65 29 0a 23 20 20 64 65 66   c, d, e).#  def
17e0: 69 6e 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 61  ine UnlockFile(a
17f0: 2c 62 2c 63 2c 64 2c 65 29 20 20 20 20 20 77 69  ,b,c,d,e)     wi
1800: 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 61  nceUnlockFile(&a
1810: 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23 20  , b, c, d, e).# 
1820: 20 64 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65   define LockFile
1830: 45 78 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20  Ex(a,b,c,d,e,f) 
1840: 20 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45    winceLockFileE
1850: 78 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65  x(&a, b, c, d, e
1860: 2c 20 66 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  , f)../*.** Thes
1870: 65 20 61 72 65 20 74 68 65 20 73 70 65 63 69 61  e are the specia
1880: 6c 20 73 79 73 63 61 6c 6c 20 68 61 63 6b 73 20  l syscall hacks 
1890: 66 6f 72 20 57 69 6e 64 6f 77 73 20 43 45 2e 20  for Windows CE. 
18a0: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c   The locking rel
18b0: 61 74 65 64 0a 2a 2a 20 64 65 66 69 6e 65 73 20  ated.** defines 
18c0: 68 65 72 65 20 72 65 66 65 72 20 74 6f 20 74 68  here refer to th
18d0: 65 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 64  e macros defined
18e0: 20 6a 75 73 74 20 61 62 6f 76 65 2e 0a 20 2a 2f   just above.. */
18f0: 0a 0a 23 20 20 64 65 66 69 6e 65 20 6f 73 41 72  ..#  define osAr
1900: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20  eFileApisANSI() 
1910: 20 20 20 20 20 20 31 0a 23 20 20 64 65 66 69 6e        1.#  defin
1920: 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 20 20 20 20  e osLockFile    
1930: 20 20 20 20 20 20 20 20 20 20 20 20 4c 6f 63 6b              Lock
1940: 46 69 6c 65 0a 23 20 20 64 65 66 69 6e 65 20 6f  File.#  define o
1950: 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 20 20 20 20  sUnlockFile     
1960: 20 20 20 20 20 20 20 20 20 55 6e 6c 6f 63 6b 46           UnlockF
1970: 69 6c 65 0a 23 20 20 64 65 66 69 6e 65 20 6f 73  ile.#  define os
1980: 4c 6f 63 6b 46 69 6c 65 45 78 20 20 20 20 20 20  LockFileEx      
1990: 20 20 20 20 20 20 20 20 4c 6f 63 6b 46 69 6c 65          LockFile
19a0: 45 78 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69  Ex.#endif..stati
19b0: 63 20 73 74 72 75 63 74 20 77 69 6e 5f 73 79 73  c struct win_sys
19c0: 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63  call {.  const c
19d0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
19e0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
19f0: 66 20 74 68 65 20 73 79 74 65 6d 20 63 61 6c 6c  f the sytem call
1a00: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
1a10: 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65  scall_ptr pCurre
1a20: 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76  nt; /* Current v
1a30: 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73 74  alue of the syst
1a40: 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c  em call */.  sql
1a50: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
1a60: 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65   pDefault; /* De
1a70: 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d  fault value */.}
1a80: 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a   aSyscall[] = {.
1a90: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
1aa0: 49 4e 43 45 0a 20 20 7b 20 22 41 72 65 46 69 6c  INCE.  { "AreFil
1ab0: 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20  eApisANSI",     
1ac0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 41 72 65      (SYSCALL)Are
1ad0: 46 69 6c 65 41 70 69 73 41 4e 53 49 2c 20 20 20  FileApisANSI,   
1ae0: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
1af0: 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69  ine osAreFileApi
1b00: 73 41 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e  sANSI ((BOOL(WIN
1b10: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
1b20: 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74  call[0].pCurrent
1b30: 29 0a 23 65 6c 73 65 0a 20 20 7b 20 22 41 72 65  ).#else.  { "Are
1b40: 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20  FileApisANSI",  
1b50: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
1b60: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
1b70: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
1b80: 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
1b90: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66  _OS_WINCE && def
1ba0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
1bb0: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
1bc0: 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20 20  "CharLowerW",   
1bd0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
1be0: 41 4c 4c 29 43 68 61 72 4c 6f 77 65 72 57 2c 20  ALL)CharLowerW, 
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
1c00: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 68 61  ,.#else.  { "Cha
1c10: 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20 20  rLowerW",       
1c20: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
1c30: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
1c40: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
1c50: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
1c60: 43 68 61 72 4c 6f 77 65 72 57 20 28 28 4c 50 57  CharLowerW ((LPW
1c70: 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c 50 57  STR(WINAPI*)(LPW
1c80: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d  STR))aSyscall[1]
1c90: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
1ca0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
1cb0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
1cc0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
1cd0: 29 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65 72  ).  { "CharUpper
1ce0: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
1cf0: 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72 55 70   (SYSCALL)CharUp
1d00: 70 65 72 57 2c 20 20 20 20 20 20 20 20 20 20 20  perW,           
1d10: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
1d20: 7b 20 22 43 68 61 72 55 70 70 65 72 57 22 2c 20  { "CharUpperW", 
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
1d40: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
1d60: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
1d70: 69 6e 65 20 6f 73 43 68 61 72 55 70 70 65 72 57  ine osCharUpperW
1d80: 20 28 28 4c 50 57 53 54 52 28 57 49 4e 41 50 49   ((LPWSTR(WINAPI
1d90: 2a 29 28 4c 50 57 53 54 52 29 29 61 53 79 73 63  *)(LPWSTR))aSysc
1da0: 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29  all[2].pCurrent)
1db0: 0a 0a 20 20 7b 20 22 43 6c 6f 73 65 48 61 6e 64  ..  { "CloseHand
1dc0: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
1dd0: 20 28 53 59 53 43 41 4c 4c 29 43 6c 6f 73 65 48   (SYSCALL)CloseH
1de0: 61 6e 64 6c 65 2c 20 20 20 20 20 20 20 20 20 20  andle,          
1df0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
1e00: 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 20 28   osCloseHandle (
1e10: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
1e20: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
1e30: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
1e40: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1e50: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
1e60: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
1e70: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  A",             
1e80: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46  (SYSCALL)CreateF
1e90: 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20 20  ileA,           
1ea0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
1eb0: 20 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c 20   "CreateFileA", 
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
1ed0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
1ef0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
1f00: 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 41  ne osCreateFileA
1f10: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
1f20: 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c  *)(LPCSTR,DWORD,
1f30: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
1f40: 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52   LPSECURITY_ATTR
1f50: 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f  IBUTES,DWORD,DWO
1f60: 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73 63  RD,HANDLE))aSysc
1f70: 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29  all[4].pCurrent)
1f80: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
1f90: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
1fa0: 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65  IDE).  { "Create
1fb0: 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20  FileW",         
1fc0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
1fd0: 61 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20  ateFileW,       
1fe0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
1ff0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
2000: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
2010: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2030: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
2040: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
2050: 69 6c 65 57 20 28 28 48 41 4e 44 4c 45 28 57 49  ileW ((HANDLE(WI
2060: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44  NAPI*)(LPCWSTR,D
2070: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
2080: 20 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59        LPSECURITY
2090: 5f 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52  _ATTRIBUTES,DWOR
20a0: 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29  D,DWORD,HANDLE))
20b0: 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72  aSyscall[5].pCur
20c0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 43 72 65 61  rent)..  { "Crea
20d0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 22 2c 20  teFileMapping", 
20e0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
20f0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
2100: 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64  ,       0 },..#d
2110: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
2120: 6c 65 4d 61 70 70 69 6e 67 20 28 28 48 41 4e 44  leMapping ((HAND
2130: 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  LE(WINAPI*)(HAND
2140: 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f 41 54  LE,LPSECURITY_AT
2150: 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20  TRIBUTES, \.    
2160: 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c      DWORD,DWORD,
2170: 44 57 4f 52 44 2c 4c 50 43 54 53 54 52 29 29 61  DWORD,LPCTSTR))a
2180: 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72  Syscall[6].pCurr
2190: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
21a0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
21b0: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 72  AS_WIDE).  { "Cr
21c0: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
21d0: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
21e0: 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  )CreateFileMappi
21f0: 6e 67 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  ngW,      0 },.#
2200: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
2210: 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20  FileMappingW",  
2220: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2240: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
2250: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
2260: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 20  ateFileMappingW 
2270: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
2280: 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52  )(HANDLE,LPSECUR
2290: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20  ITY_ATTRIBUTES, 
22a0: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
22b0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 57  DWORD,DWORD,LPCW
22c0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d  STR))aSyscall[7]
22d0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
22e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
22f0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
2300: 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78 57   { "CreateMutexW
2310: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
2320: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 4d 75 74  YSCALL)CreateMut
2330: 65 78 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  exW,            
2340: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
2350: 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20 20  CreateMutexW",  
2360: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
2370: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
2380: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
2390: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
23a0: 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57 20   osCreateMutexW 
23b0: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
23c0: 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54  )(LPSECURITY_ATT
23d0: 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c 20 5c 0a  RIBUTES,BOOL, \.
23e0: 20 20 20 20 20 20 20 20 4c 50 43 57 53 54 52 29          LPCWSTR)
23f0: 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75  )aSyscall[8].pCu
2400: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
2410: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
2420: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
2430: 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20  DeleteFileA",   
2440: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
2450: 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 41 2c 20  LL)DeleteFileA, 
2460: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
2470: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65  .#else.  { "Dele
2480: 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20  teFileA",       
2490: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
24a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24b0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
24c0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44  dif..#define osD
24d0: 65 6c 65 74 65 46 69 6c 65 41 20 28 28 42 4f 4f  eleteFileA ((BOO
24e0: 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  L(WINAPI*)(LPCST
24f0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70  R))aSyscall[9].p
2500: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
2510: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
2520: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
2530: 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20   "DeleteFileW", 
2540: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
2550: 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 57  CALL)DeleteFileW
2560: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
2570: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65  },.#else.  { "De
2580: 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20  leteFileW",     
2590: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
25a0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
25b0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
25c0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
25d0: 73 44 65 6c 65 74 65 46 69 6c 65 57 20 28 28 42  sDeleteFileW ((B
25e0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
25f0: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 31  WSTR))aSyscall[1
2600: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
2610: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
2620: 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54  E.  { "FileTimeT
2630: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c  oLocalFileTime",
2640: 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69   (SYSCALL)FileTi
2650: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
2660: 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  e, 0 },.#else.  
2670: 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63  { "FileTimeToLoc
2680: 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  alFileTime", (SY
2690: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
26b0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
26c0: 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f  ine osFileTimeTo
26d0: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 20 28 28  LocalFileTime ((
26e0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f  BOOL(WINAPI*)(CO
26f0: 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c  NST FILETIME*, \
2700: 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54  .        LPFILET
2710: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 31  IME))aSyscall[11
2720: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
2730: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
2740: 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f  .  { "FileTimeTo
2750: 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20  SystemTime",    
2760: 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69 6d  (SYSCALL)FileTim
2770: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 2c 20 20  eToSystemTime,  
2780: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
2790: 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74   "FileTimeToSyst
27a0: 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53  emTime",    (SYS
27b0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
27d0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
27e0: 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53  ne osFileTimeToS
27f0: 79 73 74 65 6d 54 69 6d 65 20 28 28 42 4f 4f 4c  ystemTime ((BOOL
2800: 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20  (WINAPI*)(CONST 
2810: 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20  FILETIME*, \.   
2820: 20 20 20 20 20 4c 50 53 59 53 54 45 4d 54 49 4d       LPSYSTEMTIM
2830: 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e  E))aSyscall[12].
2840: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
2850: 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73  FlushFileBuffers
2860: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
2870: 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42 75 66 66  LL)FlushFileBuff
2880: 65 72 73 2c 20 20 20 20 20 20 20 20 30 20 7d 2c  ers,        0 },
2890: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c 75 73  ..#define osFlus
28a0: 68 46 69 6c 65 42 75 66 66 65 72 73 20 28 28 42  hFileBuffers ((B
28b0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
28c0: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 33  DLE))aSyscall[13
28d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
28e0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
28f0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
2900: 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61    { "FormatMessa
2910: 67 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 28  geA",          (
2920: 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65  SYSCALL)FormatMe
2930: 73 73 61 67 65 41 2c 20 20 20 20 20 20 20 20 20  ssageA,         
2940: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
2950: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22  "FormatMessageA"
2960: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
2970: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
2980: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
2990: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
29a0: 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  e osFormatMessag
29b0: 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eA ((DWORD(WINAP
29c0: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49  I*)(DWORD,LPCVOI
29d0: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
29e0: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
29f0: 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61  WORD,va_list*))a
2a00: 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72  Syscall[14].pCur
2a10: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
2a20: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
2a30: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 46  HAS_WIDE).  { "F
2a40: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20  ormatMessageW", 
2a50: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
2a60: 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57  L)FormatMessageW
2a70: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
2a80: 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61  #else.  { "Forma
2a90: 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20 20  tMessageW",     
2aa0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
2ad0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f  if..#define osFo
2ae0: 72 6d 61 74 4d 65 73 73 61 67 65 57 20 28 28 44  rmatMessageW ((D
2af0: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57  WORD(WINAPI*)(DW
2b00: 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52  ORD,LPCVOID,DWOR
2b10: 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20  D,DWORD,LPWSTR, 
2b20: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
2b30: 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63 61  va_list*))aSysca
2b40: 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[15].pCurrent)
2b50: 0a 0a 20 20 7b 20 22 46 72 65 65 4c 69 62 72 61  ..  { "FreeLibra
2b60: 72 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ry",            
2b70: 20 28 53 59 53 43 41 4c 4c 29 46 72 65 65 4c 69   (SYSCALL)FreeLi
2b80: 62 72 61 72 79 2c 20 20 20 20 20 20 20 20 20 20  brary,          
2b90: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
2ba0: 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79 20 28   osFreeLibrary (
2bb0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
2bc0: 4d 4f 44 55 4c 45 29 29 61 53 79 73 63 61 6c 6c  MODULE))aSyscall
2bd0: 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [16].pCurrent)..
2be0: 20 20 7b 20 22 47 65 74 43 75 72 72 65 6e 74 50    { "GetCurrentP
2bf0: 72 6f 63 65 73 73 49 64 22 2c 20 20 20 20 20 28  rocessId",     (
2c00: 53 59 53 43 41 4c 4c 29 47 65 74 43 75 72 72 65  SYSCALL)GetCurre
2c10: 6e 74 50 72 6f 63 65 73 73 49 64 2c 20 20 20 20  ntProcessId,    
2c20: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
2c30: 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
2c40: 73 73 49 64 20 28 28 44 57 4f 52 44 28 57 49 4e  ssId ((DWORD(WIN
2c50: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
2c60: 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e  call[17].pCurren
2c70: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
2c80: 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69  OS_WINCE && defi
2c90: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
2ca0: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
2cb0: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
2cc0: 41 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41  A",       (SYSCA
2cd0: 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53 70  LL)GetDiskFreeSp
2ce0: 61 63 65 41 2c 20 20 20 20 20 20 20 30 20 7d 2c  aceA,       0 },
2cf0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44  .#else.  { "GetD
2d00: 69 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20  iskFreeSpaceA", 
2d10: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
2d20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d30: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
2d40: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
2d50: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
2d60: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
2d70: 28 4c 50 43 53 54 52 2c 4c 50 44 57 4f 52 44 2c  (LPCSTR,LPDWORD,
2d80: 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  LPDWORD,LPDWORD,
2d90: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f   \.        LPDWO
2da0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d  RD))aSyscall[18]
2db0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
2dc0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
2dd0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
2de0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
2df0: 45 29 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  E).  { "GetDiskF
2e00: 72 65 65 53 70 61 63 65 57 22 2c 20 20 20 20 20  reeSpaceW",     
2e10: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 44 69    (SYSCALL)GetDi
2e20: 73 6b 46 72 65 65 53 70 61 63 65 57 2c 20 20 20  skFreeSpaceW,   
2e30: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
2e40: 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53   { "GetDiskFreeS
2e50: 70 61 63 65 57 22 2c 20 20 20 20 20 20 20 28 53  paceW",       (S
2e60: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e80: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
2e90: 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b 46 72  fine osGetDiskFr
2ea0: 65 65 53 70 61 63 65 57 20 28 28 42 4f 4f 4c 28  eeSpaceW ((BOOL(
2eb0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
2ec0: 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44  ,LPDWORD,LPDWORD
2ed0: 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  ,LPDWORD, \.    
2ee0: 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61 53 79      LPDWORD))aSy
2ef0: 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65  scall[19].pCurre
2f00: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
2f10: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
2f20: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74  S_ANSI).  { "Get
2f30: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 22  FileAttributesA"
2f40: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
2f50: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
2f60: 73 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  sA,      0 },.#e
2f70: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  lse.  { "GetFile
2f80: 41 74 74 72 69 62 75 74 65 73 41 22 2c 20 20 20  AttributesA",   
2f90: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
2fc0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46  ..#define osGetF
2fd0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 20 28  ileAttributesA (
2fe0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
2ff0: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
3000: 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [20].pCurrent)..
3010: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3020: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
3030: 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  E).  { "GetFileA
3040: 74 74 72 69 62 75 74 65 73 57 22 2c 20 20 20 20  ttributesW",    
3050: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69    (SYSCALL)GetFi
3060: 6c 65 41 74 74 72 69 62 75 74 65 73 57 2c 20 20  leAttributesW,  
3070: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3080: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
3090: 62 75 74 65 73 57 22 2c 20 20 20 20 20 20 28 53  butesW",      (S
30a0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
30b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
30d0: 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74  fine osGetFileAt
30e0: 74 72 69 62 75 74 65 73 57 20 28 28 44 57 4f 52  tributesW ((DWOR
30f0: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  D(WINAPI*)(LPCWS
3100: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d  TR))aSyscall[21]
3110: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3120: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
3130: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
3140: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
3150: 62 75 74 65 73 45 78 57 22 2c 20 20 20 20 28 53  butesExW",    (S
3160: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74  YSCALL)GetFileAt
3170: 74 72 69 62 75 74 65 73 45 78 57 2c 20 20 20 20  tributesExW,    
3180: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3190: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
31a0: 73 45 78 57 22 2c 20 20 20 20 28 53 59 53 43 41  sExW",    (SYSCA
31b0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
31d0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
31e0: 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
31f0: 75 74 65 73 45 78 57 20 28 28 42 4f 4f 4c 28 57  utesExW ((BOOL(W
3200: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c  INAPI*)(LPCWSTR,
3210: 47 45 54 5f 46 49 4c 45 45 58 5f 49 4e 46 4f 5f  GET_FILEEX_INFO_
3220: 4c 45 56 45 4c 53 2c 20 5c 0a 20 20 20 20 20 20  LEVELS, \.      
3230: 20 20 4c 50 56 4f 49 44 29 29 61 53 79 73 63 61    LPVOID))aSysca
3240: 6c 6c 5b 32 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[22].pCurrent)
3250: 0a 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69  ..  { "GetFileSi
3260: 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ze",            
3270: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c   (SYSCALL)GetFil
3280: 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
3290: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
32a0: 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 20 28   osGetFileSize (
32b0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
32c0: 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52 44 29 29  HANDLE,LPDWORD))
32d0: 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75  aSyscall[23].pCu
32e0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
32f0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
3300: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
3310: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
3320: 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e   { "GetFullPathN
3330: 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53  ameA",        (S
3340: 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61  YSCALL)GetFullPa
3350: 74 68 4e 61 6d 65 41 2c 20 20 20 20 20 20 20 20  thNameA,        
3360: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3370: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
3380: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
3390: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
33b0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
33c0: 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
33d0: 6d 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41  meA ((DWORD(WINA
33e0: 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52  PI*)(LPCSTR,DWOR
33f0: 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20  D,LPSTR, \.     
3400: 20 20 20 4c 50 53 54 52 2a 29 29 61 53 79 73 63     LPSTR*))aSysc
3410: 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74  all[24].pCurrent
3420: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
3430: 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e  S_WINCE && defin
3440: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3450: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
3460: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22  etFullPathNameW"
3470: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
3480: 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  L)GetFullPathNam
3490: 65 57 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  eW,        0 },.
34a0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 75  #else.  { "GetFu
34b0: 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20 20 20  llPathNameW",   
34c0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34e0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
34f0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
3500: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 20 28  tFullPathNameW (
3510: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
3520: 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 4c 50  LPCWSTR,DWORD,LP
3530: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
3540: 4c 50 57 53 54 52 2a 29 29 61 53 79 73 63 61 6c  LPWSTR*))aSyscal
3550: 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[25].pCurrent).
3560: 0a 20 20 7b 20 22 47 65 74 4c 61 73 74 45 72 72  .  { "GetLastErr
3570: 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  or",            
3580: 28 53 59 53 43 41 4c 4c 29 47 65 74 4c 61 73 74  (SYSCALL)GetLast
3590: 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20  Error,          
35a0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
35b0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 20 28  osGetLastError (
35c0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
35d0: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32  VOID))aSyscall[2
35e0: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
35f0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
3600: 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74 50 72  E.  /* The GetPr
3610: 6f 63 41 64 64 72 65 73 73 41 28 29 20 72 6f 75  ocAddressA() rou
3620: 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76 61  tine is only ava
3630: 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77  ilable on Window
3640: 73 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 22 47 65  s CE. */.  { "Ge
3650: 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20  tProcAddressA", 
3660: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3670: 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  )GetProcAddressA
3680: 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  ,         0 },.#
3690: 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74  else.  /* All ot
36a0: 68 65 72 20 57 69 6e 64 6f 77 73 20 70 6c 61 74  her Windows plat
36b0: 66 6f 72 6d 73 20 65 78 70 65 63 74 20 47 65 74  forms expect Get
36c0: 50 72 6f 63 41 64 64 72 65 73 73 28 29 20 74 6f  ProcAddress() to
36d0: 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 4e   take.  ** an AN
36e0: 53 49 20 73 74 72 69 6e 67 20 72 65 67 61 72 64  SI string regard
36f0: 6c 65 73 73 20 6f 66 20 74 68 65 20 5f 55 4e 49  less of the _UNI
3700: 43 4f 44 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a  CODE setting */.
3710: 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72    { "GetProcAddr
3720: 65 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28  essA",         (
3730: 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41  SYSCALL)GetProcA
3740: 64 64 72 65 73 73 2c 20 20 20 20 20 20 20 20 20  ddress,         
3750: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3760: 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 41  efine osGetProcA
3770: 64 64 72 65 73 73 41 20 28 28 46 41 52 50 52 4f  ddressA ((FARPRO
3780: 43 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55  C(WINAPI*)(HMODU
3790: 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  LE, \.        LP
37a0: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32  CSTR))aSyscall[2
37b0: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  7].pCurrent)..  
37c0: 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66 6f  { "GetSystemInfo
37d0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
37e0: 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 49  SCALL)GetSystemI
37f0: 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 30  nfo,           0
3800: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47   },..#define osG
3810: 65 74 53 79 73 74 65 6d 49 6e 66 6f 20 28 28 56  etSystemInfo ((V
3820: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 53  OID(WINAPI*)(LPS
3830: 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73  YSTEM_INFO))aSys
3840: 63 61 6c 6c 5b 32 38 5d 2e 70 43 75 72 72 65 6e  call[28].pCurren
3850: 74 29 0a 0a 20 20 7b 20 22 47 65 74 53 79 73 74  t)..  { "GetSyst
3860: 65 6d 54 69 6d 65 22 2c 20 20 20 20 20 20 20 20  emTime",        
3870: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53     (SYSCALL)GetS
3880: 79 73 74 65 6d 54 69 6d 65 2c 20 20 20 20 20 20  ystemTime,      
3890: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
38a0: 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69  ne osGetSystemTi
38b0: 6d 65 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  me ((VOID(WINAPI
38c0: 2a 29 28 4c 50 53 59 53 54 45 4d 54 49 4d 45 29  *)(LPSYSTEMTIME)
38d0: 29 61 53 79 73 63 61 6c 6c 5b 32 39 5d 2e 70 43  )aSyscall[29].pC
38e0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
38f0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
3900: 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65  { "GetSystemTime
3910: 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  AsFileTime", (SY
3920: 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 54  SCALL)GetSystemT
3930: 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 2c 20 30  imeAsFileTime, 0
3940: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
3950: 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69  etSystemTimeAsFi
3960: 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c  leTime", (SYSCAL
3970: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
3980: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3990: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
39a0: 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41  osGetSystemTimeA
39b0: 73 46 69 6c 65 54 69 6d 65 20 28 28 56 4f 49 44  sFileTime ((VOID
39c0: 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20  (WINAPI*)( \.   
39d0: 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29       LPFILETIME)
39e0: 29 61 53 79 73 63 61 6c 6c 5b 33 30 5d 2e 70 43  )aSyscall[30].pC
39f0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
3a00: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
3a10: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
3a20: 22 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c 20  "GetTempPathA", 
3a30: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
3a40: 41 4c 4c 29 47 65 74 54 65 6d 70 50 61 74 68 41  ALL)GetTempPathA
3a50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
3a60: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
3a70: 54 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20 20  TempPathA",     
3a80: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3a90: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3aa0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3ab0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
3ac0: 47 65 74 54 65 6d 70 50 61 74 68 41 20 28 28 44  GetTempPathA ((D
3ad0: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57  WORD(WINAPI*)(DW
3ae0: 4f 52 44 2c 4c 50 53 54 52 29 29 61 53 79 73 63  ORD,LPSTR))aSysc
3af0: 61 6c 6c 5b 33 31 5d 2e 70 43 75 72 72 65 6e 74  all[31].pCurrent
3b00: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
3b10: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
3b20: 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 54 65  WIDE).  { "GetTe
3b30: 6d 70 50 61 74 68 57 22 2c 20 20 20 20 20 20 20  mpPathW",       
3b40: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
3b50: 74 54 65 6d 70 50 61 74 68 57 2c 20 20 20 20 20  tTempPathW,     
3b60: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
3b70: 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61  e.  { "GetTempPa
3b80: 74 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  thW",           
3b90: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
3ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bb0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
3bc0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d  #define osGetTem
3bd0: 70 50 61 74 68 57 20 28 28 44 57 4f 52 44 28 57  pPathW ((DWORD(W
3be0: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50  INAPI*)(DWORD,LP
3bf0: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33  WSTR))aSyscall[3
3c00: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
3c10: 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22  { "GetTickCount"
3c20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
3c30: 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75  SCALL)GetTickCou
3c40: 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  nt,            0
3c50: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47   },..#define osG
3c60: 65 74 54 69 63 6b 43 6f 75 6e 74 20 28 28 44 57  etTickCount ((DW
3c70: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49  ORD(WINAPI*)(VOI
3c80: 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 33 5d 2e  D))aSyscall[33].
3c90: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3ca0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
3cb0: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
3cc0: 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41  { "GetVersionExA
3cd0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
3ce0: 53 43 41 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e  SCALL)GetVersion
3cf0: 45 78 41 2c 20 20 20 20 20 20 20 20 20 20 20 30  ExA,           0
3d00: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
3d10: 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20 20  etVersionExA",  
3d20: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3d30: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
3d40: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3d50: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
3d60: 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41 20  osGetVersionExA 
3d70: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
3d80: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 53 56   \.        LPOSV
3d90: 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29 61 53 79  ERSIONINFOA))aSy
3da0: 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75 72 72 65  scall[34].pCurre
3db0: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 41 6c  nt)..  { "HeapAl
3dc0: 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 20  loc",           
3dd0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
3de0: 70 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 20  pAlloc,         
3df0: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
3e00: 69 6e 65 20 6f 73 48 65 61 70 41 6c 6c 6f 63 20  ine osHeapAlloc 
3e10: 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a  ((LPVOID(WINAPI*
3e20: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20  )(HANDLE,DWORD, 
3e30: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
3e40: 29 29 61 53 79 73 63 61 6c 6c 5b 33 35 5d 2e 70  ))aSyscall[35].p
3e50: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48  Current)..  { "H
3e60: 65 61 70 43 72 65 61 74 65 22 2c 20 20 20 20 20  eapCreate",     
3e70: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3e80: 4c 29 48 65 61 70 43 72 65 61 74 65 2c 20 20 20  L)HeapCreate,   
3e90: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3ea0: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 43  .#define osHeapC
3eb0: 72 65 61 74 65 20 28 28 48 41 4e 44 4c 45 28 57  reate ((HANDLE(W
3ec0: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 53 49  INAPI*)(DWORD,SI
3ed0: 5a 45 5f 54 2c 20 5c 0a 20 20 20 20 20 20 20 20  ZE_T, \.        
3ee0: 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c  SIZE_T))aSyscall
3ef0: 5b 33 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [36].pCurrent)..
3f00: 20 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f 79    { "HeapDestroy
3f10: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
3f20: 53 59 53 43 41 4c 4c 29 48 65 61 70 44 65 73 74  SYSCALL)HeapDest
3f30: 72 6f 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  roy,            
3f40: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
3f50: 73 48 65 61 70 44 65 73 74 72 6f 79 20 28 28 42  sHeapDestroy ((B
3f60: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
3f70: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 37  DLE))aSyscall[37
3f80: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3f90: 20 22 48 65 61 70 46 72 65 65 22 2c 20 20 20 20   "HeapFree",    
3fa0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3fb0: 43 41 4c 4c 29 48 65 61 70 46 72 65 65 2c 20 20  CALL)HeapFree,  
3fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3fd0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
3fe0: 61 70 46 72 65 65 20 28 28 42 4f 4f 4c 28 57 49  apFree ((BOOL(WI
3ff0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
4000: 4f 52 44 2c 4c 50 56 4f 49 44 29 29 61 53 79 73  ORD,LPVOID))aSys
4010: 63 61 6c 6c 5b 33 38 5d 2e 70 43 75 72 72 65 6e  call[38].pCurren
4020: 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 52 65 41  t)..  { "HeapReA
4030: 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20  lloc",          
4040: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
4050: 52 65 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20  ReAlloc,        
4060: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
4070: 6e 65 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63  ne osHeapReAlloc
4080: 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49   ((LPVOID(WINAPI
4090: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
40a0: 4c 50 56 4f 49 44 2c 20 5c 0a 20 20 20 20 20 20  LPVOID, \.      
40b0: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61    SIZE_T))aSysca
40c0: 6c 6c 5b 33 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[39].pCurrent)
40d0: 0a 0a 20 20 7b 20 22 48 65 61 70 53 69 7a 65 22  ..  { "HeapSize"
40e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
40f0: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 53 69   (SYSCALL)HeapSi
4100: 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
4110: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
4120: 20 6f 73 48 65 61 70 53 69 7a 65 20 28 28 53 49   osHeapSize ((SI
4130: 5a 45 5f 54 28 57 49 4e 41 50 49 2a 29 28 48 41  ZE_T(WINAPI*)(HA
4140: 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  NDLE,DWORD, \.  
4150: 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29 61        LPCVOID))a
4160: 53 79 73 63 61 6c 6c 5b 34 30 5d 2e 70 43 75 72  Syscall[40].pCur
4170: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70  rent)..  { "Heap
4180: 56 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20  Validate",      
4190: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
41a0: 65 61 70 56 61 6c 69 64 61 74 65 2c 20 20 20 20  eapValidate,    
41b0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
41c0: 65 66 69 6e 65 20 6f 73 48 65 61 70 56 61 6c 69  efine osHeapVali
41d0: 64 61 74 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  date ((BOOL(WINA
41e0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
41f0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  D, \.        LPC
4200: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  VOID))aSyscall[4
4210: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
4220: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
4230: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
4240: 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72  .  { "LoadLibrar
4250: 79 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  yA",            
4260: 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62  (SYSCALL)LoadLib
4270: 72 61 72 79 41 2c 20 20 20 20 20 20 20 20 20 20  raryA,          
4280: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4290: 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c   "LoadLibraryA",
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
42b0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
42c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
42d0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
42e0: 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79  ne osLoadLibrary
42f0: 41 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41  A ((HMODULE(WINA
4300: 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79  PI*)(LPCSTR))aSy
4310: 73 63 61 6c 6c 5b 34 32 5d 2e 70 43 75 72 72 65  scall[42].pCurre
4320: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
4330: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
4340: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 4c 6f 61  S_WIDE).  { "Loa
4350: 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20  dLibraryW",     
4360: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4370: 4c 6f 61 64 4c 69 62 72 61 72 79 57 2c 20 20 20  LoadLibraryW,   
4380: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4390: 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62  lse.  { "LoadLib
43a0: 72 61 72 79 57 22 2c 20 20 20 20 20 20 20 20 20  raryW",         
43b0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
43c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43d0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
43e0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64  ..#define osLoad
43f0: 4c 69 62 72 61 72 79 57 20 28 28 48 4d 4f 44 55  LibraryW ((HMODU
4400: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  LE(WINAPI*)(LPCW
4410: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 33  STR))aSyscall[43
4420: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
4430: 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20   "LocalFree",   
4440: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4450: 43 41 4c 4c 29 4c 6f 63 61 6c 46 72 65 65 2c 20  CALL)LocalFree, 
4460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4470: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f  },..#define osLo
4480: 63 61 6c 46 72 65 65 20 28 28 48 4c 4f 43 41 4c  calFree ((HLOCAL
4490: 28 57 49 4e 41 50 49 2a 29 28 48 4c 4f 43 41 4c  (WINAPI*)(HLOCAL
44a0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 34 5d 2e 70  ))aSyscall[44].p
44b0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
44c0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
44d0: 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20   { "LockFile",  
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
44f0: 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c  YSCALL)LockFile,
4500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4510: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
4520: 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28  LockFile ((BOOL(
4530: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
4540: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
4550: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  D, \.        DWO
4560: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 35 5d  RD))aSyscall[45]
4570: 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6c 73 65  .pCurrent).#else
4580: 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c  .  { "LockFile",
4590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45a0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45c0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
45d0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
45e0: 4e 43 45 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c  NCE.  { "LockFil
45f0: 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20  eEx",           
4600: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b     (SYSCALL)Lock
4610: 46 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20  FileEx,         
4620: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
4630: 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20  ne osLockFileEx 
4640: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4650: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f  HANDLE,DWORD,DWO
4660: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  RD,DWORD,DWORD, 
4670: 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52  \.        LPOVER
4680: 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c  LAPPED))aSyscall
4690: 5b 34 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23  [46].pCurrent).#
46a0: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69  else.  { "LockFi
46b0: 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20  leEx",          
46c0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
46d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46e0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
46f0: 66 0a 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f  f..  { "MapViewO
4700: 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  fFile",         
4710: 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69    (SYSCALL)MapVi
4720: 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20  ewOfFile,       
4730: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
4740: 65 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  e osMapViewOfFil
4750: 65 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50  e ((LPVOID(WINAP
4760: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
4770: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
4780: 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29          SIZE_T))
4790: 61 53 79 73 63 61 6c 6c 5b 34 37 5d 2e 70 43 75  aSyscall[47].pCu
47a0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 4d 75 6c  rrent)..  { "Mul
47b0: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
47c0: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
47d0: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
47e0: 68 61 72 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23  har,     0 },..#
47f0: 64 65 66 69 6e 65 20 6f 73 4d 75 6c 74 69 42 79  define osMultiBy
4800: 74 65 54 6f 57 69 64 65 43 68 61 72 20 28 28 69  teToWideChar ((i
4810: 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54  nt(WINAPI*)(UINT
4820: 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 2c 69 6e  ,DWORD,LPCSTR,in
4830: 74 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20  t,LPWSTR, \.    
4840: 20 20 20 20 69 6e 74 29 29 61 53 79 73 63 61 6c      int))aSyscal
4850: 6c 5b 34 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[48].pCurrent).
4860: 0a 20 20 7b 20 22 51 75 65 72 79 50 65 72 66 6f  .  { "QueryPerfo
4870: 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 22 2c 20  rmanceCounter", 
4880: 28 53 59 53 43 41 4c 4c 29 51 75 65 72 79 50 65  (SYSCALL)QueryPe
4890: 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72  rformanceCounter
48a0: 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20  , 0 },..#define 
48b0: 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e  osQueryPerforman
48c0: 63 65 43 6f 75 6e 74 65 72 20 28 28 42 4f 4f 4c  ceCounter ((BOOL
48d0: 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20  (WINAPI*)( \.   
48e0: 20 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47       LARGE_INTEG
48f0: 45 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34 39  ER*))aSyscall[49
4900: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
4910: 20 22 52 65 61 64 46 69 6c 65 22 2c 20 20 20 20   "ReadFile",    
4920: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4930: 43 41 4c 4c 29 52 65 61 64 46 69 6c 65 2c 20 20  CALL)ReadFile,  
4940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4950: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 52 65  },..#define osRe
4960: 61 64 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  adFile ((BOOL(WI
4970: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
4980: 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f  VOID,DWORD,LPDWO
4990: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
49a0: 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73  OVERLAPPED))aSys
49b0: 63 61 6c 6c 5b 35 30 5d 2e 70 43 75 72 72 65 6e  call[50].pCurren
49c0: 74 29 0a 0a 20 20 7b 20 22 53 65 74 45 6e 64 4f  t)..  { "SetEndO
49d0: 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  fFile",         
49e0: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 45     (SYSCALL)SetE
49f0: 6e 64 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20  ndOfFile,       
4a00: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
4a10: 6e 65 20 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c  ne osSetEndOfFil
4a20: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
4a30: 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61  )(HANDLE))aSysca
4a40: 6c 6c 5b 35 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[51].pCurrent)
4a50: 0a 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f  ..  { "SetFilePo
4a60: 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20  inter",         
4a70: 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c   (SYSCALL)SetFil
4a80: 65 50 6f 69 6e 74 65 72 2c 20 20 20 20 20 20 20  ePointer,       
4a90: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
4aa0: 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65   osSetFilePointe
4ab0: 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  r ((DWORD(WINAPI
4ac0: 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f 4e 47 2c 50  *)(HANDLE,LONG,P
4ad0: 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20 20 20 20 20  LONG, \.        
4ae0: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
4af0: 35 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  52].pCurrent).. 
4b00: 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20   { "Sleep",     
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
4b20: 59 53 43 41 4c 4c 29 53 6c 65 65 70 2c 20 20 20  YSCALL)Sleep,   
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b40: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
4b50: 53 6c 65 65 70 20 28 28 56 4f 49 44 28 57 49 4e  Sleep ((VOID(WIN
4b60: 41 50 49 2a 29 28 44 57 4f 52 44 29 29 61 53 79  API*)(DWORD))aSy
4b70: 73 63 61 6c 6c 5b 35 33 5d 2e 70 43 75 72 72 65  scall[53].pCurre
4b80: 6e 74 29 0a 0a 20 20 7b 20 22 53 79 73 74 65 6d  nt)..  { "System
4b90: 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 22 2c  TimeToFileTime",
4ba0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 79 73      (SYSCALL)Sys
4bb0: 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
4bc0: 65 2c 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  e,    0 },..#def
4bd0: 69 6e 65 20 6f 73 53 79 73 74 65 6d 54 69 6d 65  ine osSystemTime
4be0: 54 6f 46 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f  ToFileTime ((BOO
4bf0: 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54  L(WINAPI*)(CONST
4c00: 20 53 59 53 54 45 4d 54 49 4d 45 2a 2c 20 5c 0a   SYSTEMTIME*, \.
4c10: 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49          LPFILETI
4c20: 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 34 5d  ME))aSyscall[54]
4c30: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4c40: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
4c50: 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65  .  { "UnlockFile
4c60: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
4c70: 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46  (SYSCALL)UnlockF
4c80: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
4c90: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
4ca0: 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 28 28 42  osUnlockFile ((B
4cb0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
4cc0: 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  DLE,DWORD,DWORD,
4cd0: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
4ce0: 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c   DWORD))aSyscall
4cf0: 5b 35 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23  [55].pCurrent).#
4d00: 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b  else.  { "Unlock
4d10: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
4d20: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d40: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4d50: 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  f..#if !SQLITE_O
4d60: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55 6e 6c  S_WINCE.  { "Unl
4d70: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
4d80: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4d90: 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20  UnlockFileEx,   
4da0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
4db0: 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46  define osUnlockF
4dc0: 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e  ileEx ((BOOL(WIN
4dd0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
4de0: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  RD,DWORD,DWORD, 
4df0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52  \.        LPOVER
4e00: 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c  LAPPED))aSyscall
4e10: 5b 35 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23  [56].pCurrent).#
4e20: 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b  else.  { "Unlock
4e30: 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20  FileEx",        
4e40: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e60: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4e70: 66 0a 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69 65  f..  { "UnmapVie
4e80: 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  wOfFile",       
4e90: 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6d 61 70    (SYSCALL)Unmap
4ea0: 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20  ViewOfFile,     
4eb0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
4ec0: 65 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46  e osUnmapViewOfF
4ed0: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
4ee0: 49 2a 29 28 4c 50 43 56 4f 49 44 29 29 61 53 79  I*)(LPCVOID))aSy
4ef0: 73 63 61 6c 6c 5b 35 37 5d 2e 70 43 75 72 72 65  scall[57].pCurre
4f00: 6e 74 29 0a 0a 20 20 7b 20 22 57 69 64 65 43 68  nt)..  { "WideCh
4f10: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20  arToMultiByte", 
4f20: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 69 64      (SYSCALL)Wid
4f30: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
4f40: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
4f50: 69 6e 65 20 6f 73 57 69 64 65 43 68 61 72 54 6f  ine osWideCharTo
4f60: 4d 75 6c 74 69 42 79 74 65 20 28 28 69 6e 74 28  MultiByte ((int(
4f70: 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57  WINAPI*)(UINT,DW
4f80: 4f 52 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c  ORD,LPCWSTR,int,
4f90: 4c 50 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20  LPSTR,int, \.   
4fa0: 20 20 20 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f       LPCSTR,LPBO
4fb0: 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 35 38 5d  OL))aSyscall[58]
4fc0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
4fd0: 22 57 72 69 74 65 46 69 6c 65 22 2c 20 20 20 20  "WriteFile",    
4fe0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4ff0: 41 4c 4c 29 57 72 69 74 65 46 69 6c 65 2c 20 20  ALL)WriteFile,  
5000: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5010: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69  ,..#define osWri
5020: 74 65 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  teFile ((BOOL(WI
5030: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
5040: 43 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57  CVOID,DWORD,LPDW
5050: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
5060: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
5070: 73 63 61 6c 6c 5b 35 39 5d 2e 70 43 75 72 72 65  scall[59].pCurre
5080: 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f  nt)..}; /* End o
5090: 66 20 74 68 65 20 6f 76 65 72 72 69 64 65 61 62  f the overrideab
50a0: 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  le system calls 
50b0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  */../*.** This i
50c0: 73 20 74 68 65 20 78 53 65 74 53 79 73 74 65 6d  s the xSetSystem
50d0: 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66  Call() method of
50e0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f 72   sqlite3_vfs for
50f0: 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22   all of the.** "
5100: 77 69 6e 33 32 22 20 56 46 53 65 73 2e 20 20 52  win32" VFSes.  R
5110: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
5120: 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  opon successfull
5130: 79 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a  y updating the.*
5140: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f  * system call po
5150: 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45  inter, or SQLITE
5160: 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65  _NOTFOUND if the
5170: 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75  re is no configu
5180: 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20  rable.** system 
5190: 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65  call named zName
51a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
51b0: 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  winSetSystemCall
51c0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
51d0: 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20  *pNotUsed,      
51e0: 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f 69    /* The VFS poi
51f0: 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64 20  nter.  Not used 
5200: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
5210: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *zName,         
5220: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79     /* Name of sy
5230: 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65  stem call to ove
5240: 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74  rride */.  sqlit
5250: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70  e3_syscall_ptr p
5260: 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e  NewFunc  /* Poin
5270: 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74 65  ter to new syste
5280: 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a  m call value */.
5290: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ){.  unsigned in
52a0: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t i;.  int rc = 
52b0: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
52c0: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
52d0: 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a  ETER(pNotUsed);.
52e0: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
52f0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a  {.    /* If no z
5300: 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20 72  Name is given, r
5310: 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74 65  estore all syste
5320: 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69 72  m calls to their
5330: 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20   default.    ** 
5340: 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65 74  settings and ret
5350: 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a  urn NULL.    */.
5360: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
5370: 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  OK;.    for(i=0;
5380: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
5390: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
53a0: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
53b0: 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c       if( aSyscal
53c0: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b  l[i].pDefault ){
53d0: 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c  .        aSyscal
53e0: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20  l[i].pCurrent = 
53f0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
5400: 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ault;.      }.  
5410: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
5420: 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20   /* If zName is 
5430: 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72 61  specified, opera
5440: 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f  te on only the o
5450: 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20  ne system call. 
5460: 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 2e     ** specified.
5470: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
5480: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
5490: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
54a0: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
54b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
54c0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
54d0: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
54e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
54f0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
5500: 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ault==0 ){.     
5510: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d       aSyscall[i]
5520: 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79 73  .pDefault = aSys
5530: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
5540: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5550: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
5560: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  OK;.        if( 
5570: 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e  pNewFunc==0 ) pN
5580: 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61 6c  ewFunc = aSyscal
5590: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20  l[i].pDefault;. 
55a0: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
55b0: 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70 4e  i].pCurrent = pN
55c0: 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20  ewFunc;.        
55d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
55e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
55f0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
5600: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
5610: 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c  of a system call
5620: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
5630: 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61  f zName is not a
5640: 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 73  .** recognized s
5650: 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e  ystem call name.
5660: 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72    NULL is also r
5670: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 73  eturned if the s
5680: 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73  ystem call.** is
5690: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 66   currently undef
56a0: 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
56b0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
56c0: 70 74 72 20 77 69 6e 47 65 74 53 79 73 74 65 6d  ptr winGetSystem
56d0: 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f  Call(.  sqlite3_
56e0: 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20  vfs *pNotUsed,. 
56f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
5700: 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  me.){.  unsigned
5710: 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45   int i;..  UNUSE
5720: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74  D_PARAMETER(pNot
5730: 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Used);.  for(i=0
5740: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63  ; i<sizeof(aSysc
5750: 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73  all)/sizeof(aSys
5760: 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  call[0]); i++){.
5770: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
5780: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69  Name, aSyscall[i
5790: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65  ].zName)==0 ) re
57a0: 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d  turn aSyscall[i]
57b0: 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20  .pCurrent;.  }. 
57c0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
57d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
57e0: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
57f0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 66 74   system call aft
5800: 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e  er zName.  If zN
5810: 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65  ame==NULL.** the
5820: 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  n return the nam
5830: 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73  e of the first s
5840: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74  ystem call.  Ret
5850: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d  urn NULL if zNam
5860: 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74  e.** is the last
5870: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20   system call or 
5880: 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20  if zName is not 
5890: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61  the name of a va
58a0: 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61  lid.** system ca
58b0: 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ll..*/.static co
58c0: 6e 73 74 20 63 68 61 72 20 2a 77 69 6e 4e 65 78  nst char *winNex
58d0: 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69  tSystemCall(sqli
58e0: 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73  te3_vfs *p, cons
58f0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
5900: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20    int i = -1;.. 
5910: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
5920: 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  R(p);.  if( zNam
5930: 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e ){.    for(i=0
5940: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53  ; i<ArraySize(aS
5950: 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b  yscall)-1; i++){
5960: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
5970: 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c  p(zName, aSyscal
5980: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
5990: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
59a0: 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41  }.  for(i++; i<A
59b0: 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c  rraySize(aSyscal
59c0: 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  l); i++){.    if
59d0: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43  ( aSyscall[i].pC
59e0: 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65 74 75  urrent!=0 ) retu
59f0: 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  rn aSyscall[i].z
5a00: 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Name;.  }.  retu
5a10: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
5a20: 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d  eturn true (non-
5a30: 7a 65 72 6f 29 20 69 66 20 77 65 20 61 72 65 20  zero) if we are 
5a40: 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 69  running under Wi
5a50: 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58  nNT, Win2K, WinX
5a60: 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20  P,.** or WinCE. 
5a70: 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 28 7a   Return false (z
5a80: 65 72 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c 20  ero) for Win95, 
5a90: 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e  Win98, or WinME.
5aa0: 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 61  .**.** Here is a
5ab0: 6e 20 69 6e 74 65 72 65 73 74 69 6e 67 20 6f 62  n interesting ob
5ac0: 73 65 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39  servation:  Win9
5ad0: 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20 57 69  5, Win98, and Wi
5ae0: 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20  nME lack.** the 
5af0: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49  LockFileEx() API
5b00: 2e 20 20 42 75 74 20 77 65 20 63 61 6e 20 73 74  .  But we can st
5b10: 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79 20 6c  ill statically l
5b20: 69 6e 6b 20 61 67 61 69 6e 73 74 20 74 68 61 74  ink against that
5b30: 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67 20  .** API as long 
5b40: 61 73 20 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c  as we don't call
5b50: 20 69 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67   it when running
5b60: 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41   Win95/98/ME.  A
5b70: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73   call to.** this
5b80: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
5b90: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
5ba0: 20 74 68 65 20 68 6f 73 74 20 69 73 20 57 69 6e   the host is Win
5bb0: 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57  95/98/ME or.** W
5bc0: 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68  inNT/2K/XP so th
5bd0: 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20  at we will know 
5be0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 77  whether or not w
5bf0: 65 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c  e can safely cal
5c00: 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c  l.** the LockFil
5c10: 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 23 69  eEx() API..*/.#i
5c20: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
5c30: 45 0a 23 20 64 65 66 69 6e 65 20 69 73 4e 54 28  E.# define isNT(
5c40: 29 20 20 28 31 29 0a 23 65 6c 73 65 0a 20 20 73  )  (1).#else.  s
5c50: 74 61 74 69 63 20 69 6e 74 20 69 73 4e 54 28 76  tatic int isNT(v
5c60: 6f 69 64 29 7b 0a 20 20 20 20 69 66 28 20 73 71  oid){.    if( sq
5c70: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 30  lite3_os_type==0
5c80: 20 29 7b 0a 20 20 20 20 20 20 4f 53 56 45 52 53   ){.      OSVERS
5c90: 49 4f 4e 49 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a  IONINFOA sInfo;.
5ca0: 20 20 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53        sInfo.dwOS
5cb0: 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20  VersionInfoSize 
5cc0: 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b  = sizeof(sInfo);
5cd0: 0a 20 20 20 20 20 20 6f 73 47 65 74 56 65 72 73  .      osGetVers
5ce0: 69 6f 6e 45 78 41 28 26 73 49 6e 66 6f 29 3b 0a  ionExA(&sInfo);.
5cf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73        sqlite3_os
5d00: 5f 74 79 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77  _type = sInfo.dw
5d10: 50 6c 61 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f  PlatformId==VER_
5d20: 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e  PLATFORM_WIN32_N
5d30: 54 20 3f 20 32 20 3a 20 31 3b 0a 20 20 20 20 7d  T ? 2 : 1;.    }
5d40: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
5d50: 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 3b 0a  te3_os_type==2;.
5d60: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
5d70: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f  LITE_OS_WINCE */
5d80: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5d90: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a  WIN32_MALLOC./*.
5da0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
5db0: 65 73 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  es of memory..*/
5dc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
5dd0: 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e  nMemMalloc(int n
5de0: 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45  Bytes){.  HANDLE
5df0: 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a   hHeap;.  void *
5e00: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
5e10: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
5e20: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
5e30: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
5e40: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
5e50: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
5e60: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
5e70: 45 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  E );.#ifdef SQLI
5e80: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
5e90: 56 41 4c 49 44 41 54 45 0a 20 20 61 73 73 65 72  VALIDATE.  asser
5ea0: 74 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  t ( osHeapValida
5eb0: 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  te(hHeap, SQLITE
5ec0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
5ed0: 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64  S, NULL) );.#end
5ee0: 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  if.  assert( nBy
5ef0: 74 65 73 3e 3d 30 20 29 3b 0a 20 20 70 20 3d 20  tes>=0 );.  p = 
5f00: 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61  osHeapAlloc(hHea
5f10: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
5f20: 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a  HEAP_FLAGS, (SIZ
5f30: 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 69  E_T)nBytes);.  i
5f40: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c  f( !p ){.    sql
5f50: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
5f60: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
5f70: 6f 20 48 65 61 70 41 6c 6c 6f 63 20 25 75 20 62  o HeapAlloc %u b
5f80: 79 74 65 73 20 28 25 64 29 2c 20 68 65 61 70 3d  ytes (%d), heap=
5f90: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
5fa0: 20 20 20 20 20 6e 42 79 74 65 73 2c 20 6f 73 47       nBytes, osG
5fb0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
5fc0: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
5fd0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
5fe0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f  ./*.** Free memo
5ff0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
6000: 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f  id winMemFree(vo
6010: 69 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20 48  id *pPrior){.  H
6020: 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20  ANDLE hHeap;..  
6030: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
6040: 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77  c();.  hHeap = w
6050: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a  inMemGetHeap();.
6060: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
6070: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
6080: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
6090: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
60a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
60b0: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
60c0: 54 45 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73  TE.  assert ( os
60d0: 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65  HeapValidate(hHe
60e0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
60f0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72  _HEAP_FLAGS, pPr
6100: 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ior) );.#endif. 
6110: 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 20 72   if( !pPrior ) r
6120: 65 74 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69 6e  eturn; /* Passin
6130: 67 20 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46 72  g NULL to HeapFr
6140: 65 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ee is undefined.
6150: 20 2a 2f 0a 20 20 69 66 28 20 21 6f 73 48 65 61   */.  if( !osHea
6160: 70 46 72 65 65 28 68 48 65 61 70 2c 20 53 51 4c  pFree(hHeap, SQL
6170: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
6180: 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 7b  LAGS, pPrior) ){
6190: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
61a0: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22  (SQLITE_NOMEM, "
61b0: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 46 72  failed to HeapFr
61c0: 65 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 64 29  ee block %p (%d)
61d0: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
61e0: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69              pPri
61f0: 6f 72 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  or, osGetLastErr
6200: 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65  or(), (void*)hHe
6210: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ap);.  }.}../*.*
6220: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a  * Change the siz
6230: 65 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e of an existing
6240: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
6250: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on.*/.static voi
6260: 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63  d *winMemRealloc
6270: 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69  (void *pPrior, i
6280: 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41  nt nBytes){.  HA
6290: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f  NDLE hHeap;.  vo
62a0: 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d  id *p;..  winMem
62b0: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
62c0: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47   hHeap = winMemG
62d0: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65  etHeap();.  asse
62e0: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a  rt( hHeap!=0 );.
62f0: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
6300: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
6310: 56 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66 20  VALUE );.#ifdef 
6320: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
6330: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20 61  LOC_VALIDATE.  a
6340: 73 73 65 72 74 20 28 20 6f 73 48 65 61 70 56 61  ssert ( osHeapVa
6350: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
6360: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
6370: 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29  FLAGS, pPrior) )
6380: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
6390: 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a  t( nBytes>=0 );.
63a0: 20 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 7b    if( !pPrior ){
63b0: 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 41  .    p = osHeapA
63c0: 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49  lloc(hHeap, SQLI
63d0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
63e0: 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79  AGS, (SIZE_T)nBy
63f0: 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tes);.  }else{. 
6400: 20 20 20 70 20 3d 20 6f 73 48 65 61 70 52 65 41     p = osHeapReA
6410: 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49  lloc(hHeap, SQLI
6420: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
6430: 41 47 53 2c 20 70 50 72 69 6f 72 2c 20 28 53 49  AGS, pPrior, (SI
6440: 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20  ZE_T)nBytes);.  
6450: 7d 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  }.  if( !p ){.  
6460: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
6470: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
6480: 6c 65 64 20 74 6f 20 25 73 20 25 75 20 62 79 74  led to %s %u byt
6490: 65 73 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70  es (%d), heap=%p
64a0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
64b0: 20 20 20 70 50 72 69 6f 72 20 3f 20 22 48 65 61     pPrior ? "Hea
64c0: 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48 65 61  pReAlloc" : "Hea
64d0: 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65 73 2c  pAlloc", nBytes,
64e0: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
64f0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
6500: 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29     (void*)hHeap)
6510: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
6520: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6530: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e  n the size of an
6540: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c   outstanding all
6550: 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79 74 65  ocation, in byte
6560: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
6570: 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64   winMemSize(void
6580: 20 2a 70 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68   *p){.  HANDLE h
6590: 48 65 61 70 3b 0a 20 20 53 49 5a 45 5f 54 20 6e  Heap;.  SIZE_T n
65a0: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
65b0: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
65c0: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
65d0: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
65e0: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
65f0: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
6600: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
6610: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
6620: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
6630: 41 4c 49 44 41 54 45 0a 20 20 61 73 73 65 72 74  ALIDATE.  assert
6640: 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74   ( osHeapValidat
6650: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
6660: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
6670: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
6680: 66 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  f.  if( !p ) ret
6690: 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f 73 48  urn 0;.  n = osH
66a0: 65 61 70 53 69 7a 65 28 68 48 65 61 70 2c 20 53  eapSize(hHeap, S
66b0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
66c0: 5f 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20 69 66  _FLAGS, p);.  if
66d0: 28 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d 31 20  ( n==(SIZE_T)-1 
66e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
66f0: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
6700: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
6710: 53 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20 28 25  Size block %p (%
6720: 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  d), heap=%p",.  
6730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c                p,
6740: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
6750: 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29  ), (void*)hHeap)
6760: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
6770: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e    }.  return (in
6780: 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  t)n;.}../*.** Ro
6790: 75 6e 64 20 75 70 20 61 20 72 65 71 75 65 73 74  und up a request
67a0: 20 73 69 7a 65 20 74 6f 20 74 68 65 20 6e 65 78   size to the nex
67b0: 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69  t valid allocati
67c0: 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  on size..*/.stat
67d0: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75  ic int winMemRou
67e0: 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72  ndup(int n){.  r
67f0: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
6800: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69  * Initialize thi
6810: 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61  s module..*/.sta
6820: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e  tic int winMemIn
6830: 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74  it(void *pAppDat
6840: 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61  a){.  winMemData
6850: 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20   *pWinMemData = 
6860: 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41  (winMemData *)pA
6870: 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21  ppData;..  if( !
6880: 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65  pWinMemData ) re
6890: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
68a0: 52 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69  R;.  assert( pWi
68b0: 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 3d  nMemData->magic=
68c0: 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 29 3b  =WINMEM_MAGIC );
68d0: 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44  .  if( !pWinMemD
68e0: 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20  ata->hHeap ){.  
68f0: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68    pWinMemData->h
6900: 48 65 61 70 20 3d 20 6f 73 48 65 61 70 43 72 65  Heap = osHeapCre
6910: 61 74 65 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ate(SQLITE_WIN32
6920: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20  _HEAP_FLAGS,.   
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6950: 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f     SQLITE_WIN32_
6960: 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 0a  HEAP_INIT_SIZE,.
6970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6990: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e        SQLITE_WIN
69a0: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45  32_HEAP_MAX_SIZE
69b0: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 57 69 6e  );.    if( !pWin
69c0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29  MemData->hHeap )
69d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
69e0: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
69f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 66 61 69  ,.          "fai
6a00: 6c 65 64 20 74 6f 20 48 65 61 70 43 72 65 61 74  led to HeapCreat
6a10: 65 20 28 25 64 29 2c 20 66 6c 61 67 73 3d 25 75  e (%d), flags=%u
6a20: 2c 20 69 6e 69 74 53 69 7a 65 3d 25 75 2c 20 6d  , initSize=%u, m
6a30: 61 78 53 69 7a 65 3d 25 75 22 2c 0a 20 20 20 20  axSize=%u",.    
6a40: 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
6a50: 72 72 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f 57  rror(), SQLITE_W
6a60: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
6a70: 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
6a80: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49  E_WIN32_HEAP_INI
6a90: 54 5f 53 49 5a 45 2c 20 53 51 4c 49 54 45 5f 57  T_SIZE, SQLITE_W
6aa0: 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49  IN32_HEAP_MAX_SI
6ab0: 5a 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ZE);.      retur
6ac0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
6ad0: 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65      }.    pWinMe
6ae0: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20  mData->bOwned = 
6af0: 54 52 55 45 3b 0a 20 20 7d 0a 20 20 61 73 73 65  TRUE;.  }.  asse
6b00: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
6b10: 3e 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61  >hHeap!=0 );.  a
6b20: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
6b30: 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c  ta->hHeap!=INVAL
6b40: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
6b50: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
6b60: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
6b70: 4c 49 44 41 54 45 0a 20 20 61 73 73 65 72 74 28  LIDATE.  assert(
6b80: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
6b90: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
6ba0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
6bb0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c  _HEAP_FLAGS, NUL
6bc0: 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  L) );.#endif.  r
6bd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6be0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74  .}../*.** Deinit
6bf0: 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75  ialize this modu
6c00: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
6c10: 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77  id winMemShutdow
6c20: 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  n(void *pAppData
6c30: 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20  ){.  winMemData 
6c40: 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28  *pWinMemData = (
6c50: 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70  winMemData *)pAp
6c60: 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70  pData;..  if( !p
6c70: 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74  WinMemData ) ret
6c80: 75 72 6e 3b 0a 20 20 69 66 28 20 70 57 69 6e 4d  urn;.  if( pWinM
6c90: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b  emData->hHeap ){
6ca0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69  .    assert( pWi
6cb0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21  nMemData->hHeap!
6cc0: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
6cd0: 56 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66 20  VALUE );.#ifdef 
6ce0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
6cf0: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20 20  LOC_VALIDATE.   
6d00: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56   assert( osHeapV
6d10: 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44  alidate(pWinMemD
6d20: 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49  ata->hHeap, SQLI
6d30: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
6d40: 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65  AGS, NULL) );.#e
6d50: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 57 69  ndif.    if( pWi
6d60: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64  nMemData->bOwned
6d70: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6f   ){.      if( !o
6d80: 73 48 65 61 70 44 65 73 74 72 6f 79 28 70 57 69  sHeapDestroy(pWi
6d90: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29  nMemData->hHeap)
6da0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6db0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
6dc0: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
6dd0: 20 48 65 61 70 44 65 73 74 72 6f 79 20 28 25 64   HeapDestroy (%d
6de0: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
6df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e00: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
6e10: 29 2c 20 28 76 6f 69 64 2a 29 70 57 69 6e 4d 65  ), (void*)pWinMe
6e20: 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 3b 0a 20  mData->hHeap);. 
6e30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57 69       }.      pWi
6e40: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64  nMemData->bOwned
6e50: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a   = FALSE;.    }.
6e60: 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d      pWinMemData-
6e70: 3e 68 48 65 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20  >hHeap = NULL;. 
6e80: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75   }.}../*.** Popu
6e90: 6c 61 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76  late the low-lev
6ea0: 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  el memory alloca
6eb0: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f  tion function po
6ec0: 69 6e 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c  inters in.** sql
6ed0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
6ee0: 2e 6d 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73  .m with pointers
6ef0: 20 74 6f 20 74 68 65 20 72 6f 75 74 69 6e 65 73   to the routines
6f00: 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 54   in this file. T
6f10: 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20  he.** arguments 
6f20: 73 70 65 63 69 66 79 20 74 68 65 20 62 6c 6f 63  specify the bloc
6f30: 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6d  k of memory to m
6f40: 61 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  anage..**.** Thi
6f50: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
6f60: 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69  y called by sqli
6f70: 74 65 33 5f 63 6f 6e 66 69 67 28 29 2c 20 61 6e  te3_config(), an
6f80: 64 20 74 68 65 72 65 66 6f 72 65 0a 2a 2a 20 69  d therefore.** i
6f90: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74  s not required t
6fa0: 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65 20  o be threadsafe 
6fb0: 28 69 74 20 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a  (it is not)..*/.
6fc0: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65  const sqlite3_me
6fd0: 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74  m_methods *sqlit
6fe0: 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f  e3MemGetWin32(vo
6ff0: 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  id){.  static co
7000: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  nst sqlite3_mem_
7010: 6d 65 74 68 6f 64 73 20 77 69 6e 4d 65 6d 4d 65  methods winMemMe
7020: 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20 20 77 69  thods = {.    wi
7030: 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20  nMemMalloc,.    
7040: 77 69 6e 4d 65 6d 46 72 65 65 2c 0a 20 20 20 20  winMemFree,.    
7050: 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20  winMemRealloc,. 
7060: 20 20 20 77 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20     winMemSize,. 
7070: 20 20 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70     winMemRoundup
7080: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 49 6e 69 74  ,.    winMemInit
7090: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74  ,.    winMemShut
70a0: 64 6f 77 6e 2c 0a 20 20 20 20 26 77 69 6e 5f 6d  down,.    &win_m
70b0: 65 6d 5f 64 61 74 61 0a 20 20 7d 3b 0a 20 20 72  em_data.  };.  r
70c0: 65 74 75 72 6e 20 26 77 69 6e 4d 65 6d 4d 65 74  eturn &winMemMet
70d0: 68 6f 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71  hods;.}..void sq
70e0: 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75  lite3MemSetDefau
70f0: 6c 74 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  lt(void){.  sqli
7100: 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54  te3_config(SQLIT
7110: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c  E_CONFIG_MALLOC,
7120: 20 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69   sqlite3MemGetWi
7130: 6e 33 32 28 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  n32());.}.#endif
7140: 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   /* SQLITE_WIN32
7150: 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a  _MALLOC */../*.*
7160: 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d  * Convert a UTF-
7170: 38 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72  8 string to Micr
7180: 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 28 55  osoft Unicode (U
7190: 54 46 2d 31 36 3f 29 2e 20 0a 2a 2a 0a 2a 2a 20  TF-16?). .**.** 
71a0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
71b0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
71c0: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
71d0: 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74  om malloc..*/.st
71e0: 61 74 69 63 20 4c 50 57 53 54 52 20 75 74 66 38  atic LPWSTR utf8
71f0: 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20  ToUnicode(const 
7200: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
7210: 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20  {.  int nChar;. 
7220: 20 4c 50 57 53 54 52 20 7a 57 69 64 65 46 69 6c   LPWSTR zWideFil
7230: 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20  ename;..  nChar 
7240: 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  = osMultiByteToW
7250: 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c  ideChar(CP_UTF8,
7260: 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d   0, zFilename, -
7270: 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 69  1, NULL, 0);.  i
7280: 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20  f( nChar==0 ){. 
7290: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
72a0: 0a 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  .  zWideFilename
72b0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
72c0: 63 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28  c( nChar*sizeof(
72d0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d  zWideFilename[0]
72e0: 29 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65  ) );.  if( zWide
72f0: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
7300: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7310: 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c  .  nChar = osMul
7320: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
7330: 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69  (CP_UTF8, 0, zFi
7340: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64  lename, -1, zWid
7350: 65 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  eFilename,.     
7360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7370: 20 20 20 20 20 20 20 20 20 20 20 6e 43 68 61 72             nChar
7380: 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d  );.  if( nChar==
7390: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
73a0: 5f 66 72 65 65 28 7a 57 69 64 65 46 69 6c 65 6e  _free(zWideFilen
73b0: 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69 64 65 46  ame);.    zWideF
73c0: 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ilename = 0;.  }
73d0: 0a 20 20 72 65 74 75 72 6e 20 7a 57 69 64 65 46  .  return zWideF
73e0: 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
73f0: 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73  * Convert Micros
7400: 6f 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 55  oft Unicode to U
7410: 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20  TF-8.  Space to 
7420: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
7430: 64 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f  d string is.** o
7440: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
7450: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
7460: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75  /.static char *u
7470: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 4c 50 43  nicodeToUtf8(LPC
7480: 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61  WSTR zWideFilena
7490: 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  me){.  int nByte
74a0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  ;.  char *zFilen
74b0: 61 6d 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20  ame;..  nByte = 
74c0: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
74d0: 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30  iByte(CP_UTF8, 0
74e0: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
74f0: 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29   -1, 0, 0, 0, 0)
7500: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
7510: 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e   0 ){.    return
7520: 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e   0;.  }.  zFilen
7530: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ame = sqlite3_ma
7540: 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20  lloc( nByte );. 
7550: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d   if( zFilename==
7560: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
7570: 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  0;.  }.  nByte =
7580: 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   osWideCharToMul
7590: 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20  tiByte(CP_UTF8, 
75a0: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
75b0: 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  , -1, zFilename,
75c0: 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20   nByte,.        
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75e0: 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20          0, 0);. 
75f0: 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20   if( nByte == 0 
7600: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
7610: 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ree(zFilename);.
7620: 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20      zFilename = 
7630: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
7640: 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
7650: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 41  .** Convert an A
7660: 4e 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d 69  NSI string to Mi
7670: 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c  crosoft Unicode,
7680: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a   based on the.**
7690: 20 63 75 72 72 65 6e 74 20 63 6f 64 65 70 61 67   current codepag
76a0: 65 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20 66  e settings for f
76b0: 69 6c 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a  ile apis..** .**
76c0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
76d0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
76e0: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  ng is obtained.*
76f0: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  * from sqlite3_m
7700: 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  alloc..*/.static
7710: 20 4c 50 57 53 54 52 20 6d 62 63 73 54 6f 55 6e   LPWSTR mbcsToUn
7720: 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72  icode(const char
7730: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
7740: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 4c 50 57  int nByte;.  LPW
7750: 53 54 52 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  STR zMbcsFilenam
7760: 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67  e;.  int codepag
7770: 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69  e = osAreFileApi
7780: 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50  sANSI() ? CP_ACP
7790: 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20   : CP_OEMCP;..  
77a0: 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42  nByte = osMultiB
77b0: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f  yteToWideChar(co
77c0: 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65  depage, 0, zFile
77d0: 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 0a  name, -1, NULL,.
77e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7800: 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29  0)*sizeof(WCHAR)
7810: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30  ;.  if( nByte==0
7820: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
7830: 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 46 69 6c  ;.  }.  zMbcsFil
7840: 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f  ename = sqlite3_
7850: 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69  malloc( nByte*si
7860: 7a 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61  zeof(zMbcsFilena
7870: 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  me[0]) );.  if( 
7880: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30  zMbcsFilename==0
7890: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
78a0: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
78b0: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  osMultiByteToWid
78c0: 65 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20  eChar(codepage, 
78d0: 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  0, zFilename, -1
78e0: 2c 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c  , zMbcsFilename,
78f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7910: 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e   nByte);.  if( n
7920: 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Byte==0 ){.    s
7930: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 62 63  qlite3_free(zMbc
7940: 73 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  sFilename);.    
7950: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20  zMbcsFilename = 
7960: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
7970: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d  zMbcsFilename;.}
7980: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
7990: 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64  Microsoft Unicod
79a0: 65 20 74 6f 20 6d 75 6c 74 69 2d 62 79 74 65 20  e to multi-byte 
79b0: 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67  character string
79c0: 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a  , based on the.*
79d0: 2a 20 75 73 65 72 27 73 20 41 4e 53 49 20 63 6f  * user's ANSI co
79e0: 64 65 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70  depage..**.** Sp
79f0: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
7a00: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
7a10: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
7a20: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  .** sqlite3_mall
7a30: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
7a40: 63 68 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 4d  char *unicodeToM
7a50: 62 63 73 28 4c 50 43 57 53 54 52 20 7a 57 69 64  bcs(LPCWSTR zWid
7a60: 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e  eFilename){.  in
7a70: 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20  t nByte;.  char 
7a80: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e  *zFilename;.  in
7a90: 74 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73 41  t codepage = osA
7aa0: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
7ab0: 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f   ? CP_ACP : CP_O
7ac0: 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d  EMCP;..  nByte =
7ad0: 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   osWideCharToMul
7ae0: 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c  tiByte(codepage,
7af0: 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d   0, zWideFilenam
7b00: 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20  e, -1, 0, 0, 0, 
7b10: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
7b20: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75  == 0 ){.    retu
7b30: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c  rn 0;.  }.  zFil
7b40: 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f  ename = sqlite3_
7b50: 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b  malloc( nByte );
7b60: 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
7b70: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
7b80: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  n 0;.  }.  nByte
7b90: 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d   = osWideCharToM
7ba0: 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67  ultiByte(codepag
7bb0: 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e  e, 0, zWideFilen
7bc0: 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61  ame, -1, zFilena
7bd0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bf0: 20 20 20 20 6e 42 79 74 65 2c 20 30 2c 20 30 29      nByte, 0, 0)
7c00: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
7c10: 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   0 ){.    sqlite
7c20: 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65  3_free(zFilename
7c30: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
7c40: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
7c50: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  rn zFilename;.}.
7c60: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 6d  ./*.** Convert m
7c70: 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74  ultibyte charact
7c80: 65 72 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46  er string to UTF
7c90: 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  -8.  Space to ho
7ca0: 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e  ld the.** return
7cb0: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
7cc0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
7cd0: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  e3_malloc()..*/.
7ce0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
7cf0: 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
7d00: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
7d10: 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  lename){.  char 
7d20: 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a  *zFilenameUtf8;.
7d30: 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64    LPWSTR zTmpWid
7d40: 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d  e;..  zTmpWide =
7d50: 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a   mbcsToUnicode(z
7d60: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
7d70: 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a   zTmpWide==0 ){.
7d80: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7d90: 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66  }.  zFilenameUtf
7da0: 38 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66  8 = unicodeToUtf
7db0: 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73  8(zTmpWide);.  s
7dc0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70  qlite3_free(zTmp
7dd0: 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Wide);.  return 
7de0: 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 7d  zFilenameUtf8;.}
7df0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
7e00: 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69 62 79  UTF-8 to multiby
7e10: 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72  te character str
7e20: 69 6e 67 2e 20 20 53 70 61 63 65 20 74 6f 20 68  ing.  Space to h
7e30: 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72 65 74 75  old the .** retu
7e40: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
7e50: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
7e60: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
7e70: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
7e80: 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62  win32_utf8_to_mb
7e90: 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  cs(const char *z
7ea0: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61  Filename){.  cha
7eb0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73  r *zFilenameMbcs
7ec0: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57  ;.  LPWSTR zTmpW
7ed0: 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65  ide;..  zTmpWide
7ee0: 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65   = utf8ToUnicode
7ef0: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
7f00: 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29  f( zTmpWide==0 )
7f10: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
7f20: 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 4d    }.  zFilenameM
7f30: 62 63 73 20 3d 20 75 6e 69 63 6f 64 65 54 6f 4d  bcs = unicodeToM
7f40: 62 63 73 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20  bcs(zTmpWide);. 
7f50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
7f60: 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72  mpWide);.  retur
7f70: 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b  n zFilenameMbcs;
7f80: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72  .}.../*.** The r
7f90: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 67  eturn value of g
7fa0: 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a 2a  etLastErrorMsg.*
7fb0: 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65  * is zero if the
7fc0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
7fd0: 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65  its in the buffe
7fe0: 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a  r, or non-zero.*
7ff0: 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20  * otherwise (if 
8000: 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20  the message was 
8010: 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a 73  truncated)..*/.s
8020: 74 61 74 69 63 20 69 6e 74 20 67 65 74 4c 61 73  tatic int getLas
8030: 74 45 72 72 6f 72 4d 73 67 28 44 57 4f 52 44 20  tErrorMsg(DWORD 
8040: 6c 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20 6e  lastErrno, int n
8050: 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
8060: 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73  {.  /* FormatMes
8070: 73 61 67 65 20 72 65 74 75 72 6e 73 20 30 20 6f  sage returns 0 o
8080: 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68 65  n failure.  Othe
8090: 72 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72 65  rwise it.  ** re
80a0: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
80b0: 20 6f 66 20 54 43 48 41 52 73 20 77 72 69 74 74   of TCHARs writt
80c0: 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  en to the output
80d0: 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65 78  .  ** buffer, ex
80e0: 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72 6d  cluding the term
80f0: 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61  inating null cha
8100: 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44 20  r..  */.  DWORD 
8110: 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61  dwLen = 0;.  cha
8120: 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20 20  r *zOut = 0;..  
8130: 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
8140: 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 57 69    LPWSTR zTempWi
8150: 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64  de = NULL;.    d
8160: 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d  wLen = osFormatM
8170: 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d  essageW(FORMAT_M
8180: 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f  ESSAGE_ALLOCATE_
8190: 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20  BUFFER |.       
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81b0: 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53        FORMAT_MES
81c0: 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d  SAGE_FROM_SYSTEM
81d0: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
81e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81f0: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49  FORMAT_MESSAGE_I
8200: 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20  GNORE_INSERTS,. 
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8220: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
8230: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
8250: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
8260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8270: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
8280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8290: 20 20 20 20 20 20 20 28 4c 50 57 53 54 52 29 20         (LPWSTR) 
82a0: 26 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20  &zTempWide,.    
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82c0: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
82d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82e0: 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20           0);.   
82f0: 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29   if( dwLen > 0 )
8300: 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63  {.      /* alloc
8310: 61 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64  ate a buffer and
8320: 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38   convert to UTF8
8330: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
8340: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
8350: 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74  oc();.      zOut
8360: 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38   = unicodeToUtf8
8370: 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20  (zTempWide);.   
8380: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
8390: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
83a0: 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73     /* free the s
83b0: 79 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c  ystem buffer all
83c0: 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74  ocated by Format
83d0: 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20  Message */.     
83e0: 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65   osLocalFree(zTe
83f0: 6d 70 57 69 64 65 29 3b 0a 20 20 20 20 7d 0a 2f  mpWide);.    }./
8400: 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66  * isNT() is 1 if
8410: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
8420: 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73  ==1, so this els
8430: 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75  e is never execu
8440: 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74  ted. .** Since t
8450: 68 65 20 41 4e 53 49 20 76 65 72 73 69 6f 6e 20  he ANSI version 
8460: 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73  of these Windows
8470: 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73   API do not exis
8480: 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20  t for WINCE,.** 
8490: 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  it's important t
84a0: 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20  o not reference 
84b0: 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62  them for WINCE b
84c0: 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51  uilds..*/.#if SQ
84d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30  LITE_OS_WINCE==0
84e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
84f0: 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c  ar *zTemp = NULL
8500: 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73  ;.    dwLen = os
8510: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28 46  FormatMessageA(F
8520: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c  ORMAT_MESSAGE_AL
8530: 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a  LOCATE_BUFFER |.
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8550: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
8560: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d  MAT_MESSAGE_FROM
8570: 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20  _SYSTEM |.      
8580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8590: 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45         FORMAT_ME
85a0: 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53  SSAGE_IGNORE_INS
85b0: 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20  ERTS,.          
85c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85d0: 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20     NULL,.       
85e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85f0: 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c        lastErrno,
8600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
8620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4c                (L
8640: 50 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20  PSTR) &zTemp,.  
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8660: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
8670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8680: 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20             0);. 
8690: 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30     if( dwLen > 0
86a0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c   ){.      /* all
86b0: 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61  ocate a buffer a
86c0: 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54  nd convert to UT
86d0: 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  F8 */.      sqli
86e0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
86f0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f  lloc();.      zO
8700: 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  ut = sqlite3_win
8710: 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
8720: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71  zTemp);.      sq
8730: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
8740: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a  lloc();.      /*
8750: 20 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d   free the system
8760: 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
8770: 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61  d by FormatMessa
8780: 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f  ge */.      osLo
8790: 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a  calFree(zTemp);.
87a0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
87b0: 0a 20 20 69 66 28 20 30 20 3d 3d 20 64 77 4c 65  .  if( 0 == dwLe
87c0: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
87d0: 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20  _snprintf(nBuf, 
87e0: 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f 72 20 30  zBuf, "OsError 0
87f0: 78 25 78 20 28 25 75 29 22 2c 20 6c 61 73 74 45  x%x (%u)", lastE
8800: 72 72 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29  rrno, lastErrno)
8810: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
8820: 2a 20 63 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d  * copy a maximum
8830: 20 6f 66 20 6e 42 75 66 20 63 68 61 72 73 20 74   of nBuf chars t
8840: 6f 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  o output buffer 
8850: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
8860: 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42  nprintf(nBuf, zB
8870: 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b  uf, "%s", zOut);
8880: 0a 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65  .    /* free the
8890: 20 55 54 46 38 20 62 75 66 66 65 72 20 2a 2f 0a   UTF8 buffer */.
88a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
88b0: 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65  (zOut);.  }.  re
88c0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
88d0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
88e0: 6e 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41  n - winLogErrorA
88f0: 74 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c  tLine() - is onl
8900: 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69  y ever called vi
8910: 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77  a the macro.** w
8920: 69 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a  inLogError()..**
8930: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8940: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65   is invoked afte
8950: 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  r an error occur
8960: 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74  s in an OS funct
8970: 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20  ion..** It logs 
8980: 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20  a message using 
8990: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f  sqlite3_log() co
89a0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72  ntaining the cur
89b0: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a  rent value of.**
89c0: 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c   error code and,
89d0: 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68   if possible, th
89e0: 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  e human-readable
89f0: 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d   equivalent from
8a00: 20 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61   .** FormatMessa
8a10: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ge..**.** The fi
8a20: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
8a30: 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f  sed to the macro
8a40: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65   should be the e
8a50: 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a  rror code that.*
8a60: 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  * will be return
8a70: 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e  ed to SQLite (e.
8a80: 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  g. SQLITE_IOERR_
8a90: 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43  DELETE, SQLITE_C
8aa0: 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68  ANTOPEN). .** Th
8ab0: 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74  e two subsequent
8ac0: 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c   arguments shoul
8ad0: 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  d be the name of
8ae0: 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e   the OS function
8af0: 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20   that.** failed 
8b00: 61 6e 64 20 74 68 65 20 74 68 65 20 61 73 73 6f  and the the asso
8b10: 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74  ciated file-syst
8b20: 65 6d 20 70 61 74 68 2c 20 69 66 20 61 6e 79 2e  em path, if any.
8b30: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c  .*/.#define winL
8b40: 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29  ogError(a,b,c,d)
8b50: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74     winLogErrorAt
8b60: 4c 69 6e 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c  Line(a,b,c,d,__L
8b70: 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e  INE__).static in
8b80: 74 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c  t winLogErrorAtL
8b90: 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f  ine(.  int errco
8ba0: 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
8bb0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65         /* SQLite
8bc0: 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
8bd0: 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
8be0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8bf0: 20 2f 2a 20 57 69 6e 33 32 20 6c 61 73 74 20 65   /* Win32 last e
8c00: 72 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rror */.  const 
8c10: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20  char *zFunc,    
8c20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
8c30: 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e  e of OS function
8c40: 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a   that failed */.
8c50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
8c60: 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
8c70: 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61    /* File path a
8c80: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
8c90: 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  rror */.  int iL
8ca0: 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ine             
8cb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75            /* Sou
8cc0: 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  rce line number 
8cd0: 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75  where error occu
8ce0: 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  rred */.){.  cha
8cf0: 72 20 7a 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20  r zMsg[500];    
8d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8d10: 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 65  Human readable e
8d20: 72 72 6f 72 20 74 65 78 74 20 2a 2f 0a 20 20 69  rror text */.  i
8d30: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
8d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8d50: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
8d60: 2f 0a 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30  /..  zMsg[0] = 0
8d70: 3b 0a 20 20 67 65 74 4c 61 73 74 45 72 72 6f 72  ;.  getLastError
8d80: 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73  Msg(lastErrno, s
8d90: 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73  izeof(zMsg), zMs
8da0: 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 72  g);.  assert( er
8db0: 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rcode!=SQLITE_OK
8dc0: 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d   );.  if( zPath=
8dd0: 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b  =0 ) zPath = "";
8de0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67  .  for(i=0; zMsg
8df0: 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d  [i] && zMsg[i]!=
8e00: 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21  '\r' && zMsg[i]!
8e10: 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\n'; i++){}.  
8e20: 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73  zMsg[i] = 0;.  s
8e30: 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f  qlite3_log(errco
8e40: 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77 69  de,.      "os_wi
8e50: 6e 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28  n.c:%d: (%d) %s(
8e60: 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20  %s) - %s",.     
8e70: 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e   iLine, lastErrn
8e80: 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c  o, zFunc, zPath,
8e90: 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65   zMsg.  );..  re
8ea0: 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a  turn errcode;.}.
8eb0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65  ./*.** The numbe
8ec0: 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20  r of times that 
8ed0: 61 20 52 65 61 64 46 69 6c 65 28 29 2c 20 57 72  a ReadFile(), Wr
8ee0: 69 74 65 46 69 6c 65 28 29 2c 20 61 6e 64 20 44  iteFile(), and D
8ef0: 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77  eleteFile().** w
8f00: 69 6c 6c 20 62 65 20 72 65 74 72 69 65 64 20 66  ill be retried f
8f10: 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69  ollowing a locki
8f20: 6e 67 20 65 72 72 6f 72 20 2d 20 70 72 6f 62 61  ng error - proba
8f30: 62 6c 79 20 63 61 75 73 65 64 20 62 79 20 0a 2a  bly caused by .*
8f40: 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f 66 74  * antivirus soft
8f50: 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68 65 20  ware.  Also the 
8f60: 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20 62 65  initial delay be
8f70: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 72  fore the first r
8f80: 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c  etry..** The del
8f90: 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c 69 6e  ay increases lin
8fa0: 65 61 72 6c 79 20 77 69 74 68 20 65 61 63 68 20  early with each 
8fb0: 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65  retry..*/.#ifnde
8fc0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  f SQLITE_WIN32_I
8fd0: 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64 65 66  OERR_RETRY.# def
8fe0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
8ff0: 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31 30 0a  _IOERR_RETRY 10.
9000: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
9010: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
9020: 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a 23 20  R_RETRY_DELAY.# 
9030: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
9040: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
9050: 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69 66 0a  DELAY 25.#endif.
9060: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32  static int win32
9070: 49 6f 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c  IoerrRetry = SQL
9080: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
9090: 52 45 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e  RETRY;.static in
90a0: 74 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72  t win32IoerrRetr
90b0: 79 44 65 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f  yDelay = SQLITE_
90c0: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
90d0: 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20  Y_DELAY;../*.** 
90e0: 49 66 20 61 20 52 65 61 64 46 69 6c 65 28 29 20  If a ReadFile() 
90f0: 6f 72 20 57 72 69 74 65 46 69 6c 65 28 29 20 65  or WriteFile() e
9100: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 69 6e 76  rror occurs, inv
9110: 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oke this routine
9120: 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 69 74  .** to see if it
9130: 20 73 68 6f 75 6c 64 20 62 65 20 72 65 74 72 69   should be retri
9140: 65 64 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ed.  Return TRUE
9150: 20 74 6f 20 72 65 74 72 79 2e 20 20 52 65 74 75   to retry.  Retu
9160: 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 74 6f 20 67  rn FALSE.** to g
9170: 69 76 65 20 75 70 20 77 69 74 68 20 61 6e 20 65  ive up with an e
9180: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
9190: 69 6e 74 20 72 65 74 72 79 49 6f 65 72 72 28 69  int retryIoerr(i
91a0: 6e 74 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f  nt *pnRetry, DWO
91b0: 52 44 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44  RD *pError){.  D
91c0: 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61  WORD e = osGetLa
91d0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28  stError();.  if(
91e0: 20 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e 33 32   *pnRetry>=win32
91f0: 49 6f 65 72 72 52 65 74 72 79 20 29 7b 0a 20 20  IoerrRetry ){.  
9200: 20 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a    if( pError ){.
9210: 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20        *pError = 
9220: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  e;.    }.    ret
9230: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
9240: 20 65 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53 53   e==ERROR_ACCESS
9250: 5f 44 45 4e 49 45 44 20 7c 7c 0a 20 20 20 20 20  _DENIED ||.     
9260: 20 65 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56   e==ERROR_LOCK_V
9270: 49 4f 4c 41 54 49 4f 4e 20 7c 7c 0a 20 20 20 20  IOLATION ||.    
9280: 20 20 65 3d 3d 45 52 52 4f 52 5f 53 48 41 52 49    e==ERROR_SHARI
9290: 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 20 29 7b 0a  NG_VIOLATION ){.
92a0: 20 20 20 20 6f 73 53 6c 65 65 70 28 77 69 6e 33      osSleep(win3
92b0: 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79  2IoerrRetryDelay
92c0: 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a  *(1+*pnRetry));.
92d0: 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a      ++*pnRetry;.
92e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
92f0: 7d 0a 20 20 69 66 28 20 70 45 72 72 6f 72 20 29  }.  if( pError )
9300: 7b 0a 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20  {.    *pError = 
9310: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
9320: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20  0;.}../*.** Log 
9330: 61 20 49 2f 4f 20 65 72 72 6f 72 20 72 65 74 72  a I/O error retr
9340: 79 20 65 70 69 73 6f 64 65 2e 0a 2a 2f 0a 73 74  y episode..*/.st
9350: 61 74 69 63 20 76 6f 69 64 20 6c 6f 67 49 6f 65  atic void logIoe
9360: 72 72 28 69 6e 74 20 6e 52 65 74 72 79 29 7b 0a  rr(int nRetry){.
9370: 20 20 69 66 28 20 6e 52 65 74 72 79 20 29 7b 0a    if( nRetry ){.
9380: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
9390: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 0a 20  SQLITE_IOERR, . 
93a0: 20 20 20 20 20 22 64 65 6c 61 79 65 64 20 25 64       "delayed %d
93b0: 6d 73 20 66 6f 72 20 6c 6f 63 6b 2f 73 68 61 72  ms for lock/shar
93c0: 69 6e 67 20 63 6f 6e 66 6c 69 63 74 22 2c 0a 20  ing conflict",. 
93d0: 20 20 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52       win32IoerrR
93e0: 65 74 72 79 44 65 6c 61 79 2a 6e 52 65 74 72 79  etryDelay*nRetry
93f0: 2a 28 6e 52 65 74 72 79 2b 31 29 2f 32 0a 20 20  *(nRetry+1)/2.  
9400: 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20    );.  }.}..#if 
9410: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
9420: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
9430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
9470: 69 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e 74 61  is section conta
9480: 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 57 69 6e  ins code for Win
9490: 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 2f 2a 0a 2a  CE only..*/./*.*
94a0: 2a 20 57 69 6e 64 6f 77 73 20 43 45 20 64 6f 65  * Windows CE doe
94b0: 73 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f 63  s not have a loc
94c0: 61 6c 74 69 6d 65 28 29 20 66 75 6e 63 74 69 6f  altime() functio
94d0: 6e 2e 20 20 53 6f 20 63 72 65 61 74 65 20 61 0a  n.  So create a.
94e0: 2a 2a 20 73 75 62 73 74 69 74 75 74 65 2e 0a 2a  ** substitute..*
94f0: 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65  /.#include <time
9500: 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a 5f  .h>.struct tm *_
9510: 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d 65  _cdecl localtime
9520: 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a 74  (const time_t *t
9530: 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72  ).{.  static str
9540: 75 63 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c 45  uct tm y;.  FILE
9550: 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20  TIME uTm, lTm;. 
9560: 20 53 59 53 54 45 4d 54 49 4d 45 20 70 54 6d 3b   SYSTEMTIME pTm;
9570: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
9580: 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a 74   t64;.  t64 = *t
9590: 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34 20 2b  ;.  t64 = (t64 +
95a0: 20 31 31 36 34 34 34 37 33 36 30 30 29 2a 31 30   11644473600)*10
95b0: 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64 77  000000;.  uTm.dw
95c0: 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20 28 44  LowDateTime = (D
95d0: 57 4f 52 44 29 28 74 36 34 20 26 20 30 78 46 46  WORD)(t64 & 0xFF
95e0: 46 46 46 46 46 46 29 3b 0a 20 20 75 54 6d 2e 64  FFFFFF);.  uTm.d
95f0: 77 48 69 67 68 44 61 74 65 54 69 6d 65 3d 20 28  wHighDateTime= (
9600: 44 57 4f 52 44 29 28 74 36 34 20 3e 3e 20 33 32  DWORD)(t64 >> 32
9610: 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54  );.  osFileTimeT
9620: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28 26  oLocalFileTime(&
9630: 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 6f 73 46  uTm,&lTm);.  osF
9640: 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54  ileTimeToSystemT
9650: 69 6d 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a  ime(&lTm,&pTm);.
9660: 20 20 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70 54    y.tm_year = pT
9670: 6d 2e 77 59 65 61 72 20 2d 20 31 39 30 30 3b 0a  m.wYear - 1900;.
9680: 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d    y.tm_mon = pTm
9690: 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20 79  .wMonth - 1;.  y
96a0: 2e 74 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e 77  .tm_wday = pTm.w
96b0: 44 61 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e 74  DayOfWeek;.  y.t
96c0: 6d 5f 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44 61  m_mday = pTm.wDa
96d0: 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20 3d  y;.  y.tm_hour =
96e0: 20 70 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79 2e   pTm.wHour;.  y.
96f0: 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d 69  tm_min = pTm.wMi
9700: 6e 75 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65 63  nute;.  y.tm_sec
9710: 20 3d 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a   = pTm.wSecond;.
9720: 20 20 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a 0a    return &y;.}..
9730: 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f 54  #define HANDLE_T
9740: 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28 77 69  O_WINFILE(a) (wi
9750: 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72 2a 29  nFile*)&((char*)
9760: 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74 6f  a)[-(int)offseto
9770: 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f  f(winFile,h)]../
9780: 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 6c  *.** Acquire a l
9790: 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64 6c  ock on the handl
97a0: 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  e h.*/.static vo
97b0: 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  id winceMutexAcq
97c0: 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29 7b 0a  uire(HANDLE h){.
97d0: 20 20 20 44 57 4f 52 44 20 64 77 45 72 72 3b 0a     DWORD dwErr;.
97e0: 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64 77 45     do {.     dwE
97f0: 72 72 20 3d 20 57 61 69 74 46 6f 72 53 69 6e 67  rr = WaitForSing
9800: 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e 46 49  leObject(h, INFI
9810: 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77 68 69 6c  NITE);.   } whil
9820: 65 20 28 64 77 45 72 72 20 21 3d 20 57 41 49 54  e (dwErr != WAIT
9830: 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20 64 77 45  _OBJECT_0 && dwE
9840: 72 72 20 21 3d 20 57 41 49 54 5f 41 42 41 4e 44  rr != WAIT_ABAND
9850: 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52  ONED);.}./*.** R
9860: 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20 61 63  elease a lock ac
9870: 71 75 69 72 65 64 20 62 79 20 77 69 6e 63 65 4d  quired by winceM
9880: 75 74 65 78 41 63 71 75 69 72 65 28 29 0a 2a 2f  utexAcquire().*/
9890: 0a 23 64 65 66 69 6e 65 20 77 69 6e 63 65 4d 75  .#define winceMu
98a0: 74 65 78 52 65 6c 65 61 73 65 28 68 29 20 52 65  texRelease(h) Re
98b0: 6c 65 61 73 65 4d 75 74 65 78 28 68 29 0a 0a 2f  leaseMutex(h)../
98c0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
98d0: 6d 75 74 65 78 20 61 6e 64 20 73 68 61 72 65 64  mutex and shared
98e0: 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 66 6f 72   memory used for
98f0: 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 65 20   locking in the 
9900: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
9910: 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74 61 74  or pFile.*/.stat
9920: 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 43 72 65  ic BOOL winceCre
9930: 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68  ateLock(const ch
9940: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 77  ar *zFilename, w
9950: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
9960: 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b 3b 0a 20    LPWSTR zTok;. 
9970: 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65 3b 0a 20   LPWSTR zName;. 
9980: 20 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52   BOOL bInit = TR
9990: 55 45 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 75  UE;..  zName = u
99a0: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
99b0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
99c0: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Name==0 ){.    /
99d0: 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20  * out of memory 
99e0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41  */.    return FA
99f0: 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  LSE;.  }..  /* I
9a00: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f  nitialize the lo
9a10: 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a  cal lockdata */.
9a20: 20 20 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d    memset(&pFile-
9a30: 3e 6c 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f  >local, 0, sizeo
9a40: 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29  f(pFile->local))
9a50: 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20  ;..  /* Replace 
9a60: 74 68 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20  the backslashes 
9a70: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d  from the filenam
9a80: 65 20 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20  e and lowercase 
9a90: 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76  it.  ** to deriv
9aa0: 65 20 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20  e a mutex name. 
9ab0: 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68  */.  zTok = osCh
9ac0: 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b  arLowerW(zName);
9ad0: 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a  .  for (;*zTok;z
9ae0: 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28  Tok++){.    if (
9af0: 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a  *zTok == '\\') *
9b00: 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a  zTok = '_';.  }.
9b10: 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65  .  /* Create/ope
9b20: 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65  n the named mute
9b30: 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d  x */.  pFile->hM
9b40: 75 74 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d  utex = osCreateM
9b50: 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53  utexW(NULL, FALS
9b60: 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20  E, zName);.  if 
9b70: 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  (!pFile->hMutex)
9b80: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
9b90: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
9ba0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 77  stError();.    w
9bb0: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
9bc0: 45 5f 45 52 52 4f 52 2c 20 70 46 69 6c 65 2d 3e  E_ERROR, pFile->
9bd0: 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 63  lastErrno, "winc
9be0: 65 43 72 65 61 74 65 4c 6f 63 6b 31 22 2c 20 7a  eCreateLock1", z
9bf0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 73  Filename);.    s
9c00: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d  qlite3_free(zNam
9c10: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46  e);.    return F
9c20: 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ALSE;.  }..  /* 
9c30: 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65  Acquire the mute
9c40: 78 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  x before continu
9c50: 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75  ing */.  winceMu
9c60: 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
9c70: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 0a 20 20  ->hMutex);.  .  
9c80: 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 6e 61 6d  /* Since the nam
9c90: 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65  es of named mute
9ca0: 78 65 73 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c  xes, semaphores,
9cb0: 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 73 20 65   file mappings e
9cc0: 74 63 20 61 72 65 20 0a 20 20 2a 2a 20 63 61 73  tc are .  ** cas
9cd0: 65 2d 73 65 6e 73 69 74 69 76 65 2c 20 74 61 6b  e-sensitive, tak
9ce0: 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  e advantage of t
9cf0: 68 61 74 20 62 79 20 75 70 70 65 72 63 61 73 69  hat by uppercasi
9d00: 6e 67 20 74 68 65 20 6d 75 74 65 78 20 6e 61 6d  ng the mutex nam
9d10: 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e 67  e.  ** and using
9d20: 20 74 68 61 74 20 61 73 20 74 68 65 20 73 68 61   that as the sha
9d30: 72 65 64 20 66 69 6c 65 6d 61 70 70 69 6e 67 20  red filemapping 
9d40: 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 6f 73 43  name..  */.  osC
9d50: 68 61 72 55 70 70 65 72 57 28 7a 4e 61 6d 65 29  harUpperW(zName)
9d60: 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72  ;.  pFile->hShar
9d70: 65 64 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ed = osCreateFil
9d80: 65 4d 61 70 70 69 6e 67 57 28 49 4e 56 41 4c 49  eMappingW(INVALI
9d90: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 2c 20  D_HANDLE_VALUE, 
9da0: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
9dd0: 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c  GE_READWRITE, 0,
9de0: 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63   sizeof(winceLoc
9df0: 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  k),.            
9e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e10: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
9e20: 65 29 3b 20 20 0a 0a 20 20 2f 2a 20 53 65 74 20  e);  ..  /* Set 
9e30: 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69  a flag that indi
9e40: 63 61 74 65 73 20 77 65 27 72 65 20 74 68 65 20  cates we're the 
9e50: 66 69 72 73 74 20 74 6f 20 63 72 65 61 74 65 20  first to create 
9e60: 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74  the memory so it
9e70: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a   .  ** must be z
9e80: 65 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20  ero-initialized 
9e90: 2a 2f 0a 20 20 69 66 20 28 6f 73 47 65 74 4c 61  */.  if (osGetLa
9ea0: 73 74 45 72 72 6f 72 28 29 20 3d 3d 20 45 52 52  stError() == ERR
9eb0: 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58 49 53 54  OR_ALREADY_EXIST
9ec0: 53 29 7b 0a 20 20 20 20 62 49 6e 69 74 20 3d 20  S){.    bInit = 
9ed0: 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71  FALSE;.  }..  sq
9ee0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65  lite3_free(zName
9ef0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 73  );..  /* If we s
9f00: 75 63 63 65 65 64 65 64 20 69 6e 20 6d 61 6b 69  ucceeded in maki
9f10: 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
9f20: 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70  mory handle, map
9f30: 20 69 74 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46   it. */.  if (pF
9f40: 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 7b 0a 20  ile->hShared){. 
9f50: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
9f60: 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f   = (winceLock*)o
9f70: 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  sMapViewOfFile(p
9f80: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 2c 20 0a  File->hShared, .
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 49 4c               FIL
9fa0: 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f  E_MAP_READ|FILE_
9fb0: 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c  MAP_WRITE, 0, 0,
9fc0: 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63   sizeof(winceLoc
9fd0: 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d  k));.    /* If m
9fe0: 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2c 20 63  apping failed, c
9ff0: 6c 6f 73 65 20 74 68 65 20 73 68 61 72 65 64 20  lose the shared 
a000: 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e  memory handle an
a010: 64 20 65 72 61 73 65 20 69 74 20 2a 2f 0a 20 20  d erase it */.  
a020: 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 73 68    if (!pFile->sh
a030: 61 72 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69  ared){.      pFi
a040: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
a050: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
a060: 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72  ;.      winLogEr
a070: 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52  ror(SQLITE_ERROR
a080: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
a090: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
a0a0: 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c     "winceCreateL
a0b0: 6f 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  ock2", zFilename
a0c0: 29 3b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65  );.      osClose
a0d0: 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53  Handle(pFile->hS
a0e0: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 46  hared);.      pF
a0f0: 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e  ile->hShared = N
a100: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ULL;.    }.  }..
a110: 20 20 2f 2a 20 49 66 20 73 68 61 72 65 64 20 6d    /* If shared m
a120: 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20  emory could not 
a130: 62 65 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e  be created, then
a140: 20 63 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78   close the mutex
a150: 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20 69   and fail */.  i
a160: 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  f (pFile->hShare
a170: 64 20 3d 3d 20 4e 55 4c 4c 29 7b 0a 20 20 20 20  d == NULL){.    
a180: 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
a190: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
a1a0: 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e  ;.    osCloseHan
a1b0: 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  dle(pFile->hMute
a1c0: 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68  x);.    pFile->h
a1d0: 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20  Mutex = NULL;.  
a1e0: 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a    return FALSE;.
a1f0: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 6e 69 74    }.  .  /* Init
a200: 69 61 6c 69 7a 65 20 74 68 65 20 73 68 61 72 65  ialize the share
a210: 64 20 6d 65 6d 6f 72 79 20 69 66 20 77 65 27 72  d memory if we'r
a220: 65 20 73 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f  e supposed to */
a230: 0a 20 20 69 66 20 28 62 49 6e 69 74 29 20 7b 0a  .  if (bInit) {.
a240: 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65      memset(pFile
a250: 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20 73 69 7a  ->shared, 0, siz
a260: 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b  eof(winceLock));
a270: 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74  .  }..  winceMut
a280: 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
a290: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  >hMutex);.  retu
a2a0: 72 6e 20 54 52 55 45 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn TRUE;.}../*.*
a2b0: 2a 20 44 65 73 74 72 6f 79 20 74 68 65 20 70 61  * Destroy the pa
a2c0: 72 74 20 6f 66 20 77 69 6e 46 69 6c 65 20 74 68  rt of winFile th
a2d0: 61 74 20 64 65 61 6c 73 20 77 69 74 68 20 77 69  at deals with wi
a2e0: 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61  nce locks.*/.sta
a2f0: 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 44 65  tic void winceDe
a300: 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46 69 6c  stroyLock(winFil
a310: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66 20  e *pFile){.  if 
a320: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b  (pFile->hMutex){
a330: 0a 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20  .    /* Acquire 
a340: 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20  the mutex */.   
a350: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
a360: 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  re(pFile->hMutex
a370: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  );..    /* The f
a380: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20  ollowing blocks 
a390: 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20  should probably 
a3a0: 61 73 73 65 72 74 20 69 6e 20 64 65 62 75 67 20  assert in debug 
a3b0: 6d 6f 64 65 2c 20 62 75 74 20 74 68 65 79 0a 20  mode, but they. 
a3c0: 20 20 20 20 20 20 61 72 65 20 74 6f 20 63 6c 65        are to cle
a3d0: 61 6e 75 70 20 69 6e 20 63 61 73 65 20 61 6e 79  anup in case any
a3e0: 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65 64 20   locks remained 
a3f0: 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28  open */.    if (
a400: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
a410: 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 70 46  aders){.      pF
a420: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65  ile->shared->nRe
a430: 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a  aders --;.    }.
a440: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
a450: 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 7b  ocal.bReserved){
a460: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
a470: 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20  ared->bReserved 
a480: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20  = FALSE;.    }. 
a490: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
a4a0: 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20  cal.bPending){. 
a4b0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
a4c0: 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46  ed->bPending = F
a4d0: 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ALSE;.    }.    
a4e0: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
a4f0: 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20  .bExclusive){.  
a500: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
a510: 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  d->bExclusive = 
a520: 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  FALSE;.    }..  
a530: 20 20 2f 2a 20 44 65 2d 72 65 66 65 72 65 6e 63    /* De-referenc
a540: 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75 72 20  e and close our 
a550: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 68 61 72  copy of the shar
a560: 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65  ed memory handle
a570: 20 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d 61 70 56   */.    osUnmapV
a580: 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d  iewOfFile(pFile-
a590: 3e 73 68 61 72 65 64 29 3b 0a 20 20 20 20 6f 73  >shared);.    os
a5a0: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
a5b0: 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 0a 20 20  e->hShared);..  
a5c0: 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74 68 20 74    /* Done with t
a5d0: 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20  he mutex */.    
a5e0: 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
a5f0: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
a600: 3b 20 20 20 20 0a 20 20 20 20 6f 73 43 6c 6f 73  ;    .    osClos
a610: 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
a620: 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c  Mutex);.    pFil
a630: 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c  e->hMutex = NULL
a640: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  ;.  }.}../* .** 
a650: 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  An implementatio
a660: 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c  n of the LockFil
a670: 65 28 29 20 41 50 49 20 6f 66 20 57 69 6e 64 6f  e() API of Windo
a680: 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61  ws for CE.*/.sta
a690: 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f  tic BOOL winceLo
a6a0: 63 6b 46 69 6c 65 28 0a 20 20 48 41 4e 44 4c 45  ckFile(.  HANDLE
a6b0: 20 2a 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52   *phFile,.  DWOR
a6c0: 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f  D dwFileOffsetLo
a6d0: 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  w,.  DWORD dwFil
a6e0: 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44  eOffsetHigh,.  D
a6f0: 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
a700: 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20  tesToLockLow,.  
a710: 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42  DWORD nNumberOfB
a720: 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29  ytesToLockHigh.)
a730: 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
a740: 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57  le = HANDLE_TO_W
a750: 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a  INFILE(phFile);.
a760: 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d    BOOL bReturn =
a770: 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45   FALSE;..  UNUSE
a780: 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46 69  D_PARAMETER(dwFi
a790: 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20  leOffsetHigh);. 
a7a0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
a7b0: 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  R(nNumberOfBytes
a7c0: 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20  ToLockHigh);..  
a7d0: 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74  if (!pFile->hMut
a7e0: 65 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b  ex) return TRUE;
a7f0: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
a800: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
a810: 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74 69  ex);..  /* Wanti
a820: 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ng an exclusive 
a830: 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20 28 64  lock? */.  if (d
a840: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
a850: 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
a860: 46 49 52 53 54 0a 20 20 20 20 20 20 20 26 26 20  FIRST.       && 
a870: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
a880: 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  LockLow == (DWOR
a890: 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a  D)SHARED_SIZE){.
a8a0: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73      if (pFile->s
a8b0: 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20  hared->nReaders 
a8c0: 3d 3d 20 30 20 26 26 20 70 46 69 6c 65 2d 3e 73  == 0 && pFile->s
a8d0: 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
a8e0: 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 20  e == 0){.       
a8f0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
a900: 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45  Exclusive = TRUE
a910: 3b 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ;.       pFile->
a920: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
a930: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20   = TRUE;.       
a940: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
a950: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
a960: 57 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  Want a read-only
a970: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65   lock? */.  else
a980: 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
a990: 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53  tLow == (DWORD)S
a9a0: 48 41 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20  HARED_FIRST &&. 
a9b0: 20 20 20 20 20 20 20 20 20 20 6e 4e 75 6d 62 65            nNumbe
a9c0: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
a9d0: 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20  w == 1){.    if 
a9e0: 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e  (pFile->shared->
a9f0: 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29  bExclusive == 0)
aa00: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
aa10: 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b 2b  ocal.nReaders ++
aa20: 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c  ;.      if (pFil
aa30: 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
aa40: 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20 20  s == 1){.       
aa50: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
aa60: 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20  nReaders ++;.   
aa70: 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75     }.      bRetu
aa80: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
aa90: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20  .  }..  /* Want 
aaa0: 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20  a pending lock? 
aab0: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
aac0: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
aad0: 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f   (DWORD)PENDING_
aae0: 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f  BYTE && nNumberO
aaf0: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
ab00: 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66  == 1){.    /* If
ab10: 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b   no pending lock
ab20: 20 68 61 73 20 62 65 65 6e 20 61 63 71 75 69 72   has been acquir
ab30: 65 64 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65  ed, then acquire
ab40: 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70   it */.    if (p
ab50: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
ab60: 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20  ending == 0) {. 
ab70: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
ab80: 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54  ed->bPending = T
ab90: 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  RUE;.      pFile
aba0: 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67  ->local.bPending
abb0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62   = TRUE;.      b
abc0: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
abd0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
abe0: 61 6e 74 20 61 20 72 65 73 65 72 76 65 64 20 6c  ant a reserved l
abf0: 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69  ock? */.  else i
ac00: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
ac10: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53  ow == (DWORD)RES
ac20: 45 52 56 45 44 5f 42 59 54 45 20 26 26 20 6e 4e  ERVED_BYTE && nN
ac30: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
ac40: 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
ac50: 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72   if (pFile->shar
ac60: 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 3d  ed->bReserved ==
ac70: 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c   0) {.      pFil
ac80: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
ac90: 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20  rved = TRUE;.   
aca0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
acb0: 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45  bReserved = TRUE
acc0: 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  ;.      bReturn 
acd0: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
ace0: 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52  }..  winceMutexR
acf0: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
ad00: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
ad10: 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  bReturn;.}../*.*
ad20: 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  * An implementat
ad30: 69 6f 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63  ion of the Unloc
ad40: 6b 46 69 6c 65 20 41 50 49 20 6f 66 20 57 69 6e  kFile API of Win
ad50: 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73  dows for CE.*/.s
ad60: 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65  tatic BOOL wince
ad70: 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 48 41  UnlockFile(.  HA
ad80: 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a 20 20  NDLE *phFile,.  
ad90: 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
ada0: 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64  etLow,.  DWORD d
adb0: 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c  wFileOffsetHigh,
adc0: 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
add0: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
ade0: 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d  ow,.  DWORD nNum
adf0: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
ae00: 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46  ckHigh.){.  winF
ae10: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e  ile *pFile = HAN
ae20: 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70  DLE_TO_WINFILE(p
ae30: 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62  hFile);.  BOOL b
ae40: 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a  Return = FALSE;.
ae50: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
ae60: 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74  TER(dwFileOffset
ae70: 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f  High);.  UNUSED_
ae80: 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65  PARAMETER(nNumbe
ae90: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
aea0: 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70  High);..  if (!p
aeb0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65  File->hMutex) re
aec0: 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e  turn TRUE;.  win
aed0: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
aee0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a  File->hMutex);..
aef0: 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61    /* Releasing a
af00: 20 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20   reader lock or 
af10: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
af20: 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c  k */.  if (dwFil
af30: 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44  eOffsetLow == (D
af40: 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53  WORD)SHARED_FIRS
af50: 54 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20 77  T){.    /* Did w
af60: 65 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  e have an exclus
af70: 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20  ive lock? */.   
af80: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
af90: 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20  l.bExclusive){. 
afa0: 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d       assert(nNum
afb0: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
afc0: 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  ckLow == (DWORD)
afd0: 53 48 41 52 45 44 5f 53 49 5a 45 29 3b 0a 20 20  SHARED_SIZE);.  
afe0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
aff0: 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41  .bExclusive = FA
b000: 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  LSE;.      pFile
b010: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
b020: 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20  sive = FALSE;.  
b030: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
b040: 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  UE;.    }..    /
b050: 2a 20 44 69 64 20 77 65 20 6a 75 73 74 20 68 61  * Did we just ha
b060: 76 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b  ve a reader lock
b070: 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  ? */.    else if
b080: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
b090: 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20  Readers){.      
b0a0: 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66  assert(nNumberOf
b0b0: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
b0c0: 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
b0d0: 44 5f 53 49 5a 45 20 7c 7c 20 6e 4e 75 6d 62 65  D_SIZE || nNumbe
b0e0: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
b0f0: 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20  Low == 1);.     
b100: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52   pFile->local.nR
b110: 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20  eaders --;.     
b120: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
b130: 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 29  l.nReaders == 0)
b140: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
b150: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
b160: 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20  nReaders --;.   
b170: 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75     }.      bRetu
b180: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
b190: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  .  }..  /* Relea
b1a0: 73 69 6e 67 20 61 20 70 65 6e 64 69 6e 67 20 6c  sing a pending l
b1b0: 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ock */.  else if
b1c0: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
b1d0: 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44  w == (DWORD)PEND
b1e0: 49 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d  ING_BYTE && nNum
b1f0: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
b200: 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
b210: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
b220: 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20  l.bPending){.   
b230: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
b240: 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45  bPending = FALSE
b250: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  ;.      pFile->s
b260: 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
b270: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62  = FALSE;.      b
b280: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
b290: 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65     }.  }.  /* Re
b2a0: 6c 65 61 73 69 6e 67 20 61 20 72 65 73 65 72 76  leasing a reserv
b2b0: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73  ed lock */.  els
b2c0: 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
b2d0: 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
b2e0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 26 26  RESERVED_BYTE &&
b2f0: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
b300: 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  oUnlockLow == 1)
b310: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
b320: 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
b330: 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
b340: 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
b350: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
b360: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
b370: 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45  Reserved = FALSE
b380: 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  ;.      bReturn 
b390: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
b3a0: 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52  }..  winceMutexR
b3b0: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
b3c0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
b3d0: 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  bReturn;.}../*.*
b3e0: 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  * An implementat
b3f0: 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46  ion of the LockF
b400: 69 6c 65 45 78 28 29 20 41 50 49 20 6f 66 20 57  ileEx() API of W
b410: 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f  indows for CE.*/
b420: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
b430: 63 65 4c 6f 63 6b 46 69 6c 65 45 78 28 0a 20 20  ceLockFileEx(.  
b440: 48 41 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a  HANDLE *phFile,.
b450: 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 2c    DWORD dwFlags,
b460: 0a 20 20 44 57 4f 52 44 20 64 77 52 65 73 65 72  .  DWORD dwReser
b470: 76 65 64 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75  ved,.  DWORD nNu
b480: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
b490: 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  kLow,.  DWORD nN
b4a0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
b4b0: 63 6b 48 69 67 68 2c 0a 20 20 4c 50 4f 56 45 52  ckHigh,.  LPOVER
b4c0: 4c 41 50 50 45 44 20 6c 70 4f 76 65 72 6c 61 70  LAPPED lpOverlap
b4d0: 70 65 64 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ped.){.  UNUSED_
b4e0: 50 41 52 41 4d 45 54 45 52 28 64 77 52 65 73 65  PARAMETER(dwRese
b4f0: 72 76 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  rved);.  UNUSED_
b500: 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65  PARAMETER(nNumbe
b510: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69  rOfBytesToLockHi
b520: 67 68 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  gh);..  /* If th
b530: 65 20 63 61 6c 6c 65 72 20 77 61 6e 74 73 20 61  e caller wants a
b540: 20 73 68 61 72 65 64 20 72 65 61 64 20 6c 6f 63   shared read loc
b550: 6b 2c 20 66 6f 72 77 61 72 64 20 74 68 69 73 20  k, forward this 
b560: 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 77 69 6e  call.  ** to win
b570: 63 65 4c 6f 63 6b 46 69 6c 65 20 2a 2f 0a 20 20  ceLockFile */.  
b580: 69 66 20 28 6c 70 4f 76 65 72 6c 61 70 70 65 64  if (lpOverlapped
b590: 2d 3e 4f 66 66 73 65 74 20 3d 3d 20 28 44 57 4f  ->Offset == (DWO
b5a0: 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20  RD)SHARED_FIRST 
b5b0: 26 26 0a 20 20 20 20 20 20 64 77 46 6c 61 67 73  &&.      dwFlags
b5c0: 20 3d 3d 20 31 20 26 26 0a 20 20 20 20 20 20 6e   == 1 &&.      n
b5d0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
b5e0: 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  ockLow == (DWORD
b5f0: 29 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20  )SHARED_SIZE){. 
b600: 20 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 4c     return winceL
b610: 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20  ockFile(phFile, 
b620: 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
b630: 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   1, 0);.  }.  re
b640: 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 2f 2a  turn FALSE;.}./*
b650: 0a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73  .** End of the s
b660: 70 65 63 69 61 6c 20 63 6f 64 65 20 66 6f 72 20  pecial code for 
b670: 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  wince.**********
b680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b6a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b6b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b6c0: 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ***/.#endif /* S
b6d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a  QLITE_OS_WINCE *
b6e0: 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
b6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b730: 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 72  *.** The next gr
b740: 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  oup of routines 
b750: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f  implement the I/
b760: 4f 20 6d 65 74 68 6f 64 73 20 73 70 65 63 69 66  O methods specif
b770: 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 71  ied.** by the sq
b780: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
b790: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a   object..*******
b7a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b7b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b7c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b7d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b7e0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
b7f0: 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20 63  Some Microsoft c
b800: 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68  ompilers lack th
b810: 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a  is definition..*
b820: 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49  /.#ifndef INVALI
b830: 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
b840: 45 52 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41  ER.# define INVA
b850: 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
b860: 4e 54 45 52 20 28 28 44 57 4f 52 44 29 2d 31 29  NTER ((DWORD)-1)
b870: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
b880: 6f 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ove the current 
b890: 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  position of the 
b8a0: 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 61 73 73  file handle pass
b8b0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
b8c0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  .** argument to 
b8d0: 6f 66 66 73 65 74 20 69 4f 66 66 73 65 74 20 77  offset iOffset w
b8e0: 69 74 68 69 6e 20 74 68 65 20 66 69 6c 65 2e 20  ithin the file. 
b8f0: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  If successful, r
b900: 65 74 75 72 6e 20 30 2e 20 0a 2a 2a 20 4f 74 68  eturn 0. .** Oth
b910: 65 72 77 69 73 65 2c 20 73 65 74 20 70 46 69 6c  erwise, set pFil
b920: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 61 6e 64  e->lastErrno and
b930: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
b940: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b950: 73 65 65 6b 57 69 6e 46 69 6c 65 28 77 69 6e 46  seekWinFile(winF
b960: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69  ile *pFile, sqli
b970: 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 66 73 65  te3_int64 iOffse
b980: 74 29 7b 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72  t){.  LONG upper
b990: 42 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20  Bits;           
b9a0: 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69        /* Most si
b9b0: 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65  g. 32 bits of ne
b9c0: 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f  w offset */.  LO
b9d0: 4e 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20 20  NG lowerBits;   
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b9f0: 20 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20 62   Least sig. 32 b
ba00: 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65  its of new offse
ba10: 74 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 52  t */.  DWORD dwR
ba20: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
ba30: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
ba40: 72 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46  returned by SetF
ba50: 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a  ilePointer() */.
ba60: 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
ba70: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
ba80: 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
ba90: 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72  ned by GetLastEr
baa0: 72 6f 72 28 29 20 2a 2f 0a 0a 20 20 75 70 70 65  ror() */..  uppe
bab0: 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28  rBits = (LONG)((
bac0: 69 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30  iOffset>>32) & 0
bad0: 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f  x7fffffff);.  lo
bae0: 77 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29  werBits = (LONG)
baf0: 28 69 4f 66 66 73 65 74 20 26 20 30 78 66 66 66  (iOffset & 0xfff
bb00: 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50  fffff);..  /* AP
bb10: 49 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75 63  I oddity: If suc
bb20: 63 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c 65  cessful, SetFile
bb30: 50 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72 6e  Pointer() return
bb40: 73 20 61 20 64 77 6f 72 64 20 0a 20 20 2a 2a 20  s a dword .  ** 
bb50: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c  containing the l
bb60: 6f 77 65 72 20 33 32 2d 62 69 74 73 20 6f 66 20  ower 32-bits of 
bb70: 74 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66  the new file-off
bb80: 73 65 74 2e 20 4f 72 2c 20 69 66 20 69 74 20 66  set. Or, if it f
bb90: 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65  ails,.  ** it re
bba0: 74 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45  turns INVALID_SE
bbb0: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20  T_FILE_POINTER. 
bbc0: 48 6f 77 65 76 65 72 20 61 63 63 6f 72 64 69 6e  However accordin
bbd0: 67 20 74 6f 20 4d 53 44 4e 2c 20 0a 20 20 2a 2a  g to MSDN, .  **
bbe0: 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c   INVALID_SET_FIL
bbf0: 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c  E_POINTER may al
bc00: 73 6f 20 62 65 20 61 20 76 61 6c 69 64 20 6e 65  so be a valid ne
bc10: 77 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f 20  w offset. So to 
bc20: 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20  determine .  ** 
bc30: 77 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f 72  whether an error
bc40: 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f 63   has actually oc
bc50: 63 75 72 65 64 2c 20 69 74 20 69 73 20 61 6c 73  cured, it is als
bc60: 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 63  o necessary to c
bc70: 61 6c 6c 20 0a 20 20 2a 2a 20 47 65 74 4c 61 73  all .  ** GetLas
bc80: 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20  tError()..  */. 
bc90: 20 64 77 52 65 74 20 3d 20 6f 73 53 65 74 46 69   dwRet = osSetFi
bca0: 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d  lePointer(pFile-
bcb0: 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26  >h, lowerBits, &
bcc0: 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f  upperBits, FILE_
bcd0: 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 20 28  BEGIN);..  if( (
bce0: 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53  dwRet==INVALID_S
bcf0: 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a  ET_FILE_POINTER.
bd00: 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45        && ((lastE
bd10: 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
bd20: 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52  Error())!=NO_ERR
bd30: 4f 52 29 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  OR)) ){.    pFil
bd40: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
bd50: 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69  astErrno;.    wi
bd60: 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
bd70: 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69  _IOERR_SEEK, pFi
bd80: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
bd90: 20 20 20 20 20 20 20 20 20 20 20 20 22 73 65 65              "see
bda0: 6b 57 69 6e 46 69 6c 65 22 2c 20 70 46 69 6c 65  kWinFile", pFile
bdb0: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65  ->zPath);.    re
bdc0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 72  turn 1;.  }..  r
bdd0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
bde0: 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
bdf0: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65 70 6f  **.** It is repo
be00: 72 74 65 64 20 74 68 61 74 20 61 6e 20 61 74 74  rted that an att
be10: 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20 61 20  empt to close a 
be20: 68 61 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d  handle might som
be30: 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20  etimes.** fail. 
be40: 20 54 68 69 73 20 69 73 20 61 20 76 65 72 79 20   This is a very 
be50: 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72 65 73  unreasonable res
be60: 75 6c 74 2c 20 62 75 74 20 57 69 6e 64 6f 77 73  ult, but Windows
be70: 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a   is notorious.**
be80: 20 66 6f 72 20 62 65 69 6e 67 20 75 6e 72 65 61   for being unrea
be90: 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f 20  sonable so I do 
bea0: 6e 6f 74 20 64 6f 75 62 74 20 74 68 61 74 20 69  not doubt that i
beb0: 74 20 6d 69 67 68 74 20 68 61 70 70 65 6e 2e 20  t might happen. 
bec0: 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65   If.** the close
bed0: 20 66 61 69 6c 73 2c 20 77 65 20 70 61 75 73 65   fails, we pause
bee0: 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73 65   for 100 millise
bef0: 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 61 67  conds and try ag
bf00: 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79  ain.  As.** many
bf10: 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54   as MX_CLOSE_ATT
bf20: 45 4d 50 54 20 61 74 74 65 6d 70 74 73 20 74 6f  EMPT attempts to
bf30: 20 63 6c 6f 73 65 20 74 68 65 20 68 61 6e 64 6c   close the handl
bf40: 65 20 61 72 65 20 6d 61 64 65 20 62 65 66 6f 72  e are made befor
bf50: 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70 20 61  e.** giving up a
bf60: 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20  nd returning an 
bf70: 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  error..*/.#defin
bf80: 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  e MX_CLOSE_ATTEM
bf90: 50 54 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20  PT 3.static int 
bfa0: 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  winClose(sqlite3
bfb0: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e  _file *id){.  in
bfc0: 74 20 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20  t rc, cnt = 0;. 
bfd0: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
bfe0: 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
bff0: 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
c000: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46   );.  assert( pF
c010: 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a  ile->pShm==0 );.
c020: 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53    OSTRACE(("CLOS
c030: 45 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E %d\n", pFile->
c040: 68 29 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 72  h));.  do{.    r
c050: 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  c = osCloseHandl
c060: 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20  e(pFile->h);.   
c070: 20 2f 2a 20 53 69 6d 75 6c 61 74 65 49 4f 45 72   /* SimulateIOEr
c080: 72 6f 72 28 20 72 63 3d 30 3b 20 63 6e 74 3d 4d  ror( rc=0; cnt=M
c090: 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 3b  X_CLOSE_ATTEMPT;
c0a0: 20 29 3b 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28   ); */.  }while(
c0b0: 20 72 63 3d 3d 30 20 26 26 20 2b 2b 63 6e 74 20   rc==0 && ++cnt 
c0c0: 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  < MX_CLOSE_ATTEM
c0d0: 50 54 20 26 26 20 28 6f 73 53 6c 65 65 70 28 31  PT && (osSleep(1
c0e0: 30 30 29 2c 20 31 29 20 29 3b 0a 23 69 66 20 53  00), 1) );.#if S
c0f0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23  QLITE_OS_WINCE.#
c100: 64 65 66 69 6e 65 20 57 49 4e 43 45 5f 44 45 4c  define WINCE_DEL
c110: 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33  ETION_ATTEMPTS 3
c120: 0a 20 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c  .  winceDestroyL
c130: 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  ock(pFile);.  if
c140: 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65  ( pFile->zDelete
c150: 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20 69  OnClose ){.    i
c160: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
c170: 77 68 69 6c 65 28 0a 20 20 20 20 20 20 20 20 20  while(.         
c180: 20 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28    osDeleteFileW(
c190: 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
c1a0: 43 6c 6f 73 65 29 3d 3d 30 0a 20 20 20 20 20 20  Close)==0.      
c1b0: 20 20 26 26 20 6f 73 47 65 74 46 69 6c 65 41 74    && osGetFileAt
c1c0: 74 72 69 62 75 74 65 73 57 28 70 46 69 6c 65 2d  tributesW(pFile-
c1d0: 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29  >zDeleteOnClose)
c1e0: 21 3d 30 78 66 66 66 66 66 66 66 66 20 0a 20 20  !=0xffffffff .  
c1f0: 20 20 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c        && cnt++ <
c200: 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f   WINCE_DELETION_
c210: 41 54 54 45 4d 50 54 53 0a 20 20 20 20 29 7b 0a  ATTEMPTS.    ){.
c220: 20 20 20 20 20 20 20 6f 73 53 6c 65 65 70 28 31         osSleep(1
c230: 30 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61 20  00);  /* Wait a 
c240: 6c 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74 72  little before tr
c250: 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20 20  ying again */.  
c260: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
c270: 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65 6c  free(pFile->zDel
c280: 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d  eteOnClose);.  }
c290: 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43  .#endif.  OSTRAC
c2a0: 45 28 28 22 43 4c 4f 53 45 20 25 64 20 25 73 5c  E(("CLOSE %d %s\
c2b0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
c2c0: 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
c2d0: 64 22 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e  d"));.  OpenCoun
c2e0: 74 65 72 28 2d 31 29 3b 0a 20 20 72 65 74 75 72  ter(-1);.  retur
c2f0: 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  n rc ? SQLITE_OK
c300: 0a 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 77  .            : w
c310: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
c320: 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 6f  E_IOERR_CLOSE, o
c330: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
c340: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c350: 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 43             "winC
c360: 6c 6f 73 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  lose", pFile->zP
c370: 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ath);.}../*.** R
c380: 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ead data from a 
c390: 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66  file into a buff
c3a0: 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  er.  Return SQLI
c3b0: 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20  TE_OK if all.** 
c3c0: 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20  bytes were read 
c3d0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64  successfully and
c3e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66   SQLITE_IOERR if
c3f0: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
c400: 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  * wrong..*/.stat
c410: 69 63 20 69 6e 74 20 77 69 6e 52 65 61 64 28 0a  ic int winRead(.
c420: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
c430: 69 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  id,          /* 
c440: 46 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f  File to read fro
c450: 6d 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  m */.  void *pBu
c460: 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
c470: 20 20 2f 2a 20 57 72 69 74 65 20 63 6f 6e 74 65    /* Write conte
c480: 6e 74 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  nt into this buf
c490: 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74  fer */.  int amt
c4a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c4b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c4c0: 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
c4d0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
c4e0: 34 20 6f 66 66 73 65 74 20 20 20 20 20 20 20 2f  4 offset       /
c4f0: 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20  * Begin reading 
c500: 61 74 20 74 68 69 73 20 6f 66 66 73 65 74 20 2a  at this offset *
c510: 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  /.){.  winFile *
c520: 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
c530: 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c 65 20 68  *)id;  /* file h
c540: 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57 4f 52 44  andle */.  DWORD
c550: 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20 20   nRead;         
c560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c570: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
c580: 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  tually read from
c590: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
c5a0: 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20  Retry = 0;      
c5b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c5c0: 6d 62 65 72 20 6f 66 20 72 65 74 72 79 73 20 2a  mber of retrys *
c5d0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  /..  assert( id!
c5e0: 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  =0 );.  Simulate
c5f0: 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
c600: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
c610: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52  );.  OSTRACE(("R
c620: 45 41 44 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e  EAD %d lock=%d\n
c630: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69  ", pFile->h, pFi
c640: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  le->locktype));.
c650: 0a 20 20 69 66 28 20 73 65 65 6b 57 69 6e 46 69  .  if( seekWinFi
c660: 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  le(pFile, offset
c670: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
c680: 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d  SQLITE_FULL;.  }
c690: 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52 65 61  .  while( !osRea
c6a0: 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  dFile(pFile->h, 
c6b0: 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61  pBuf, amt, &nRea
c6c0: 64 2c 20 30 29 20 29 7b 0a 20 20 20 20 44 57 4f  d, 0) ){.    DWO
c6d0: 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
c6e0: 20 20 69 66 28 20 72 65 74 72 79 49 6f 65 72 72    if( retryIoerr
c6f0: 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45  (&nRetry, &lastE
c700: 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65  rrno) ) continue
c710: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  ;.    pFile->las
c720: 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
c730: 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  no;.    return w
c740: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
c750: 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c 20 70 46  E_IOERR_READ, pF
c760: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
c770: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
c780: 6e 52 65 61 64 22 2c 20 70 46 69 6c 65 2d 3e 7a  nRead", pFile->z
c790: 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 6c 6f 67  Path);.  }.  log
c7a0: 49 6f 65 72 72 28 6e 52 65 74 72 79 29 3b 0a 20  Ioerr(nRetry);. 
c7b0: 20 69 66 28 20 6e 52 65 61 64 3c 28 44 57 4f 52   if( nRead<(DWOR
c7c0: 44 29 61 6d 74 20 29 7b 0a 20 20 20 20 2f 2a 20  D)amt ){.    /* 
c7d0: 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20  Unread parts of 
c7e0: 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20  the buffer must 
c7f0: 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a  be zero-filled *
c800: 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28  /.    memset(&((
c810: 63 68 61 72 2a 29 70 42 75 66 29 5b 6e 52 65 61  char*)pBuf)[nRea
c820: 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52 65 61 64  d], 0, amt-nRead
c830: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
c840: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
c850: 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 72 65  _READ;.  }..  re
c860: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c870: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  }../*.** Write d
c880: 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65  ata from a buffe
c890: 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20  r into a file.  
c8a0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
c8b0: 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f   on success.** o
c8c0: 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
c8d0: 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75  or code on failu
c8e0: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
c8f0: 74 20 77 69 6e 57 72 69 74 65 28 0a 20 20 73 71  t winWrite(.  sq
c900: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
c910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c920: 20 46 69 6c 65 20 74 6f 20 77 72 69 74 65 20 69   File to write i
c930: 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  nto */.  const v
c940: 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
c950: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
c960: 62 79 74 65 73 20 74 6f 20 62 65 20 77 72 69 74  bytes to be writ
c970: 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74  ten */.  int amt
c980: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c990: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
c9a0: 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77  er of bytes to w
c9b0: 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rite */.  sqlite
c9c0: 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20  3_int64 offset  
c9d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
c9e0: 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  set into the fil
c9f0: 65 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69  e to begin writi
ca00: 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ng at */.){.  in
ca10: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
ca20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ca30: 20 54 72 75 65 20 69 66 20 65 72 72 6f 72 20 68   True if error h
ca40: 61 73 20 6f 63 63 75 72 65 64 2c 20 65 6c 73 65  as occured, else
ca50: 20 66 61 6c 73 65 20 2a 2f 0a 20 20 77 69 6e 46   false */.  winF
ca60: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
ca70: 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46  nFile*)id;  /* F
ca80: 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ile handle */.  
ca90: 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20  int nRetry = 0; 
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cab0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74  /* Number of ret
cac0: 72 69 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ries */..  asser
cad0: 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73  t( amt>0 );.  as
cae0: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
caf0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
cb00: 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
cb10: 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a 20 20 53  OERR_WRITE);.  S
cb20: 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
cb30: 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
cb40: 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54  TE_FULL);..  OST
cb50: 52 41 43 45 28 28 22 57 52 49 54 45 20 25 64 20  RACE(("WRITE %d 
cb60: 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c  lock=%d\n", pFil
cb70: 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
cb80: 6b 74 79 70 65 29 29 3b 0a 0a 20 20 72 63 20 3d  ktype));..  rc =
cb90: 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46 69   seekWinFile(pFi
cba0: 6c 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69  le, offset);.  i
cbb0: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
cbc0: 75 38 20 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a  u8 *aRem = (u8 *
cbd0: 29 70 42 75 66 3b 20 20 20 20 20 20 20 20 2f 2a  )pBuf;        /*
cbe0: 20 44 61 74 61 20 79 65 74 20 74 6f 20 62 65 20   Data yet to be 
cbf0: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69  written */.    i
cc00: 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20  nt nRem = amt;  
cc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cc20: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
cc30: 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65  yet to be writte
cc40: 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e  n */.    DWORD n
cc50: 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
cc60: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
cc70: 77 72 69 74 74 65 6e 20 62 79 20 65 61 63 68 20  written by each 
cc80: 57 72 69 74 65 46 69 6c 65 28 29 20 63 61 6c 6c  WriteFile() call
cc90: 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6c 61   */.    DWORD la
cca0: 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52  stErrno = NO_ERR
ccb0: 4f 52 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20 72  OR;   /* Value r
ccc0: 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61  eturned by GetLa
ccd0: 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20 20  stError() */..  
cce0: 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20    while( nRem>0 
ccf0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73  ){.      if( !os
cd00: 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d  WriteFile(pFile-
cd10: 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20  >h, aRem, nRem, 
cd20: 26 6e 57 72 69 74 65 2c 20 30 29 20 29 7b 0a 20  &nWrite, 0) ){. 
cd30: 20 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79         if( retry
cd40: 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26  Ioerr(&nRetry, &
cd50: 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e  lastErrno) ) con
cd60: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 62  tinue;.        b
cd70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
cd80: 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 3c 3d      if( nWrite<=
cd90: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
cda0: 20 61 52 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b   aRem += nWrite;
cdb0: 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e  .      nRem -= n
cdc0: 57 72 69 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Write;.    }.   
cdd0: 20 69 66 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20   if( nRem>0 ){. 
cde0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
cdf0: 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
ce00: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  o;.      rc = 1;
ce10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
ce20: 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20  ( rc ){.    if( 
ce30: 20 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45    ( pFile->lastE
ce40: 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44  rrno==ERROR_HAND
ce50: 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20  LE_DISK_FULL ). 
ce60: 20 20 20 20 20 20 7c 7c 20 28 20 70 46 69 6c 65        || ( pFile
ce70: 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  ->lastErrno==ERR
ce80: 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b  OR_DISK_FULL )){
ce90: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
cea0: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d  LITE_FULL;.    }
ceb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
cec0: 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
ced0: 4f 45 52 52 5f 57 52 49 54 45 2c 20 70 46 69 6c  OERR_WRITE, pFil
cee0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
cef0: 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 57             "winW
cf00: 72 69 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  rite", pFile->zP
cf10: 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ath);.  }else{. 
cf20: 20 20 20 6c 6f 67 49 6f 65 72 72 28 6e 52 65 74     logIoerr(nRet
cf30: 72 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ry);.  }.  retur
cf40: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
cf50: 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61  /*.** Truncate a
cf60: 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61  n open file to a
cf70: 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a   specified size.
cf80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
cf90: 6e 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65  nTruncate(sqlite
cfa0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69  3_file *id, sqli
cfb0: 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29  te3_int64 nByte)
cfc0: 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
cfd0: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
cfe0: 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64  d;  /* File hand
cff0: 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  le object */.  i
d000: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
d010: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
d020: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 6f  * Return code fo
d030: 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
d040: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  */..  assert( pF
d050: 69 6c 65 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  ile );..  OSTRAC
d060: 45 28 28 22 54 52 55 4e 43 41 54 45 20 25 64 20  E(("TRUNCATE %d 
d070: 25 6c 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %lld\n", pFile->
d080: 68 2c 20 6e 42 79 74 65 29 29 3b 0a 20 20 53 69  h, nByte));.  Si
d090: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
d0a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
d0b0: 52 5f 54 52 55 4e 43 41 54 45 29 3b 0a 0a 20 20  R_TRUNCATE);..  
d0c0: 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68  /* If the user h
d0d0: 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20  as configured a 
d0e0: 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74  chunk-size for t
d0f0: 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61  his file, trunca
d100: 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65  te the.  ** file
d110: 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73   so that it cons
d120: 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67  ists of an integ
d130: 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75  er number of chu
d140: 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20  nks (i.e. the.  
d150: 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73  ** actual file s
d160: 69 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f 70  ize after the op
d170: 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c  eration may be l
d180: 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 72  arger than the r
d190: 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69  equested.  ** si
d1a0: 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ze)..  */.  if( 
d1b0: 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30  pFile->szChunk>0
d1c0: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
d1d0: 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d  ((nByte + pFile-
d1e0: 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46  >szChunk - 1)/pF
d1f0: 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20  ile->szChunk) * 
d200: 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a  pFile->szChunk;.
d210: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 45 6e 64    }..  /* SetEnd
d220: 4f 66 46 69 6c 65 28 29 20 72 65 74 75 72 6e 73  OfFile() returns
d230: 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 73   non-zero when s
d240: 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 7a 65  uccessful, or ze
d250: 72 6f 20 77 68 65 6e 20 69 74 20 66 61 69 6c 73  ro when it fails
d260: 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 65 6b 57  . */.  if( seekW
d270: 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42  inFile(pFile, nB
d280: 79 74 65 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  yte) ){.    rc =
d290: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
d2a0: 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
d2b0: 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  TE, pFile->lastE
d2c0: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
d2d0: 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65 31     "winTruncate1
d2e0: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
d2f0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 30 3d  ;.  }else if( 0=
d300: 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 28  =osSetEndOfFile(
d310: 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20 20  pFile->h) ){.   
d320: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
d330: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
d340: 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 77  or();.    rc = w
d350: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
d360: 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
d370: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
d380: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
d390: 20 22 77 69 6e 54 72 75 6e 63 61 74 65 32 22 2c   "winTruncate2",
d3a0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
d3b0: 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
d3c0: 22 54 52 55 4e 43 41 54 45 20 25 64 20 25 6c 6c  "TRUNCATE %d %ll
d3d0: 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d %s\n", pFile->
d3e0: 68 2c 20 6e 42 79 74 65 2c 20 72 63 20 3f 20 22  h, nByte, rc ? "
d3f0: 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29  failed" : "ok"))
d400: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
d410: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
d420: 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  TEST./*.** Count
d430: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
d440: 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72  ullsyncs and nor
d450: 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73  mal syncs.  This
d460: 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
d470: 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61  .** that syncs a
d480: 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65  nd fullsyncs are
d490: 20 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68 65   occuring at the
d4a0: 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f   right times..*/
d4b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e  .int sqlite3_syn
d4c0: 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74  c_count = 0;.int
d4d0: 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
d4e0: 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  c_count = 0;.#en
d4f0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  dif../*.** Make 
d500: 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20  sure all writes 
d510: 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  to a particular 
d520: 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74  file are committ
d530: 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73  ed to disk..*/.s
d540: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 79 6e  tatic int winSyn
d550: 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  c(sqlite3_file *
d560: 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  id, int flags){.
d570: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e  #ifndef SQLITE_N
d580: 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a  O_SYNC.  /*.  **
d590: 20 55 73 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20   Used only when 
d5a0: 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69  SQLITE_NO_SYNC i
d5b0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e 0a 20  s not defined.. 
d5c0: 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a    */.  BOOL rc;.
d5d0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
d5e0: 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 21  ned(NDEBUG) || !
d5f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e  defined(SQLITE_N
d600: 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c 0a 20 20 20  O_SYNC) || \.   
d610: 20 28 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   (defined(SQLITE
d620: 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65  _TEST) && define
d630: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 29  d(SQLITE_DEBUG))
d640: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20  .  /*.  ** Used 
d650: 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  when SQLITE_NO_S
d660: 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  YNC is not defin
d670: 65 64 20 61 6e 64 20 62 79 20 74 68 65 20 61 73  ed and by the as
d680: 73 65 72 74 28 29 20 61 6e 64 2f 6f 72 0a 20 20  sert() and/or.  
d690: 2a 2a 20 4f 53 54 52 41 43 45 28 29 20 6d 61 63  ** OSTRACE() mac
d6a0: 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20 77 69 6e  ros..   */.  win
d6b0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
d6c0: 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 23 65 6c 73  inFile*)id;.#els
d6d0: 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
d6e0: 45 54 45 52 28 69 64 29 3b 0a 23 65 6e 64 69 66  ETER(id);.#endif
d6f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
d700: 65 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20  e );.  /* Check 
d710: 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49  that one of SQLI
d720: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  TE_SYNC_NORMAL o
d730: 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65  r FULL was passe
d740: 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66  d */.  assert((f
d750: 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
d760: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20  TE_SYNC_NORMAL. 
d770: 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30       || (flags&0
d780: 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
d790: 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 4f  C_FULL.  );..  O
d7a0: 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 25 64  STRACE(("SYNC %d
d7b0: 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69   lock=%d\n", pFi
d7c0: 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
d7d0: 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20  cktype));..  /* 
d7e0: 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74  Unix cannot, but
d7f0: 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61   some systems ma
d800: 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
d810: 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20  FULL from here. 
d820: 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69  This.  ** line i
d830: 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64  s to test that d
d840: 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74  oing so does not
d850: 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c   cause any probl
d860: 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ems..  */.  Simu
d870: 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
d880: 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
d890: 5f 46 55 4c 4c 20 29 3b 0a 0a 23 69 66 6e 64 65  _FULL );..#ifnde
d8a0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
d8b0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
d8c0: 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65 0a 20  (flags);.#else. 
d8d0: 20 69 66 28 20 28 66 6c 61 67 73 26 30 78 30 46   if( (flags&0x0F
d8e0: 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
d8f0: 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ULL ){.    sqlit
d900: 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
d910: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  t++;.  }.  sqlit
d920: 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  e3_sync_count++;
d930: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
d940: 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   we compiled wit
d950: 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f  h the SQLITE_NO_
d960: 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20  SYNC flag, then 
d970: 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a  syncing is a.  *
d980: 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66  * no-op.  */.#if
d990: 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
d9a0: 4e 43 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  NC.  return SQLI
d9b0: 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 72  TE_OK;.#else.  r
d9c0: 63 20 3d 20 6f 73 46 6c 75 73 68 46 69 6c 65 42  c = osFlushFileB
d9d0: 75 66 66 65 72 73 28 70 46 69 6c 65 2d 3e 68 29  uffers(pFile->h)
d9e0: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
d9f0: 72 6f 72 28 20 72 63 3d 46 41 4c 53 45 20 29 3b  ror( rc=FALSE );
da00: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
da10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
da20: 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
da30: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
da40: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
da50: 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  r();.    return 
da60: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
da70: 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20  TE_IOERR_FSYNC, 
da80: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
da90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
daa0: 77 69 6e 53 79 6e 63 22 2c 20 70 46 69 6c 65 2d  winSync", pFile-
dab0: 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 65 6e  >zPath);.  }.#en
dac0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  dif.}../*.** Det
dad0: 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65  ermine the curre
dae0: 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c  nt size of a fil
daf0: 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74  e in bytes.*/.st
db00: 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65  atic int winFile
db10: 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
db20: 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69  e *id, sqlite3_i
db30: 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20  nt64 *pSize){.  
db40: 44 57 4f 52 44 20 75 70 70 65 72 42 69 74 73 3b  DWORD upperBits;
db50: 0a 20 20 44 57 4f 52 44 20 6c 6f 77 65 72 42 69  .  DWORD lowerBi
db60: 74 73 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  ts;.  winFile *p
db70: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
db80: 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  )id;.  DWORD las
db90: 74 45 72 72 6e 6f 3b 0a 0a 20 20 61 73 73 65 72  tErrno;..  asser
dba0: 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53 69  t( id!=0 );.  Si
dbb0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
dbc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
dbd0: 52 5f 46 53 54 41 54 29 3b 0a 20 20 6c 6f 77 65  R_FSTAT);.  lowe
dbe0: 72 42 69 74 73 20 3d 20 6f 73 47 65 74 46 69 6c  rBits = osGetFil
dbf0: 65 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20  eSize(pFile->h, 
dc00: 26 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20 69  &upperBits);.  i
dc10: 66 28 20 20 20 28 6c 6f 77 65 72 42 69 74 73 20  f(   (lowerBits 
dc20: 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  == INVALID_FILE_
dc30: 53 49 5a 45 29 0a 20 20 20 20 20 26 26 20 28 28  SIZE).     && ((
dc40: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
dc50: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e  tLastError())!=N
dc60: 4f 5f 45 52 52 4f 52 29 20 29 0a 20 20 7b 0a 20  O_ERROR) ).  {. 
dc70: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
dc80: 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
dc90: 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
dca0: 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
dcb0: 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c  OERR_FSTAT, pFil
dcc0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
dcd0: 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
dce0: 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d  ileSize", pFile-
dcf0: 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 2a  >zPath);.  }.  *
dd00: 70 53 69 7a 65 20 3d 20 28 28 28 73 71 6c 69 74  pSize = (((sqlit
dd10: 65 33 5f 69 6e 74 36 34 29 75 70 70 65 72 42 69  e3_int64)upperBi
dd20: 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72  ts)<<32) + lower
dd30: 42 69 74 73 3b 0a 20 20 72 65 74 75 72 6e 20 53  Bits;.  return S
dd40: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
dd50: 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ** LOCKFILE_FAIL
dd60: 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 69 73 20  _IMMEDIATELY is 
dd70: 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d  undefined on som
dd80: 65 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  e Windows system
dd90: 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f  s..*/.#ifndef LO
dda0: 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
ddb0: 44 49 41 54 45 4c 59 0a 23 20 64 65 66 69 6e 65  DIATELY.# define
ddc0: 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
ddd0: 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a 23 65 6e  MMEDIATELY 1.#en
dde0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  dif../*.** Acqui
ddf0: 72 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b  re a reader lock
de00: 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 41  ..** Different A
de10: 50 49 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  PI routines are 
de20: 63 61 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e 67  called depending
de30: 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
de40: 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73 20 57 69  ot this.** is Wi
de50: 6e 39 78 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f  n9x or WinNT..*/
de60: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 52  .static int getR
de70: 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20  eadLock(winFile 
de80: 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72  *pFile){.  int r
de90: 65 73 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29  es;.  if( isNT()
dea0: 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50   ){.    OVERLAPP
deb0: 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6f 76 6c  ED ovlp;.    ovl
dec0: 70 2e 4f 66 66 73 65 74 20 3d 20 53 48 41 52 45  p.Offset = SHARE
ded0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6f 76 6c  D_FIRST;.    ovl
dee0: 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 30  p.OffsetHigh = 0
def0: 3b 0a 20 20 20 20 6f 76 6c 70 2e 68 45 76 65 6e  ;.    ovlp.hEven
df00: 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 73 20 3d  t = 0;.    res =
df10: 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 28 70 46   osLockFileEx(pF
df20: 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 46 49 4c 45  ile->h, LOCKFILE
df30: 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
df40: 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y,.             
df50: 20 20 20 20 20 20 20 20 20 20 30 2c 20 53 48 41            0, SHA
df60: 52 45 44 5f 53 49 5a 45 2c 20 30 2c 20 26 6f 76  RED_SIZE, 0, &ov
df70: 6c 70 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69  lp);./* isNT() i
df80: 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53  s 1 if SQLITE_OS
df90: 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68  _WINCE==1, so th
dfa0: 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72  is else is never
dfb0: 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2f 0a 23   executed. .*/.#
dfc0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
dfd0: 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20  CE==0.  }else{. 
dfe0: 20 20 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73     int lk;.    s
dff0: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
e000: 73 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c  s(sizeof(lk), &l
e010: 6b 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73  k);.    pFile->s
e020: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20  haredLockByte = 
e030: 28 73 68 6f 72 74 29 28 28 6c 6b 20 26 20 30 78  (short)((lk & 0x
e040: 37 66 66 66 66 66 66 66 29 25 28 53 48 41 52 45  7fffffff)%(SHARE
e050: 44 5f 53 49 5a 45 20 2d 20 31 29 29 3b 0a 20 20  D_SIZE - 1));.  
e060: 20 20 72 65 73 20 3d 20 6f 73 4c 6f 63 6b 46 69    res = osLockFi
e070: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  le(pFile->h, SHA
e080: 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d  RED_FIRST+pFile-
e090: 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c  >sharedLockByte,
e0a0: 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65 6e 64 69   0, 1, 0);.#endi
e0b0: 66 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 73 20  f.  }.  if( res 
e0c0: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  == 0 ){.    pFil
e0d0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
e0e0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
e0f0: 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20  .    /* No need 
e100: 74 6f 20 6c 6f 67 20 61 20 66 61 69 6c 75 72 65  to log a failure
e110: 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a   to lock */.  }.
e120: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
e130: 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 72 65  ./*.** Undo a re
e140: 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63  adlock.*/.static
e150: 20 69 6e 74 20 75 6e 6c 6f 63 6b 52 65 61 64 4c   int unlockReadL
e160: 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ock(winFile *pFi
e170: 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  le){.  int res;.
e180: 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
e190: 6f 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  o;.  if( isNT() 
e1a0: 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 6f 73 55  ){.    res = osU
e1b0: 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d  nlockFile(pFile-
e1c0: 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
e1d0: 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  , 0, SHARED_SIZE
e1e0: 2c 20 30 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20  , 0);./* isNT() 
e1f0: 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f  is 1 if SQLITE_O
e200: 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74  S_WINCE==1, so t
e210: 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65  his else is neve
e220: 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2f 0a  r executed. .*/.
e230: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
e240: 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a  NCE==0.  }else{.
e250: 20 20 20 20 72 65 73 20 3d 20 6f 73 55 6e 6c 6f      res = osUnlo
e260: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
e270: 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20   SHARED_FIRST + 
e280: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
e290: 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b  kByte, 0, 1, 0);
e2a0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66  .#endif.  }.  if
e2b0: 28 20 72 65 73 3d 3d 30 20 26 26 20 28 28 6c 61  ( res==0 && ((la
e2c0: 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
e2d0: 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52  astError())!=ERR
e2e0: 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29 20 29  OR_NOT_LOCKED) )
e2f0: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
e300: 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
e310: 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  no;.    winLogEr
e320: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
e330: 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65 2d 3e  _UNLOCK, pFile->
e340: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
e350: 20 20 20 20 20 20 20 20 22 75 6e 6c 6f 63 6b 52          "unlockR
e360: 65 61 64 4c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d  eadLock", pFile-
e370: 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72  >zPath);.  }.  r
e380: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
e390: 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
e3a0: 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
e3b0: 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
e3c0: 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20  ameter locktype 
e3d0: 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
e3e0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
e3f0: 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
e400: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
e410: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
e420: 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
e430: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
e440: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
e450: 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
e460: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
e470: 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
e480: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
e490: 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
e4a0: 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
e4b0: 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
e4c0: 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
e4d0: 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
e4e0: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
e4f0: 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
e500: 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
e510: 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
e520: 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
e530: 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
e540: 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
e550: 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
e560: 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
e570: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
e580: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
e590: 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
e5a0: 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
e5b0: 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
e5c0: 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
e5d0: 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
e5e0: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
e5f0: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
e600: 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
e610: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
e620: 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
e630: 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
e640: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
e650: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
e660: 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54  rease a lock.  T
e670: 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72  he winUnlock() r
e680: 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73  outine.** erases
e690: 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e   all locks at on
e6a0: 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 75  ce and returns u
e6b0: 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  s immediately to
e6c0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30   locking level 0
e6d0: 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70  ..** It is not p
e6e0: 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72  ossible to lower
e6f0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
e700: 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20 61  el one step at a
e710: 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d   time.  You.** m
e720: 75 73 74 20 67 6f 20 73 74 72 61 69 67 68 74 20  ust go straight 
e730: 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  to locking level
e740: 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
e750: 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74 65  t winLock(sqlite
e760: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
e770: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
e780: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e790: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
e7a0: 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69  de from subrouti
e7b0: 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  nes */.  int res
e7c0: 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
e7d0: 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 20 57  /* Result of a W
e7e0: 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c  indows lock call
e7f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63   */.  int newLoc
e800: 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20  ktype;       /* 
e810: 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  Set pFile->lockt
e820: 79 70 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ype to this valu
e830: 65 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  e before exiting
e840: 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e   */.  int gotPen
e850: 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20  dingLock = 0;/* 
e860: 54 72 75 65 20 69 66 20 77 65 20 61 63 71 75 69  True if we acqui
e870: 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  red a PENDING lo
e880: 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a  ck this time */.
e890: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
e8a0: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
e8b0: 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
e8c0: 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a  no = NO_ERROR;..
e8d0: 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
e8e0: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
e8f0: 4f 43 4b 20 25 64 20 25 64 20 77 61 73 20 25 64  OCK %d %d was %d
e900: 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  (%d)\n",.       
e910: 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f      pFile->h, lo
e920: 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 6c  cktype, pFile->l
e930: 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e  ocktype, pFile->
e940: 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 29 29  sharedLockByte))
e950: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
e960: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f   is already a lo
e970: 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ck of this type 
e980: 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74  or more restrict
e990: 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ive on the.  ** 
e9a0: 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69  OsFile, do nothi
e9b0: 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68  ng. Don't use th
e9c0: 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  e end_lock: exit
e9d0: 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 73   path, as.  ** s
e9e0: 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74  qlite3OsEnterMut
e9f0: 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
ea00: 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
ea10: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
ea20: 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70  ocktype>=locktyp
ea30: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
ea40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
ea50: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
ea60: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
ea70: 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20  nce is correct. 
ea80: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
ea90: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e  ile->locktype!=N
eaa0: 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79  O_LOCK || lockty
eab0: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
eac0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
ead0: 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c  ktype!=PENDING_L
eae0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
eaf0: 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52   locktype!=RESER
eb00: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
eb10: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  e->locktype==SHA
eb20: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  RED_LOCK );..  /
eb30: 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e 44 49  * Lock the PENDI
eb40: 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 66 20  NG_LOCK byte if 
eb50: 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71 75 69  we need to acqui
eb60: 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  re a PENDING loc
eb70: 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48 41 52  k or.  ** a SHAR
eb80: 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77 65 20  ED lock.  If we 
eb90: 61 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20  are acquiring a 
eba0: 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
ebb0: 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f 66 0a   acquisition of.
ebc0: 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49 4e 47    ** the PENDING
ebd0: 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20 74 65  _LOCK byte is te
ebe0: 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  mporary..  */.  
ebf0: 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 70 46  newLocktype = pF
ec00: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  ile->locktype;. 
ec10: 20 69 66 28 20 20 20 28 70 46 69 6c 65 2d 3e 6c   if(   (pFile->l
ec20: 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
ec30: 29 0a 20 20 20 20 20 7c 7c 20 28 20 20 20 28 6c  ).     || (   (l
ec40: 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
ec50: 56 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20  VE_LOCK).       
ec60: 20 20 26 26 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    && (pFile->loc
ec70: 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f  ktype==RESERVED_
ec80: 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20  LOCK)).  ){.    
ec90: 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20 20 20  int cnt = 3;.   
eca0: 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20   while( cnt-->0 
ecb0: 26 26 20 28 72 65 73 20 3d 20 6f 73 4c 6f 63 6b  && (res = osLock
ecc0: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50  File(pFile->h, P
ecd0: 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20  ENDING_BYTE, 0, 
ece0: 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20  1, 0))==0 ){.   
ecf0: 20 20 20 2f 2a 20 54 72 79 20 33 20 74 69 6d 65     /* Try 3 time
ed00: 73 20 74 6f 20 67 65 74 20 74 68 65 20 70 65 6e  s to get the pen
ed10: 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68 69 73  ding lock.  This
ed20: 20 69 73 20 6e 65 65 64 65 64 20 74 6f 20 77 6f   is needed to wo
ed30: 72 6b 0a 20 20 20 20 20 20 2a 2a 20 61 72 6f 75  rk.      ** arou
ed40: 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63 61 75 73  nd problems caus
ed50: 65 64 20 62 79 20 69 6e 64 65 78 69 6e 67 20 61  ed by indexing a
ed60: 6e 64 2f 6f 72 20 61 6e 74 69 2d 76 69 72 75 73  nd/or anti-virus
ed70: 20 73 6f 66 74 77 61 72 65 20 6f 6e 0a 20 20 20   software on.   
ed80: 20 20 20 2a 2a 20 57 69 6e 64 6f 77 73 20 73 79     ** Windows sy
ed90: 73 74 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2a 20  stems..      ** 
eda0: 49 66 20 79 6f 75 20 61 72 65 20 75 73 69 6e 67  If you are using
edb0: 20 74 68 69 73 20 63 6f 64 65 20 61 73 20 61 20   this code as a 
edc0: 6d 6f 64 65 6c 20 66 6f 72 20 61 6c 74 65 72 6e  model for altern
edd0: 61 74 69 76 65 20 56 46 53 65 73 2c 20 64 6f 20  ative VFSes, do 
ede0: 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70  not.      ** cop
edf0: 79 20 74 68 69 73 20 72 65 74 72 79 20 6c 6f 67  y this retry log
ee00: 69 63 2e 20 20 49 74 20 69 73 20 61 20 68 61 63  ic.  It is a hac
ee10: 6b 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 57  k intended for W
ee20: 69 6e 64 6f 77 73 20 6f 6e 6c 79 2e 0a 20 20 20  indows only..   
ee30: 20 20 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52     */.      OSTR
ee40: 41 43 45 28 28 22 63 6f 75 6c 64 20 6e 6f 74 20  ACE(("could not 
ee50: 67 65 74 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  get a PENDING lo
ee60: 63 6b 2e 20 63 6e 74 3d 25 64 5c 6e 22 2c 20 63  ck. cnt=%d\n", c
ee70: 6e 74 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nt));.      if( 
ee80: 63 6e 74 20 29 20 6f 73 53 6c 65 65 70 28 31 29  cnt ) osSleep(1)
ee90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50  ;.    }.    gotP
eea0: 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73  endingLock = res
eeb0: 3b 0a 20 20 20 20 69 66 28 20 21 72 65 73 20 29  ;.    if( !res )
eec0: 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
eed0: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
eee0: 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  or();.    }.  }.
eef0: 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
ef00: 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f  shared lock.  */
ef10: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
ef20: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
ef30: 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72  res ){.    asser
ef40: 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
ef50: 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20  pe==NO_LOCK );. 
ef60: 20 20 20 72 65 73 20 3d 20 67 65 74 52 65 61 64     res = getRead
ef70: 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20  Lock(pFile);.   
ef80: 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
ef90: 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
efa0: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
efb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61   }else{.      la
efc0: 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
efd0: 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
efe0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75  }.  }..  /* Acqu
eff0: 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c  ire a RESERVED l
f000: 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
f010: 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45  ocktype==RESERVE
f020: 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  D_LOCK && res ){
f030: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
f040: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  le->locktype==SH
f050: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
f060: 20 72 65 73 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c   res = osLockFil
f070: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45  e(pFile->h, RESE
f080: 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
f090: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73   0);.    if( res
f0a0: 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
f0b0: 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56 45 44  ktype = RESERVED
f0c0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
f0d0: 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
f0e0: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
f0f0: 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  or();.    }.  }.
f100: 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
f110: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a  PENDING lock.  *
f120: 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
f130: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
f140: 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 6e   && res ){.    n
f150: 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e  ewLocktype = PEN
f160: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67  DING_LOCK;.    g
f170: 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
f180: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71  0;.  }..  /* Acq
f190: 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
f1a0: 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  E lock.  */.  if
f1b0: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  ( locktype==EXCL
f1c0: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65  USIVE_LOCK && re
f1d0: 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  s ){.    assert(
f1e0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
f1f0: 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
f200: 0a 20 20 20 20 72 65 73 20 3d 20 75 6e 6c 6f 63  .    res = unloc
f210: 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  kReadLock(pFile)
f220: 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
f230: 75 6e 72 65 61 64 6c 6f 63 6b 20 3d 20 25 64 5c  unreadlock = %d\
f240: 6e 22 2c 20 72 65 73 29 29 3b 0a 20 20 20 20 72  n", res));.    r
f250: 65 73 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65 28  es = osLockFile(
f260: 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
f270: 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45  _FIRST, 0, SHARE
f280: 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20  D_SIZE, 0);.    
f290: 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
f2a0: 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45   newLocktype = E
f2b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20  XCLUSIVE_LOCK;. 
f2c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f2d0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
f2e0: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
f2f0: 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 65 72      OSTRACE(("er
f300: 72 6f 72 2d 63 6f 64 65 20 3d 20 25 64 5c 6e 22  ror-code = %d\n"
f310: 2c 20 6c 61 73 74 45 72 72 6e 6f 29 29 3b 0a 20  , lastErrno));. 
f320: 20 20 20 20 20 67 65 74 52 65 61 64 4c 6f 63 6b       getReadLock
f330: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
f340: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61   }..  /* If we a
f350: 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e  re holding a PEN
f360: 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f  DING lock that o
f370: 75 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61  ught to be relea
f380: 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72  sed, then.  ** r
f390: 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20  elease it now.. 
f3a0: 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e   */.  if( gotPen
f3b0: 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b  dingLock && lock
f3c0: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
f3d0: 4b 20 29 7b 0a 20 20 20 20 6f 73 55 6e 6c 6f 63  K ){.    osUnloc
f3e0: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
f3f0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c  PENDING_BYTE, 0,
f400: 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f   1, 0);.  }..  /
f410: 2a 20 55 70 64 61 74 65 20 74 68 65 20 73 74 61  * Update the sta
f420: 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68  te of the lock h
f430: 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66  as held in the f
f440: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
f450: 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  hen.  ** return 
f460: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
f470: 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a  result code..  *
f480: 2f 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20  /.  if( res ){. 
f490: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
f4a0: 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
f4b0: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 46  OSTRACE(("LOCK F
f4c0: 41 49 4c 45 44 20 25 64 20 74 72 79 69 6e 67 20  AILED %d trying 
f4d0: 66 6f 72 20 25 64 20 62 75 74 20 67 6f 74 20 25  for %d but got %
f4e0: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  d\n", pFile->h,.
f4f0: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74             lockt
f500: 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65  ype, newLocktype
f510: 29 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ));.    pFile->l
f520: 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
f530: 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 53  rrno;.    rc = S
f540: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
f550: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
f560: 65 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74  e = (u8)newLockt
f570: 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ype;.  return rc
f580: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
f590: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
f5a0: 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
f5b0: 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
f5c0: 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
f5d0: 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
f5e0: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
f5f0: 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
f600: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72   lock is held, r
f610: 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
f620: 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65 72  o, otherwise zer
f630: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
f640: 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65   winCheckReserve
f650: 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
f660: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
f670: 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  sOut){.  int rc;
f680: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
f690: 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
f6a0: 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
f6b0: 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
f6c0: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
f6d0: 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
f6e0: 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
f6f0: 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
f700: 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52  >locktype>=RESER
f710: 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  VED_LOCK ){.    
f720: 72 63 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52  rc = 1;.    OSTR
f730: 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
f740: 43 4b 20 25 64 20 25 64 20 28 6c 6f 63 61 6c 29  CK %d %d (local)
f750: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
f760: 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  c));.  }else{.  
f770: 20 20 72 63 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c    rc = osLockFil
f780: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45  e(pFile->h, RESE
f790: 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
f7a0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
f7b0: 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 6f 63  ){.      osUnloc
f7c0: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
f7d0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
f7e0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 0);.    }. 
f7f0: 20 20 20 72 63 20 3d 20 21 72 63 3b 0a 20 20 20     rc = !rc;.   
f800: 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
f810: 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 72  WR-LOCK %d %d (r
f820: 65 6d 6f 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65  emote)\n", pFile
f830: 2d 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d 0a 20  ->h, rc));.  }. 
f840: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a   *pResOut = rc;.
f850: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f860: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  OK;.}../*.** Low
f870: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
f880: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
f890: 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f  criptor id to lo
f8a0: 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70  cktype.  locktyp
f8b0: 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  e.** must be eit
f8c0: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
f8d0: 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
f8e0: 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
f8f0: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
f900: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
f910: 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
f920: 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
f930: 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
f940: 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
f950: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
f960: 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f  .** It is not po
f970: 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20  ssible for this 
f980: 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c 20  routine to fail 
f990: 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
f9a0: 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f  gument.** is NO_
f9b0: 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 73 65  LOCK.  If the se
f9c0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
f9d0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65   SHARED_LOCK the
f9e0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
f9f0: 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 53  * might return S
fa00: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a  QLITE_IOERR;.*/.
fa10: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e  static int winUn
fa20: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
fa30: 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
fa40: 79 70 65 29 7b 0a 20 20 69 6e 74 20 74 79 70 65  ype){.  int type
fa50: 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  ;.  winFile *pFi
fa60: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
fa70: 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
fa80: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
fa90: 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20  t( pFile!=0 );. 
faa0: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
fab0: 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e<=SHARED_LOCK )
fac0: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
fad0: 4c 4f 43 4b 20 25 64 20 74 6f 20 25 64 20 77 61  LOCK %d to %d wa
fae0: 73 20 25 64 28 25 64 29 5c 6e 22 2c 20 70 46 69  s %d(%d)\n", pFi
faf0: 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c  le->h, locktype,
fb00: 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
fb10: 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c  ->locktype, pFil
fb20: 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e->sharedLockByt
fb30: 65 29 29 3b 0a 20 20 74 79 70 65 20 3d 20 70 46  e));.  type = pF
fb40: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  ile->locktype;. 
fb50: 20 69 66 28 20 74 79 70 65 3e 3d 45 58 43 4c 55   if( type>=EXCLU
fb60: 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
fb70: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46   osUnlockFile(pF
fb80: 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
fb90: 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f  IRST, 0, SHARED_
fba0: 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  SIZE, 0);.    if
fbb0: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
fbc0: 45 44 5f 4c 4f 43 4b 20 26 26 20 21 67 65 74 52  ED_LOCK && !getR
fbd0: 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 20 29  eadLock(pFile) )
fbe0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
fbf0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
fc00: 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c 64 20  pen.  We should 
fc10: 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65 20 74  always be able t
fc20: 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 63 71  o.      ** reacq
fc30: 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
fc40: 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  ck */.      rc =
fc50: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
fc60: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
fc70: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
fc80: 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
fc90: 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20     "winUnlock", 
fca0: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
fcb0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74     }.  }.  if( t
fcc0: 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype>=RESERVED_LO
fcd0: 43 4b 20 29 7b 0a 20 20 20 20 6f 73 55 6e 6c 6f  CK ){.    osUnlo
fce0: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
fcf0: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
fd00: 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 1, 0);.  }.  
fd10: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  if( locktype==NO
fd20: 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53  _LOCK && type>=S
fd30: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
fd40: 20 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b    unlockReadLock
fd50: 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69  (pFile);.  }.  i
fd60: 66 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47  f( type>=PENDING
fd70: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 6f 73 55  _LOCK ){.    osU
fd80: 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d  nlockFile(pFile-
fd90: 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  >h, PENDING_BYTE
fda0: 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
fdb0: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
fdc0: 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65  e = (u8)locktype
fdd0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
fde0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67  ../*.** If *pArg
fdf0: 20 69 73 20 69 6e 69 74 69 74 69 61 6c 6c 79 20   is inititially 
fe00: 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20 74 68  negative then th
fe10: 69 73 20 69 73 20 61 20 71 75 65 72 79 2e 20 20  is is a query.  
fe20: 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20  Set *pArg to.** 
fe30: 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67  1 or 0 depending
fe40: 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
fe50: 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70  ot bit mask of p
fe60: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
fe70: 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  is set..**.** If
fe80: 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20 31   *pArg is 0 or 1
fe90: 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20  , then clear or 
fea0: 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74  set the mask bit
feb0: 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46   of pFile->ctrlF
fec0: 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lags..*/.static 
fed0: 76 6f 69 64 20 77 69 6e 4d 6f 64 65 42 69 74 28  void winModeBit(
fee0: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  winFile *pFile, 
fef0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61  unsigned char ma
ff00: 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a  sk, int *pArg){.
ff10: 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b    if( *pArg<0 ){
ff20: 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46  .    *pArg = (pF
ff30: 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
ff40: 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c   mask)!=0;.  }el
ff50: 73 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d  se if( (*pArg)==
ff60: 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 ){.    pFile->
ff70: 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61  ctrlFlags &= ~ma
ff80: 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  sk;.  }else{.   
ff90: 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
ffa0: 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d  s |= mask;.  }.}
ffb0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20  ../*.** Control 
ffc0: 61 6e 64 20 71 75 65 72 79 20 6f 66 20 74 68 65  and query of the
ffd0: 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c   open file handl
ffe0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
fff0: 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 28   winFileControl(
10000 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
10010 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
10020 70 41 72 67 29 7b 0a 20 20 77 69 6e 46 69 6c 65  pArg){.  winFile
10030 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
10040 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69 74 63 68  le*)id;.  switch
10050 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
10060 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f   SQLITE_FCNTL_LO
10070 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20  CKSTATE: {.     
10080 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70   *(int*)pArg = p
10090 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a  File->locktype;.
100a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
100b0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
100c0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41    case SQLITE_LA
100d0 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20  ST_ERRNO: {.    
100e0 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
100f0 28 69 6e 74 29 70 46 69 6c 65 2d 3e 6c 61 73 74  (int)pFile->last
10100 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74  Errno;.      ret
10110 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10120 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
10130 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b  LITE_FCNTL_CHUNK
10140 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70  _SIZE: {.      p
10150 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20  File->szChunk = 
10160 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20  *(int *)pArg;.  
10170 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10180 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
10190 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
101a0 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20  L_SIZE_HINT: {. 
101b0 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e       if( pFile->
101c0 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20  szChunk>0 ){.   
101d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
101e0 36 34 20 6f 6c 64 53 7a 3b 0a 20 20 20 20 20 20  64 oldSz;.      
101f0 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 46 69    int rc = winFi
10200 6c 65 53 69 7a 65 28 69 64 2c 20 26 6f 6c 64 53  leSize(id, &oldS
10210 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
10220 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10230 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10240 65 33 5f 69 6e 74 36 34 20 6e 65 77 53 7a 20 3d  e3_int64 newSz =
10250 20 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34   *(sqlite3_int64
10260 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 20 20  *)pArg;.        
10270 20 20 69 66 28 20 6e 65 77 53 7a 3e 6f 6c 64 53    if( newSz>oldS
10280 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  z ){.           
10290 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
102a0 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
102b0 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54         rc = winT
102c0 72 75 6e 63 61 74 65 28 69 64 2c 20 6e 65 77 53  runcate(id, newS
102d0 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  z);.            
102e0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
102f0 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
10300 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
10310 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
10320 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
10330 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10340 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
10350 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
10360 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20  ERSIST_WAL: {.  
10370 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70      winModeBit(p
10380 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 45  File, WINFILE_PE
10390 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a  RSIST_WAL, (int*
103a0 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65  )pArg);.      re
103b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
103c0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
103d0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 5a 45 52 4f  QLITE_FCNTL_ZERO
103e0 5f 44 41 4d 41 47 45 3a 20 7b 0a 20 20 20 20 20  _DAMAGE: {.     
103f0 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c   winModeBit(pFil
10400 65 2c 20 57 49 4e 46 49 4c 45 5f 5a 45 52 4f 5f  e, WINFILE_ZERO_
10410 44 41 4d 41 47 45 2c 20 28 69 6e 74 2a 29 70 41  DAMAGE, (int*)pA
10420 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rg);.      retur
10430 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
10440 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
10450 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45  TE_FCNTL_VFSNAME
10460 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72  : {.      *(char
10470 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65  **)pArg = sqlite
10480 33 5f 6d 70 72 69 6e 74 66 28 22 77 69 6e 33 32  3_mprintf("win32
10490 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
104a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
104b0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
104c0 45 5f 46 43 4e 54 4c 5f 53 59 4e 43 5f 4f 4d 49  E_FCNTL_SYNC_OMI
104d0 54 54 45 44 3a 20 7b 0a 20 20 20 20 20 20 72 65  TTED: {.      re
104e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
104f0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
10500 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33  QLITE_FCNTL_WIN3
10510 32 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a 20 20  2_AV_RETRY: {.  
10520 20 20 20 20 69 6e 74 20 2a 61 20 3d 20 28 69 6e      int *a = (in
10530 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69  t*)pArg;.      i
10540 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20 20 20  f( a[0]>0 ){.   
10550 20 20 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52       win32IoerrR
10560 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20 20  etry = a[0];.   
10570 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10580 20 20 61 5b 30 5d 20 3d 20 77 69 6e 33 32 49 6f    a[0] = win32Io
10590 65 72 72 52 65 74 72 79 3b 0a 20 20 20 20 20 20  errRetry;.      
105a0 7d 0a 20 20 20 20 20 20 69 66 28 20 61 5b 31 5d  }.      if( a[1]
105b0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69  >0 ){.        wi
105c0 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c  n32IoerrRetryDel
105d0 61 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20  ay = a[1];.     
105e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
105f0 61 5b 31 5d 20 3d 20 77 69 6e 33 32 49 6f 65 72  a[1] = win32Ioer
10600 72 52 65 74 72 79 44 65 6c 61 79 3b 0a 20 20 20  rRetryDelay;.   
10610 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
10620 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
10630 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
10640 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
10650 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
10660 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
10670 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65   in bytes of the
10680 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63   underlying bloc
10690 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20  k device for.** 
106a0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
106b0 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f  le. This is almo
106c0 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79  st always 512 by
106d0 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a  tes, but may be.
106e0 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f  ** larger for so
106f0 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a  me devices..**.*
10700 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73  * SQLite code as
10710 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74  sumes this funct
10720 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ion cannot fail.
10730 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73   It also assumes
10740 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20   that.** if two 
10750 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
10760 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69  d in the same fi
10770 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74  le-system direct
10780 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64  ory (i.e..** a d
10790 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20  atabase and its 
107a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68  journal file) th
107b0 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  at the sector si
107c0 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a  ze will be the.*
107d0 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e  * same for both.
107e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
107f0 69 6e 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  inSectorSize(sql
10800 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
10810 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
10820 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74  );.  return (int
10830 29 28 28 28 77 69 6e 46 69 6c 65 2a 29 69 64 29  )(((winFile*)id)
10840 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 7d  ->sectorSize);.}
10850 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
10860 20 76 65 63 74 6f 72 20 6f 66 20 64 65 76 69 63   vector of devic
10870 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
10880 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
10890 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63   winDeviceCharac
108a0 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65  teristics(sqlite
108b0 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 77  3_file *id){.  w
108c0 69 6e 46 69 6c 65 20 2a 70 20 3d 20 28 77 69 6e  inFile *p = (win
108d0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 72 65 74 75  File*)id;.  retu
108e0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rn SQLITE_IOCAP_
108f0 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
10900 5f 4f 50 45 4e 20 7c 0a 20 20 20 20 20 20 20 20  _OPEN |.        
10910 20 28 28 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20   ((p->ctrlFlags 
10920 26 20 57 49 4e 46 49 4c 45 5f 5a 45 52 4f 5f 44  & WINFILE_ZERO_D
10930 41 4d 41 47 45 29 3f 53 51 4c 49 54 45 5f 49 4f  AMAGE)?SQLITE_IO
10940 43 41 50 5f 5a 45 52 4f 5f 44 41 4d 41 47 45 3a  CAP_ZERO_DAMAGE:
10950 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  0);.}..#ifndef S
10960 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a  QLITE_OMIT_WAL..
10970 2f 2a 20 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77  /* .** Windows w
10980 69 6c 6c 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75  ill only let you
10990 20 63 72 65 61 74 65 20 66 69 6c 65 20 76 69 65   create file vie
109a0 77 20 6d 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e  w mappings.** on
109b0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65   allocation size
109c0 20 67 72 61 6e 75 6c 61 72 69 74 79 20 62 6f 75   granularity bou
109d0 6e 64 61 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69  ndaries..** Duri
109e0 6e 67 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e  ng sqlite3_os_in
109f0 69 74 28 29 20 77 65 20 64 6f 20 61 20 47 65 74  it() we do a Get
10a00 53 79 73 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20  SystemInfo().** 
10a10 74 6f 20 67 65 74 20 74 68 65 20 67 72 61 6e 75  to get the granu
10a20 6c 61 72 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a  larity size..*/.
10a30 53 59 53 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53  SYSTEM_INFO winS
10a40 79 73 49 6e 66 6f 3b 0a 0a 2f 2a 0a 2a 2a 20 48  ysInfo;../*.** H
10a50 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  elper functions 
10a60 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65  to obtain and re
10a70 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f  linquish the glo
10a80 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a  bal mutex. The.*
10a90 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69  * global mutex i
10aa0 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63  s used to protec
10ab0 74 20 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66  t the winLockInf
10ac0 6f 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62  o objects used b
10ad0 79 20 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c  y .** this file,
10ae0 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61   all of which ma
10af0 79 20 62 65 20 73 68 61 72 65 64 20 62 79 20 6d  y be shared by m
10b00 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e  ultiple threads.
10b10 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  .**.** Function 
10b20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
10b30 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73  ) is used to ass
10b40 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67  ert() that the g
10b50 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20  lobal mutex .** 
10b60 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71  is held when req
10b70 75 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63  uired. This func
10b80 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65  tion is only use
10b90 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
10ba0 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d  ert() .** statem
10bb0 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a  ents. e.g..**.**
10bc0 20 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75     winShmEnterMu
10bd0 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73  tex().**     ass
10be0 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78  ert( winShmMutex
10bf0 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77  Held() );.**   w
10c00 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
10c10 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
10c20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
10c30 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
10c40 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
10c50 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
10c60 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
10c70 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
10c80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
10c90 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f  ShmLeaveMutex(vo
10ca0 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
10cb0 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
10cc0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
10cd0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
10ce0 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66  _MASTER));.}.#if
10cf0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
10d00 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
10d10 68 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64  hmMutexHeld(void
10d20 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  ) {.  return sql
10d30 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
10d40 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
10d50 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
10d60 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
10d70 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
10d80 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72  Object used to r
10d90 65 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c  epresent a singl
10da0 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e  e file opened an
10db0 64 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f  d mmapped to pro
10dc0 76 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d  vide.** shared m
10dd0 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c  emory.  When mul
10de0 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c  tiple threads al
10df0 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  l reference the 
10e00 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d  same.** log-summ
10e10 61 72 79 2c 20 65 61 63 68 20 74 68 72 65 61 64  ary, each thread
10e20 20 68 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e   has its own win
10e30 46 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74  File object, but
10e40 20 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69   they all.** poi
10e50 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69  nt to a single i
10e60 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
10e70 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65  object.  In othe
10e80 72 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a  r words, each.**
10e90 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20   log-summary is 
10ea0 6f 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65  opened only once
10eb0 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a   per process..**
10ec0 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  .** winShmMutexH
10ed0 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72  eld() must be tr
10ee0 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ue when creating
10ef0 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a   or destroying.*
10f00 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72  * this object or
10f10 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f   while reading o
10f20 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f  r writing the fo
10f30 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a  llowing fields:.
10f40 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a  **.**      nRef.
10f50 2a 2a 20 20 20 20 20 20 70 4e 65 78 74 20 0a 2a  **      pNext .*
10f60 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
10f70 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
10f80 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
10f90 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
10fa0 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  ted:.** .**     
10fb0 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
10fc0 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
10fd0 68 65 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d  her winShmNode.m
10fe0 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
10ff0 64 20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e  d or winShmNode.
11000 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77  nRef==0 and.** w
11010 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
11020 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
11030 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
11040 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
11050 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
11060 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72  cture..**.*/.str
11070 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b  uct winShmNode {
11080 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
11090 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a   *mutex;      /*
110a0 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73   Mutex to access
110b0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
110c0 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
110d0 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
110e0 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
110f0 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68 46   */.  winFile hF
11100 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
11110 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20   /* File handle 
11120 66 72 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a  from winOpen */.
11130 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b  .  int szRegion;
11140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11150 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d   Size of shared-
11160 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a  memory regions *
11170 2f 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b  /.  int nRegion;
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11190 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20  * Size of array 
111a0 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74  apRegion */.  st
111b0 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b  ruct ShmRegion {
111c0 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70  .    HANDLE hMap
111d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
111e0 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f   File handle fro
111f0 6d 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  m CreateFileMapp
11200 69 6e 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20  ing */.    void 
11210 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67  *pMap;.  } *aReg
11220 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  ion;.  DWORD las
11230 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20  tErrno;         
11240 20 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73    /* The Windows
11250 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20   errno from the 
11260 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a  last I/O error *
11270 2f 0a 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  /..  int nRef;  
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11290 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e  /* Number of win
112a0 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
112b0 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
112c0 20 20 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74    winShm *pFirst
112d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
112e0 41 6c 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63  All winShm objec
112f0 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
11300 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e  his */.  winShmN
11310 6f 64 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  ode *pNext;     
11320 20 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c      /* Next in l
11330 69 73 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68  ist of all winSh
11340 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f  mNode objects */
11350 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
11360 45 42 55 47 0a 20 20 75 38 20 6e 65 78 74 53 68  EBUG.  u8 nextSh
11370 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  mId;            
11380 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61    /* Next availa
11390 62 6c 65 20 77 69 6e 53 68 6d 2e 69 64 20 76 61  ble winShm.id va
113a0 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  lue */.#endif.};
113b0 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c  ../*.** A global
113c0 20 61 72 72 61 79 20 6f 66 20 61 6c 6c 20 77 69   array of all wi
113d0 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73  nShmNode objects
113e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53  ..**.** The winS
113f0 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75  hmMutexHeld() mu
11400 73 74 20 62 65 20 74 72 75 65 20 77 68 69 6c 65  st be true while
11410 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
11420 69 6e 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a  ing this list..*
11430 2f 0a 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e  /.static winShmN
11440 6f 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c  ode *winShmNodeL
11450 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ist = 0;../*.** 
11460 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69  Structure used i
11470 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69  nternally by thi
11480 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20  s VFS to record 
11490 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a  the state of an.
114a0 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d  ** open shared m
114b0 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  emory connection
114c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
114d0 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65  owing fields are
114e0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65   initialized whe
114f0 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73  n this object is
11500 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20   created and.** 
11510 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68  are read-only th
11520 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20  ereafter:.**.** 
11530 20 20 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f     winShm.pShmNo
11540 64 65 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e  de.**    winShm.
11550 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68  id.**.** All oth
11560 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  er fields are re
11570 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 77  ad/write.  The w
11580 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e  inShm.pShmNode->
11590 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
115a0 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65  ld.** while acce
115b0 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77  ssing any read/w
115c0 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a  rite fields..*/.
115d0 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a  struct winShm {.
115e0 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
115f0 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20  hmNode;      /* 
11600 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 77  The underlying w
11610 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
11620 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e   */.  winShm *pN
11630 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
11640 20 2f 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d 20   /* Next winShm 
11650 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 77 69  with the same wi
11660 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38  nShmNode */.  u8
11670 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20   hasMutex;      
11680 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
11690 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   if holding the 
116a0 77 69 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78  winShmNode mutex
116b0 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64   */.  u16 shared
116c0 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
116d0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
116e0 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
116f0 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b  .  u16 exclMask;
11700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11710 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
11720 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
11730 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
11740 45 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20 20  EBUG.  u8 id;   
11750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11760 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20    /* Id of this 
11770 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
11780 69 74 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  its winShmNode *
11790 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
117a0 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65  ** Constants use
117b0 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f  d for locking.*/
117c0 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d  .#define WIN_SHM
117d0 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c  _BASE   ((22+SQL
117e0 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34  ITE_SHM_NLOCK)*4
117f0 29 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73  )        /* firs
11800 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23  t lock byte */.#
11810 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44  define WIN_SHM_D
11820 4d 53 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42  MS    (WIN_SHM_B
11830 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  ASE+SQLITE_SHM_N
11840 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61  LOCK)  /* deadma
11850 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a  n switch */../*.
11860 2a 2a 20 41 70 70 6c 79 20 61 64 76 69 73 6f 72  ** Apply advisor
11870 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20  y locks for all 
11880 6e 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e  n bytes beginnin
11890 67 20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64  g at ofst..*/.#d
118a0 65 66 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b  efine _SHM_UNLCK
118b0 20 20 31 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d    1.#define _SHM
118c0 5f 52 44 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e  _RDLCK  2.#defin
118d0 65 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a  e _SHM_WRLCK  3.
118e0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
118f0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77  mSystemLock(.  w
11900 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65  inShmNode *pFile
11910 2c 20 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f  ,    /* Apply lo
11920 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e  cks to this open
11930 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
11940 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  egment */.  int 
11950 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20  lockType,       
11960 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c    /* _SHM_UNLCK,
11970 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20   _SHM_RDLCK, or 
11980 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20  _SHM_WRLCK */.  
11990 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
119a0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
119b0 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f  to first byte to
119c0 20 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63   be locked/unloc
119d0 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  ked */.  int nBy
119e0 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  te             /
119f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
11a00 73 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c  s to lock or unl
11a10 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 4f 56 45 52  ock */.){.  OVER
11a20 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 44  LAPPED ovlp;.  D
11a30 57 4f 52 44 20 64 77 46 6c 61 67 73 3b 0a 20 20  WORD dwFlags;.  
11a40 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20  int rc = 0;     
11a50 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
11a60 63 6f 64 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55  code form Lock/U
11a70 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20 2a 2f  nlockFileEx() */
11a80 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f  ..  /* Access to
11a90 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20   the winShmNode 
11aa0 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c  object is serial
11ab0 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ized by the call
11ac0 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
11ad0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11ae0 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29  ld(pFile->mutex)
11af0 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3d   || pFile->nRef=
11b00 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  =0 );..  /* Init
11b10 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69  ialize the locki
11b20 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  ng parameters */
11b30 0a 20 20 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43  .  dwFlags = LOC
11b40 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
11b50 49 41 54 45 4c 59 3b 0a 20 20 69 66 28 20 6c 6f  IATELY;.  if( lo
11b60 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 57  ckType == _SHM_W
11b70 52 4c 43 4b 20 29 20 64 77 46 6c 61 67 73 20 7c  RLCK ) dwFlags |
11b80 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55  = LOCKFILE_EXCLU
11b90 53 49 56 45 5f 4c 4f 43 4b 3b 0a 0a 20 20 6d 65  SIVE_LOCK;..  me
11ba0 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73  mset(&ovlp, 0, s
11bb0 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44  izeof(OVERLAPPED
11bc0 29 29 3b 0a 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ));.  ovlp.Offse
11bd0 74 20 3d 20 6f 66 73 74 3b 0a 0a 20 20 2f 2a 20  t = ofst;..  /* 
11be0 52 65 6c 65 61 73 65 2f 41 63 71 75 69 72 65 20  Release/Acquire 
11bf0 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c  the system-level
11c00 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 6c   lock */.  if( l
11c10 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e  ockType==_SHM_UN
11c20 4c 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  LCK ){.    rc = 
11c30 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 70  osUnlockFileEx(p
11c40 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 30  File->hFile.h, 0
11c50 2c 20 6e 42 79 74 65 2c 20 30 2c 20 26 6f 76 6c  , nByte, 0, &ovl
11c60 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p);.  }else{.   
11c70 20 72 63 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65   rc = osLockFile
11c80 45 78 28 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e  Ex(pFile->hFile.
11c90 68 2c 20 64 77 46 6c 61 67 73 2c 20 30 2c 20 6e  h, dwFlags, 0, n
11ca0 42 79 74 65 2c 20 30 2c 20 26 6f 76 6c 70 29 3b  Byte, 0, &ovlp);
11cb0 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63  .  }.  .  if( rc
11cc0 21 3d 20 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  != 0 ){.    rc =
11cd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
11ce0 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
11cf0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 20 6f 73 47  lastErrno =  osG
11d00 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
11d10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
11d20 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  USY;.  }..  OSTR
11d30 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 25  ACE(("SHM-LOCK %
11d40 64 20 25 73 20 25 73 20 30 78 25 30 38 6c 78 5c  d %s %s 0x%08lx\
11d50 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  n", .           
11d60 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a  pFile->hFile.h,.
11d70 20 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53             rc==S
11d80 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
11d90 3a 20 22 66 61 69 6c 65 64 22 2c 0a 20 20 20 20  : "failed",.    
11da0 20 20 20 20 20 20 20 6c 6f 63 6b 54 79 70 65 3d         lockType=
11db0 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 3f 20 22 55  =_SHM_UNLCK ? "U
11dc0 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 20 3a 20 22  nlockFileEx" : "
11dd0 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 0a 20 20 20  LockFileEx",.   
11de0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
11df0 61 73 74 45 72 72 6e 6f 29 29 3b 0a 0a 20 20 72  astErrno));..  r
11e00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
11e10 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
11e20 65 73 20 74 6f 20 56 46 53 20 6d 65 74 68 6f 64  es to VFS method
11e30 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
11e40 77 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  winOpen(sqlite3_
11e50 76 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  vfs*,const char*
11e60 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69  ,sqlite3_file*,i
11e70 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63  nt,int*);.static
11e80 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 73   int winDelete(s
11e90 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e  qlite3_vfs *,con
11ea0 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a  st char*,int);..
11eb0 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20  /*.** Purge the 
11ec0 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c  winShmNodeList l
11ed0 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69  ist of all entri
11ee0 65 73 20 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f  es with winShmNo
11ef0 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a  de.nRef==0..**.*
11f00 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
11f10 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
11f20 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20  y method; it is 
11f30 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  a utility functi
11f40 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20  on called.** by 
11f50 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
11f60 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74  y methods..*/.st
11f70 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d  atic void winShm
11f80 50 75 72 67 65 28 73 71 6c 69 74 65 33 5f 76 66  Purge(sqlite3_vf
11f90 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 64 65 6c  s *pVfs, int del
11fa0 65 74 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53  eteFlag){.  winS
11fb0 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77  hmNode **pp;.  w
11fc0 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20  inShmNode *p;.  
11fd0 42 4f 4f 4c 20 62 52 63 3b 0a 20 20 61 73 73 65  BOOL bRc;.  asse
11fe0 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  rt( winShmMutexH
11ff0 65 6c 64 28 29 20 29 3b 0a 20 20 70 70 20 3d 20  eld() );.  pp = 
12000 26 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b  &winShmNodeList;
12010 0a 20 20 77 68 69 6c 65 28 20 28 70 20 3d 20 2a  .  while( (p = *
12020 70 70 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pp)!=0 ){.    if
12030 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ( p->nRef==0 ){.
12040 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
12050 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20     if( p->mutex 
12060 29 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ) sqlite3_mutex_
12070 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a  free(p->mutex);.
12080 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
12090 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b  <p->nRegion; i++
120a0 29 7b 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d  ){.        bRc =
120b0 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69   osUnmapViewOfFi
120c0 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d  le(p->aRegion[i]
120d0 2e 70 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  .pMap);.        
120e0 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55  OSTRACE(("SHM-PU
120f0 52 47 45 20 70 69 64 2d 25 64 20 75 6e 6d 61 70  RGE pid-%d unmap
12100 20 72 65 67 69 6f 6e 3d 25 64 20 25 73 5c 6e 22   region=%d %s\n"
12110 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12120 20 20 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72     (int)osGetCur
12130 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
12140 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   i,.            
12150 20 20 20 20 20 62 52 63 20 3f 20 22 6f 6b 22 20       bRc ? "ok" 
12160 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
12170 20 20 20 20 20 20 62 52 63 20 3d 20 6f 73 43 6c        bRc = osCl
12180 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65  oseHandle(p->aRe
12190 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20  gion[i].hMap);. 
121a0 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
121b0 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64 2d 25  "SHM-PURGE pid-%
121c0 64 20 63 6c 6f 73 65 20 72 65 67 69 6f 6e 3d 25  d close region=%
121d0 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
121e0 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 6f            (int)o
121f0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
12200 73 73 49 64 28 29 2c 20 69 2c 0a 20 20 20 20 20  ssId(), i,.     
12210 20 20 20 20 20 20 20 20 20 20 20 20 62 52 63 20              bRc 
12220 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
12230 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
12240 20 20 20 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e     if( p->hFile.
12250 68 20 21 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e  h != INVALID_HAN
12260 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20  DLE_VALUE ){.   
12270 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
12280 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
12290 20 20 20 20 20 20 20 77 69 6e 43 6c 6f 73 65 28         winClose(
122a0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
122b0 26 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 20 20 20  &p->hFile);.    
122c0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
122d0 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
122e0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
122f0 64 65 6c 65 74 65 46 6c 61 67 20 29 7b 0a 20 20  deleteFlag ){.  
12300 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
12310 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
12320 20 20 20 20 20 20 20 20 77 69 6e 44 65 6c 65 74          winDelet
12330 65 28 70 56 66 73 2c 20 70 2d 3e 7a 46 69 6c 65  e(pVfs, p->zFile
12340 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  name, 0);.      
12350 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
12360 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
12370 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20    }.      *pp = 
12380 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  p->pNext;.      
12390 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
123a0 61 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20  aRegion);.      
123b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
123c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
123d0 20 20 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74    pp = &p->pNext
123e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
123f0 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 68  *.** Open the sh
12400 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61  ared-memory area
12410 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
12420 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
12430 44 62 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  DbFd..**.** When
12440 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73   opening a new s
12450 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
12460 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69  e, if no other i
12470 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74  nstances of that
12480 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72  .** file are cur
12490 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20  rently open, in 
124a0 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20  this process or 
124b0 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  in other process
124c0 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  es, then.** the 
124d0 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75  file must be tru
124e0 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c  ncated to zero l
124f0 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74  ength or have it
12500 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64  s header cleared
12510 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12520 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  winOpenSharedMem
12530 6f 72 79 28 77 69 6e 46 69 6c 65 20 2a 70 44 62  ory(winFile *pDb
12540 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 77 69  Fd){.  struct wi
12550 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20  nShm *p;        
12560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12570 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
12580 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74  e opened */.  st
12590 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ruct winShmNode 
125a0 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20  *pShmNode = 0;  
125b0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
125c0 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  ng mmapped file 
125d0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
125e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
12600 74 20 63 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75  t code */.  stru
12610 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  ct winShmNode *p
12620 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f  New;           /
12630 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  * Newly allocate
12640 64 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  d winShmNode */.
12650 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20    int nName;    
12660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12670 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
12680 7a 4e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a  zName in bytes *
12690 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  /..  assert( pDb
126a0 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20  Fd->pShm==0 );  
126b0 20 20 2f 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75    /* Not previou
126c0 73 6c 79 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20  sly opened */.. 
126d0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
126e0 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73  ce for the new s
126f0 71 6c 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63  qlite3_shm objec
12700 74 2e 20 20 41 6c 73 6f 20 73 70 65 63 75 6c 61  t.  Also specula
12710 74 69 76 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f  tively.  ** allo
12720 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61  cate space for a
12730 20 6e 65 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20   new winShmNode 
12740 61 6e 64 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20  and filename..  
12750 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  */.  p = sqlite3
12760 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
12770 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  *p) );.  if( p==
12780 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
12790 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
127a0 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
127b0 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 6e 4e 61  zeof(*p));.  nNa
127c0 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
127d0 65 6e 33 30 28 70 44 62 46 64 2d 3e 7a 50 61 74  en30(pDbFd->zPat
127e0 68 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  h);.  pNew = sql
127f0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
12800 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b  eof(*pShmNode) +
12810 20 6e 4e 61 6d 65 20 2b 20 31 35 20 29 3b 0a 20   nName + 15 );. 
12820 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
12830 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
12840 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
12850 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
12860 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  EM;.  }.  memset
12870 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66  (pNew, 0, sizeof
12880 28 2a 70 4e 65 77 29 29 3b 0a 20 20 70 4e 65 77  (*pNew));.  pNew
12890 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63  ->zFilename = (c
128a0 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
128b0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
128c0 66 28 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e 65 77  f(nName+15, pNew
128d0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73  ->zFilename, "%s
128e0 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50  -shm", pDbFd->zP
128f0 61 74 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  ath);.  sqlite3F
12900 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64  ileSuffix3(pDbFd
12910 2d 3e 7a 50 61 74 68 2c 20 70 4e 65 77 2d 3e 7a  ->zPath, pNew->z
12920 46 69 6c 65 6e 61 6d 65 29 3b 20 0a 0a 20 20 2f  Filename); ..  /
12930 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66  * Look to see if
12940 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 78 69   there is an exi
12950 73 74 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65  sting winShmNode
12960 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
12970 64 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61  d..  ** If no ma
12980 74 63 68 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64  tching winShmNod
12990 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73  e currently exis
129a0 74 73 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77  ts, create a new
129b0 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e   one..  */.  win
129c0 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  ShmEnterMutex();
129d0 0a 20 20 66 6f 72 28 70 53 68 6d 4e 6f 64 65 20  .  for(pShmNode 
129e0 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74  = winShmNodeList
129f0 3b 20 70 53 68 6d 4e 6f 64 65 3b 20 70 53 68 6d  ; pShmNode; pShm
12a00 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  Node=pShmNode->p
12a10 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 42  Next){.    /* TB
12a20 44 20 6e 65 65 64 20 74 6f 20 63 6f 6d 65 20 75  D need to come u
12a30 70 20 77 69 74 68 20 62 65 74 74 65 72 20 6d 61  p with better ma
12a40 74 63 68 20 68 65 72 65 2e 20 20 50 65 72 68 61  tch here.  Perha
12a50 70 73 0a 20 20 20 20 2a 2a 20 75 73 65 20 46 49  ps.    ** use FI
12a60 4c 45 5f 49 44 5f 42 4f 54 48 5f 44 49 52 5f 49  LE_ID_BOTH_DIR_I
12a70 4e 46 4f 20 53 74 72 75 63 74 75 72 65 2e 0a 20  NFO Structure.. 
12a80 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
12a90 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 53 68  lite3StrICmp(pSh
12aa0 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
12ab0 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d  , pNew->zFilenam
12ac0 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
12ad0 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64   }.  if( pShmNod
12ae0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
12af0 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d  _free(pNew);.  }
12b00 65 6c 73 65 7b 0a 20 20 20 20 70 53 68 6d 4e 6f  else{.    pShmNo
12b10 64 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70  de = pNew;.    p
12b20 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 28 28 77  New = 0;.    ((w
12b30 69 6e 46 69 6c 65 2a 29 28 26 70 53 68 6d 4e 6f  inFile*)(&pShmNo
12b40 64 65 2d 3e 68 46 69 6c 65 29 29 2d 3e 68 20 3d  de->hFile))->h =
12b50 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f   INVALID_HANDLE_
12b60 56 41 4c 55 45 3b 0a 20 20 20 20 70 53 68 6d 4e  VALUE;.    pShmN
12b70 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 77 69 6e  ode->pNext = win
12b80 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 20  ShmNodeList;.   
12b90 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20   winShmNodeList 
12ba0 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20  = pShmNode;..   
12bb0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
12bc0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
12bd0 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
12be0 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69  TEX_FAST);.    i
12bf0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  f( pShmNode->mut
12c00 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ex==0 ){.      r
12c10 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
12c20 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
12c30 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
12c40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
12c50 20 77 69 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e   winOpen(pDbFd->
12c60 70 56 66 73 2c 0a 20 20 20 20 20 20 20 20 20 20  pVfs,.          
12c70 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
12c80 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20  >zFilename,     
12c90 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
12ca0 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46  of the file (UTF
12cb0 2d 38 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  -8) */.         
12cc0 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
12cd0 5f 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65  _file*)&pShmNode
12ce0 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 46 69 6c  ->hFile,  /* Fil
12cf0 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f  e handle here */
12d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12d10 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41    SQLITE_OPEN_WA
12d20 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  L | SQLITE_OPEN_
12d30 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
12d40 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
12d50 2f 2a 20 4d 6f 64 65 20 66 6c 61 67 73 20 2a 2f  /* Mode flags */
12d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12d70 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 53 51    0);.    if( SQ
12d80 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20  LITE_OK!=rc ){. 
12d90 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
12da0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
12db0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
12dc0 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  pen_err;.    }..
12dd0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
12de0 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70  see if another p
12df0 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
12e00 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73  g the dead-man s
12e10 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66  witch..    ** If
12e20 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74   not, truncate t
12e30 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  he file to zero 
12e40 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f 0a  length. .    */.
12e50 20 20 20 20 69 66 28 20 77 69 6e 53 68 6d 53 79      if( winShmSy
12e60 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
12e70 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 57  e, _SHM_WRLCK, W
12e80 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d  IN_SHM_DMS, 1)==
12e90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12ea0 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63     rc = winTrunc
12eb0 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ate((sqlite3_fil
12ec0 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  e *)&pShmNode->h
12ed0 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  File, 0);.      
12ee0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12ef0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
12f00 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
12f10 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50  LITE_IOERR_SHMOP
12f20 45 4e 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  EN, osGetLastErr
12f30 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
12f40 20 20 20 20 20 20 20 22 77 69 6e 4f 70 65 6e 53         "winOpenS
12f50 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  hm", pDbFd->zPat
12f60 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
12f70 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
12f80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12f90 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
12fa0 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
12fb0 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f  _UNLCK, WIN_SHM_
12fc0 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 72  DMS, 1);.      r
12fd0 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
12fe0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
12ff0 53 48 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53  SHM_RDLCK, WIN_S
13000 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20  HM_DMS, 1);.    
13010 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  }.    if( rc ) g
13020 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
13030 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
13040 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74   the new connect
13050 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74  ion a child of t
13060 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f  he winShmNode */
13070 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d  .  p->pShmNode =
13080 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65   pShmNode;.#ifde
13090 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
130a0 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64   p->id = pShmNod
130b0 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a  e->nextShmId++;.
130c0 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64  #endif.  pShmNod
130d0 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62  e->nRef++;.  pDb
130e0 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20  Fd->pShm = p;.  
130f0 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
13100 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65  ();..  /* The re
13110 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
13120 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c   pShmNode has al
13130 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
13140 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a  mented under.  *
13150 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74  * the cover of t
13160 68 65 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  he winShmEnterMu
13170 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20  tex() mutex and 
13180 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  the pointer from
13190 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73   the.  ** new (s
131a0 74 72 75 63 74 20 77 69 6e 53 68 6d 29 20 6f 62  truct winShm) ob
131b0 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d  ject to the pShm
131c0 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65  Node has been se
131d0 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20  t. All that is. 
131e0 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69   ** left to do i
131f0 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65  s to link the ne
13200 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68  w object into th
13210 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74  e linked list st
13220 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70  arting.  ** at p
13230 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e  ShmNode->pFirst.
13240 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f   This must be do
13250 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67  ne while holding
13260 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d   the pShmNode->m
13270 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78  utex .  ** mutex
13280 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
13290 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
132a0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
132b0 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d   p->pNext = pShm
132c0 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20  Node->pFirst;.  
132d0 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
132e0 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = p;.  sqlite3_
132f0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
13300 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
13310 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13320 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
13330 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a  e on any error *
13340 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a  /.shm_open_err:.
13350 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f    winShmSystemLo
13360 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
13370 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d  M_UNLCK, WIN_SHM
13380 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 77 69 6e 53  _DMS, 1);.  winS
13390 68 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70  hmPurge(pDbFd->p
133a0 56 66 73 2c 20 30 29 3b 20 20 20 20 20 20 2f 2a  Vfs, 0);      /*
133b0 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73   This call frees
133c0 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71   pShmNode if req
133d0 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  uired */.  sqlit
133e0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 73 71  e3_free(p);.  sq
133f0 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
13400 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  ;.  winShmLeaveM
13410 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e  utex();.  return
13420 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c   rc;.}../*.** Cl
13430 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  ose a connection
13440 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   to shared-memor
13450 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 75  y.  Delete the u
13460 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74  nderlying .** st
13470 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74 65 46  orage if deleteF
13480 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a  lag is true..*/.
13490 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
134a0 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65  mUnmap(.  sqlite
134b0 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
134c0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
134d0 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20   holding shared 
134e0 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20  memory */.  int 
134f0 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20  deleteFlag      
13500 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65         /* Delete
13510 20 61 66 74 65 72 20 63 6c 6f 73 69 6e 67 20 69   after closing i
13520 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 77  f true */.){.  w
13530 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20  inFile *pDbFd;  
13540 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
13550 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 2d   holding shared-
13560 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53  memory */.  winS
13570 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  hm *p;          
13580 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74    /* The connect
13590 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64  ion to be closed
135a0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65   */.  winShmNode
135b0 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54   *pShmNode; /* T
135c0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68  he underlying sh
135d0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
135e0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 2a 70   */.  winShm **p
135f0 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  p;          /* F
13600 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
13610 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
13620 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20  ons */..  pDbFd 
13630 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a  = (winFile*)fd;.
13640 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
13650 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  m;.  if( p==0 ) 
13660 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13670 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  ;.  pShmNode = p
13680 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f  ->pShmNode;..  /
13690 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74  * Remove connect
136a0 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73  ion p from the s
136b0 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e  et of connection
136c0 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a  s associated.  *
136d0 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20  * with pShmNode 
136e0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
136f0 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
13700 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72  e->mutex);.  for
13710 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70  (pp=&pShmNode->p
13720 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b  First; (*pp)!=p;
13730 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e   pp = &(*pp)->pN
13740 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70  ext){}.  *pp = p
13750 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46  ->pNext;..  /* F
13760 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ree the connecti
13770 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65  on p */.  sqlite
13780 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62  3_free(p);.  pDb
13790 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20  Fd->pShm = 0;.  
137a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
137b0 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
137c0 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  tex);..  /* If p
137d0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61  ShmNode->nRef ha
137e0 73 20 72 65 61 63 68 65 64 20 30 2c 20 74 68 65  s reached 0, the
137f0 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65  n close the unde
13800 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72  rlying.  ** shar
13810 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20  ed-memory file, 
13820 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45  too */.  winShmE
13830 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61  nterMutex();.  a
13840 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
13850 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68  >nRef>0 );.  pSh
13860 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  mNode->nRef--;. 
13870 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
13880 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69  Ref==0 ){.    wi
13890 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 2d  nShmPurge(pDbFd-
138a0 3e 70 56 66 73 2c 20 64 65 6c 65 74 65 46 6c 61  >pVfs, deleteFla
138b0 67 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 53 68 6d  g);.  }.  winShm
138c0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
138d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
138e0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
138f0 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ge the lock stat
13900 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d  e for a shared-m
13910 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a  emory segment..*
13920 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
13930 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74  ShmLock(.  sqlit
13940 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
13950 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
13960 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74  e file holding t
13970 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
13980 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20   */.  int ofst, 
13990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139a0 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74   /* First lock t
139b0 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c  o acquire or rel
139c0 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c  ease */.  int n,
139d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
139f0 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69  f locks to acqui
13a00 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  re or release */
13a10 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
13a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13a30 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
13a40 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a   the lock */.){.
13a50 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64    winFile *pDbFd
13a60 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b   = (winFile*)fd;
13a70 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
13a80 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68  ction holding sh
13a90 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared memory */. 
13aa0 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62   winShm *p = pDb
13ab0 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20  Fd->pShm;       
13ac0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68         /* The sh
13ad0 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e  ared memory bein
13ae0 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 77 69  g locked */.  wi
13af0 6e 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20  nShm *pX;       
13b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b10 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
13b20 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c  ng over all sibl
13b30 69 6e 67 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  ings */.  winShm
13b40 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d  Node *pShmNode =
13b50 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20   p->pShmNode;.  
13b60 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
13b70 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
13b80 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
13b90 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61  code */.  u16 ma
13ba0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
13bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bc0 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73  /* Mask of locks
13bd0 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65   to take or rele
13be0 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ase */..  assert
13bf0 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73  ( ofst>=0 && ofs
13c00 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f  t+n<=SQLITE_SHM_
13c10 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  NLOCK );.  asser
13c20 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73  t( n>=1 );.  ass
13c30 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c  ert( flags==(SQL
13c40 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53  ITE_SHM_LOCK | S
13c50 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
13c60 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
13c70 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c  s==(SQLITE_SHM_L
13c80 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
13c90 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20  _EXCLUSIVE).    
13ca0 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
13cb0 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
13cc0 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  | SQLITE_SHM_SHA
13cd0 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  RED).       || f
13ce0 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
13cf0 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  M_UNLOCK | SQLIT
13d00 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
13d10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d   );.  assert( n=
13d20 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53  =1 || (flags & S
13d30 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
13d40 49 56 45 29 21 3d 30 20 29 3b 0a 0a 20 20 6d 61  IVE)!=0 );..  ma
13d50 73 6b 20 3d 20 28 75 31 36 29 28 28 31 55 3c 3c  sk = (u16)((1U<<
13d60 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 55 3c  (ofst+n)) - (1U<
13d70 3c 6f 66 73 74 29 29 3b 0a 20 20 61 73 73 65 72  <ofst));.  asser
13d80 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d  t( n>1 || mask==
13d90 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73  (1<<ofst) );.  s
13da0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
13db0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
13dc0 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  ex);.  if( flags
13dd0 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e   & SQLITE_SHM_UN
13de0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20  LOCK ){.    u16 
13df0 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20  allMask = 0; /* 
13e00 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65  Mask of locks he
13e10 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a  ld by siblings *
13e20 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66  /..    /* See if
13e30 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f   any siblings ho
13e40 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63  ld this same loc
13e50 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d  k */.    for(pX=
13e60 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
13e70 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
13e80 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  xt){.      if( p
13e90 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b  X==p ) continue;
13ea0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
13eb0 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28  pX->exclMask & (
13ec0 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73  p->exclMask|p->s
13ed0 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29  haredMask))==0 )
13ee0 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20  ;.      allMask 
13ef0 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  |= pX->sharedMas
13f00 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
13f10 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74   Unlock the syst
13f20 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a  em-level locks *
13f30 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20  /.    if( (mask 
13f40 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b  & allMask)==0 ){
13f50 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53  .      rc = winS
13f60 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
13f70 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43  mNode, _SHM_UNLC
13f80 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f  K, ofst+WIN_SHM_
13f90 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  BASE, n);.    }e
13fa0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
13fb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
13fc0 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68  ..    /* Undo th
13fd0 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f  e local locks */
13fe0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
13ff0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14000 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e  p->exclMask &= ~
14010 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73  mask;.      p->s
14020 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61  haredMask &= ~ma
14030 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c  sk;.    } .  }el
14040 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
14050 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
14060 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53   ){.    u16 allS
14070 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55  hared = 0;  /* U
14080 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65  nion of locks he
14090 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
140a0 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22  s other than "p"
140b0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64   */..    /* Find
140c0 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72 65   out which share
140d0 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65  d locks are alre
140e0 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c  ady held by sibl
140f0 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ing connections.
14100 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73  .    ** If any s
14110 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68  ibling already h
14120 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76  olds an exclusiv
14130 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64  e lock, go ahead
14140 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20   and return.    
14150 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a  ** SQLITE_BUSY..
14160 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
14170 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
14180 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
14190 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
141a0 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
141b0 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20   mask)!=0 ){.   
141c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
141d0 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62  _BUSY;.        b
141e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
141f0 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d      allShared |=
14200 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
14210 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
14220 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  et shared locks 
14230 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
14240 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72  vel, if necessar
14250 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  y */.    if( rc=
14260 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14270 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72      if( (allShar
14280 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b  ed & mask)==0 ){
14290 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69  .        rc = wi
142a0 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
142b0 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44  ShmNode, _SHM_RD
142c0 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48  LCK, ofst+WIN_SH
142d0 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
142e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
142f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14300 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
14310 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c      /* Get the l
14320 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b  ocal shared lock
14330 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  s */.    if( rc=
14340 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14350 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
14360 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d  k |= mask;.    }
14370 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
14380 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69   Make sure no si
14390 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
143a0 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61  s hold locks tha
143b0 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69  t will block thi
143c0 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20  s.    ** lock.  
143d0 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72  If any do, retur
143e0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69  n SQLITE_BUSY ri
143f0 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f  ght away..    */
14400 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
14410 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
14420 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
14430 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e  .      if( (pX->
14440 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29  exclMask & mask)
14450 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72  !=0 || (pX->shar
14460 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  edMask & mask)!=
14470 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
14480 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
14490 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
144a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
144b0 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78     /* Get the ex
144c0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74  clusive locks at
144d0 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65   the system leve
144e0 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63  l.  Then if succ
144f0 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c  essful.    ** al
14500 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61  so mark the loca
14510 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20  l connection as 
14520 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20  being locked..  
14530 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
14540 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14550 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53      rc = winShmS
14560 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
14570 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20  de, _SHM_WRLCK, 
14580 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53  ofst+WIN_SHM_BAS
14590 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  E, n);.      if(
145a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
145b0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
145c0 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  ( (p->sharedMask
145d0 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20   & mask)==0 );. 
145e0 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61         p->exclMa
145f0 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
14600 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
14610 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
14620 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
14630 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  tex);.  OSTRACE(
14640 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64  ("SHM-LOCK shmid
14650 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20  -%d, pid-%d got 
14660 25 30 33 78 2c 25 30 33 78 20 25 73 5c 6e 22 2c  %03x,%03x %s\n",
14670 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69  .           p->i
14680 64 2c 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72  d, (int)osGetCur
14690 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
146a0 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20   p->sharedMask, 
146b0 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c 0a 20 20 20  p->exclMask,.   
146c0 20 20 20 20 20 20 20 20 72 63 20 3f 20 22 66 61          rc ? "fa
146d0 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a  iled" : "ok"));.
146e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
146f0 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20  /*.** Implement 
14700 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72  a memory barrier
14710 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65   or memory fence
14720 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   on shared memor
14730 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c  y.  .**.** All l
14740 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20  oads and stores 
14750 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65  begun before the
14760 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f   barrier must co
14770 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a  mplete before.**
14780 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f   any load or sto
14790 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 74  re begun after t
147a0 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73  he barrier..*/.s
147b0 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
147c0 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69  mBarrier(.  sqli
147d0 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20  te3_file *fd    
147e0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
147f0 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
14800 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  ared memory */.)
14810 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
14820 45 54 45 52 28 66 64 29 3b 0a 20 20 2f 2a 20 4d  ETER(fd);.  /* M
14830 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20  emoryBarrier(); 
14840 2f 2f 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  // does not work
14850 20 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20   -- do not know 
14860 77 68 79 20 6e 6f 74 20 2a 2f 0a 20 20 77 69 6e  why not */.  win
14870 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  ShmEnterMutex();
14880 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  .  winShmLeaveMu
14890 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tex();.}../*.** 
148a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
148b0 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
148c0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72  n a pointer to r
148d0 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66  egion iRegion of
148e0 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d   the .** shared-
148f0 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
14900 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
14910 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61  ase file fd. Sha
14920 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
14930 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65  ns .** are numbe
14940 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f  red starting fro
14950 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61  m zero. Each sha
14960 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
14970 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a  n is szRegion .*
14980 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  * bytes in size.
14990 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
149a0 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
149b0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
149c0 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20  rned and *pp is 
149d0 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
149e0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
149f0 20 74 68 65 20 69 73 57 72 69 74 65 20 70 61 72   the isWrite par
14a00 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64 20  ameter is 0 and 
14a10 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68  the requested sh
14a20 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72  ared-memory.** r
14a30 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65  egion has not be
14a40 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79  en allocated (by
14a50 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63   any client, inc
14a60 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69  luding one runni
14a70 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72  ng in a.** separ
14a80 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68  ate process), th
14a90 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  en *pp is set to
14aa0 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
14ab0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
14ac0 20 0a 2a 2a 20 69 73 57 72 69 74 65 20 69 73 20   .** isWrite is 
14ad0 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65  non-zero and the
14ae0 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65   requested share
14af0 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
14b00 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20  has not yet .** 
14b10 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
14b20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  it is allocated 
14b30 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
14b40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
14b50 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
14b60 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
14b70 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f  been allocated o
14b80 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  r is allocated b
14b90 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61  y.** this call a
14ba0 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
14bb0 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61  e, then it is ma
14bc0 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
14bd0 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64 64  rocesses .** add
14be0 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69  ress space (if i
14bf0 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
14c00 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  ), *pp is set to
14c10 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61   point to the ma
14c20 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  pped .** memory 
14c30 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
14c40 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
14c50 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70 28  c int winShmMap(
14c60 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
14c70 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *fd,            
14c80 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65     /* Handle ope
14c90 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69  n on database fi
14ca0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  le */.  int iReg
14cb0 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
14cc0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f          /* Regio
14cd0 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f  n to retrieve */
14ce0 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c  .  int szRegion,
14cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d00 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65     /* Size of re
14d10 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69  gions */.  int i
14d20 73 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20  sWrite,         
14d30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
14d40 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c  ue to extend fil
14d50 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  e if necessary *
14d60 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c  /.  void volatil
14d70 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20  e **pp          
14d80 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70      /* OUT: Mapp
14d90 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a  ed memory */.){.
14da0 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64    winFile *pDbFd
14db0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b   = (winFile*)fd;
14dc0 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70  .  winShm *p = p
14dd0 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77 69  DbFd->pShm;.  wi
14de0 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  nShmNode *pShmNo
14df0 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  de;.  int rc = S
14e00 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
14e10 20 21 70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20   !p ){.    rc = 
14e20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  winOpenSharedMem
14e30 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20  ory(pDbFd);.    
14e40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14e50 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
14e60 20 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53     p = pDbFd->pS
14e70 68 6d 3b 0a 20 20 7d 0a 20 20 70 53 68 6d 4e 6f  hm;.  }.  pShmNo
14e80 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
14e90 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ;..  sqlite3_mut
14ea0 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
14eb0 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  e->mutex);.  ass
14ec0 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70  ert( szRegion==p
14ed0 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f  ShmNode->szRegio
14ee0 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  n || pShmNode->n
14ef0 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20  Region==0 );..  
14f00 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
14f10 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29  egion<=iRegion )
14f20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 68 6d  {.    struct Shm
14f30 52 65 67 69 6f 6e 20 2a 61 70 4e 65 77 3b 20 20  Region *apNew;  
14f40 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
14f50 61 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20  aRegion[] array 
14f60 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
14f70 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73   = (iRegion+1)*s
14f80 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e  zRegion;  /* Min
14f90 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69  imum required fi
14fa0 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
14fb0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b  qlite3_int64 sz;
14fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fd0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a    /* Current siz
14fe0 65 20 6f 66 20 77 61 6c 2d 69 6e 64 65 78 20 66  e of wal-index f
14ff0 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d  ile */..    pShm
15000 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d  Node->szRegion =
15010 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20   szRegion;..    
15020 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
15030 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d   region is not m
15040 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
15050 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73  processes addres
15060 73 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20  s space..    ** 
15070 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
15080 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  it has been allo
15090 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74  cated (i.e. if t
150a0 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c  he wal-index fil
150b0 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72 67  e is.    ** larg
150c0 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74  e enough to cont
150d0 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  ain the requeste
150e0 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 2a  d region)..    *
150f0 2f 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69  /.    rc = winFi
15100 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f  leSize((sqlite3_
15110 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65  file *)&pShmNode
15120 2d 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a 20  ->hFile, &sz);. 
15130 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
15140 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
15150 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
15160 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
15170 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  IZE, osGetLastEr
15180 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
15190 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70        "winShmMap
151a0 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  1", pDbFd->zPath
151b0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  );.      goto sh
151c0 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  mpage_out;.    }
151d0 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e 42 79  ..    if( sz<nBy
151e0 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  te ){.      /* T
151f0 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
15200 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20  ory region does 
15210 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 69 73  not exist. If is
15220 57 72 69 74 65 20 69 73 20 73 65 74 20 74 6f 0a  Write is set to.
15230 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65        ** zero, e
15240 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77  xit early. *pp w
15250 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55  ill be set to NU
15260 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  LL and SQLITE_OK
15270 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20   returned..     
15280 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74   **.      ** Alt
15290 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 69  ernatively, if i
152a0 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  sWrite is non-ze
152b0 72 6f 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74  ro, use ftruncat
152c0 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a  e() to allocate.
152d0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71        ** the req
152e0 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
152f0 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  gion..      */. 
15300 20 20 20 20 20 69 66 28 20 21 69 73 57 72 69 74       if( !isWrit
15310 65 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65  e ) goto shmpage
15320 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  _out;.      rc =
15330 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71   winTruncate((sq
15340 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53  lite3_file *)&pS
15350 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e  hmNode->hFile, n
15360 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
15370 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15380 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
15390 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
153a0 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c  E_IOERR_SHMSIZE,
153b0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
153c0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
153d0 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 32 22      "winShmMap2"
153e0 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
153f0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
15400 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
15410 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
15420 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74   Map the request
15430 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
15440 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
15450 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
15460 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77  ce. */.    apNew
15470 20 3d 20 28 73 74 72 75 63 74 20 53 68 6d 52 65   = (struct ShmRe
15480 67 69 6f 6e 20 2a 29 73 71 6c 69 74 65 33 5f 72  gion *)sqlite3_r
15490 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
154a0 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
154b0 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73  n, (iRegion+1)*s
154c0 69 7a 65 6f 66 28 61 70 4e 65 77 5b 30 5d 29 0a  izeof(apNew[0]).
154d0 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
154e0 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72  apNew ){.      r
154f0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
15500 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
15510 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
15520 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f      }.    pShmNo
15530 64 65 2d 3e 61 52 65 67 69 6f 6e 20 3d 20 61 70  de->aRegion = ap
15540 4e 65 77 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  New;..    while(
15550 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
15560 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20  on<=iRegion ){. 
15570 20 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70       HANDLE hMap
15580 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15590 20 2f 2a 20 66 69 6c 65 2d 6d 61 70 70 69 6e 67   /* file-mapping
155a0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20   handle */.     
155b0 20 76 6f 69 64 20 2a 70 4d 61 70 20 3d 20 30 3b   void *pMap = 0;
155c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
155d0 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 72 65  Mapped memory re
155e0 67 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 0a 20 20  gion */.     .  
155f0 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65      hMap = osCre
15600 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 28 70  ateFileMapping(p
15610 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68  ShmNode->hFile.h
15620 2c 20 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c  , .          NUL
15630 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54  L, PAGE_READWRIT
15640 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c  E, 0, nByte, NUL
15650 4c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  L.      );.     
15660 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d   OSTRACE(("SHM-M
15670 41 50 20 70 69 64 2d 25 64 20 63 72 65 61 74 65  AP pid-%d create
15680 20 72 65 67 69 6f 6e 3d 25 64 20 6e 62 79 74 65   region=%d nbyte
15690 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  =%d %s\n",.     
156a0 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 6f            (int)o
156b0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
156c0 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65  ssId(), pShmNode
156d0 2d 3e 6e 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65  ->nRegion, nByte
156e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
156f0 20 68 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22   hMap ? "ok" : "
15700 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20  failed"));.     
15710 20 69 66 28 20 68 4d 61 70 20 29 7b 0a 20 20 20   if( hMap ){.   
15720 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74       int iOffset
15730 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65   = pShmNode->nRe
15740 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20  gion*szRegion;. 
15750 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73         int iOffs
15760 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65  etShift = iOffse
15770 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64  t % winSysInfo.d
15780 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75  wAllocationGranu
15790 6c 61 72 69 74 79 3b 0a 20 20 20 20 20 20 20 20  larity;.        
157a0 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65 77  pMap = osMapView
157b0 4f 66 46 69 6c 65 28 68 4d 61 70 2c 20 46 49 4c  OfFile(hMap, FIL
157c0 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49  E_MAP_WRITE | FI
157d0 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20  LE_MAP_READ,.   
157e0 20 20 20 20 20 20 20 20 20 30 2c 20 69 4f 66 66           0, iOff
157f0 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69  set - iOffsetShi
15800 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69  ft, szRegion + i
15810 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20 20 20  OffsetShift.    
15820 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 4f      );.        O
15830 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50  STRACE(("SHM-MAP
15840 20 70 69 64 2d 25 64 20 6d 61 70 20 72 65 67 69   pid-%d map regi
15850 6f 6e 3d 25 64 20 6f 66 66 73 65 74 3d 25 64 20  on=%d offset=%d 
15860 73 69 7a 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20  size=%d %s\n",. 
15870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15880 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e  (int)osGetCurren
15890 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53  tProcessId(), pS
158a0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c  hmNode->nRegion,
158b0 20 69 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20   iOffset,.      
158c0 20 20 20 20 20 20 20 20 20 20 20 73 7a 52 65 67             szReg
158d0 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22 6f 6b 22  ion, pMap ? "ok"
158e0 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
158f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
15900 20 21 70 4d 61 70 20 29 7b 0a 20 20 20 20 20 20   !pMap ){.      
15910 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74    pShmNode->last
15920 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
15930 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
15940 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
15950 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
15960 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f 64 65  SHMMAP, pShmNode
15970 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
15980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
15990 69 6e 53 68 6d 4d 61 70 33 22 2c 20 70 44 62 46  inShmMap3", pDbF
159a0 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
159b0 20 20 20 69 66 28 20 68 4d 61 70 20 29 20 6f 73     if( hMap ) os
159c0 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 4d 61 70  CloseHandle(hMap
159d0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
159e0 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
159f0 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 53 68 6d     }..      pShm
15a00 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53  Node->aRegion[pS
15a10 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d  hmNode->nRegion]
15a20 2e 70 4d 61 70 20 3d 20 70 4d 61 70 3b 0a 20 20  .pMap = pMap;.  
15a30 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52      pShmNode->aR
15a40 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e  egion[pShmNode->
15a50 6e 52 65 67 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20  nRegion].hMap = 
15a60 68 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d  hMap;.      pShm
15a70 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b  Node->nRegion++;
15a80 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70  .    }.  }..shmp
15a90 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70  age_out:.  if( p
15aa0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
15ab0 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  >iRegion ){.    
15ac0 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 69 52  int iOffset = iR
15ad0 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a  egion*szRegion;.
15ae0 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53      int iOffsetS
15af0 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25  hift = iOffset %
15b00 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c   winSysInfo.dwAl
15b10 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72  locationGranular
15b20 69 74 79 3b 0a 20 20 20 20 63 68 61 72 20 2a 70  ity;.    char *p
15b30 20 3d 20 28 63 68 61 72 20 2a 29 70 53 68 6d 4e   = (char *)pShmN
15b40 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 69 52 65  ode->aRegion[iRe
15b50 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a 20 20 20 20  gion].pMap;.    
15b60 2a 70 70 20 3d 20 28 76 6f 69 64 20 2a 29 26 70  *pp = (void *)&p
15b70 5b 69 4f 66 66 73 65 74 53 68 69 66 74 5d 3b 0a  [iOffsetShift];.
15b80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
15b90 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
15ba0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
15bb0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
15bc0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15bd0 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ..#else.# define
15be0 20 77 69 6e 53 68 6d 4d 61 70 20 20 20 20 20 30   winShmMap     0
15bf0 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
15c00 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69  Lock    0.# defi
15c10 6e 65 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72  ne winShmBarrier
15c20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53   0.# define winS
15c30 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64  hmUnmap   0.#end
15c40 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
15c50 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
15c60 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64  ../*.** Here end
15c70 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
15c80 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69  tion of all sqli
15c90 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73  te3_file methods
15ca0 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
15cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
15cc0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74  sqlite3_file Met
15cd0 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
15ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15cf0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
15d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d40 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ***/../*.** This
15d50 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20   vector defines 
15d60 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20  all the methods 
15d70 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65  that can operate
15d80 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65   on an.** sqlite
15d90 33 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e 33 32  3_file for win32
15da0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
15db0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
15dc0 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74 68 6f 64  hods winIoMethod
15dd0 20 3d 20 7b 0a 20 20 32 2c 20 20 20 20 20 20 20   = {.  2,       
15de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15df0 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
15e00 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65  on */.  winClose
15e10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15e20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
15e30 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61 64 2c 20  e */.  winRead, 
15e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e50 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20         /* xRead 
15e60 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65 2c 20 20  */.  winWrite,  
15e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e80 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a       /* xWrite *
15e90 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61 74 65 2c  /.  winTruncate,
15ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15eb0 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65      /* xTruncate
15ec0 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63 2c 20 20   */.  winSync,  
15ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ee0 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a        /* xSync *
15ef0 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c  /.  winFileSize,
15f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f10 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65      /* xFileSize
15f20 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20 20   */.  winLock,  
15f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f40 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a        /* xLock *
15f50 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20  /.  winUnlock,  
15f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f70 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a      /* xUnlock *
15f80 2f 0a 20 20 77 69 6e 43 68 65 63 6b 52 65 73 65  /.  winCheckRese
15f90 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20  rvedLock,       
15fa0 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
15fb0 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77  ervedLock */.  w
15fc0 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20  inFileControl,  
15fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15fe0 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a  * xFileControl *
15ff0 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72 53 69 7a  /.  winSectorSiz
16000 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
16010 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69      /* xSectorSi
16020 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65 76 69 63  ze */.  winDevic
16030 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
16040 2c 20 20 20 20 20 20 20 2f 2a 20 78 44 65 76 69  ,       /* xDevi
16050 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
16060 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70  s */.  winShmMap
16070 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16080 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
16090 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63  p */.  winShmLoc
160a0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
160b0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f         /* xShmLo
160c0 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61  ck */.  winShmBa
160d0 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20  rrier,          
160e0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42          /* xShmB
160f0 61 72 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53  arrier */.  winS
16100 68 6d 55 6e 6d 61 70 20 20 20 20 20 20 20 20 20  hmUnmap         
16110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
16120 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 7d 3b 0a 0a  ShmUnmap */.};..
16130 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
16140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
16180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74  ********** sqlit
161a0 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a  e3_vfs methods *
161b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
161c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
161d0 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20  * This division 
161e0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70  contains the imp
161f0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d  lementation of m
16200 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a  ethods on the.**
16210 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a   sqlite3_vfs obj
16220 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  ect..*/../*.** C
16230 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20 66  onvert a UTF-8 f
16240 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61  ilename into wha
16250 74 65 76 65 72 20 66 6f 72 6d 20 74 68 65 20 75  tever form the u
16260 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65  nderlying.** ope
16270 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 77 61  rating system wa
16280 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e  nts filenames in
16290 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
162a0 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69   the result.** i
162b0 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
162c0 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20  malloc and must 
162d0 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
162e0 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
162f0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
16300 6f 69 64 20 2a 63 6f 6e 76 65 72 74 55 74 66 38  oid *convertUtf8
16310 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63  Filename(const c
16320 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
16330 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
16340 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 69  ted = 0;.  if( i
16350 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f  sNT() ){.    zCo
16360 6e 76 65 72 74 65 64 20 3d 20 75 74 66 38 54 6f  nverted = utf8To
16370 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d  Unicode(zFilenam
16380 65 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73  e);./* isNT() is
16390 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f   1 if SQLITE_OS_
163a0 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69  WINCE==1, so thi
163b0 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20  s else is never 
163c0 65 78 65 63 75 74 65 64 2e 20 0a 2a 2f 0a 23 69  executed. .*/.#i
163d0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
163e0 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E==0.  }else{.  
163f0 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73    zConverted = s
16400 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
16410 38 5f 74 6f 5f 6d 62 63 73 28 7a 46 69 6c 65 6e  8_to_mbcs(zFilen
16420 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  ame);.#endif.  }
16430 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c  .  /* caller wil
16440 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20  l handle out of 
16450 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75  memory */.  retu
16460 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d  rn zConverted;.}
16470 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
16480 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
16490 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a  name in zBuf.  z
164a0 42 75 66 20 6d 75 73 74 20 62 65 20 62 69 67 20  Buf must be big 
164b0 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c  enough to.** hol
164c0 64 20 61 74 20 70 56 66 73 2d 3e 6d 78 50 61 74  d at pVfs->mxPat
164d0 68 6e 61 6d 65 20 63 68 61 72 61 63 74 65 72 73  hname characters
164e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
164f0 67 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20  getTempname(int 
16500 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
16510 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  ){.  static char
16520 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20   zChars[] =.    
16530 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
16540 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20  pqrstuvwxyz".   
16550 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
16560 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20  OPQRSTUVWXYZ".  
16570 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a    "0123456789";.
16580 20 20 73 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20    size_t i, j;. 
16590 20 63 68 61 72 20 7a 54 65 6d 70 50 61 74 68 5b   char zTempPath[
165a0 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 0a 0a 20 20  MAX_PATH+1];..  
165b0 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
165c0 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
165d0 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
165e0 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
165f0 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
16600 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
16610 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
16620 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
16630 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
16640 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
16650 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74   .  */.  Simulat
16660 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
16670 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b   SQLITE_IOERR );
16680 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ..  if( sqlite3_
16690 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29  temp_directory )
166a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
166b0 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d  printf(MAX_PATH-
166c0 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22  30, zTempPath, "
166d0 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d  %s", sqlite3_tem
166e0 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  p_directory);.  
166f0 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 54 28 29  }else if( isNT()
16700 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d   ){.    char *zM
16710 75 6c 74 69 3b 0a 20 20 20 20 57 43 48 41 52 20  ulti;.    WCHAR 
16720 7a 57 69 64 65 50 61 74 68 5b 4d 41 58 5f 50 41  zWidePath[MAX_PA
16730 54 48 5d 3b 0a 20 20 20 20 6f 73 47 65 74 54 65  TH];.    osGetTe
16740 6d 70 50 61 74 68 57 28 4d 41 58 5f 50 41 54 48  mpPathW(MAX_PATH
16750 2d 33 30 2c 20 7a 57 69 64 65 50 61 74 68 29 3b  -30, zWidePath);
16760 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20 75 6e  .    zMulti = un
16770 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 57 69 64  icodeToUtf8(zWid
16780 65 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  ePath);.    if( 
16790 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20 20 20  zMulti ){.      
167a0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
167b0 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54  (MAX_PATH-30, zT
167c0 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20 7a  empPath, "%s", z
167d0 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71  Multi);.      sq
167e0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74  lite3_free(zMult
167f0 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i);.    }else{. 
16800 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16810 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
16820 20 20 20 20 7d 0a 2f 2a 20 69 73 4e 54 28 29 20      }./* isNT() 
16830 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f  is 1 if SQLITE_O
16840 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74  S_WINCE==1, so t
16850 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65  his else is neve
16860 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20  r executed. .** 
16870 53 69 6e 63 65 20 74 68 65 20 41 4e 53 49 20 76  Since the ANSI v
16880 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20  ersion of these 
16890 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e  Windows API do n
168a0 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e  ot exist for WIN
168b0 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f  CE,.** it's impo
168c0 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66  rtant to not ref
168d0 65 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20  erence them for 
168e0 57 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f  WINCE builds..*/
168f0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
16900 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b  INCE==0.  }else{
16910 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38  .    char *zUtf8
16920 3b 0a 20 20 20 20 63 68 61 72 20 7a 4d 62 63 73  ;.    char zMbcs
16930 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a  Path[MAX_PATH];.
16940 20 20 20 20 6f 73 47 65 74 54 65 6d 70 50 61 74      osGetTempPat
16950 68 41 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20  hA(MAX_PATH-30, 
16960 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20  zMbcsPath);.    
16970 7a 55 74 66 38 20 3d 20 73 71 6c 69 74 65 33 5f  zUtf8 = sqlite3_
16980 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74  win32_mbcs_to_ut
16990 66 38 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20  f8(zMbcsPath);. 
169a0 20 20 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a     if( zUtf8 ){.
169b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
169c0 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d  printf(MAX_PATH-
169d0 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22  30, zTempPath, "
169e0 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20  %s", zUtf8);.   
169f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
16a00 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73  zUtf8);.    }els
16a10 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
16a20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
16a30 45 4d 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  EM;.    }.#endif
16a40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
16a50 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74   that the output
16a60 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67 65   buffer is large
16a70 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20   enough for the 
16a80 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a  temporary file .
16a90 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74    ** name. If it
16aa0 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20   is not, return 
16ab0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20  SQLITE_ERROR..  
16ac0 2a 2f 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65  */.  if( (sqlite
16ad0 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 50  3Strlen30(zTempP
16ae0 61 74 68 29 20 2b 20 73 71 6c 69 74 65 33 53 74  ath) + sqlite3St
16af0 72 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f 54 45  rlen30(SQLITE_TE
16b00 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20  MP_FILE_PREFIX) 
16b10 2b 20 31 37 29 20 3e 3d 20 6e 42 75 66 20 29 7b  + 17) >= nBuf ){
16b20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
16b30 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
16b40 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 33 53 74   for(i=sqlite3St
16b50 72 6c 65 6e 33 30 28 7a 54 65 6d 70 50 61 74 68  rlen30(zTempPath
16b60 29 3b 20 69 3e 30 20 26 26 20 7a 54 65 6d 70 50  ); i>0 && zTempP
16b70 61 74 68 5b 69 2d 31 5d 3d 3d 27 5c 5c 27 3b 20  ath[i-1]=='\\'; 
16b80 69 2d 2d 29 7b 7d 0a 20 20 7a 54 65 6d 70 50 61  i--){}.  zTempPa
16b90 74 68 5b 69 5d 20 3d 20 30 3b 0a 0a 20 20 73 71  th[i] = 0;..  sq
16ba0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
16bb0 42 75 66 2d 31 37 2c 20 7a 42 75 66 2c 0a 20 20  Buf-17, zBuf,.  
16bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bd0 20 22 25 73 5c 5c 22 53 51 4c 49 54 45 5f 54 45   "%s\\"SQLITE_TE
16be0 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20  MP_FILE_PREFIX, 
16bf0 7a 54 65 6d 70 50 61 74 68 29 3b 0a 20 20 6a 20  zTempPath);.  j 
16c00 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
16c10 30 28 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69 74  0(zBuf);.  sqlit
16c20 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35  e3_randomness(15
16c30 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66  , &zBuf[j]);.  f
16c40 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b  or(i=0; i<15; i+
16c50 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75  +, j++){.    zBu
16c60 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68  f[j] = (char)zCh
16c70 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20  ars[ ((unsigned 
16c80 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73  char)zBuf[j])%(s
16c90 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29  izeof(zChars)-1)
16ca0 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a   ];.  }.  zBuf[j
16cb0 5d 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43  ] = 0;..  OSTRAC
16cc0 45 28 28 22 54 45 4d 50 20 46 49 4c 45 4e 41 4d  E(("TEMP FILENAM
16cd0 45 3a 20 25 73 5c 6e 22 2c 20 7a 42 75 66 29 29  E: %s\n", zBuf))
16ce0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
16cf0 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  E_OK; .}../*.** 
16d00 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  Open a file..*/.
16d10 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70  static int winOp
16d20 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
16d30 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
16d40 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  /* Not used */. 
16d50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
16d60 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  me,        /* Na
16d70 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28  me of the file (
16d80 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69  UTF-8) */.  sqli
16d90 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20  te3_file *id,   
16da0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
16db0 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65 20 68  he SQLite file h
16dc0 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20  andle here */.  
16dd0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
16de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
16df0 6e 20 6d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a  n mode flags */.
16e00 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73    int *pOutFlags
16e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
16e20 74 61 74 75 73 20 72 65 74 75 72 6e 20 66 6c 61  tatus return fla
16e30 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c  gs */.){.  HANDL
16e40 45 20 68 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  E h;.  DWORD las
16e50 74 45 72 72 6e 6f 3b 0a 20 20 44 57 4f 52 44 20  tErrno;.  DWORD 
16e60 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 3b  dwDesiredAccess;
16e70 0a 20 20 44 57 4f 52 44 20 64 77 53 68 61 72 65  .  DWORD dwShare
16e80 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20 64 77  Mode;.  DWORD dw
16e90 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
16ea0 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64 77 46  ion;.  DWORD dwF
16eb0 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
16ec0 73 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c 49 54  s = 0;.#if SQLIT
16ed0 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74  E_OS_WINCE.  int
16ee0 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23 65 6e   isTemp = 0;.#en
16ef0 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  dif.  winFile *p
16f00 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
16f10 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  )id;.  void *zCo
16f20 6e 76 65 72 74 65 64 3b 20 20 20 20 20 20 20 20  nverted;        
16f30 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d        /* Filenam
16f40 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69 6e 67  e in OS encoding
16f50 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
16f60 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 4e   *zUtf8Name = zN
16f70 61 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d 65  ame; /* Filename
16f80 20 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 69   in UTF-8 encodi
16f90 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20  ng */.  int cnt 
16fa0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72  = 0;..  /* If ar
16fb0 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20  gument zPath is 
16fc0 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20  a NULL pointer, 
16fd0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
16fe0 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65   required to ope
16ff0 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61  n.  ** a tempora
17000 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69  ry file. Use thi
17010 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72  s buffer to stor
17020 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20  e the file name 
17030 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20  in..  */.  char 
17040 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54  zTmpname[MAX_PAT
17050 48 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 42 75 66  H+1];     /* Buf
17060 66 65 72 20 75 73 65 64 20 74 6f 20 63 72 65 61  fer used to crea
17070 74 65 20 74 65 6d 70 20 66 69 6c 65 6e 61 6d 65  te temp filename
17080 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20   */..  int rc = 
17090 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
170a0 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
170b0 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  n Return Code */
170c0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
170d0 45 42 55 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f  EBUG) || SQLITE_
170e0 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 65  OS_WINCE.  int e
170f0 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46  Type = flags&0xF
17100 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70  FFFFF00;  /* Typ
17110 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65  e of file to ope
17120 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69  n */.#endif..  i
17130 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20  nt isExclusive  
17140 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
17150 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
17160 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74  );.  int isDelet
17170 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
17180 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
17190 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69  ETEONCLOSE);.  i
171a0 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20  nt isCreate     
171b0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
171c0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
171d0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
171e0 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20   int isReadonly 
171f0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
17200 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
17210 59 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74  Y);.#endif.  int
17220 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20   isReadWrite  = 
17230 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
17240 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b  OPEN_READWRITE);
17250 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
17260 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 4a 6f 75  .  int isOpenJou
17270 72 6e 61 6c 20 3d 20 28 69 73 43 72 65 61 74 65  rnal = (isCreate
17280 20 26 26 20 28 0a 20 20 20 20 20 20 20 20 65 54   && (.        eT
17290 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
172a0 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
172b0 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
172c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
172d0 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c  _JOURNAL .     |
172e0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
172f0 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 23  OPEN_WAL.  ));.#
17300 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63  endif..  /* Chec
17310 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  k the following 
17320 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
17330 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rue: .  **.  ** 
17340 20 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e    (a) Exactly on
17350 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49  e of the READWRI
17360 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20  TE and READONLY 
17370 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65  flags must be se
17380 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28  t, and .  **   (
17390 62 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20  b) if CREATE is 
173a0 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52  set, then READWR
173b0 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ITE must also be
173c0 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20   set, and.  **  
173d0 20 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56   (c) if EXCLUSIV
173e0 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
173f0 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
17400 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28  be set..  **   (
17410 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c  d) if DELETEONCL
17420 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  OSE is set, then
17430 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
17440 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  o be set..  */. 
17450 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f   assert((isReado
17460 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  nly==0 || isRead
17470 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73  Write==0) && (is
17480 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52  ReadWrite || isR
17490 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73  eadonly));.  ass
174a0 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20  ert(isCreate==0 
174b0 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b  || isReadWrite);
174c0 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c  .  assert(isExcl
174d0 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72  usive==0 || isCr
174e0 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  eate);.  assert(
174f0 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69  isDelete==0 || i
17500 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20  sCreate);..  /* 
17510 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69  The main DB, mai
17520 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66  n journal, WAL f
17530 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a  ile and master j
17540 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72  ournal are never
17550 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63   .  ** automatic
17560 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f  ally deleted. No
17570 72 20 61 72 65 20 74 68 65 79 20 65 76 65 72 20  r are they ever 
17580 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
17590 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
175a0 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
175b0 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
175c0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
175d0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  B );.  assert( (
175e0 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
175f0 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
17600 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
17610 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65  OURNAL );.  asse
17620 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
17630 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
17640 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
17650 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b  ASTER_JOURNAL );
17660 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
17670 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
17680 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
17690 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20  _OPEN_WAL );..  
176a0 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
176b0 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68  he upper layer h
176c0 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68  as set one of th
176d0 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c  e "file-type" fl
176e0 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ags. */.  assert
176f0 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
17700 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20  OPEN_MAIN_DB    
17710 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
17720 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20  TE_OPEN_TEMP_DB 
17730 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
17740 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
17750 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54  IN_JOURNAL || eT
17760 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
17770 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20  _TEMP_JOURNAL . 
17780 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
17790 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
177a0 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70  OURNAL   || eTyp
177b0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
177c0 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20  ASTER_JOURNAL . 
177d0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
177e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
177f0 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70  SIENT_DB || eTyp
17800 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
17810 41 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72  AL.  );..  asser
17820 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 55 4e  t( id!=0 );.  UN
17830 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
17840 56 66 73 29 3b 0a 0a 20 20 70 46 69 6c 65 2d 3e  Vfs);..  pFile->
17850 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44  h = INVALID_HAND
17860 4c 45 5f 56 41 4c 55 45 3b 0a 0a 20 20 2f 2a 20  LE_VALUE;..  /* 
17870 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
17880 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
17890 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c  unction is NULL,
178a0 20 67 65 6e 65 72 61 74 65 20 61 20 0a 20 20 2a   generate a .  *
178b0 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  * temporary file
178c0 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 0a 20 20   name to use .  
178d0 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e  */.  if( !zUtf8N
178e0 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ame ){.    asser
178f0 74 28 69 73 44 65 6c 65 74 65 20 26 26 20 21 69  t(isDelete && !i
17900 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  sOpenJournal);. 
17910 20 20 20 72 63 20 3d 20 67 65 74 54 65 6d 70 6e     rc = getTempn
17920 61 6d 65 28 4d 41 58 5f 50 41 54 48 2b 31 2c 20  ame(MAX_PATH+1, 
17930 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69  zTmpname);.    i
17940 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17950 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
17960 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   rc;.    }.    z
17970 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e  Utf8Name = zTmpn
17980 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ame;.  }..  /* C
17990 6f 6e 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e  onvert the filen
179a0 61 6d 65 20 74 6f 20 74 68 65 20 73 79 73 74 65  ame to the syste
179b0 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20  m encoding. */. 
179c0 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f   zConverted = co
179d0 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d  nvertUtf8Filenam
179e0 65 28 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20  e(zUtf8Name);.  
179f0 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
17a00 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
17a10 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
17a20 45 4d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69  EM;.  }..  if( i
17a30 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20  sReadWrite ){.  
17a40 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
17a50 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44  s = GENERIC_READ
17a60 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45   | GENERIC_WRITE
17a70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
17a80 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20 3d  wDesiredAccess =
17a90 20 47 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20   GENERIC_READ;. 
17aa0 20 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f   }..  /* SQLITE_
17ab0 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 69  OPEN_EXCLUSIVE i
17ac0 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73  s used to make s
17ad0 75 72 65 20 74 68 61 74 20 61 20 6e 65 77 20 66  ure that a new f
17ae0 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 63 72 65  ile is .  ** cre
17af0 61 74 65 64 2e 20 53 51 4c 69 74 65 20 64 6f 65  ated. SQLite doe
17b00 73 6e 27 74 20 75 73 65 20 69 74 20 74 6f 20 69  sn't use it to i
17b10 6e 64 69 63 61 74 65 20 22 65 78 63 6c 75 73 69  ndicate "exclusi
17b20 76 65 20 61 63 63 65 73 73 22 20 0a 20 20 2a 2a  ve access" .  **
17b30 20 61 73 20 69 74 20 69 73 20 75 73 75 61 6c 6c   as it is usuall
17b40 79 20 75 6e 64 65 72 73 74 6f 6f 64 2e 0a 20 20  y understood..  
17b50 2a 2f 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75  */.  if( isExclu
17b60 73 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43  sive ){.    /* C
17b70 72 65 61 74 65 73 20 61 20 6e 65 77 20 66 69 6c  reates a new fil
17b80 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 64 6f  e, only if it do
17b90 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
17ba0 78 69 73 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20  xist. */.    /* 
17bb0 49 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73  If the file exis
17bc0 74 73 2c 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f  ts, it fails. */
17bd0 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44  .    dwCreationD
17be0 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 43 52 45  isposition = CRE
17bf0 41 54 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73 65  ATE_NEW;.  }else
17c00 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29 7b   if( isCreate ){
17c10 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 65 78 69  .    /* Open exi
17c20 73 74 69 6e 67 20 66 69 6c 65 2c 20 6f 72 20 63  sting file, or c
17c30 72 65 61 74 65 20 69 66 20 69 74 20 64 6f 65 73  reate if it does
17c40 6e 27 74 20 65 78 69 73 74 20 2a 2f 0a 20 20 20  n't exist */.   
17c50 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
17c60 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c  sition = OPEN_AL
17c70 57 41 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  WAYS;.  }else{. 
17c80 20 20 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69     /* Opens a fi
17c90 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 65  le, only if it e
17ca0 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20 64 77  xists. */.    dw
17cb0 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
17cc0 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54  ion = OPEN_EXIST
17cd0 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20 64 77 53 68  ING;.  }..  dwSh
17ce0 61 72 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53  areMode = FILE_S
17cf0 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45  HARE_READ | FILE
17d00 5f 53 48 41 52 45 5f 57 52 49 54 45 3b 0a 0a 20  _SHARE_WRITE;.. 
17d10 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b   if( isDelete ){
17d20 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
17d30 49 4e 43 45 0a 20 20 20 20 64 77 46 6c 61 67 73  INCE.    dwFlags
17d40 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20  AndAttributes = 
17d50 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48  FILE_ATTRIBUTE_H
17d60 49 44 44 45 4e 3b 0a 20 20 20 20 69 73 54 65 6d  IDDEN;.    isTem
17d70 70 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20  p = 1;.#else.   
17d80 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
17d90 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54  butes = FILE_ATT
17da0 52 49 42 55 54 45 5f 54 45 4d 50 4f 52 41 52 59  RIBUTE_TEMPORARY
17db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17dd0 7c 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  | FILE_ATTRIBUTE
17de0 5f 48 49 44 44 45 4e 0a 20 20 20 20 20 20 20 20  _HIDDEN.        
17df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e00 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c         | FILE_FL
17e10 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f  AG_DELETE_ON_CLO
17e20 53 45 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  SE;.#endif.  }el
17e30 73 65 7b 0a 20 20 20 20 64 77 46 6c 61 67 73 41  se{.    dwFlagsA
17e40 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46  ndAttributes = F
17e50 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f  ILE_ATTRIBUTE_NO
17e60 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52  RMAL;.  }.  /* R
17e70 65 70 6f 72 74 73 20 66 72 6f 6d 20 74 68 65 20  eports from the 
17e80 69 6e 74 65 72 6e 65 74 20 61 72 65 20 74 68 61  internet are tha
17e90 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 73  t performance is
17ea0 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65 74   always.  ** bet
17eb0 74 65 72 20 69 66 20 46 49 4c 45 5f 46 4c 41 47  ter if FILE_FLAG
17ec0 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69  _RANDOM_ACCESS i
17ed0 73 20 75 73 65 64 2e 20 20 54 69 63 6b 65 74 20  s used.  Ticket 
17ee0 23 32 36 39 39 2e 20 2a 2f 0a 23 69 66 20 53 51  #2699. */.#if SQ
17ef0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
17f00 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
17f10 75 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41  utes |= FILE_FLA
17f20 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b  G_RANDOM_ACCESS;
17f30 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 69  .#endif..  if( i
17f40 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 77 68 69  sNT() ){.    whi
17f50 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74  le( (h = osCreat
17f60 65 46 69 6c 65 57 28 28 4c 50 43 57 53 54 52 29  eFileW((LPCWSTR)
17f70 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
17f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f90 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69            dwDesi
17fa0 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20  redAccess,.     
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 64 77 53 68 61 72 65           dwShare
17fd0 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20  Mode, NULL,.    
17fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ff0 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61            dwCrea
18000 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c  tionDisposition,
18010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
18030 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
18040 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tes,.           
18050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18060 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c     NULL))==INVAL
18070 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
18080 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
18090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180a0 20 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74   retryIoerr(&cnt
180b0 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
180c0 7d 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31  }./* isNT() is 1
180d0 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   if SQLITE_OS_WI
180e0 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20  NCE==1, so this 
180f0 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78  else is never ex
18100 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63  ecuted. .** Sinc
18110 65 20 74 68 65 20 41 4e 53 49 20 76 65 72 73 69  e the ANSI versi
18120 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64  on of these Wind
18130 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65  ows API do not e
18140 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a  xist for WINCE,.
18150 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e  ** it's importan
18160 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e  t to not referen
18170 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43  ce them for WINC
18180 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66  E builds..*/.#if
18190 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
181a0 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ==0.  }else{.   
181b0 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43   while( (h = osC
181c0 72 65 61 74 65 46 69 6c 65 41 28 28 4c 50 43 53  reateFileA((LPCS
181d0 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
181e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181f0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44               dwD
18200 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20  esiredAccess,.  
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 64 77 53 68              dwSh
18230 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20  areMode, NULL,. 
18240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18250 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43               dwC
18260 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
18270 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  on,.            
18280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18290 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
182a0 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20  ibutes,.        
182b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182c0 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e        NULL))==IN
182d0 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
182e0 55 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  UE &&.          
182f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18300 20 20 20 20 72 65 74 72 79 49 6f 65 72 72 28 26      retryIoerr(&
18310 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
18320 20 29 7b 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a   ){}.#endif.  }.
18330 0a 20 20 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29  .  logIoerr(cnt)
18340 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f  ;..  OSTRACE(("O
18350 50 45 4e 20 25 64 20 25 73 20 30 78 25 6c 78 20  PEN %d %s 0x%lx 
18360 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  %s\n", .        
18370 20 20 20 68 2c 20 7a 4e 61 6d 65 2c 20 64 77 44     h, zName, dwD
18380 65 73 69 72 65 64 41 63 63 65 73 73 2c 20 0a 20  esiredAccess, . 
18390 20 20 20 20 20 20 20 20 20 20 68 3d 3d 49 4e 56            h==INV
183a0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
183b0 45 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22  E ? "failed" : "
183c0 6f 6b 22 29 29 3b 0a 0a 20 20 69 66 28 20 68 3d  ok"));..  if( h=
183d0 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
183e0 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 70 46 69  VALUE ){.    pFi
183f0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
18400 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77  lastErrno;.    w
18410 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
18420 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 70 46 69 6c  E_CANTOPEN, pFil
18430 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77  e->lastErrno, "w
18440 69 6e 4f 70 65 6e 22 2c 20 7a 55 74 66 38 4e 61  inOpen", zUtf8Na
18450 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
18460 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
18470 29 3b 0a 20 20 20 20 69 66 28 20 69 73 52 65 61  );.    if( isRea
18480 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78 63  dWrite && !isExc
18490 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  lusive ){.      
184a0 72 65 74 75 72 6e 20 77 69 6e 4f 70 65 6e 28 70  return winOpen(p
184b0 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 69 64 2c 20  Vfs, zName, id, 
184c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28  .             ((
184d0 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f 4f 50 45  flags|SQLITE_OPE
184e0 4e 5f 52 45 41 44 4f 4e 4c 59 29 26 7e 28 53 51  N_READONLY)&~(SQ
184f0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
18500 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  |SQLITE_OPEN_REA
18510 44 57 52 49 54 45 29 29 2c 20 70 4f 75 74 46 6c  DWRITE)), pOutFl
18520 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ags);.    }else{
18530 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
18540 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
18550 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  PT;.    }.  }.. 
18560 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29   if( pOutFlags )
18570 7b 0a 20 20 20 20 69 66 28 20 69 73 52 65 61 64  {.    if( isRead
18580 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 2a  Write ){.      *
18590 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49  pOutFlags = SQLI
185a0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
185b0 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
185c0 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d      *pOutFlags =
185d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
185e0 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d  DONLY;.    }.  }
185f0 0a 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65  ..  memset(pFile
18600 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 46 69  , 0, sizeof(*pFi
18610 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70  le));.  pFile->p
18620 4d 65 74 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d  Method = &winIoM
18630 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e  ethod;.  pFile->
18640 68 20 3d 20 68 3b 0a 20 20 70 46 69 6c 65 2d 3e  h = h;.  pFile->
18650 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45  lastErrno = NO_E
18660 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65 2d 3e 70  RROR;.  pFile->p
18670 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 46  Vfs = pVfs;.  pF
18680 69 6c 65 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20  ile->pShm = 0;. 
18690 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20   pFile->zPath = 
186a0 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 73 71 6c  zName;.  if( sql
186b0 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
186c0 28 7a 4e 61 6d 65 2c 20 22 7a 65 72 6f 5f 64 61  (zName, "zero_da
186d0 6d 61 67 65 22 2c 20 31 29 20 29 7b 0a 20 20 20  mage", 1) ){.   
186e0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
186f0 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 5a 45 52  s |= WINFILE_ZER
18700 4f 5f 44 41 4d 41 47 45 3b 0a 20 20 7d 0a 20 20  O_DAMAGE;.  }.  
18710 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
18720 65 20 3d 20 67 65 74 53 65 63 74 6f 72 53 69 7a  e = getSectorSiz
18730 65 28 70 56 66 73 2c 20 7a 55 74 66 38 4e 61 6d  e(pVfs, zUtf8Nam
18740 65 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  e);..#if SQLITE_
18750 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66 28 20 69  OS_WINCE.  if( i
18760 73 52 65 61 64 57 72 69 74 65 20 26 26 20 65 54  sReadWrite && eT
18770 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
18780 5f 4d 41 49 4e 5f 44 42 0a 20 20 20 20 20 20 20  _MAIN_DB.       
18790 26 26 20 21 77 69 6e 63 65 43 72 65 61 74 65 4c  && !winceCreateL
187a0 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 6c 65  ock(zName, pFile
187b0 29 0a 20 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f  ).  ){.    osClo
187c0 73 65 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20  seHandle(h);.   
187d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
187e0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 72  onverted);.    r
187f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
18800 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 7d 0a  TOPEN_BKPT;.  }.
18810 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a    if( isTemp ){.
18820 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65      pFile->zDele
18830 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e  teOnClose = zCon
18840 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a  verted;.  }else.
18850 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73  #endif.  {.    s
18860 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
18870 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 0a 20 20  verted);.  }..  
18880 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b  OpenCounter(+1);
18890 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
188a0 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
188b0 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a  e named file..**
188c0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 57 69  .** Note that Wi
188d0 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61  ndows does not a
188e0 6c 6c 6f 77 20 61 20 66 69 6c 65 20 74 6f 20 62  llow a file to b
188f0 65 20 64 65 6c 65 74 65 64 20 69 66 20 73 6f 6d  e deleted if som
18900 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65  e other.** proce
18910 73 73 20 68 61 73 20 69 74 20 6f 70 65 6e 2e 20  ss has it open. 
18920 20 53 6f 6d 65 74 69 6d 65 73 20 61 20 76 69 72   Sometimes a vir
18930 75 73 20 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e  us scanner or in
18940 64 65 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a  dexing program.*
18950 2a 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f  * will open a jo
18960 75 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72 74  urnal file short
18970 6c 79 20 61 66 74 65 72 20 69 74 20 69 73 20 63  ly after it is c
18980 72 65 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  reated in order 
18990 74 6f 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65  to do.** whateve
189a0 72 20 69 74 20 64 6f 65 73 2e 20 20 57 68 69 6c  r it does.  Whil
189b0 65 20 74 68 69 73 20 6f 74 68 65 72 20 70 72 6f  e this other pro
189c0 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
189d0 74 68 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e  the.** file open
189e0 2c 20 77 65 20 77 69 6c 6c 20 62 65 20 75 6e 61  , we will be una
189f0 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 69 74  ble to delete it
18a00 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  .  To work aroun
18a10 64 20 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65  d this.** proble
18a20 6d 2c 20 77 65 20 64 65 6c 61 79 20 31 30 30 20  m, we delay 100 
18a30 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64  milliseconds and
18a40 20 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20 61   try to delete a
18a50 67 61 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20  gain.  Up.** to 
18a60 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45  MX_DELETION_ATTE
18a70 4d 50 54 73 20 64 65 6c 65 74 69 6f 6e 20 61 74  MPTs deletion at
18a80 74 65 6d 70 74 73 20 61 72 65 20 72 75 6e 20 62  tempts are run b
18a90 65 66 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20  efore giving.** 
18aa0 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67  up and returning
18ab0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74   an error..*/.st
18ac0 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65  atic int winDele
18ad0 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  te(.  sqlite3_vf
18ae0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
18af0 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e    /* Not used on
18b00 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73   win32 */.  cons
18b10 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
18b20 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  e,      /* Name 
18b30 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74  of file to delet
18b40 65 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44  e */.  int syncD
18b50 69 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ir              
18b60 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f     /* Not used o
18b70 6e 20 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20  n win32 */.){.  
18b80 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  int cnt = 0;.  i
18b90 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 6c  nt rc;.  DWORD l
18ba0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 76 6f 69 64  astErrno;.  void
18bb0 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20   *zConverted;.  
18bc0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
18bd0 28 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44  (pVfs);.  UNUSED
18be0 5f 50 41 52 41 4d 45 54 45 52 28 73 79 6e 63 44  _PARAMETER(syncD
18bf0 69 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  ir);..  Simulate
18c00 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
18c10 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
18c20 54 45 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65  TE);.  zConverte
18c30 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46  d = convertUtf8F
18c40 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  ilename(zFilenam
18c50 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
18c60 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rted==0 ){.    r
18c70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
18c80 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  RR_NOMEM;.  }.  
18c90 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
18ca0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 77 68    rc = 1;.    wh
18cb0 69 6c 65 28 20 6f 73 47 65 74 46 69 6c 65 41 74  ile( osGetFileAt
18cc0 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65  tributesW(zConve
18cd0 72 74 65 64 29 21 3d 49 4e 56 41 4c 49 44 5f 46  rted)!=INVALID_F
18ce0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 26  ILE_ATTRIBUTES &
18cf0 26 0a 20 20 20 20 20 20 20 20 20 28 72 63 20 3d  &.         (rc =
18d00 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28 7a   osDeleteFileW(z
18d10 43 6f 6e 76 65 72 74 65 64 29 29 3d 3d 30 20 26  Converted))==0 &
18d20 26 20 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e  & retryIoerr(&cn
18d30 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
18d40 7b 7d 0a 20 20 20 20 72 63 20 3d 20 72 63 20 3f  {}.    rc = rc ?
18d50 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
18d60 49 54 45 5f 45 52 52 4f 52 3b 0a 2f 2a 20 69 73  ITE_ERROR;./* is
18d70 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c  NT() is 1 if SQL
18d80 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c  ITE_OS_WINCE==1,
18d90 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73   so this else is
18da0 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e   never executed.
18db0 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41   .** Since the A
18dc0 4e 53 49 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  NSI version of t
18dd0 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50 49  hese Windows API
18de0 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66 6f   do not exist fo
18df0 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73  r WINCE,.** it's
18e00 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f   important to no
18e10 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 6d  t reference them
18e20 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c 64   for WINCE build
18e30 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  s..*/.#if SQLITE
18e40 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d  _OS_WINCE==0.  }
18e50 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31  else{.    rc = 1
18e60 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6f 73 47  ;.    while( osG
18e70 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
18e80 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 21 3d 49  A(zConverted)!=I
18e90 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
18ea0 49 42 55 54 45 53 20 26 26 0a 20 20 20 20 20 20  IBUTES &&.      
18eb0 20 20 20 28 72 63 20 3d 20 6f 73 44 65 6c 65 74     (rc = osDelet
18ec0 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65  eFileA(zConverte
18ed0 64 29 29 3d 3d 30 20 26 26 20 72 65 74 72 79 49  d))==0 && retryI
18ee0 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
18ef0 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 72  Errno) ){}.    r
18f00 63 20 3d 20 72 63 20 3f 20 53 51 4c 49 54 45 5f  c = rc ? SQLITE_
18f10 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  OK : SQLITE_ERRO
18f20 52 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  R;.#endif.  }.  
18f30 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 63  if( rc ){.    rc
18f40 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
18f50 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
18f60 54 45 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  TE, lastErrno,. 
18f70 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
18f80 44 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61  Delete", zFilena
18f90 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
18fa0 20 20 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b    logIoerr(cnt);
18fb0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
18fc0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
18fd0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c  .  OSTRACE(("DEL
18fe0 45 54 45 20 5c 22 25 73 5c 22 20 25 73 5c 6e 22  ETE \"%s\" %s\n"
18ff0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 72 63  , zFilename, (rc
19000 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f   ? "failed" : "o
19010 6b 22 20 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  k" )));.  return
19020 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
19030 65 63 6b 20 74 68 65 20 65 78 69 73 74 61 6e 63  eck the existanc
19040 65 20 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20  e and status of 
19050 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
19060 63 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28  c int winAccess(
19070 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
19080 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a  pVfs,         /*
19090 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e   Not used on win
190a0 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  32 */.  const ch
190b0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
190c0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
190d0 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  le to check */. 
190e0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
190f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19100 79 70 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d  ype of test to m
19110 61 6b 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ake on this file
19120 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f   */.  int *pResO
19130 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
19140 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20   /* OUT: Result 
19150 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61 74  */.){.  DWORD at
19160 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  tr;.  int rc = 0
19170 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
19180 72 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  rno;.  void *zCo
19190 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45  nverted;.  UNUSE
191a0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
191b0 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  );..  SimulateIO
191c0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
191d0 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
191e0 53 3b 20 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74  S; );.  zConvert
191f0 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38  ed = convertUtf8
19200 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Filename(zFilena
19210 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  me);.  if( zConv
19220 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
19230 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
19240 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ERR_NOMEM;.  }. 
19250 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20   if( isNT() ){. 
19260 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a     int cnt = 0;.
19270 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41      WIN32_FILE_A
19280 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41  TTRIBUTE_DATA sA
19290 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d  ttrData;.    mem
192a0 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20  set(&sAttrData, 
192b0 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44  0, sizeof(sAttrD
192c0 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65  ata));.    while
192d0 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69  ( !(rc = osGetFi
192e0 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28  leAttributesExW(
192f0 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
19300 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
19310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19320 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53    GetFileExInfoS
19330 74 61 6e 64 61 72 64 2c 20 0a 20 20 20 20 20 20  tandard, .      
19340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19350 20 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74         &sAttrDat
19360 61 29 29 20 26 26 20 72 65 74 72 79 49 6f 65 72  a)) && retryIoer
19370 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
19380 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20  no) ){}.    if( 
19390 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  rc ){.      /* F
193a0 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 41 43 43  or an SQLITE_ACC
193b0 45 53 53 5f 45 58 49 53 54 53 20 71 75 65 72 79  ESS_EXISTS query
193c0 2c 20 74 72 65 61 74 20 61 20 7a 65 72 6f 2d 6c  , treat a zero-l
193d0 65 6e 67 74 68 20 66 69 6c 65 0a 20 20 20 20 20  ength file.     
193e0 20 2a 2a 20 61 73 20 69 66 20 69 74 20 64 6f 65   ** as if it doe
193f0 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20  s not exist..   
19400 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
19410 20 20 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45     flags==SQLITE
19420 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 0a 20  _ACCESS_EXISTS. 
19430 20 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74           && sAtt
19440 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48  rData.nFileSizeH
19450 69 67 68 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  igh==0 .        
19460 20 20 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e    && sAttrData.n
19470 46 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30 20 29  FileSizeLow==0 )
19480 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d  {.        attr =
19490 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54   INVALID_FILE_AT
194a0 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20  TRIBUTES;.      
194b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
194c0 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e  ttr = sAttrData.
194d0 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  dwFileAttributes
194e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
194f0 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 67 49 6f  lse{.      logIo
19500 65 72 72 28 63 6e 74 29 3b 0a 20 20 20 20 20 20  err(cnt);.      
19510 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45  if( lastErrno!=E
19520 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f  RROR_FILE_NOT_FO
19530 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 77  UND ){.        w
19540 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
19550 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 2c 20  E_IOERR_ACCESS, 
19560 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 41  lastErrno, "winA
19570 63 63 65 73 73 22 2c 20 7a 46 69 6c 65 6e 61 6d  ccess", zFilenam
19580 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
19590 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
195a0 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ted);.        re
195b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
195c0 52 5f 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20  R_ACCESS;.      
195d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
195e0 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49  ttr = INVALID_FI
195f0 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20  LE_ATTRIBUTES;. 
19600 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 2f 2a 20       }.    }./* 
19610 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53  isNT() is 1 if S
19620 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
19630 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20  1, so this else 
19640 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  is never execute
19650 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65  d. .** Since the
19660 20 41 4e 53 49 20 76 65 72 73 69 6f 6e 20 6f 66   ANSI version of
19670 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41   these Windows A
19680 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  PI do not exist 
19690 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74  for WINCE,.** it
196a0 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  's important to 
196b0 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  not reference th
196c0 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69  em for WINCE bui
196d0 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  lds..*/.#if SQLI
196e0 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20  TE_OS_WINCE==0. 
196f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72   }else{.    attr
19700 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
19710 69 62 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a  ibutesA((char*)z
19720 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64  Converted);.#end
19730 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  if.  }.  sqlite3
19740 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
19750 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61  );.  switch( fla
19760 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  gs ){.    case S
19770 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
19780 44 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  D:.    case SQLI
19790 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
197a0 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74 74  :.      rc = att
197b0 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r!=INVALID_FILE_
197c0 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20  ATTRIBUTES;.    
197d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
197e0 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
197f0 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20  READWRITE:.     
19800 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41   rc = attr!=INVA
19810 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
19820 54 45 53 20 26 26 0a 20 20 20 20 20 20 20 20 20  TES &&.         
19830 20 20 20 20 28 61 74 74 72 20 26 20 46 49 4c 45      (attr & FILE
19840 5f 41 54 54 52 49 42 55 54 45 5f 52 45 41 44 4f  _ATTRIBUTE_READO
19850 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20 20 62  NLY)==0;.      b
19860 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
19870 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t:.      assert(
19880 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20  !"Invalid flags 
19890 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a  argument");.  }.
198a0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63 3b    *pResOut = rc;
198b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
198c0 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  _OK;.}.../*.** T
198d0 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70  urn a relative p
198e0 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66  athname into a f
198f0 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 57  ull pathname.  W
19900 72 69 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a  rite the full.**
19910 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a   pathname into z
19920 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77  Out[].  zOut[] w
19930 69 6c 6c 20 62 65 20 61 74 20 6c 65 61 73 74 20  ill be at least 
19940 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
19950 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a  .** bytes in siz
19960 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
19970 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65   winFullPathname
19980 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
19990 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
199a0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
199b0 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
199c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c  const char *zRel
199d0 61 74 69 76 65 2c 20 20 20 20 20 20 20 20 2f 2a  ative,        /*
199e0 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69   Possibly relati
199f0 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f  ve input path */
19a00 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20  .  int nFull,   
19a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70   /* Size of outp
19a30 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74  ut buffer in byt
19a40 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  es */.  char *zF
19a50 75 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  ull             
19a60 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
19a70 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 0a  buffer */.){.  .
19a80 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59  #if defined(__CY
19a90 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61  GWIN__).  Simula
19aa0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
19ab0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
19ac0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
19ad0 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 63  ETER(nFull);.  c
19ae0 79 67 77 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 66 75  ygwin_conv_to_fu
19af0 6c 6c 5f 77 69 6e 33 32 5f 70 61 74 68 28 7a 52  ll_win32_path(zR
19b00 65 6c 61 74 69 76 65 2c 20 7a 46 75 6c 6c 29 3b  elative, zFull);
19b10 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19b20 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  _OK;.#endif..#if
19b30 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
19b40 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
19b50 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
19b60 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55  E_ERROR );.  UNU
19b70 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46  SED_PARAMETER(nF
19b80 75 6c 6c 29 3b 0a 20 20 2f 2a 20 57 69 6e 43 45  ull);.  /* WinCE
19b90 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20   has no concept 
19ba0 6f 66 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  of a relative pa
19bb0 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20  thname, or so I 
19bc0 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 73 71  am told. */.  sq
19bd0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 70  lite3_snprintf(p
19be0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c  Vfs->mxPathname,
19bf0 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52   zFull, "%s", zR
19c00 65 6c 61 74 69 76 65 29 3b 0a 20 20 72 65 74 75  elative);.  retu
19c10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
19c20 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54  ndif..#if !SQLIT
19c30 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64  E_OS_WINCE && !d
19c40 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
19c50 5f 29 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  _).  int nByte;.
19c60 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
19c70 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74  ed;.  char *zOut
19c80 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
19c90 70 61 74 68 20 6e 61 6d 65 20 62 65 67 69 6e 73  path name begins
19ca0 20 77 69 74 68 20 22 2f 58 3a 22 2c 20 77 68 65   with "/X:", whe
19cb0 72 65 20 22 58 22 20 69 73 20 61 6e 79 20 61 6c  re "X" is any al
19cc0 70 68 61 62 65 74 69 63 0a 20 20 2a 2a 20 63 68  phabetic.  ** ch
19cd0 61 72 61 63 74 65 72 2c 20 64 69 73 63 61 72 64  aracter, discard
19ce0 20 74 68 65 20 69 6e 69 74 69 61 6c 20 22 2f 22   the initial "/"
19cf0 20 66 72 6f 6d 20 74 68 65 20 70 61 74 68 6e 61   from the pathna
19d00 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  me..  */.  if( z
19d10 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27  Relative[0]=='/'
19d20 20 26 26 20 73 71 6c 69 74 65 33 49 73 61 6c 70   && sqlite3Isalp
19d30 68 61 28 7a 52 65 6c 61 74 69 76 65 5b 31 5d 29  ha(zRelative[1])
19d40 20 26 26 20 7a 52 65 6c 61 74 69 76 65 5b 32 5d   && zRelative[2]
19d50 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20 7a 52 65  ==':' ){.    zRe
19d60 6c 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 20  lative++;.  }.. 
19d70 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
19d80 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
19d90 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
19da0 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
19db0 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
19dc0 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
19dd0 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
19de0 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
19df0 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
19e00 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
19e10 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
19e20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66  could fail if, f
19e30 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a  or example, the.
19e40 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72    ** current wor
19e50 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68  king directory h
19e60 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64  as been unlinked
19e70 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
19e80 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
19e90 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
19ea0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
19eb0 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 7a 43  TER(nFull);.  zC
19ec0 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65  onverted = conve
19ed0 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  rtUtf8Filename(z
19ee0 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 69 66 28  Relative);.  if(
19ef0 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
19f00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
19f10 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
19f20 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28  .  }.  if( isNT(
19f30 29 20 29 7b 0a 20 20 20 20 4c 50 57 53 54 52 20  ) ){.    LPWSTR 
19f40 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65  zTemp;.    nByte
19f50 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68   = osGetFullPath
19f60 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a  NameW((LPCWSTR)z
19f70 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c  Converted, 0, 0,
19f80 20 30 29 20 2b 20 33 3b 0a 20 20 20 20 7a 54 65   0) + 3;.    zTe
19f90 6d 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  mp = sqlite3_mal
19fa0 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f  loc( nByte*sizeo
19fb0 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20  f(zTemp[0]) );. 
19fc0 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20     if( zTemp==0 
19fd0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
19fe0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
19ff0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1a000 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
1a010 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 73  EM;.    }.    os
1a020 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
1a030 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
1a040 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65  rted, nByte, zTe
1a050 6d 70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  mp, 0);.    sqli
1a060 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
1a070 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d  ted);.    zOut =
1a080 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a   unicodeToUtf8(z
1a090 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  Temp);.    sqlit
1a0a0 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a  e3_free(zTemp);.
1a0b0 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69  /* isNT() is 1 i
1a0c0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
1a0d0 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c  E==1, so this el
1a0e0 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63  se is never exec
1a0f0 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20  uted. .** Since 
1a100 74 68 65 20 41 4e 53 49 20 76 65 72 73 69 6f 6e  the ANSI version
1a110 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77   of these Window
1a120 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69  s API do not exi
1a130 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a  st for WINCE,.**
1a140 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20   it's important 
1a150 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65  to not reference
1a160 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20   them for WINCE 
1a170 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53  builds..*/.#if S
1a180 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
1a190 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  0.  }else{.    c
1a1a0 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20  har *zTemp;.    
1a1b0 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c  nByte = osGetFul
1a1c0 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72  lPathNameA((char
1a1d0 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c  *)zConverted, 0,
1a1e0 20 30 2c 20 30 29 20 2b 20 33 3b 0a 20 20 20 20   0, 0) + 3;.    
1a1f0 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 5f  zTemp = sqlite3_
1a200 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69  malloc( nByte*si
1a210 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29  zeof(zTemp[0]) )
1a220 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d  ;.    if( zTemp=
1a230 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
1a240 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
1a250 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
1a260 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1a270 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
1a280 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
1a290 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  meA((char*)zConv
1a2a0 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54  erted, nByte, zT
1a2b0 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  emp, 0);.    sql
1a2c0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
1a2d0 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20  rted);.    zOut 
1a2e0 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
1a2f0 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65  mbcs_to_utf8(zTe
1a300 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mp);.    sqlite3
1a310 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 23 65  _free(zTemp);.#e
1a320 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 7a  ndif.  }.  if( z
1a330 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Out ){.    sqlit
1a340 65 33 5f 73 6e 70 72 69 6e 74 66 28 70 56 66 73  e3_snprintf(pVfs
1a350 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 46  ->mxPathname, zF
1a360 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29  ull, "%s", zOut)
1a370 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1a380 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65  ee(zOut);.    re
1a390 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a3a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
1a3b0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1a3c0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64  _NOMEM;.  }.#end
1a3d0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  if.}../*.** Get 
1a3e0 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
1a3f0 6f 66 20 74 68 65 20 64 65 76 69 63 65 20 75 73  of the device us
1a400 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 66  ed to store.** f
1a410 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
1a420 6e 74 20 67 65 74 53 65 63 74 6f 72 53 69 7a 65  nt getSectorSize
1a430 28 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  (.    sqlite3_vf
1a440 73 20 2a 70 56 66 73 2c 0a 20 20 20 20 63 6f 6e  s *pVfs,.    con
1a450 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69  st char *zRelati
1a460 76 65 20 20 20 20 20 2f 2a 20 55 54 46 2d 38 20  ve     /* UTF-8 
1a470 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 29 7b 0a  file name */.){.
1a480 20 20 44 57 4f 52 44 20 62 79 74 65 73 50 65 72    DWORD bytesPer
1a490 53 65 63 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f  Sector = SQLITE_
1a4a0 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53  DEFAULT_SECTOR_S
1a4b0 49 5a 45 3b 0a 20 20 2f 2a 20 47 65 74 44 69 73  IZE;.  /* GetDis
1a4c0 6b 46 72 65 65 53 70 61 63 65 20 69 73 20 6e 6f  kFreeSpace is no
1a4d0 74 20 73 75 70 70 6f 72 74 65 64 20 75 6e 64 65  t supported unde
1a4e0 72 20 57 49 4e 43 45 20 2a 2f 0a 23 69 66 20 53  r WINCE */.#if S
1a4f0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
1a500 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1a510 52 28 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45  R(pVfs);.  UNUSE
1a520 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 52 65 6c  D_PARAMETER(zRel
1a530 61 74 69 76 65 29 3b 0a 23 65 6c 73 65 0a 20 20  ative);.#else.  
1a540 63 68 61 72 20 7a 46 75 6c 6c 70 61 74 68 5b 4d  char zFullpath[M
1a550 41 58 5f 50 41 54 48 2b 31 5d 3b 0a 20 20 69 6e  AX_PATH+1];.  in
1a560 74 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 64 77  t rc;.  DWORD dw
1a570 52 65 74 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44  Ret = 0;.  DWORD
1a580 20 64 77 44 75 6d 6d 79 3b 0a 0a 20 20 2f 2a 0a   dwDummy;..  /*.
1a590 20 20 2a 2a 20 57 65 20 6e 65 65 64 20 74 6f 20    ** We need to 
1a5a0 67 65 74 20 74 68 65 20 66 75 6c 6c 20 70 61 74  get the full pat
1a5b0 68 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  h name of the fi
1a5c0 6c 65 0a 20 20 2a 2a 20 74 6f 20 67 65 74 20 74  le.  ** to get t
1a5d0 68 65 20 64 72 69 76 65 20 6c 65 74 74 65 72 20  he drive letter 
1a5e0 74 6f 20 6c 6f 6f 6b 20 75 70 20 74 68 65 20 73  to look up the s
1a5f0 65 63 74 6f 72 0a 20 20 2a 2a 20 73 69 7a 65 2e  ector.  ** size.
1a600 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
1a610 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
1a620 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
1a630 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
1a640 20 20 72 63 20 3d 20 77 69 6e 46 75 6c 6c 50 61    rc = winFullPa
1a650 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 52 65  thname(pVfs, zRe
1a660 6c 61 74 69 76 65 2c 20 4d 41 58 5f 50 41 54 48  lative, MAX_PATH
1a670 2c 20 7a 46 75 6c 6c 70 61 74 68 29 3b 0a 20 20  , zFullpath);.  
1a680 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
1a690 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 53 69 6d 75  Malloc();.  Simu
1a6a0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1a6b0 6e 28 30 29 3b 0a 20 20 69 66 28 20 72 63 20 3d  n(0);.  if( rc =
1a6c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 0a 20 20  = SQLITE_OK ).  
1a6d0 7b 0a 20 20 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  {.    void *zCon
1a6e0 76 65 72 74 65 64 3b 0a 20 20 20 20 73 71 6c 69  verted;.    sqli
1a6f0 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
1a700 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7a 43 6f 6e  lloc();.    zCon
1a710 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74  verted = convert
1a720 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 75  Utf8Filename(zFu
1a730 6c 6c 70 61 74 68 29 3b 0a 20 20 20 20 73 71 6c  llpath);.    sql
1a740 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
1a750 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28 20 7a  loc();.    if( z
1a760 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20  Converted ){.   
1a770 20 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b     if( isNT() ){
1a780 0a 20 20 20 20 20 20 20 20 2f 2a 20 74 72 69 6d  .        /* trim
1a790 20 70 61 74 68 20 74 6f 20 6a 75 73 74 20 64 72   path to just dr
1a7a0 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ive reference */
1a7b0 0a 20 20 20 20 20 20 20 20 4c 50 57 53 54 52 20  .        LPWSTR 
1a7c0 70 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  p = zConverted;.
1a7d0 20 20 20 20 20 20 20 20 66 6f 72 28 3b 2a 70 3b          for(;*p;
1a7e0 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  p++){.          
1a7f0 69 66 28 20 2a 70 20 3d 3d 20 27 5c 5c 27 20 29  if( *p == '\\' )
1a800 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
1a810 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20   = '\0';.       
1a820 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a830 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a840 7d 0a 20 20 20 20 20 20 20 20 64 77 52 65 74 20  }.        dwRet 
1a850 3d 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53  = osGetDiskFreeS
1a860 70 61 63 65 57 28 28 4c 50 43 57 53 54 52 29 7a  paceW((LPCWSTR)z
1a870 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
1a880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
1a8a0 64 77 44 75 6d 6d 79 2c 0a 20 20 20 20 20 20 20  dwDummy,.       
1a8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 62 79               &by
1a8d0 74 65 73 50 65 72 53 65 63 74 6f 72 2c 0a 20 20  tesPerSector,.  
1a8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a900 20 20 26 64 77 44 75 6d 6d 79 2c 0a 20 20 20 20    &dwDummy,.    
1a910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a930 26 64 77 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20  &dwDummy);.     
1a940 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a950 2f 2a 20 74 72 69 6d 20 70 61 74 68 20 74 6f 20  /* trim path to 
1a960 6a 75 73 74 20 64 72 69 76 65 20 72 65 66 65 72  just drive refer
1a970 65 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  ence */.        
1a980 63 68 61 72 20 2a 70 20 3d 20 28 63 68 61 72 20  char *p = (char 
1a990 2a 29 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20  *)zConverted;.  
1a9a0 20 20 20 20 20 20 66 6f 72 28 3b 2a 70 3b 70 2b        for(;*p;p+
1a9b0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
1a9c0 28 20 2a 70 20 3d 3d 20 27 5c 5c 27 20 29 7b 0a  ( *p == '\\' ){.
1a9d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 20 3d              *p =
1a9e0 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 20   '\0';.         
1a9f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1aa00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1aa10 20 20 20 20 20 20 20 20 64 77 52 65 74 20 3d 20          dwRet = 
1aa20 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53 70 61  osGetDiskFreeSpa
1aa30 63 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  ceA((char*)zConv
1aa40 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
1aa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa60 20 20 20 20 20 20 20 20 20 20 20 26 64 77 44 75             &dwDu
1aa70 6d 6d 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mmy,.           
1aa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa90 20 20 20 20 20 20 20 20 20 26 62 79 74 65 73 50           &bytesP
1aaa0 65 72 53 65 63 74 6f 72 2c 0a 20 20 20 20 20 20  erSector,.      
1aab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 64                &d
1aad0 77 44 75 6d 6d 79 2c 0a 20 20 20 20 20 20 20 20  wDummy,.        
1aae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aaf0 20 20 20 20 20 20 20 20 20 20 20 20 26 64 77 44              &dwD
1ab00 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ummy);.      }. 
1ab10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1ab20 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
1ab30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 77     }.    if( !dw
1ab40 52 65 74 20 29 7b 0a 20 20 20 20 20 20 62 79 74  Ret ){.      byt
1ab50 65 73 50 65 72 53 65 63 74 6f 72 20 3d 20 53 51  esPerSector = SQ
1ab60 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43  LITE_DEFAULT_SEC
1ab70 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a  TOR_SIZE;.    }.
1ab80 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
1ab90 75 72 6e 20 28 69 6e 74 29 20 62 79 74 65 73 50  urn (int) bytesP
1aba0 65 72 53 65 63 74 6f 72 3b 20 0a 7d 0a 0a 23 69  erSector; .}..#i
1abb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1abc0 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
1abd0 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
1abe0 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20  s for opening a 
1abf0 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
1ac00 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f  finding entry po
1ac10 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ints.** within t
1ac20 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
1ac30 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74  y, and closing t
1ac40 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
1ac50 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  y..*/./*.** Inte
1ac60 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69  rfaces for openi
1ac70 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72  ng a shared libr
1ac80 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74  ary, finding ent
1ac90 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74  ry points.** wit
1aca0 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  hin the shared l
1acb0 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73  ibrary, and clos
1acc0 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
1acd0 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ibrary..*/.stati
1ace0 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65  c void *winDlOpe
1acf0 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  n(sqlite3_vfs *p
1ad00 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Vfs, const char 
1ad10 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48  *zFilename){.  H
1ad20 41 4e 44 4c 45 20 68 3b 0a 20 20 76 6f 69 64 20  ANDLE h;.  void 
1ad30 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f  *zConverted = co
1ad40 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d  nvertUtf8Filenam
1ad50 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
1ad60 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1ad70 28 70 56 66 73 29 3b 0a 20 20 69 66 28 20 7a 43  (pVfs);.  if( zC
1ad80 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
1ad90 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1ada0 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
1adb0 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c  .    h = osLoadL
1adc0 69 62 72 61 72 79 57 28 28 4c 50 43 57 53 54 52  ibraryW((LPCWSTR
1add0 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 2f 2a  )zConverted);./*
1ade0 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20   isNT() is 1 if 
1adf0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
1ae00 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65  =1, so this else
1ae10 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74   is never execut
1ae20 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68  ed. .** Since th
1ae30 65 20 41 4e 53 49 20 76 65 72 73 69 6f 6e 20 6f  e ANSI version o
1ae40 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20  f these Windows 
1ae50 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  API do not exist
1ae60 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69   for WINCE,.** i
1ae70 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f  t's important to
1ae80 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74   not reference t
1ae90 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75  hem for WINCE bu
1aea0 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  ilds..*/.#if SQL
1aeb0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a  ITE_OS_WINCE==0.
1aec0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d    }else{.    h =
1aed0 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 28   osLoadLibraryA(
1aee0 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
1aef0 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  d);.#endif.  }. 
1af00 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
1af10 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74  onverted);.  ret
1af20 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a  urn (void*)h;.}.
1af30 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44  static void winD
1af40 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  lError(sqlite3_v
1af50 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
1af60 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75  uf, char *zBufOu
1af70 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
1af80 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
1af90 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28  getLastErrorMsg(
1afa0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
1afb0 2c 20 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 29  , nBuf, zBufOut)
1afc0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
1afd0 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74  (*winDlSym(sqlit
1afe0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f  e3_vfs *pVfs, vo
1aff0 69 64 20 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e  id *pHandle, con
1b000 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c  st char *zSymbol
1b010 29 29 28 76 6f 69 64 29 7b 0a 20 20 55 4e 55 53  ))(void){.  UNUS
1b020 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
1b030 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  s);.  return (vo
1b040 69 64 28 2a 29 28 76 6f 69 64 29 29 6f 73 47 65  id(*)(void))osGe
1b050 74 50 72 6f 63 41 64 64 72 65 73 73 41 28 28 48  tProcAddressA((H
1b060 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 2c 20 7a  ANDLE)pHandle, z
1b070 53 79 6d 62 6f 6c 29 3b 0a 7d 0a 73 74 61 74 69  Symbol);.}.stati
1b080 63 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73  c void winDlClos
1b090 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  e(sqlite3_vfs *p
1b0a0 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  Vfs, void *pHand
1b0b0 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  le){.  UNUSED_PA
1b0c0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
1b0d0 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79 28 28   osFreeLibrary((
1b0e0 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b  HANDLE)pHandle);
1b0f0 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53  .}.#else /* if S
1b100 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
1b110 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66  EXTENSION is def
1b120 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69  ined: */.  #defi
1b130 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a  ne winDlOpen  0.
1b140 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 45    #define winDlE
1b150 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65  rror 0.  #define
1b160 20 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20   winDlSym   0.  
1b170 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f  #define winDlClo
1b180 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  se 0.#endif.../*
1b190 0a 2a 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20  .** Write up to 
1b1a0 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61  nBuf bytes of ra
1b1b0 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42  ndomness into zB
1b1c0 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  uf..*/.static in
1b1d0 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28  t winRandomness(
1b1e0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1b1f0 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
1b200 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e 74 20  r *zBuf){.  int 
1b210 6e 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f  n = 0;.  UNUSED_
1b220 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
1b230 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1b240 49 54 45 5f 54 45 53 54 29 0a 20 20 6e 20 3d 20  ITE_TEST).  n = 
1b250 6e 42 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 7a  nBuf;.  memset(z
1b260 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23  Buf, 0, nBuf);.#
1b270 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f  else.  if( sizeo
1b280 66 28 53 59 53 54 45 4d 54 49 4d 45 29 3c 3d 6e  f(SYSTEMTIME)<=n
1b290 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 53 59 53  Buf-n ){.    SYS
1b2a0 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20 6f  TEMTIME x;.    o
1b2b0 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26  sGetSystemTime(&
1b2c0 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  x);.    memcpy(&
1b2d0 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a  zBuf[n], &x, siz
1b2e0 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 6e 20 2b  eof(x));.    n +
1b2f0 3d 20 73 69 7a 65 6f 66 28 78 29 3b 0a 20 20 7d  = sizeof(x);.  }
1b300 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57  .  if( sizeof(DW
1b310 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  ORD)<=nBuf-n ){.
1b320 20 20 20 20 44 57 4f 52 44 20 70 69 64 20 3d 20      DWORD pid = 
1b330 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1b340 65 73 73 49 64 28 29 3b 0a 20 20 20 20 6d 65 6d  essId();.    mem
1b350 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 70  cpy(&zBuf[n], &p
1b360 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29  id, sizeof(pid))
1b370 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
1b380 66 28 70 69 64 29 3b 0a 20 20 7d 0a 20 20 69 66  f(pid);.  }.  if
1b390 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c  ( sizeof(DWORD)<
1b3a0 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44  =nBuf-n ){.    D
1b3b0 57 4f 52 44 20 63 6e 74 20 3d 20 6f 73 47 65 74  WORD cnt = osGet
1b3c0 54 69 63 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20  TickCount();.   
1b3d0 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d   memcpy(&zBuf[n]
1b3e0 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63  , &cnt, sizeof(c
1b3f0 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  nt));.    n += s
1b400 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a  izeof(cnt);.  }.
1b410 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 41 52    if( sizeof(LAR
1b420 47 45 5f 49 4e 54 45 47 45 52 29 3c 3d 6e 42 75  GE_INTEGER)<=nBu
1b430 66 2d 6e 20 29 7b 0a 20 20 20 20 4c 41 52 47 45  f-n ){.    LARGE
1b440 5f 49 4e 54 45 47 45 52 20 69 3b 0a 20 20 20 20  _INTEGER i;.    
1b450 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e  osQueryPerforman
1b460 63 65 43 6f 75 6e 74 65 72 28 26 69 29 3b 0a 20  ceCounter(&i);. 
1b470 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
1b480 6e 5d 2c 20 26 69 2c 20 73 69 7a 65 6f 66 28 69  n], &i, sizeof(i
1b490 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ));.    n += siz
1b4a0 65 6f 66 28 69 29 3b 0a 20 20 7d 0a 23 65 6e 64  eof(i);.  }.#end
1b4b0 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  if.  return n;.}
1b4c0 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66  .../*.** Sleep f
1b4d0 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c  or a little whil
1b4e0 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  e.  Return the a
1b4f0 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c  mount of time sl
1b500 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ept..*/.static i
1b510 6e 74 20 77 69 6e 53 6c 65 65 70 28 73 71 6c 69  nt winSleep(sqli
1b520 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
1b530 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20  nt microsec){.  
1b540 6f 73 53 6c 65 65 70 28 28 6d 69 63 72 6f 73 65  osSleep((microse
1b550 63 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20  c+999)/1000);.  
1b560 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1b570 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e  (pVfs);.  return
1b580 20 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29   ((microsec+999)
1b590 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a  /1000)*1000;.}..
1b5a0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1b5b0 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66  ing variable, if
1b5c0 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65   set to a non-ze
1b5d0 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74  ro value, is int
1b5e0 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74  erpreted as.** t
1b5f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63  he number of sec
1b600 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20  onds since 1970 
1b610 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73  and is used to s
1b620 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  et the result of
1b630 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72  .** sqlite3OsCur
1b640 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e  rentTime() durin
1b650 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69  g testing..*/.#i
1b660 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1b670 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72  .int sqlite3_cur
1b680 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20  rent_time = 0;  
1b690 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74  /* Fake system t
1b6a0 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73  ime in seconds s
1b6b0 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65  ince 1970. */.#e
1b6c0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  ndif../*.** Find
1b6d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
1b6e0 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
1b6f0 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
1b700 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  ).  Write into *
1b710 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72  piNow.** the cur
1b720 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
1b730 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
1b740 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20  ay number times 
1b750 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a  86_400_000.  In.
1b760 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  ** other words, 
1b770 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f  write into *piNo
1b780 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  w the number of 
1b790 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e  milliseconds sin
1b7a0 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a  ce the Julian.**
1b7b0 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69   epoch of noon i
1b7c0 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e  n Greenwich on N
1b7d0 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34  ovember 24, 4714
1b7e0 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74   B.C according t
1b7f0 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74  o the.** prolept
1b800 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c  ic Gregorian cal
1b810 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  endar..**.** On 
1b820 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20  success, return 
1b830 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75  SQLITE_OK.  Retu
1b840 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
1b850 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
1b860 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20  date .** cannot 
1b870 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  be found..*/.sta
1b880 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65  tic int winCurre
1b890 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69  ntTimeInt64(sqli
1b8a0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73  te3_vfs *pVfs, s
1b8b0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
1b8c0 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54  Now){.  /* FILET
1b8d0 49 4d 45 20 73 74 72 75 63 74 75 72 65 20 69 73  IME structure is
1b8e0 20 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20   a 64-bit value 
1b8f0 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65  representing the
1b900 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20 20 20   number of .    
1b910 20 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20   100-nanosecond 
1b920 69 6e 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20  intervals since 
1b930 4a 61 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20  January 1, 1601 
1b940 28 3d 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29  (= JD 2305813.5)
1b950 2e 20 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49  . .  */.  FILETI
1b960 4d 45 20 66 74 3b 0a 20 20 73 74 61 74 69 63 20  ME ft;.  static 
1b970 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e  const sqlite3_in
1b980 74 36 34 20 77 69 6e 46 69 6c 65 74 69 6d 65 45  t64 winFiletimeE
1b990 70 6f 63 68 20 3d 20 32 33 30 35 38 31 33 35 2a  poch = 23058135*
1b9a0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38  (sqlite3_int64)8
1b9b0 36 34 30 30 30 30 3b 0a 23 69 66 64 65 66 20 53  640000;.#ifdef S
1b9c0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 74 61  QLITE_TEST.  sta
1b9d0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
1b9e0 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63  3_int64 unixEpoc
1b9f0 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71  h = 24405875*(sq
1ba00 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30  lite3_int64)8640
1ba10 30 30 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  000;.#endif.  /*
1ba20 20 32 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69 64   2^32 - to avoid
1ba30 20 75 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77   use of LL and w
1ba40 61 72 6e 69 6e 67 73 20 69 6e 20 67 63 63 20 2a  arnings in gcc *
1ba50 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  /.  static const
1ba60 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
1ba70 61 78 33 32 42 69 74 56 61 6c 75 65 20 3d 20 0a  ax32BitValue = .
1ba80 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69        (sqlite3_i
1ba90 6e 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20  nt64)2000000000 
1baa0 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  + (sqlite3_int64
1bab0 29 32 30 30 30 30 30 30 30 30 30 20 2b 20 28 73  )2000000000 + (s
1bac0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 39 34  qlite3_int64)294
1bad0 39 36 37 32 39 36 3b 0a 0a 23 69 66 20 53 51 4c  967296;..#if SQL
1bae0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53  ITE_OS_WINCE.  S
1baf0 59 53 54 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a  YSTEMTIME time;.
1bb00 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d    osGetSystemTim
1bb10 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f 2a 20 69  e(&time);.  /* i
1bb20 66 20 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  f SystemTimeToFi
1bb30 6c 65 54 69 6d 65 28 29 20 66 61 69 6c 73 2c 20  leTime() fails, 
1bb40 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e  it returns zero.
1bb50 20 2a 2f 0a 20 20 69 66 20 28 21 6f 73 53 79 73   */.  if (!osSys
1bb60 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
1bb70 65 28 26 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20  e(&time,&ft)){. 
1bb80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1bb90 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6c 73  _ERROR;.  }.#els
1bba0 65 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54  e.  osGetSystemT
1bbb0 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 28 20 26  imeAsFileTime( &
1bbc0 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ft );.#endif..  
1bbd0 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46 69 6c 65  *piNow = winFile
1bbe0 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20 20 20 20  timeEpoch +.    
1bbf0 20 20 20 20 20 20 20 20 28 28 28 28 73 71 6c 69          ((((sqli
1bc00 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 48  te3_int64)ft.dwH
1bc10 69 67 68 44 61 74 65 54 69 6d 65 29 2a 6d 61 78  ighDateTime)*max
1bc20 33 32 42 69 74 56 61 6c 75 65 29 20 2b 20 0a 20  32BitValue) + . 
1bc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
1bc40 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e  qlite3_int64)ft.
1bc50 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f 28  dwLowDateTime)/(
1bc60 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 31 30  sqlite3_int64)10
1bc70 30 30 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  000;..#ifdef SQL
1bc80 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73  ITE_TEST.  if( s
1bc90 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
1bca0 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f  ime ){.    *piNo
1bcb0 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65  w = 1000*(sqlite
1bcc0 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f  3_int64)sqlite3_
1bcd0 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75  current_time + u
1bce0 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65  nixEpoch;.  }.#e
1bcf0 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41  ndif.  UNUSED_PA
1bd00 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
1bd10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1bd20 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  K;.}../*.** Find
1bd30 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
1bd40 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
1bd50 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
1bd60 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  ).  Write the.**
1bd70 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
1bd80 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
1bd90 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e  an Day number in
1bda0 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a  to *prNow and.**
1bdb0 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75   return 0.  Retu
1bdc0 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65  rn 1 if the time
1bdd0 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74   and date cannot
1bde0 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   be found..*/.st
1bdf0 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72  atic int winCurr
1be00 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f  entTime(sqlite3_
1be10 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c  vfs *pVfs, doubl
1be20 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 69 6e 74  e *prNow){.  int
1be30 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69   rc;.  sqlite3_i
1be40 6e 74 36 34 20 69 3b 0a 20 20 72 63 20 3d 20 77  nt64 i;.  rc = w
1be50 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
1be60 36 34 28 70 56 66 73 2c 20 26 69 29 3b 0a 20 20  64(pVfs, &i);.  
1be70 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 2a  if( !rc ){.    *
1be80 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30  prNow = i/864000
1be90 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  00.0;.  }.  retu
1bea0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1beb0 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74  The idea is that
1bec0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
1bed0 6f 72 6b 73 20 6c 69 6b 65 20 61 20 63 6f 6d 62  orks like a comb
1bee0 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65  ination of.** Ge
1bef0 74 4c 61 73 74 45 72 72 6f 72 28 29 20 61 6e 64  tLastError() and
1bf00 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 28 29   FormatMessage()
1bf10 20 6f 6e 20 57 69 6e 64 6f 77 73 20 28 6f 72 20   on Windows (or 
1bf20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74 72  errno and.** str
1bf30 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20 55 6e 69  error_r() on Uni
1bf40 78 29 2e 20 41 66 74 65 72 20 61 6e 20 65 72 72  x). After an err
1bf50 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 62  or is returned b
1bf60 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63 74  y an OS.** funct
1bf70 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63 61 6c 6c  ion, SQLite call
1bf80 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
1bf90 77 69 74 68 20 7a 42 75 66 20 70 6f 69 6e 74 69  with zBuf pointi
1bfa0 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65  ng to.** a buffe
1bfb0 72 20 6f 66 20 6e 42 75 66 20 62 79 74 65 73 2e  r of nBuf bytes.
1bfc0 20 54 68 65 20 4f 53 20 6c 61 79 65 72 20 73 68   The OS layer sh
1bfd0 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65 20 74 68  ould populate th
1bfe0 65 0a 2a 2a 20 62 75 66 66 65 72 20 77 69 74 68  e.** buffer with
1bff0 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
1c000 64 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  d UTF-8 encoded 
1c010 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
1c020 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20   describing the 
1c030 6c 61 73 74 20 49 4f 20 65 72 72 6f 72 20 74 6f  last IO error to
1c040 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 77   have occurred w
1c050 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e  ithin the callin
1c060 67 0a 2a 2a 20 74 68 72 65 61 64 2e 0a 2a 2a 0a  g.** thread..**.
1c070 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  ** If the error 
1c080 6d 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c  message is too l
1c090 61 72 67 65 20 66 6f 72 20 74 68 65 20 73 75 70  arge for the sup
1c0a0 70 6c 69 65 64 20 62 75 66 66 65 72 2c 0a 2a 2a  plied buffer,.**
1c0b0 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 74 72   it should be tr
1c0c0 75 6e 63 61 74 65 64 2e 20 54 68 65 20 72 65 74  uncated. The ret
1c0d0 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 78 47 65  urn value of xGe
1c0e0 74 4c 61 73 74 45 72 72 6f 72 0a 2a 2a 20 69 73  tLastError.** is
1c0f0 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72   zero if the err
1c100 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74 73 20  or message fits 
1c110 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f  in the buffer, o
1c120 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74  r non-zero.** ot
1c130 68 65 72 77 69 73 65 20 28 69 66 20 74 68 65 20  herwise (if the 
1c140 6d 65 73 73 61 67 65 20 77 61 73 20 74 72 75 6e  message was trun
1c150 63 61 74 65 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a  cated). If non-z
1c160 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ero is returned,
1c170 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e  .** then it is n
1c180 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ot necessary to 
1c190 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 2d  include the nul-
1c1a0 74 65 72 6d 69 6e 61 74 6f 72 20 63 68 61 72 61  terminator chara
1c1b0 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6f  cter.** in the o
1c1c0 75 74 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2a  utput buffer..**
1c1d0 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 6c 79 69 6e  .** Not supplyin
1c1e0 67 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  g an error messa
1c1f0 67 65 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20  ge will have no 
1c200 61 64 76 65 72 73 65 20 65 66 66 65 63 74 0a 2a  adverse effect.*
1c210 2a 20 6f 6e 20 53 51 4c 69 74 65 2e 20 49 74 20  * on SQLite. It 
1c220 69 73 20 66 69 6e 65 20 74 6f 20 68 61 76 65 20  is fine to have 
1c230 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  an implementatio
1c240 6e 20 74 68 61 74 20 6e 65 76 65 72 0a 2a 2a 20  n that never.** 
1c250 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
1c260 20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20   message:.**.** 
1c270 20 20 69 6e 74 20 78 47 65 74 4c 61 73 74 45 72    int xGetLastEr
1c280 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
1c290 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
1c2a0 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a   char *zBuf){.**
1c2b0 20 20 20 20 20 61 73 73 65 72 74 28 7a 42 75 66       assert(zBuf
1c2c0 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20  [0]=='\0');.**  
1c2d0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 20     return 0;.** 
1c2e0 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65    }.**.** Howeve
1c2f0 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6d 65  r if an error me
1c300 73 73 61 67 65 20 69 73 20 73 75 70 70 6c 69 65  ssage is supplie
1c310 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 69 6e  d, it will be in
1c320 63 6f 72 70 6f 72 61 74 65 64 0a 2a 2a 20 62 79  corporated.** by
1c330 20 73 71 6c 69 74 65 20 69 6e 74 6f 20 74 68 65   sqlite into the
1c340 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
1c350 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20  vailable to the 
1c360 75 73 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71  user using.** sq
1c370 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 2c 20  lite3_errmsg(), 
1c380 70 6f 73 73 69 62 6c 79 20 6d 61 6b 69 6e 67 20  possibly making 
1c390 49 4f 20 65 72 72 6f 72 73 20 65 61 73 69 65 72  IO errors easier
1c3a0 20 74 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a 73 74   to debug..*/.st
1c3b0 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c  atic int winGetL
1c3c0 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33  astError(sqlite3
1c3d0 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
1c3e0 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
1c3f0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
1c400 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72  METER(pVfs);.  r
1c410 65 74 75 72 6e 20 67 65 74 4c 61 73 74 45 72 72  eturn getLastErr
1c420 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45  orMsg(osGetLastE
1c430 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42  rror(), nBuf, zB
1c440 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  uf);.}../*.** In
1c450 69 74 69 61 6c 69 7a 65 20 61 6e 64 20 64 65 69  itialize and dei
1c460 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70  nitialize the op
1c470 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
1c480 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74  nterface..*/.int
1c490 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
1c4a0 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
1c4b0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e   sqlite3_vfs win
1c4c0 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20  Vfs = {.    3,  
1c4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4e0 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
1c4f0 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69      sizeof(winFi
1c500 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73  le),     /* szOs
1c510 46 69 6c 65 20 2a 2f 0a 20 20 20 20 4d 41 58 5f  File */.    MAX_
1c520 50 41 54 48 2c 20 20 20 20 20 20 20 20 20 20 20  PATH,           
1c530 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a   /* mxPathname *
1c540 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
1c550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
1c560 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33  ext */.    "win3
1c570 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  2",             
1c580 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20  /* zName */.    
1c590 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
1c5a0 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61       /* pAppData
1c5b0 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c   */.    winOpen,
1c5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c5d0 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e  xOpen */.    win
1c5e0 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20  Delete,         
1c5f0 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a    /* xDelete */.
1c600 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20      winAccess,  
1c610 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63           /* xAcc
1c620 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75  ess */.    winFu
1c630 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
1c640 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
1c650 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65   */.    winDlOpe
1c660 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n,           /* 
1c670 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  xDlOpen */.    w
1c680 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20  inDlError,      
1c690 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20      /* xDlError 
1c6a0 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c  */.    winDlSym,
1c6b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1c6c0 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e  DlSym */.    win
1c6d0 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  DlClose,        
1c6e0 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f    /* xDlClose */
1c6f0 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65  .    winRandomne
1c700 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61  ss,       /* xRa
1c710 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20  ndomness */.    
1c720 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20  winSleep,       
1c730 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a       /* xSleep *
1c740 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74  /.    winCurrent
1c750 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43  Time,      /* xC
1c760 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20  urrentTime */.  
1c770 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f    winGetLastErro
1c780 72 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61  r,     /* xGetLa
1c790 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77  stError */.    w
1c7a0 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
1c7b0 36 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54  64, /* xCurrentT
1c7c0 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20  imeInt64 */.    
1c7d0 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  winSetSystemCall
1c7e0 2c 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74  ,    /* xSetSyst
1c7f0 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69  emCall */.    wi
1c800 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  nGetSystemCall, 
1c810 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d     /* xGetSystem
1c820 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e  Call */.    winN
1c830 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  extSystemCall,  
1c840 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43   /* xNextSystemC
1c850 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 2f  all */.  };..  /
1c860 2a 20 44 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74  * Double-check t
1c870 68 61 74 20 74 68 65 20 61 53 79 73 63 61 6c 6c  hat the aSyscall
1c880 5b 5d 20 61 72 72 61 79 20 68 61 73 20 62 65 65  [] array has bee
1c890 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 20 20  n constructed.  
1c8a0 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 53  ** correctly.  S
1c8b0 65 65 20 74 69 63 6b 65 74 20 5b 62 62 33 61 38  ee ticket [bb3a8
1c8c0 36 65 38 39 30 63 38 65 39 36 61 62 5d 20 2a 2f  6e890c8e96ab] */
1c8d0 0a 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79  .  assert( Array
1c8e0 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3d 3d  Size(aSyscall)==
1c8f0 36 30 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  60 );..#ifndef S
1c900 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
1c910 20 2f 2a 20 67 65 74 20 6d 65 6d 6f 72 79 20 6d   /* get memory m
1c920 61 70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 67 72  ap allocation gr
1c930 61 6e 75 6c 61 72 69 74 79 20 2a 2f 0a 20 20 6d  anularity */.  m
1c940 65 6d 73 65 74 28 26 77 69 6e 53 79 73 49 6e 66  emset(&winSysInf
1c950 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 59 53  o, 0, sizeof(SYS
1c960 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a 20 20 6f 73  TEM_INFO));.  os
1c970 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 26 77  GetSystemInfo(&w
1c980 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 20 20 61 73  inSysInfo);.  as
1c990 73 65 72 74 28 77 69 6e 53 79 73 49 6e 66 6f 2e  sert(winSysInfo.
1c9a0 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e  dwAllocationGran
1c9b0 75 6c 61 72 69 74 79 20 3e 20 30 29 3b 0a 23 65  ularity > 0);.#e
1c9c0 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ndif..  sqlite3_
1c9d0 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69  vfs_register(&wi
1c9e0 6e 56 66 73 2c 20 31 29 3b 0a 20 20 72 65 74 75  nVfs, 1);.  retu
1c9f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d  rn SQLITE_OK; .}
1ca00 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  ..int sqlite3_os
1ca10 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 20 20 72  _end(void){ .  r
1ca20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ca30 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
1ca40 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a     LITE_OS_WIN */.