/ Hex Artifact Content
Login

Artifact f6b9fa7a93d16779b0504d8c5d438fdd0ef022bb:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59   */..#ifdef __CY
0220: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0230: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0240: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
0250: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
0260: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
0270: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
0280: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
0290: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 53  mmon.h"../*.** S
02a0: 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f  ome Microsoft co
02b0: 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69  mpilers lack thi
02c0: 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f  s definition..*/
02d0: 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44  .#ifndef INVALID
02e0: 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
02f0: 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49  .# define INVALI
0300: 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
0310: 53 20 28 28 44 57 4f 52 44 29 2d 31 29 20 0a 23  S ((DWORD)-1) .#
0320: 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72  endif../* Forwar
0330: 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a  d references */.
0340: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
0350: 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20 20 20  inShm winShm;   
0360: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6e          /* A con
0370: 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65  nection to share
0380: 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65  d-memory */.type
0390: 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 53 68  def struct winSh
03a0: 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f 64 65  mNode winShmNode
03b0: 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f 6e 20  ;   /* A region 
03c0: 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
03d0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 43 45   */../*.** WinCE
03e0: 20 6c 61 63 6b 73 20 6e 61 74 69 76 65 20 73 75   lacks native su
03f0: 70 70 6f 72 74 20 66 6f 72 20 66 69 6c 65 20 6c  pport for file l
0400: 6f 63 6b 69 6e 67 20 73 6f 20 77 65 20 68 61 76  ocking so we hav
0410: 65 20 74 6f 20 66 61 6b 65 20 69 74 0a 2a 2a 20  e to fake it.** 
0420: 77 69 74 68 20 73 6f 6d 65 20 63 6f 64 65 20 6f  with some code o
0430: 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a 23 69  f our own..*/.#i
0440: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
0450: 45 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  E.typedef struct
0460: 20 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20 20 69   winceLock {.  i
0470: 6e 74 20 6e 52 65 61 64 65 72 73 3b 20 20 20 20  nt nReaders;    
0480: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0490: 72 65 61 64 65 72 20 6c 6f 63 6b 73 20 6f 62 74  reader locks obt
04a0: 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ained */.  BOOL 
04b0: 62 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 2f  bPending;      /
04c0: 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20 70 65  * Indicates a pe
04d0: 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62  nding lock has b
04e0: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a  een obtained */.
04f0: 20 20 42 4f 4f 4c 20 62 52 65 73 65 72 76 65 64    BOOL bReserved
0500: 3b 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74  ;     /* Indicat
0510: 65 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  es a reserved lo
0520: 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61  ck has been obta
0530: 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  ined */.  BOOL b
0540: 45 78 63 6c 75 73 69 76 65 3b 20 20 20 20 2f 2a  Exclusive;    /*
0550: 20 49 6e 64 69 63 61 74 65 73 20 61 6e 20 65 78   Indicates an ex
0560: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 68 61 73  clusive lock has
0570: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a   been obtained *
0580: 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b 0a 23  /.} winceLock;.#
0590: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
05a0: 20 77 69 6e 46 69 6c 65 20 73 74 72 75 63 74 75   winFile structu
05b0: 72 65 20 69 73 20 61 20 73 75 62 63 6c 61 73 73  re is a subclass
05c0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   of sqlite3_file
05d0: 2a 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68  * specific to th
05e0: 65 20 77 69 6e 33 32 0a 2a 2a 20 70 6f 72 74 61  e win32.** porta
05f0: 62 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a 2f  bility layer..*/
0600: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0610: 77 69 6e 46 69 6c 65 20 77 69 6e 46 69 6c 65 3b  winFile winFile;
0620: 0a 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20  .struct winFile 
0630: 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  {.  const sqlite
0640: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d  3_io_methods *pM
0650: 65 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75 73 74  ethod; /*** Must
0660: 20 62 65 20 66 69 72 73 74 20 2a 2a 2a 2f 0a 20   be first ***/. 
0670: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
0680: 66 73 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  fs;      /* The 
0690: 56 46 53 20 75 73 65 64 20 74 6f 20 6f 70 65 6e  VFS used to open
06a0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
06b0: 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20 20  HANDLE h;       
06c0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
06d0: 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20  e for accessing 
06e0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  the file */.  u8
06f0: 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20   locktype;      
0700: 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
0710: 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79 20   lock currently 
0720: 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 69 6c  held on this fil
0730: 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73 68 61  e */.  short sha
0740: 72 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20 20 2f  redLockByte;   /
0750: 2a 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f 73 65  * Randomly chose
0760: 6e 20 62 79 74 65 20 75 73 65 64 20 61 73 20 61  n byte used as a
0770: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a   shared lock */.
0780: 20 20 75 38 20 63 74 72 6c 46 6c 61 67 73 3b 20    u8 ctrlFlags; 
0790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
07a0: 67 73 2e 20 20 53 65 65 20 57 49 4e 46 49 4c 45  gs.  See WINFILE
07b0: 5f 2a 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 44 57  _* below */.  DW
07c0: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  ORD lastErrno;  
07d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e        /* The Win
07e0: 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20  dows errno from 
07f0: 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72  the last I/O err
0800: 6f 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  or */.  winShm *
0810: 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pShm;           
0820: 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20 73  /* Instance of s
0830: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e 20  hared memory on 
0840: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 63  this file */.  c
0850: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
0860: 3b 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70  ;      /* Full p
0870: 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 69 73 20  athname of this 
0880: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  file */.  int sz
0890: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
08a0: 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65 20    /* Chunk size 
08b0: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46 43  configured by FC
08c0: 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2a  NTL_CHUNK_SIZE *
08d0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
08e0: 57 49 4e 43 45 0a 20 20 4c 50 57 53 54 52 20 7a  WINCE.  LPWSTR z
08f0: 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20 20  DeleteOnClose;  
0900: 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
0910: 74 6f 20 64 65 6c 65 74 65 20 77 68 65 6e 20 63  to delete when c
0920: 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e 44  losing */.  HAND
0930: 4c 45 20 68 4d 75 74 65 78 3b 20 20 20 20 20 20  LE hMutex;      
0940: 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 75 73 65      /* Mutex use
0950: 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63  d to control acc
0960: 65 73 73 20 74 6f 20 73 68 61 72 65 64 20 6c 6f  ess to shared lo
0970: 63 6b 20 2a 2f 20 20 0a 20 20 48 41 4e 44 4c 45  ck */  .  HANDLE
0980: 20 68 53 68 61 72 65 64 3b 20 20 20 20 20 20 20   hShared;       
0990: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
09a0: 72 79 20 73 65 67 6d 65 6e 74 20 75 73 65 64 20  ry segment used 
09b0: 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20  for locking */. 
09c0: 20 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c   winceLock local
09d0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b  ;        /* Lock
09e0: 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68  s obtained by th
09f0: 69 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 77  is instance of w
0a00: 69 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 63  inFile */.  winc
0a10: 65 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20 20  eLock *shared;  
0a20: 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 68      /* Global sh
0a30: 61 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79  ared lock memory
0a40: 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 20 2a   for the file  *
0a50: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
0a60: 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  ** Allowed value
0a70: 73 20 66 6f 72 20 77 69 6e 46 69 6c 65 2e 63 74  s for winFile.ct
0a80: 72 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69  rlFlags.*/.#defi
0a90: 6e 65 20 57 49 4e 46 49 4c 45 5f 50 45 52 53 49  ne WINFILE_PERSI
0aa0: 53 54 5f 57 41 4c 20 20 20 20 20 30 78 30 34 20  ST_WAL     0x04 
0ab0: 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74 20    /* Persistent 
0ac0: 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 64 65 66  WAL mode */.#def
0ad0: 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57  ine WINFILE_PSOW
0ae0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31 30              0x10
0af0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43     /* SQLITE_IOC
0b00: 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
0b10: 52 57 52 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 20 2a  RWRITE */../*. *
0b20: 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   If compiled wit
0b30: 68 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  h SQLITE_WIN32_M
0b40: 41 4c 4c 4f 43 20 6f 6e 20 57 69 6e 64 6f 77 73  ALLOC on Windows
0b50: 2c 20 77 65 20 77 69 6c 6c 20 75 73 65 20 74 68  , we will use th
0b60: 65 0a 20 2a 20 76 61 72 69 6f 75 73 20 57 69 6e  e. * various Win
0b70: 33 32 20 41 50 49 20 68 65 61 70 20 66 75 6e 63  32 API heap func
0b80: 74 69 6f 6e 73 20 69 6e 73 74 65 61 64 20 6f 66  tions instead of
0b90: 20 6f 75 72 20 6f 77 6e 2e 0a 20 2a 2f 0a 23 69   our own.. */.#i
0ba0: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
0bb0: 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 20 2a 20 54  2_MALLOC./*. * T
0bc0: 68 65 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20  he initial size 
0bd0: 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  of the Win32-spe
0be0: 63 69 66 69 63 20 68 65 61 70 2e 20 20 54 68 69  cific heap.  Thi
0bf0: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  s value may be z
0c00: 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ero.. */.#ifndef
0c10: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
0c20: 41 50 5f 49 4e 49 54 5f 53 49 5a 45 0a 23 20 20  AP_INIT_SIZE.#  
0c30: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
0c40: 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49  N32_HEAP_INIT_SI
0c50: 5a 45 20 28 28 53 51 4c 49 54 45 5f 44 45 46 41  ZE ((SQLITE_DEFA
0c60: 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 20  ULT_CACHE_SIZE) 
0c70: 2a 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  * \.            
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c90: 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49             (SQLI
0ca0: 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
0cb0: 53 49 5a 45 29 20 2b 20 34 31 39 34 33 30 34 29  SIZE) + 4194304)
0cc0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
0cd0: 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20  he maximum size 
0ce0: 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  of the Win32-spe
0cf0: 63 69 66 69 63 20 68 65 61 70 2e 20 20 54 68 69  cific heap.  Thi
0d00: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  s value may be z
0d10: 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ero.. */.#ifndef
0d20: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
0d30: 41 50 5f 4d 41 58 5f 53 49 5a 45 0a 23 20 20 64  AP_MAX_SIZE.#  d
0d40: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
0d50: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45  32_HEAP_MAX_SIZE
0d60: 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a    (0).#endif../*
0d70: 0a 20 2a 20 54 68 65 20 65 78 74 72 61 20 66 6c  . * The extra fl
0d80: 61 67 73 20 74 6f 20 75 73 65 20 69 6e 20 63 61  ags to use in ca
0d90: 6c 6c 73 20 74 6f 20 74 68 65 20 57 69 6e 33 32  lls to the Win32
0da0: 20 68 65 61 70 20 41 50 49 73 2e 20 20 54 68 69   heap APIs.  Thi
0db0: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 0a 20  s value may be. 
0dc0: 2a 20 7a 65 72 6f 20 66 6f 72 20 74 68 65 20 64  * zero for the d
0dd0: 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f 72 2e  efault behavior.
0de0: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
0df0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
0e00: 4c 41 47 53 0a 23 20 20 64 65 66 69 6e 65 20 53  LAGS.#  define S
0e10: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
0e20: 5f 46 4c 41 47 53 20 20 20 20 20 28 30 29 0a 23  _FLAGS     (0).#
0e30: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
0e40: 20 77 69 6e 4d 65 6d 44 61 74 61 20 73 74 72 75   winMemData stru
0e50: 63 74 75 72 65 20 73 74 6f 72 65 73 20 69 6e 66  cture stores inf
0e60: 6f 72 6d 61 74 69 6f 6e 20 72 65 71 75 69 72 65  ormation require
0e70: 64 20 62 79 20 74 68 65 20 57 69 6e 33 32 2d 73  d by the Win32-s
0e80: 70 65 63 69 66 69 63 0a 2a 2a 20 73 71 6c 69 74  pecific.** sqlit
0e90: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 69  e3_mem_methods i
0ea0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a  mplementation..*
0eb0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0ec0: 20 77 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 4d   winMemData winM
0ed0: 65 6d 44 61 74 61 3b 0a 73 74 72 75 63 74 20 77  emData;.struct w
0ee0: 69 6e 4d 65 6d 44 61 74 61 20 7b 0a 23 69 66 6e  inMemData {.#ifn
0ef0: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 75 33 32  def NDEBUG.  u32
0f00: 20 6d 61 67 69 63 3b 20 20 20 20 2f 2a 20 4d 61   magic;    /* Ma
0f10: 67 69 63 20 6e 75 6d 62 65 72 20 74 6f 20 64 65  gic number to de
0f20: 74 65 63 74 20 73 74 72 75 63 74 75 72 65 20 63  tect structure c
0f30: 6f 72 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65  orruption. */.#e
0f40: 6e 64 69 66 0a 20 20 48 41 4e 44 4c 45 20 68 48  ndif.  HANDLE hH
0f50: 65 61 70 3b 20 2f 2a 20 54 68 65 20 68 61 6e 64  eap; /* The hand
0f60: 6c 65 20 74 6f 20 6f 75 72 20 68 65 61 70 2e 20  le to our heap. 
0f70: 2a 2f 0a 20 20 42 4f 4f 4c 20 62 4f 77 6e 65 64  */.  BOOL bOwned
0f80: 3b 20 20 2f 2a 20 44 6f 20 77 65 20 6f 77 6e 20  ;  /* Do we own 
0f90: 74 68 65 20 68 65 61 70 20 28 69 2e 65 2e 20 64  the heap (i.e. d
0fa0: 65 73 74 72 6f 79 20 69 74 20 6f 6e 20 73 68 75  estroy it on shu
0fb0: 74 64 6f 77 6e 29 3f 20 2a 2f 0a 7d 3b 0a 0a 23  tdown)? */.};..#
0fc0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64  ifndef NDEBUG.#d
0fd0: 65 66 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47  efine WINMEM_MAG
0fe0: 49 43 20 20 20 20 20 30 78 34 32 62 32 38 33 30  IC     0x42b2830
0ff0: 62 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63  b.#endif..static
1000: 20 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61   struct winMemDa
1010: 74 61 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 20  ta win_mem_data 
1020: 3d 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  = {.#ifndef NDEB
1030: 55 47 0a 20 20 57 49 4e 4d 45 4d 5f 4d 41 47 49  UG.  WINMEM_MAGI
1040: 43 2c 0a 23 65 6e 64 69 66 0a 20 20 4e 55 4c 4c  C,.#endif.  NULL
1050: 2c 20 46 41 4c 53 45 0a 7d 3b 0a 0a 23 69 66 6e  , FALSE.};..#ifn
1060: 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66 69  def NDEBUG.#defi
1070: 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  ne winMemAssertM
1080: 61 67 69 63 28 29 20 61 73 73 65 72 74 28 20 77  agic() assert( w
1090: 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69  in_mem_data.magi
10a0: 63 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20  c==WINMEM_MAGIC 
10b0: 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ).#else.#define 
10c0: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
10d0: 63 28 29 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66  c().#endif..#def
10e0: 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  ine winMemGetHea
10f0: 70 28 29 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61  p() win_mem_data
1100: 2e 68 48 65 61 70 0a 0a 73 74 61 74 69 63 20 76  .hHeap..static v
1110: 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f  oid *winMemMallo
1120: 63 28 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73  c(int nBytes);.s
1130: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65  tatic void winMe
1140: 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69  mFree(void *pPri
1150: 6f 72 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  or);.static void
1160: 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28   *winMemRealloc(
1170: 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e  void *pPrior, in
1180: 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69  t nBytes);.stati
1190: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65  c int winMemSize
11a0: 28 76 6f 69 64 20 2a 70 29 3b 0a 73 74 61 74 69  (void *p);.stati
11b0: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e  c int winMemRoun
11c0: 64 75 70 28 69 6e 74 20 6e 29 3b 0a 73 74 61 74  dup(int n);.stat
11d0: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69  ic int winMemIni
11e0: 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  t(void *pAppData
11f0: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  );.static void w
1200: 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f  inMemShutdown(vo
1210: 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 0a  id *pAppData);..
1220: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65  const sqlite3_me
1230: 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74  m_methods *sqlit
1240: 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f  e3MemGetWin32(vo
1250: 69 64 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  id);.#endif /* S
1260: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
1270: 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OC */../*.** The
1280: 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
1290: 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c 79  ble is (normally
12a0: 29 20 73 65 74 20 6f 6e 63 65 20 61 6e 64 20 6e  ) set once and n
12b0: 65 76 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a 20  ever changes.** 
12c0: 74 68 65 72 65 61 66 74 65 72 2e 20 20 49 74 20  thereafter.  It 
12d0: 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72 20  records whether 
12e0: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
12f0: 73 74 65 6d 20 69 73 20 57 69 6e 39 78 0a 2a 2a  stem is Win9x.**
1300: 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a   or WinNT..**.**
1310: 20 30 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20   0:   Operating 
1320: 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a  system unknown..
1330: 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61 74 69 6e  ** 1:   Operatin
1340: 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39  g system is Win9
1350: 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72 61  x..** 2:   Opera
1360: 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57  ting system is W
1370: 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  inNT..**.** In o
1380: 72 64 65 72 20 74 6f 20 66 61 63 69 6c 69 74 61  rder to facilita
1390: 74 65 20 74 65 73 74 69 6e 67 20 6f 6e 20 61 20  te testing on a 
13a0: 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74 68  WinNT system, th
13b0: 65 20 74 65 73 74 20 66 69 78 74 75 72 65 0a 2a  e test fixture.*
13c0: 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20 73  * can manually s
13d0: 65 74 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f  et this value to
13e0: 20 31 20 74 6f 20 65 6d 75 6c 61 74 65 20 57 69   1 to emulate Wi
13f0: 6e 39 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  n98 behavior..*/
1400: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1410: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
1420: 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6c  os_type = 0;.#el
1430: 73 65 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  se.static int sq
1440: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20  lite3_os_type = 
1450: 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  0;.#endif..#if !
1460: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
1470: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
1480: 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20 53 51  NRT.#  define SQ
1490: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
14a0: 4e 53 49 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  NSI.#endif..#if 
14b0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
14c0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  || SQLITE_OS_WIN
14d0: 4e 54 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  NT || SQLITE_OS_
14e0: 57 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20  WINRT.#  define 
14f0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
1500: 5f 57 49 44 45 0a 23 65 6e 64 69 66 0a 0a 23 69  _WIDE.#endif..#i
1510: 66 6e 64 65 66 20 53 59 53 43 41 4c 4c 0a 23 20  fndef SYSCALL.# 
1520: 20 64 65 66 69 6e 65 20 53 59 53 43 41 4c 4c 20   define SYSCALL 
1530: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
1540: 70 74 72 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ptr.#endif..#if 
1550: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
1560: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 6d 61 63 72  /*.** These macr
1570: 6f 73 20 61 72 65 20 6e 65 63 65 73 73 61 72 79  os are necessary
1580: 20 62 65 63 61 75 73 65 20 57 69 6e 64 6f 77 73   because Windows
1590: 20 43 45 20 64 6f 65 73 20 6e 6f 74 20 6e 61 74   CE does not nat
15a0: 69 76 65 6c 79 20 73 75 70 70 6f 72 74 20 74 68  ively support th
15b0: 65 0a 2a 2a 20 57 69 6e 33 32 20 41 50 49 73 20  e.** Win32 APIs 
15c0: 4c 6f 63 6b 46 69 6c 65 2c 20 55 6e 6c 6f 63 6b  LockFile, Unlock
15d0: 46 69 6c 65 2c 20 61 6e 64 20 4c 6f 63 6b 46 69  File, and LockFi
15e0: 6c 65 45 78 2e 0a 20 2a 2f 0a 0a 23 20 20 64 65  leEx.. */..#  de
15f0: 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 28 61 2c  fine LockFile(a,
1600: 62 2c 63 2c 64 2c 65 29 20 20 20 20 20 20 20 77  b,c,d,e)       w
1610: 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26 61 2c  inceLockFile(&a,
1620: 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23 20 20   b, c, d, e).#  
1630: 64 65 66 69 6e 65 20 55 6e 6c 6f 63 6b 46 69 6c  define UnlockFil
1640: 65 28 61 2c 62 2c 63 2c 64 2c 65 29 20 20 20 20  e(a,b,c,d,e)    
1650: 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65   winceUnlockFile
1660: 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29  (&a, b, c, d, e)
1670: 0a 23 20 20 64 65 66 69 6e 65 20 4c 6f 63 6b 46  .#  define LockF
1680: 69 6c 65 45 78 28 61 2c 62 2c 63 2c 64 2c 65 2c  ileEx(a,b,c,d,e,
1690: 66 29 20 20 20 77 69 6e 63 65 4c 6f 63 6b 46 69  f)   winceLockFi
16a0: 6c 65 45 78 28 26 61 2c 20 62 2c 20 63 2c 20 64  leEx(&a, b, c, d
16b0: 2c 20 65 2c 20 66 29 0a 0a 2f 2a 0a 2a 2a 20 54  , e, f)../*.** T
16c0: 68 65 73 65 20 61 72 65 20 74 68 65 20 73 70 65  hese are the spe
16d0: 63 69 61 6c 20 73 79 73 63 61 6c 6c 20 68 61 63  cial syscall hac
16e0: 6b 73 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 43  ks for Windows C
16f0: 45 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  E.  The locking 
1700: 72 65 6c 61 74 65 64 0a 2a 2a 20 64 65 66 69 6e  related.** defin
1710: 65 73 20 68 65 72 65 20 72 65 66 65 72 20 74 6f  es here refer to
1720: 20 74 68 65 20 6d 61 63 72 6f 73 20 64 65 66 69   the macros defi
1730: 6e 65 64 20 6a 75 73 74 20 61 62 6f 76 65 2e 0a  ned just above..
1740: 20 2a 2f 0a 0a 23 20 20 64 65 66 69 6e 65 20 6f   */..#  define o
1750: 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
1760: 28 29 20 20 20 20 20 20 20 31 0a 23 20 20 64 65  ()       1.#  de
1770: 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 20  fine osLockFile 
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
1790: 6f 63 6b 46 69 6c 65 0a 23 20 20 64 65 66 69 6e  ockFile.#  defin
17a0: 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 20  e osUnlockFile  
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 55 6e 6c 6f              Unlo
17c0: 63 6b 46 69 6c 65 0a 23 20 20 64 65 66 69 6e 65  ckFile.#  define
17d0: 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20 20 20   osLockFileEx   
17e0: 20 20 20 20 20 20 20 20 20 20 20 4c 6f 63 6b 46             LockF
17f0: 69 6c 65 45 78 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ileEx.#endif../*
1800: 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20  .** Many system 
1810: 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73  calls are access
1820: 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74  ed through point
1830: 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20  er-to-functions 
1840: 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20  so that.** they 
1850: 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65  may be overridde
1860: 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20  n at runtime to 
1870: 66 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74  facilitate fault
1880: 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e   injection durin
1890: 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  g.** testing and
18a0: 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68   sandboxing.  Th
18b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61  e following arra
18c0: 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  y holds the name
18d0: 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a  s and pointers.*
18e0: 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64  * to all overrid
18f0: 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c  eable system cal
1900: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  ls..*/.static st
1910: 72 75 63 74 20 77 69 6e 5f 73 79 73 63 61 6c 6c  ruct win_syscall
1920: 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   {.  const char 
1930: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
1940: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1950: 65 20 73 79 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a  e sytem call */.
1960: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
1970: 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20  l_ptr pCurrent; 
1980: 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65  /* Current value
1990: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   of the system c
19a0: 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  all */.  sqlite3
19b0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65  _syscall_ptr pDe
19c0: 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c  fault; /* Defaul
19d0: 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79  t value */.} aSy
19e0: 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 23 69 66 20  scall[] = {.#if 
19f0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
1a00: 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41 70 69  .  { "AreFileApi
1a10: 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20 20 20  sANSI",         
1a20: 28 53 59 53 43 41 4c 4c 29 41 72 65 46 69 6c 65  (SYSCALL)AreFile
1a30: 41 70 69 73 41 4e 53 49 2c 20 20 20 20 20 20 20  ApisANSI,       
1a40: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
1a50: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
1a60: 49 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  I ((BOOL(WINAPI*
1a70: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  )(VOID))aSyscall
1a80: 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65  [0].pCurrent).#e
1a90: 6c 73 65 0a 20 20 7b 20 22 41 72 65 46 69 6c 65  lse.  { "AreFile
1aa0: 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20  ApisANSI",      
1ab0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
1ae0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
1af0: 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64  WINCE && defined
1b00: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
1b10: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61  S_WIDE).  { "Cha
1b20: 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20 20  rLowerW",       
1b30: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
1b40: 43 68 61 72 4c 6f 77 65 72 57 2c 20 20 20 20 20  CharLowerW,     
1b50: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
1b60: 6c 73 65 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77  lse.  { "CharLow
1b70: 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  erW",           
1b80: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
1bb0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72  ..#define osChar
1bc0: 4c 6f 77 65 72 57 20 28 28 4c 50 57 53 54 52 28  LowerW ((LPWSTR(
1bd0: 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29  WINAPI*)(LPWSTR)
1be0: 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75  )aSyscall[1].pCu
1bf0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
1c00: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64  TE_OS_WINCE && d
1c10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
1c20: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
1c30: 7b 20 22 43 68 61 72 55 70 70 65 72 57 22 2c 20  { "CharUpperW", 
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
1c50: 53 43 41 4c 4c 29 43 68 61 72 55 70 70 65 72 57  SCALL)CharUpperW
1c60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
1c70: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
1c80: 68 61 72 55 70 70 65 72 57 22 2c 20 20 20 20 20  harUpperW",     
1c90: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
1ca0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
1cb0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
1cc0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
1cd0: 6f 73 43 68 61 72 55 70 70 65 72 57 20 28 28 4c  osCharUpperW ((L
1ce0: 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c  PWSTR(WINAPI*)(L
1cf0: 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PWSTR))aSyscall[
1d00: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
1d10: 7b 20 22 43 6c 6f 73 65 48 61 6e 64 6c 65 22 2c  { "CloseHandle",
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
1d30: 53 43 41 4c 4c 29 43 6c 6f 73 65 48 61 6e 64 6c  SCALL)CloseHandl
1d40: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  e,             0
1d50: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43   },..#define osC
1d60: 6c 6f 73 65 48 61 6e 64 6c 65 20 28 28 42 4f 4f  loseHandle ((BOO
1d70: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
1d80: 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70  E))aSyscall[3].p
1d90: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
1da0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1db0: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
1dc0: 20 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c 20   "CreateFileA", 
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
1de0: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 41  CALL)CreateFileA
1df0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
1e00: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
1e10: 65 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20  eateFileA",     
1e20: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
1e30: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
1e40: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
1e50: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
1e60: 73 43 72 65 61 74 65 46 69 6c 65 41 20 28 28 48  sCreateFileA ((H
1e70: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ANDLE(WINAPI*)(L
1e80: 50 43 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52  PCSTR,DWORD,DWOR
1e90: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  D, \.        LPS
1ea0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
1eb0: 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48  ES,DWORD,DWORD,H
1ec0: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
1ed0: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
1ee0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1ef0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
1f00: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
1f10: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
1f20: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46  (SYSCALL)CreateF
1f30: 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20 20  ileW,           
1f40: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
1f50: 20 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20   "CreateFileW", 
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
1f70: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
1f90: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
1fa0: 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57  ne osCreateFileW
1fb0: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
1fc0: 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44  *)(LPCWSTR,DWORD
1fd0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
1fe0: 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54    LPSECURITY_ATT
1ff0: 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57  RIBUTES,DWORD,DW
2000: 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73  ORD,HANDLE))aSys
2010: 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74  call[5].pCurrent
2020: 29 0a 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  )..  { "CreateFi
2030: 6c 65 4d 61 70 70 69 6e 67 22 2c 20 20 20 20 20  leMapping",     
2040: 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74    (SYSCALL)Creat
2050: 65 46 69 6c 65 4d 61 70 70 69 6e 67 2c 20 20 20  eFileMapping,   
2060: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
2070: 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  e osCreateFileMa
2080: 70 70 69 6e 67 20 28 28 48 41 4e 44 4c 45 28 57  pping ((HANDLE(W
2090: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
20a0: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
20b0: 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20  UTES, \.        
20c0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
20d0: 44 2c 4c 50 43 54 53 54 52 29 29 61 53 79 73 63  D,LPCTSTR))aSysc
20e0: 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29  all[6].pCurrent)
20f0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
2100: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
2110: 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65  IDE).  { "Create
2120: 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20  FileMappingW",  
2130: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
2140: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 2c  ateFileMappingW,
2150: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
2160: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
2170: 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20 20 20  MappingW",      
2180: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
21b0: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
21c0: 69 6c 65 4d 61 70 70 69 6e 67 57 20 28 28 48 41  ileMappingW ((HA
21d0: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41  NDLE(WINAPI*)(HA
21e0: 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f  NDLE,LPSECURITY_
21f0: 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20  ATTRIBUTES, \.  
2200: 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52        DWORD,DWOR
2210: 44 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52 29  D,DWORD,LPCWSTR)
2220: 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75  )aSyscall[7].pCu
2230: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
2240: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
2250: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
2260: 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20 20  CreateMutexW",  
2270: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
2280: 4c 4c 29 43 72 65 61 74 65 4d 75 74 65 78 57 2c  LL)CreateMutexW,
2290: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
22a0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
22b0: 74 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20  teMutexW",      
22c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
22d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
22f0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
2300: 72 65 61 74 65 4d 75 74 65 78 57 20 28 28 48 41  reateMutexW ((HA
2310: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
2320: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
2330: 54 45 53 2c 42 4f 4f 4c 2c 20 5c 0a 20 20 20 20  TES,BOOL, \.    
2340: 20 20 20 20 4c 50 43 57 53 54 52 29 29 61 53 79      LPCWSTR))aSy
2350: 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e  scall[8].pCurren
2360: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
2370: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
2380: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 44 65 6c 65  _ANSI).  { "Dele
2390: 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20  teFileA",       
23a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 44        (SYSCALL)D
23b0: 65 6c 65 74 65 46 69 6c 65 41 2c 20 20 20 20 20  eleteFileA,     
23c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
23d0: 73 65 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69  se.  { "DeleteFi
23e0: 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  leA",           
23f0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2410: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
2420: 0a 23 64 65 66 69 6e 65 20 6f 73 44 65 6c 65 74  .#define osDelet
2430: 65 46 69 6c 65 41 20 28 28 42 4f 4f 4c 28 57 49  eFileA ((BOOL(WI
2440: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61  NAPI*)(LPCSTR))a
2450: 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72  Syscall[9].pCurr
2460: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
2470: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
2480: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 44 65  AS_WIDE).  { "De
2490: 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20  leteFileW",     
24a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
24b0: 29 44 65 6c 65 74 65 46 69 6c 65 57 2c 20 20 20  )DeleteFileW,   
24c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
24d0: 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65 74 65  else.  { "Delete
24e0: 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20  FileW",         
24f0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
2520: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44 65 6c  f..#define osDel
2530: 65 74 65 46 69 6c 65 57 20 28 28 42 4f 4f 4c 28  eteFileW ((BOOL(
2540: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
2550: 29 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70  ))aSyscall[10].p
2560: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
2570: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
2580: 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63  { "FileTimeToLoc
2590: 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  alFileTime", (SY
25a0: 53 43 41 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f  SCALL)FileTimeTo
25b0: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 2c 20 30  LocalFileTime, 0
25c0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46   },.#else.  { "F
25d0: 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69  ileTimeToLocalFi
25e0: 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c  leTime", (SYSCAL
25f0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
2600: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2610: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
2620: 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61  osFileTimeToLoca
2630: 6c 46 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c  lFileTime ((BOOL
2640: 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20  (WINAPI*)(CONST 
2650: 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20  FILETIME*, \.   
2660: 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29       LPFILETIME)
2670: 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43  )aSyscall[11].pC
2680: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
2690: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b  ITE_OS_WINCE.  {
26a0: 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74   "FileTimeToSyst
26b0: 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53  emTime",    (SYS
26c0: 43 41 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f 53  CALL)FileTimeToS
26d0: 79 73 74 65 6d 54 69 6d 65 2c 20 20 20 20 30 20  ystemTime,    0 
26e0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 69  },.#else.  { "Fi
26f0: 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69  leTimeToSystemTi
2700: 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  me",    (SYSCALL
2710: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
2720: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
2730: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
2740: 73 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65  sFileTimeToSyste
2750: 6d 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e  mTime ((BOOL(WIN
2760: 41 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45  API*)(CONST FILE
2770: 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20  TIME*, \.       
2780: 20 4c 50 53 59 53 54 45 4d 54 49 4d 45 29 29 61   LPSYSTEMTIME))a
2790: 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72  Syscall[12].pCur
27a0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 46 6c 75 73  rent)..  { "Flus
27b0: 68 46 69 6c 65 42 75 66 66 65 72 73 22 2c 20 20  hFileBuffers",  
27c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46        (SYSCALL)F
27d0: 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 2c  lushFileBuffers,
27e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
27f0: 65 66 69 6e 65 20 6f 73 46 6c 75 73 68 46 69 6c  efine osFlushFil
2800: 65 42 75 66 66 65 72 73 20 28 28 42 4f 4f 4c 28  eBuffers ((BOOL(
2810: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29  WINAPI*)(HANDLE)
2820: 29 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43  )aSyscall[13].pC
2830: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
2840: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
2850: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
2860: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22  "FormatMessageA"
2870: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
2880: 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67  ALL)FormatMessag
2890: 65 41 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  eA,          0 }
28a0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72  ,.#else.  { "For
28b0: 6d 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20  matMessageA",   
28c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
28d0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
28e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
28f0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
2900: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 20 28  FormatMessageA (
2910: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
2920: 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57  DWORD,LPCVOID,DW
2930: 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c  ORD,DWORD,LPSTR,
2940: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
2950: 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63  ,va_list*))aSysc
2960: 61 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74  all[14].pCurrent
2970: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
2980: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2990: 57 49 44 45 29 0a 20 20 7b 20 22 46 6f 72 6d 61  WIDE).  { "Forma
29a0: 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20 20  tMessageW",     
29b0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f       (SYSCALL)Fo
29c0: 72 6d 61 74 4d 65 73 73 61 67 65 57 2c 20 20 20  rmatMessageW,   
29d0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
29e0: 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73  e.  { "FormatMes
29f0: 73 61 67 65 57 22 2c 20 20 20 20 20 20 20 20 20  sageW",         
2a00: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a20: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
2a30: 23 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74  #define osFormat
2a40: 4d 65 73 73 61 67 65 57 20 28 28 44 57 4f 52 44  MessageW ((DWORD
2a50: 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c  (WINAPI*)(DWORD,
2a60: 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57  LPCVOID,DWORD,DW
2a70: 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20  ORD,LPWSTR, \.  
2a80: 20 20 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c        DWORD,va_l
2a90: 69 73 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31  ist*))aSyscall[1
2aa0: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  5].pCurrent)..  
2ab0: 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c  { "FreeLibrary",
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
2ad0: 53 43 41 4c 4c 29 46 72 65 65 4c 69 62 72 61 72  SCALL)FreeLibrar
2ae0: 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  y,             0
2af0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46   },..#define osF
2b00: 72 65 65 4c 69 62 72 61 72 79 20 28 28 42 4f 4f  reeLibrary ((BOO
2b10: 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55  L(WINAPI*)(HMODU
2b20: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d  LE))aSyscall[16]
2b30: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
2b40: 22 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  "GetCurrentProce
2b50: 73 73 49 64 22 2c 20 20 20 20 20 28 53 59 53 43  ssId",     (SYSC
2b60: 41 4c 4c 29 47 65 74 43 75 72 72 65 6e 74 50 72  ALL)GetCurrentPr
2b70: 6f 63 65 73 73 49 64 2c 20 20 20 20 20 30 20 7d  ocessId,     0 }
2b80: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  ,..#define osGet
2b90: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
2ba0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
2bb0: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  )(VOID))aSyscall
2bc0: 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [17].pCurrent)..
2bd0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
2be0: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
2bf0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
2c00: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 44  _ANSI).  { "GetD
2c10: 69 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20  iskFreeSpaceA", 
2c20: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
2c30: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
2c40: 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ,       0 },.#el
2c50: 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  se.  { "GetDiskF
2c60: 72 65 65 53 70 61 63 65 41 22 2c 20 20 20 20 20  reeSpaceA",     
2c70: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c90: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
2ca0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69  .#define osGetDi
2cb0: 73 6b 46 72 65 65 53 70 61 63 65 41 20 28 28 42  skFreeSpaceA ((B
2cc0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
2cd0: 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57  STR,LPDWORD,LPDW
2ce0: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
2cf0: 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29         LPDWORD))
2d00: 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75  aSyscall[18].pCu
2d10: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
2d20: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
2d30: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
2d40: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
2d50: 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53   { "GetDiskFreeS
2d60: 70 61 63 65 57 22 2c 20 20 20 20 20 20 20 28 53  paceW",       (S
2d70: 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46 72  YSCALL)GetDiskFr
2d80: 65 65 53 70 61 63 65 57 2c 20 20 20 20 20 20 20  eeSpaceW,       
2d90: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
2da0: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
2db0: 57 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41  W",       (SYSCA
2dc0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
2de0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
2df0: 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53 70   osGetDiskFreeSp
2e00: 61 63 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41  aceW ((BOOL(WINA
2e10: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 4c 50 44  PI*)(LPCWSTR,LPD
2e20: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44  WORD,LPDWORD,LPD
2e30: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
2e40: 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  LPDWORD))aSyscal
2e50: 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[19].pCurrent).
2e60: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
2e70: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
2e80: 53 49 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  SI).  { "GetFile
2e90: 41 74 74 72 69 62 75 74 65 73 41 22 2c 20 20 20  AttributesA",   
2ea0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
2eb0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 2c 20  ileAttributesA, 
2ec0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
2ed0: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
2ee0: 69 62 75 74 65 73 41 22 2c 20 20 20 20 20 20 28  ibutesA",      (
2ef0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f10: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
2f20: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41  efine osGetFileA
2f30: 74 74 72 69 62 75 74 65 73 41 20 28 28 44 57 4f  ttributesA ((DWO
2f40: 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53  RD(WINAPI*)(LPCS
2f50: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d  TR))aSyscall[20]
2f60: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
2f70: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
2f80: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
2f90: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
2fa0: 62 75 74 65 73 57 22 2c 20 20 20 20 20 20 28 53  butesW",      (S
2fb0: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74  YSCALL)GetFileAt
2fc0: 74 72 69 62 75 74 65 73 57 2c 20 20 20 20 20 20  tributesW,      
2fd0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
2fe0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
2ff0: 73 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  sW",      (SYSCA
3000: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3010: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3020: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3030: 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
3040: 75 74 65 73 57 20 28 28 44 57 4f 52 44 28 57 49  utesW ((DWORD(WI
3050: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29  NAPI*)(LPCWSTR))
3060: 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75  aSyscall[21].pCu
3070: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
3080: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3090: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
30a0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
30b0: 73 45 78 57 22 2c 20 20 20 20 28 53 59 53 43 41  sExW",    (SYSCA
30c0: 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62  LL)GetFileAttrib
30d0: 75 74 65 73 45 78 57 2c 20 20 20 20 30 20 7d 2c  utesExW,    0 },
30e0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
30f0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
3100: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30  ",    (SYSCALL)0
3110: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3120: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3130: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
3140: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
3150: 45 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ExW ((BOOL(WINAP
3160: 49 2a 29 28 4c 50 43 57 53 54 52 2c 47 45 54 5f  I*)(LPCWSTR,GET_
3170: 46 49 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56 45  FILEEX_INFO_LEVE
3180: 4c 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  LS, \.        LP
3190: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32  VOID))aSyscall[2
31a0: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
31b0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
31c0: 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69  T.  { "GetFileSi
31d0: 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ze",            
31e0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3200: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3210: 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c  { "GetFileSize",
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
3230: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a  SCALL)GetFileSiz
3240: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  e,             0
3250: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
3260: 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 53 69 7a  ine osGetFileSiz
3270: 65 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  e ((DWORD(WINAPI
3280: 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52  *)(HANDLE,LPDWOR
3290: 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e  D))aSyscall[23].
32a0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
32b0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
32c0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
32d0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
32e0: 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61  ).  { "GetFullPa
32f0: 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20  thNameA",       
3300: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c   (SYSCALL)GetFul
3310: 6c 50 61 74 68 4e 61 6d 65 41 2c 20 20 20 20 20  lPathNameA,     
3320: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3330: 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  { "GetFullPathNa
3340: 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 59  meA",        (SY
3350: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
3360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3370: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
3380: 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  ine osGetFullPat
3390: 68 4e 61 6d 65 41 20 28 28 44 57 4f 52 44 28 57  hNameA ((DWORD(W
33a0: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44  INAPI*)(LPCSTR,D
33b0: 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20  WORD,LPSTR, \.  
33c0: 20 20 20 20 20 20 4c 50 53 54 52 2a 29 29 61 53        LPSTR*))aS
33d0: 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72  yscall[24].pCurr
33e0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
33f0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65  E_OS_WINCE && de
3400: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3410: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
3420: 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
3430: 65 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  eW",        (SYS
3440: 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68  CALL)GetFullPath
3450: 4e 61 6d 65 57 2c 20 20 20 20 20 20 20 20 30 20  NameW,        0 
3460: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
3470: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c  tFullPathNameW",
3480: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3490: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
34a0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
34b0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
34c0: 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
34d0: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
34e0: 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44  *)(LPCWSTR,DWORD
34f0: 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  ,LPWSTR, \.     
3500: 20 20 20 4c 50 57 53 54 52 2a 29 29 61 53 79 73     LPWSTR*))aSys
3510: 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e  call[25].pCurren
3520: 74 29 0a 0a 20 20 7b 20 22 47 65 74 4c 61 73 74  t)..  { "GetLast
3530: 45 72 72 6f 72 22 2c 20 20 20 20 20 20 20 20 20  Error",         
3540: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 4c     (SYSCALL)GetL
3550: 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20  astError,       
3560: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
3570: 6e 65 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  ne osGetLastErro
3580: 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  r ((DWORD(WINAPI
3590: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
35a0: 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[26].pCurrent).
35b0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
35c0: 49 4e 43 45 0a 20 20 2f 2a 20 54 68 65 20 47 65  INCE.  /* The Ge
35d0: 74 50 72 6f 63 41 64 64 72 65 73 73 41 28 29 20  tProcAddressA() 
35e0: 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
35f0: 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e  available on Win
3600: 64 6f 77 73 20 43 45 2e 20 2a 2f 0a 20 20 7b 20  dows CE. */.  { 
3610: 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  "GetProcAddressA
3620: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
3630: 41 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65  ALL)GetProcAddre
3640: 73 73 41 2c 20 20 20 20 20 20 20 20 20 30 20 7d  ssA,         0 }
3650: 2c 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c  ,.#else.  /* All
3660: 20 6f 74 68 65 72 20 57 69 6e 64 6f 77 73 20 70   other Windows p
3670: 6c 61 74 66 6f 72 6d 73 20 65 78 70 65 63 74 20  latforms expect 
3680: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 28 29  GetProcAddress()
3690: 20 74 6f 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e   to take.  ** an
36a0: 20 41 4e 53 49 20 73 74 72 69 6e 67 20 72 65 67   ANSI string reg
36b0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 5f  ardless of the _
36c0: 55 4e 49 43 4f 44 45 20 73 65 74 74 69 6e 67 20  UNICODE setting 
36d0: 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41  */.  { "GetProcA
36e0: 64 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20  ddressA",       
36f0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72    (SYSCALL)GetPr
3700: 6f 63 41 64 64 72 65 73 73 2c 20 20 20 20 20 20  ocAddress,      
3710: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3720: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72  .#define osGetPr
3730: 6f 63 41 64 64 72 65 73 73 41 20 28 28 46 41 52  ocAddressA ((FAR
3740: 50 52 4f 43 28 57 49 4e 41 50 49 2a 29 28 48 4d  PROC(WINAPI*)(HM
3750: 4f 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20  ODULE, \.       
3760: 20 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c   LPCSTR))aSyscal
3770: 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[27].pCurrent).
3780: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49  .  { "GetSystemI
3790: 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20  nfo",           
37a0: 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74  (SYSCALL)GetSyst
37b0: 65 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  emInfo,         
37c0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
37d0: 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 20  osGetSystemInfo 
37e0: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
37f0: 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61  LPSYSTEM_INFO))a
3800: 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70 43 75 72  Syscall[28].pCur
3810: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 53  rent)..  { "GetS
3820: 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 20  ystemTime",     
3830: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
3840: 65 74 53 79 73 74 65 6d 54 69 6d 65 2c 20 20 20  etSystemTime,   
3850: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
3860: 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65  efine osGetSyste
3870: 6d 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49 4e  mTime ((VOID(WIN
3880: 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d 54 49  API*)(LPSYSTEMTI
3890: 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 32 39 5d  ME))aSyscall[29]
38a0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
38b0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
38c0: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54  .  { "GetSystemT
38d0: 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20  imeAsFileTime", 
38e0: 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74  (SYSCALL)GetSyst
38f0: 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
3900: 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b  , 0 },.#else.  {
3910: 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41   "GetSystemTimeA
3920: 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53  sFileTime", (SYS
3930: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
3940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3950: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
3960: 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69  ne osGetSystemTi
3970: 6d 65 41 73 46 69 6c 65 54 69 6d 65 20 28 28 56  meAsFileTime ((V
3980: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a  OID(WINAPI*)( \.
3990: 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49          LPFILETI
39a0: 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 30 5d  ME))aSyscall[30]
39b0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
39c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
39d0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
39e0: 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 41   { "GetTempPathA
39f0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
3a00: 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50 61  YSCALL)GetTempPa
3a10: 74 68 41 2c 20 20 20 20 20 20 20 20 20 20 20 20  thA,            
3a20: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3a30: 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c 20 20  GetTempPathA",  
3a40: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3a50: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3a60: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3a70: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3a80: 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41 20   osGetTempPathA 
3a90: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
3aa0: 28 44 57 4f 52 44 2c 4c 50 53 54 52 29 29 61 53  (DWORD,LPSTR))aS
3ab0: 79 73 63 61 6c 6c 5b 33 31 5d 2e 70 43 75 72 72  yscall[31].pCurr
3ac0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
3ad0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3ae0: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65  AS_WIDE).  { "Ge
3af0: 74 54 65 6d 70 50 61 74 68 57 22 2c 20 20 20 20  tTempPathW",    
3b00: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3b10: 29 47 65 74 54 65 6d 70 50 61 74 68 57 2c 20 20  )GetTempPathW,  
3b20: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3b30: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d  else.  { "GetTem
3b40: 70 50 61 74 68 57 22 2c 20 20 20 20 20 20 20 20  pPathW",        
3b50: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b70: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3b80: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
3b90: 54 65 6d 70 50 61 74 68 57 20 28 28 44 57 4f 52  TempPathW ((DWOR
3ba0: 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  D(WINAPI*)(DWORD
3bb0: 2c 4c 50 57 53 54 52 29 29 61 53 79 73 63 61 6c  ,LPWSTR))aSyscal
3bc0: 6c 5b 33 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[32].pCurrent).
3bd0: 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75  .  { "GetTickCou
3be0: 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  nt",            
3bf0: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b  (SYSCALL)GetTick
3c00: 43 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20  Count,          
3c10: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
3c20: 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 20 28  osGetTickCount (
3c30: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
3c40: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33  VOID))aSyscall[3
3c50: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
3c60: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
3c70: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
3c80: 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e  .  { "GetVersion
3c90: 45 78 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  ExA",           
3ca0: 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72 73  (SYSCALL)GetVers
3cb0: 69 6f 6e 45 78 41 2c 20 20 20 20 20 20 20 20 20  ionExA,         
3cc0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3cd0: 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22   "GetVersionExA"
3ce0: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
3cf0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
3d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3d10: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
3d20: 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45  ne osGetVersionE
3d30: 78 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  xA ((BOOL(WINAPI
3d40: 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  *)( \.        LP
3d50: 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29  OSVERSIONINFOA))
3d60: 61 53 79 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75  aSyscall[34].pCu
3d70: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61  rrent)..  { "Hea
3d80: 70 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20  pAlloc",        
3d90: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3da0: 48 65 61 70 41 6c 6c 6f 63 2c 20 20 20 20 20 20  HeapAlloc,      
3db0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
3dc0: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 41 6c 6c  define osHeapAll
3dd0: 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41  oc ((LPVOID(WINA
3de0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
3df0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  D, \.        SIZ
3e00: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 35  E_T))aSyscall[35
3e10: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3e20: 20 22 48 65 61 70 43 72 65 61 74 65 22 2c 20 20   "HeapCreate",  
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3e40: 43 41 4c 4c 29 48 65 61 70 43 72 65 61 74 65 2c  CALL)HeapCreate,
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3e60: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
3e70: 61 70 43 72 65 61 74 65 20 28 28 48 41 4e 44 4c  apCreate ((HANDL
3e80: 45 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  E(WINAPI*)(DWORD
3e90: 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20 20 20 20 20  ,SIZE_T, \.     
3ea0: 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63     SIZE_T))aSysc
3eb0: 61 6c 6c 5b 33 36 5d 2e 70 43 75 72 72 65 6e 74  all[36].pCurrent
3ec0: 29 0a 0a 20 20 7b 20 22 48 65 61 70 44 65 73 74  )..  { "HeapDest
3ed0: 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  roy",           
3ee0: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 44    (SYSCALL)HeapD
3ef0: 65 73 74 72 6f 79 2c 20 20 20 20 20 20 20 20 20  estroy,         
3f00: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
3f10: 65 20 6f 73 48 65 61 70 44 65 73 74 72 6f 79 20  e osHeapDestroy 
3f20: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
3f30: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
3f40: 5b 33 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [37].pCurrent)..
3f50: 20 20 7b 20 22 48 65 61 70 46 72 65 65 22 2c 20    { "HeapFree", 
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
3f70: 53 59 53 43 41 4c 4c 29 48 65 61 70 46 72 65 65  SYSCALL)HeapFree
3f80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3f90: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
3fa0: 73 48 65 61 70 46 72 65 65 20 28 28 42 4f 4f 4c  sHeapFree ((BOOL
3fb0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
3fc0: 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 29 29 61  ,DWORD,LPVOID))a
3fd0: 53 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43 75 72  Syscall[38].pCur
3fe0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70  rent)..  { "Heap
3ff0: 52 65 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20  ReAlloc",       
4000: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
4010: 65 61 70 52 65 41 6c 6c 6f 63 2c 20 20 20 20 20  eapReAlloc,     
4020: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
4030: 65 66 69 6e 65 20 6f 73 48 65 61 70 52 65 41 6c  efine osHeapReAl
4040: 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e  loc ((LPVOID(WIN
4050: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
4060: 52 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a 20 20 20  RD,LPVOID, \.   
4070: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
4080: 73 63 61 6c 6c 5b 33 39 5d 2e 70 43 75 72 72 65  scall[39].pCurre
4090: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 53 69  nt)..  { "HeapSi
40a0: 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ze",            
40b0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
40c0: 70 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  pSize,          
40d0: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
40e0: 69 6e 65 20 6f 73 48 65 61 70 53 69 7a 65 20 28  ine osHeapSize (
40f0: 28 53 49 5a 45 5f 54 28 57 49 4e 41 50 49 2a 29  (SIZE_T(WINAPI*)
4100: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c  (HANDLE,DWORD, \
4110: 0a 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44  .        LPCVOID
4120: 29 29 61 53 79 73 63 61 6c 6c 5b 34 30 5d 2e 70  ))aSyscall[40].p
4130: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48  Current)..  { "H
4140: 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20 20  eapValidate",   
4150: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4160: 4c 29 48 65 61 70 56 61 6c 69 64 61 74 65 2c 20  L)HeapValidate, 
4170: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4180: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 56  .#define osHeapV
4190: 61 6c 69 64 61 74 65 20 28 28 42 4f 4f 4c 28 57  alidate ((BOOL(W
41a0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
41b0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
41c0: 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c  LPCVOID))aSyscal
41d0: 6c 5b 34 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[41].pCurrent).
41e0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
41f0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
4200: 53 49 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62  SI).  { "LoadLib
4210: 72 61 72 79 41 22 2c 20 20 20 20 20 20 20 20 20  raryA",         
4220: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64     (SYSCALL)Load
4230: 4c 69 62 72 61 72 79 41 2c 20 20 20 20 20 20 20  LibraryA,       
4240: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4250: 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79    { "LoadLibrary
4260: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  A",            (
4270: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4290: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
42a0: 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72  efine osLoadLibr
42b0: 61 72 79 41 20 28 28 48 4d 4f 44 55 4c 45 28 57  aryA ((HMODULE(W
42c0: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29  INAPI*)(LPCSTR))
42d0: 61 53 79 73 63 61 6c 6c 5b 34 32 5d 2e 70 43 75  aSyscall[42].pCu
42e0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
42f0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4300: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
4310: 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20 20  LoadLibraryW",  
4320: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4330: 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 57 2c  LL)LoadLibraryW,
4340: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4350: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64  .#else.  { "Load
4360: 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20 20  LibraryW",      
4370: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4380: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4390: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
43a0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c  dif..#define osL
43b0: 6f 61 64 4c 69 62 72 61 72 79 57 20 28 28 48 4d  oadLibraryW ((HM
43c0: 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ODULE(WINAPI*)(L
43d0: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
43e0: 5b 34 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [43].pCurrent)..
43f0: 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c    { "LocalFree",
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
4410: 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46 72 65  SYSCALL)LocalFre
4420: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
4430: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
4440: 73 4c 6f 63 61 6c 46 72 65 65 20 28 28 48 4c 4f  sLocalFree ((HLO
4450: 43 41 4c 28 57 49 4e 41 50 49 2a 29 28 48 4c 4f  CAL(WINAPI*)(HLO
4460: 43 41 4c 29 29 61 53 79 73 63 61 6c 6c 5b 34 34  CAL))aSyscall[44
4470: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4480: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
4490: 45 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22  E.  { "LockFile"
44a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
44b0: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69   (SYSCALL)LockFi
44c0: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
44d0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
44e0: 20 6f 73 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f   osLockFile ((BO
44f0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
4500: 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  LE,DWORD,DWORD,D
4510: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
4520: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
4530: 34 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65  45].pCurrent).#e
4540: 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c  lse.  { "LockFil
4550: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
4560: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4580: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4590: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
45a0: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c 6f 63 6b  _WINCE.  { "Lock
45b0: 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20  FileEx",        
45c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c        (SYSCALL)L
45d0: 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20 20 20  ockFileEx,      
45e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
45f0: 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65  efine osLockFile
4600: 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  Ex ((BOOL(WINAPI
4610: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
4620: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
4630: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f  D, \.        LPO
4640: 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63  VERLAPPED))aSysc
4650: 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65 6e 74  all[46].pCurrent
4660: 29 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63  ).#else.  { "Loc
4670: 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20  kFileEx",       
4680: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4690: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
46a0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
46b0: 6e 64 69 66 0a 0a 20 20 7b 20 22 4d 61 70 56 69  ndif..  { "MapVi
46c0: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
46d0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61       (SYSCALL)Ma
46e0: 70 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20  pViewOfFile,    
46f0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
4700: 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f 66  fine osMapViewOf
4710: 46 69 6c 65 20 28 28 4c 50 56 4f 49 44 28 57 49  File ((LPVOID(WI
4720: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
4730: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
4740: 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f   \.        SIZE_
4750: 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 37 5d 2e  T))aSyscall[47].
4760: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
4770: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
4780: 68 61 72 22 2c 20 20 20 20 20 28 53 59 53 43 41  har",     (SYSCA
4790: 4c 4c 29 4d 75 6c 74 69 42 79 74 65 54 6f 57 69  LL)MultiByteToWi
47a0: 64 65 43 68 61 72 2c 20 20 20 20 20 30 20 7d 2c  deChar,     0 },
47b0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75 6c 74  ..#define osMult
47c0: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 20  iByteToWideChar 
47d0: 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 28 55  ((int(WINAPI*)(U
47e0: 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52  INT,DWORD,LPCSTR
47f0: 2c 69 6e 74 2c 4c 50 57 53 54 52 2c 20 5c 0a 20  ,int,LPWSTR, \. 
4800: 20 20 20 20 20 20 20 69 6e 74 29 29 61 53 79 73         int))aSys
4810: 63 61 6c 6c 5b 34 38 5d 2e 70 43 75 72 72 65 6e  call[48].pCurren
4820: 74 29 0a 0a 20 20 7b 20 22 51 75 65 72 79 50 65  t)..  { "QueryPe
4830: 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72  rformanceCounter
4840: 22 2c 20 28 53 59 53 43 41 4c 4c 29 51 75 65 72  ", (SYSCALL)Quer
4850: 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e  yPerformanceCoun
4860: 74 65 72 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69  ter, 0 },..#defi
4870: 6e 65 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72  ne osQueryPerfor
4880: 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 28 28 42  manceCounter ((B
4890: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a  OOL(WINAPI*)( \.
48a0: 20 20 20 20 20 20 20 20 4c 41 52 47 45 5f 49 4e          LARGE_IN
48b0: 54 45 47 45 52 2a 29 29 61 53 79 73 63 61 6c 6c  TEGER*))aSyscall
48c0: 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [49].pCurrent)..
48d0: 20 20 7b 20 22 52 65 61 64 46 69 6c 65 22 2c 20    { "ReadFile", 
48e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
48f0: 53 59 53 43 41 4c 4c 29 52 65 61 64 46 69 6c 65  SYSCALL)ReadFile
4900: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4910: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
4920: 73 52 65 61 64 46 69 6c 65 20 28 28 42 4f 4f 4c  sReadFile ((BOOL
4930: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
4940: 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50  ,LPVOID,DWORD,LP
4950: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
4960: 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61   LPOVERLAPPED))a
4970: 53 79 73 63 61 6c 6c 5b 35 30 5d 2e 70 43 75 72  Syscall[50].pCur
4980: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 65 74 45  rent)..  { "SetE
4990: 6e 64 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ndOfFile",      
49a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53        (SYSCALL)S
49b0: 65 74 45 6e 64 4f 66 46 69 6c 65 2c 20 20 20 20  etEndOfFile,    
49c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
49d0: 65 66 69 6e 65 20 6f 73 53 65 74 45 6e 64 4f 66  efine osSetEndOf
49e0: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
49f0: 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79  PI*)(HANDLE))aSy
4a00: 73 63 61 6c 6c 5b 35 31 5d 2e 70 43 75 72 72 65  scall[51].pCurre
4a10: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
4a20: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 65  OS_WINRT.  { "Se
4a30: 74 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20  tFilePointer",  
4a40: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4a50: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4a60: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4a70: 65 6c 73 65 0a 20 20 7b 20 22 53 65 74 46 69 6c  else.  { "SetFil
4a80: 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20 20 20  ePointer",      
4a90: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74      (SYSCALL)Set
4aa0: 46 69 6c 65 50 6f 69 6e 74 65 72 2c 20 20 20 20  FilePointer,    
4ab0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4ac0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74  f..#define osSet
4ad0: 46 69 6c 65 50 6f 69 6e 74 65 72 20 28 28 44 57  FilePointer ((DW
4ae0: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  ORD(WINAPI*)(HAN
4af0: 44 4c 45 2c 4c 4f 4e 47 2c 50 4c 4f 4e 47 2c 20  DLE,LONG,PLONG, 
4b00: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29  \.        DWORD)
4b10: 29 61 53 79 73 63 61 6c 6c 5b 35 32 5d 2e 70 43  )aSyscall[52].pC
4b20: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
4b30: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
4b40: 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20 20   "Sleep",       
4b50: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4b60: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4b80: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 6c  },.#else.  { "Sl
4b90: 65 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20  eep",           
4ba0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4bb0: 29 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20  )Sleep,         
4bc0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4bd0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4be0: 73 53 6c 65 65 70 20 28 28 56 4f 49 44 28 57 49  sSleep ((VOID(WI
4bf0: 4e 41 50 49 2a 29 28 44 57 4f 52 44 29 29 61 53  NAPI*)(DWORD))aS
4c00: 79 73 63 61 6c 6c 5b 35 33 5d 2e 70 43 75 72 72  yscall[53].pCurr
4c10: 65 6e 74 29 0a 0a 20 20 7b 20 22 53 79 73 74 65  ent)..  { "Syste
4c20: 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 22  mTimeToFileTime"
4c30: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 79  ,    (SYSCALL)Sy
4c40: 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69  stemTimeToFileTi
4c50: 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65  me,    0 },..#de
4c60: 66 69 6e 65 20 6f 73 53 79 73 74 65 6d 54 69 6d  fine osSystemTim
4c70: 65 54 6f 46 69 6c 65 54 69 6d 65 20 28 28 42 4f  eToFileTime ((BO
4c80: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53  OL(WINAPI*)(CONS
4c90: 54 20 53 59 53 54 45 4d 54 49 4d 45 2a 2c 20 5c  T SYSTEMTIME*, \
4ca0: 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54  .        LPFILET
4cb0: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 34  IME))aSyscall[54
4cc0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4cd0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
4ce0: 45 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c  E.  { "UnlockFil
4cf0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
4d00: 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b   (SYSCALL)Unlock
4d10: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
4d20: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
4d30: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 28 28   osUnlockFile ((
4d40: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
4d50: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
4d60: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
4d70: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
4d80: 6c 5b 35 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[55].pCurrent).
4d90: 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63  #else.  { "Unloc
4da0: 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  kFile",         
4db0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dd0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4de0: 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  if..#if !SQLITE_
4df0: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55 6e  OS_WINCE.  { "Un
4e00: 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20  lockFileEx",    
4e10: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4e20: 29 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c 20 20  )UnlockFileEx,  
4e30: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
4e40: 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b  #define osUnlock
4e50: 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49  FileEx ((BOOL(WI
4e60: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
4e70: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
4e80: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45   \.        LPOVE
4e90: 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c  RLAPPED))aSyscal
4ea0: 6c 5b 35 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[56].pCurrent).
4eb0: 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63  #else.  { "Unloc
4ec0: 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20  kFileEx",       
4ed0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ef0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4f00: 69 66 0a 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69  if..  { "UnmapVi
4f10: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
4f20: 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6d 61     (SYSCALL)Unma
4f30: 70 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20  pViewOfFile,    
4f40: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
4f50: 6e 65 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66  ne osUnmapViewOf
4f60: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
4f70: 50 49 2a 29 28 4c 50 43 56 4f 49 44 29 29 61 53  PI*)(LPCVOID))aS
4f80: 79 73 63 61 6c 6c 5b 35 37 5d 2e 70 43 75 72 72  yscall[57].pCurr
4f90: 65 6e 74 29 0a 0a 20 20 7b 20 22 57 69 64 65 43  ent)..  { "WideC
4fa0: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c  harToMultiByte",
4fb0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 69       (SYSCALL)Wi
4fc0: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
4fd0: 65 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65  e,     0 },..#de
4fe0: 66 69 6e 65 20 6f 73 57 69 64 65 43 68 61 72 54  fine osWideCharT
4ff0: 6f 4d 75 6c 74 69 42 79 74 65 20 28 28 69 6e 74  oMultiByte ((int
5000: 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44  (WINAPI*)(UINT,D
5010: 57 4f 52 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74  WORD,LPCWSTR,int
5020: 2c 4c 50 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20  ,LPSTR,int, \.  
5030: 20 20 20 20 20 20 4c 50 43 53 54 52 2c 4c 50 42        LPCSTR,LPB
5040: 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 35 38  OOL))aSyscall[58
5050: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5060: 20 22 57 72 69 74 65 46 69 6c 65 22 2c 20 20 20   "WriteFile",   
5070: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5080: 43 41 4c 4c 29 57 72 69 74 65 46 69 6c 65 2c 20  CALL)WriteFile, 
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
50a0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 72  },..#define osWr
50b0: 69 74 65 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  iteFile ((BOOL(W
50c0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
50d0: 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44  PCVOID,DWORD,LPD
50e0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
50f0: 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53  LPOVERLAPPED))aS
5100: 79 73 63 61 6c 6c 5b 35 39 5d 2e 70 43 75 72 72  yscall[59].pCurr
5110: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5120: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22  E_OS_WINCE.  { "
5130: 43 72 65 61 74 65 45 76 65 6e 74 45 78 22 2c 20  CreateEventEx", 
5140: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5150: 4c 4c 29 43 72 65 61 74 65 45 76 65 6e 74 45 78  LL)CreateEventEx
5160: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
5170: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
5180: 74 65 45 76 65 6e 74 45 78 20 28 28 48 41 4e 44  teEventEx ((HAND
5190: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 45  LE(WINAPI*)(LPSE
51a0: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
51b0: 53 2c 4c 50 43 54 53 54 52 2c 20 5c 0a 20 20 20  S,LPCTSTR, \.   
51c0: 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44       DWORD,DWORD
51d0: 29 29 61 53 79 73 63 61 6c 6c 5b 36 30 5d 2e 70  ))aSyscall[60].p
51e0: 43 75 72 72 65 6e 74 29 0a 23 65 6c 73 65 0a 20  Current).#else. 
51f0: 20 7b 20 22 43 72 65 61 74 65 45 76 65 6e 74 45   { "CreateEventE
5200: 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  x",           (S
5210: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5230: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 20 20 7b  0 },.#endif..  {
5240: 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f   "WaitForSingleO
5250: 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59 53  bject",     (SYS
5260: 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e 67  CALL)WaitForSing
5270: 6c 65 4f 62 6a 65 63 74 2c 20 20 20 20 20 30 20  leObject,     0 
5280: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61  },..#define osWa
5290: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
52a0: 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  t ((DWORD(WINAPI
52b0: 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20  *)(HANDLE, \.   
52c0: 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73       DWORD))aSys
52d0: 63 61 6c 6c 5b 36 31 5d 2e 70 43 75 72 72 65 6e  call[61].pCurren
52e0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
52f0: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 57 61  OS_WINCE.  { "Wa
5300: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
5310: 74 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c  tEx",   (SYSCALL
5320: 29 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  )WaitForSingleOb
5330: 6a 65 63 74 45 78 2c 20 20 20 30 20 7d 2c 0a 0a  jectEx,   0 },..
5340: 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74 46 6f  #define osWaitFo
5350: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 20  rSingleObjectEx 
5360: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
5370: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c  (HANDLE,DWORD, \
5380: 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 29 29 61  .        BOOL))a
5390: 53 79 73 63 61 6c 6c 5b 36 32 5d 2e 70 43 75 72  Syscall[62].pCur
53a0: 72 65 6e 74 29 0a 23 65 6c 73 65 0a 20 20 7b 20  rent).#else.  { 
53b0: 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  "WaitForSingleOb
53c0: 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59 53 43  jectEx",   (SYSC
53d0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
53e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
53f0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53  ,.#endif..#if !S
5400: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
5410: 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74   { "SetFilePoint
5420: 65 72 45 78 22 2c 20 20 20 20 20 20 20 20 28 53  erEx",        (S
5430: 59 53 43 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f  YSCALL)SetFilePo
5440: 69 6e 74 65 72 45 78 2c 20 20 20 20 20 20 20 20  interEx,        
5450: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
5460: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78  SetFilePointerEx
5470: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
5480: 28 48 41 4e 44 4c 45 2c 4c 41 52 47 45 5f 49 4e  (HANDLE,LARGE_IN
5490: 54 45 47 45 52 2c 20 5c 0a 20 20 20 20 20 20 20  TEGER, \.       
54a0: 20 50 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2c   PLARGE_INTEGER,
54b0: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
54c0: 36 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65  63].pCurrent).#e
54d0: 6c 73 65 0a 20 20 7b 20 22 53 65 74 46 69 6c 65  lse.  { "SetFile
54e0: 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20 20  PointerEx",     
54f0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
5500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5510: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5520: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
5530: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 47 65 74 46  _WINCE.  { "GetF
5540: 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79  ileInformationBy
5550: 48 61 6e 64 6c 65 45 78 22 2c 20 28 53 59 53 43  HandleEx", (SYSC
5560: 41 4c 4c 29 47 65 74 46 69 6c 65 49 6e 66 6f 72  ALL)GetFileInfor
5570: 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78  mationByHandleEx
5580: 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20  , 0 },..#define 
5590: 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61  osGetFileInforma
55a0: 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 20 28  tionByHandleEx (
55b0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
55c0: 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20  ANDLE, \.       
55d0: 20 46 49 4c 45 5f 49 4e 46 4f 5f 42 59 5f 48 41   FILE_INFO_BY_HA
55e0: 4e 44 4c 45 5f 43 4c 41 53 53 2c 4c 50 56 4f 49  NDLE_CLASS,LPVOI
55f0: 44 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  D,DWORD))aSyscal
5600: 6c 5b 36 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[64].pCurrent).
5610: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
5620: 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48  leInformationByH
5630: 61 6e 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41  andleEx", (SYSCA
5640: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5650: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5660: 69 66 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66  if..}; /* End of
5670: 20 74 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c   the overrideabl
5680: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a  e system calls *
5690: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  /../*.** This is
56a0: 20 74 68 65 20 78 53 65 74 53 79 73 74 65 6d 43   the xSetSystemC
56b0: 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66 20  all() method of 
56c0: 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f 72 20  sqlite3_vfs for 
56d0: 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22 77  all of the.** "w
56e0: 69 6e 33 32 22 20 56 46 53 65 73 2e 20 20 52 65  in32" VFSes.  Re
56f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
5700: 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  pon successfully
5710: 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a   updating the.**
5720: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69   system call poi
5730: 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f  nter, or SQLITE_
5740: 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65 72  NOTFOUND if ther
5750: 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72  e is no configur
5760: 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63  able.** system c
5770: 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e  all named zName.
5780: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
5790: 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28  inSetSystemCall(
57a0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
57b0: 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20 20  pNotUsed,       
57c0: 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f 69 6e   /* The VFS poin
57d0: 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a  ter.  Not used *
57e0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
57f0: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  zName,          
5800: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73    /* Name of sys
5810: 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72  tem call to over
5820: 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ride */.  sqlite
5830: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e  3_syscall_ptr pN
5840: 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74  ewFunc  /* Point
5850: 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74 65 6d  er to new system
5860: 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29   call value */.)
5870: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
5880: 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   i;.  int rc = S
5890: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
58a0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
58b0: 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20  TER(pNotUsed);. 
58c0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
58d0: 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e  .    /* If no zN
58e0: 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20 72 65  ame is given, re
58f0: 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74 65 6d  store all system
5900: 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69 72 20   calls to their 
5910: 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73  default.    ** s
5920: 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65 74 75  ettings and retu
5930: 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20  rn NULL.    */. 
5940: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
5950: 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  K;.    for(i=0; 
5960: 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  i<sizeof(aSyscal
5970: 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61  l)/sizeof(aSysca
5980: 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ll[0]); i++){.  
5990: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
59a0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a  [i].pDefault ){.
59b0: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
59c0: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 61  [i].pCurrent = a
59d0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
59e0: 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ult;.      }.   
59f0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
5a00: 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 73  /* If zName is s
5a10: 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72 61 74  pecified, operat
5a20: 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e  e on only the on
5a30: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20  e system call.  
5a40: 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 2e 0a    ** specified..
5a50: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
5a60: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
5a70: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
5a80: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
5a90: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
5aa0: 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61  mp(zName, aSysca
5ab0: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ll[i].zName)==0 
5ac0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
5ad0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
5ae0: 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ult==0 ){.      
5af0: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e      aSyscall[i].
5b00: 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79 73 63  pDefault = aSysc
5b10: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b  all[i].pCurrent;
5b20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5b30: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
5b40: 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  K;.        if( p
5b50: 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65  NewFunc==0 ) pNe
5b60: 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c  wFunc = aSyscall
5b70: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20  [i].pDefault;.  
5b80: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69        aSyscall[i
5b90: 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70 4e 65  ].pCurrent = pNe
5ba0: 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 62  wFunc;.        b
5bb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
5bc0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
5bd0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
5be0: 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
5bf0: 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  f a system call.
5c00: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
5c10: 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a   zName is not a.
5c20: 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 73 79  ** recognized sy
5c30: 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20  stem call name. 
5c40: 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65   NULL is also re
5c50: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 73 79  turned if the sy
5c60: 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20  stem call.** is 
5c70: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 66 69  currently undefi
5c80: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ned..*/.static s
5c90: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
5ca0: 74 72 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43  tr winGetSystemC
5cb0: 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  all(.  sqlite3_v
5cc0: 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20  fs *pNotUsed,.  
5cd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
5ce0: 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  e.){.  unsigned 
5cf0: 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44  int i;..  UNUSED
5d00: 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55  _PARAMETER(pNotU
5d10: 73 65 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  sed);.  for(i=0;
5d20: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
5d30: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
5d40: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
5d50: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
5d60: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
5d70: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74  .zName)==0 ) ret
5d80: 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  urn aSyscall[i].
5d90: 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20  pCurrent;.  }.  
5da0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
5db0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
5dc0: 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  me of the first 
5dd0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 66 74 65  system call afte
5de0: 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61  r zName.  If zNa
5df0: 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e  me==NULL.** then
5e00: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   return the name
5e10: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79   of the first sy
5e20: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75  stem call.  Retu
5e30: 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65  rn NULL if zName
5e40: 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20  .** is the last 
5e50: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69  system call or i
5e60: 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74  f zName is not t
5e70: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c  he name of a val
5e80: 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  id.** system cal
5e90: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  l..*/.static con
5ea0: 73 74 20 63 68 61 72 20 2a 77 69 6e 4e 65 78 74  st char *winNext
5eb0: 53 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74  SystemCall(sqlit
5ec0: 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74  e3_vfs *p, const
5ed0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
5ee0: 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20   int i = -1;..  
5ef0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
5f00: 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  (p);.  if( zName
5f10: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
5f20: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79   i<ArraySize(aSy
5f30: 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a  scall)-1; i++){.
5f40: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
5f50: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
5f60: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
5f70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
5f80: 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72  .  for(i++; i<Ar
5f90: 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
5fa0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
5fb0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
5fc0: 72 72 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72  rrent!=0 ) retur
5fd0: 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  n aSyscall[i].zN
5fe0: 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ame;.  }.  retur
5ff0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
6000: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
6010: 69 6e 65 20 53 75 73 70 65 6e 64 73 20 74 68 65  ine Suspends the
6020: 20 74 68 72 65 61 64 20 66 6f 72 20 61 74 20 6c   thread for at l
6030: 65 61 73 74 20 6d 73 20 6d 69 6c 6c 69 73 65 63  east ms millisec
6040: 6f 6e 64 73 2e 20 20 54 68 69 73 20 69 73 20 65  onds.  This is e
6050: 71 75 69 76 61 6c 65 6e 74 0a 2a 2a 20 74 6f 20  quivalent.** to 
6060: 74 68 65 20 77 69 6e 33 32 20 53 6c 65 65 70 28  the win32 Sleep(
6070: 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  ) interface..*/.
6080: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
6090: 4e 52 54 0a 73 74 61 74 69 63 20 48 41 4e 44 4c  NRT.static HANDL
60a0: 45 20 73 6c 65 65 70 4f 62 6a 3b 0a 73 74 61 74  E sleepObj;.stat
60b0: 69 63 20 76 6f 69 64 20 70 6f 72 74 61 62 6c 65  ic void portable
60c0: 53 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20  Sleep(int ms){. 
60d0: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
60e0: 4f 62 6a 65 63 74 45 78 28 73 6c 65 65 70 4f 62  ObjectEx(sleepOb
60f0: 6a 2c 20 6d 73 2c 20 46 41 4c 53 45 29 3b 0a 7d  j, ms, FALSE);.}
6100: 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 76 6f  .#else.static vo
6110: 69 64 20 70 6f 72 74 61 62 6c 65 53 6c 65 65 70  id portableSleep
6120: 28 69 6e 74 20 6d 73 29 7b 0a 20 20 6f 73 53 6c  (int ms){.  osSl
6130: 65 65 70 28 6d 73 29 3b 20 0a 7d 0a 23 65 6e 64  eep(ms); .}.#end
6140: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
6150: 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29   true (non-zero)
6160: 20 69 66 20 77 65 20 61 72 65 20 72 75 6e 6e 69   if we are runni
6170: 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e 54 2c 20  ng under WinNT, 
6180: 57 69 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a  Win2K, WinXP,.**
6190: 20 6f 72 20 57 69 6e 43 45 2e 20 20 52 65 74 75   or WinCE.  Retu
61a0: 72 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f 29 20  rn false (zero) 
61b0: 66 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e 39 38  for Win95, Win98
61c0: 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a  , or WinME..**.*
61d0: 2a 20 48 65 72 65 20 69 73 20 61 6e 20 69 6e 74  * Here is an int
61e0: 65 72 65 73 74 69 6e 67 20 6f 62 73 65 72 76 61  eresting observa
61f0: 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20 57 69  tion:  Win95, Wi
6200: 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45 20 6c  n98, and WinME l
6210: 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46  ack.** the LockF
6220: 69 6c 65 45 78 28 29 20 41 50 49 2e 20 20 42 75  ileEx() API.  Bu
6230: 74 20 77 65 20 63 61 6e 20 73 74 69 6c 6c 20 73  t we can still s
6240: 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 20 61  tatically link a
6250: 67 61 69 6e 73 74 20 74 68 61 74 0a 2a 2a 20 41  gainst that.** A
6260: 50 49 20 61 73 20 6c 6f 6e 67 20 61 73 20 77 65  PI as long as we
6270: 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74 20 77   don't call it w
6280: 68 65 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e 39  hen running Win9
6290: 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c 6c  5/98/ME.  A call
62a0: 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74   to.** this rout
62b0: 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  ine is used to d
62c0: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
62d0: 68 6f 73 74 20 69 73 20 57 69 6e 39 35 2f 39 38  host is Win95/98
62e0: 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f  /ME or.** WinNT/
62f0: 32 4b 2f 58 50 20 73 6f 20 74 68 61 74 20 77 65  2K/XP so that we
6300: 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74 68   will know wheth
6310: 65 72 20 6f 72 20 6e 6f 74 20 77 65 20 63 61 6e  er or not we can
6320: 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20   safely call.** 
6330: 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29  the LockFileEx()
6340: 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c   API..*/.#if SQL
6350: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 20 7c 7c  ITE_OS_WINCE  ||
6360: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
6370: 0a 23 20 64 65 66 69 6e 65 20 69 73 4e 54 28 29  .# define isNT()
6380: 20 20 28 31 29 0a 23 65 6c 73 65 0a 20 20 73 74    (1).#else.  st
6390: 61 74 69 63 20 69 6e 74 20 69 73 4e 54 28 76 6f  atic int isNT(vo
63a0: 69 64 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  id){.    if( sql
63b0: 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 30 20  ite3_os_type==0 
63c0: 29 7b 0a 20 20 20 20 20 20 4f 53 56 45 52 53 49  ){.      OSVERSI
63d0: 4f 4e 49 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a 20  ONINFOA sInfo;. 
63e0: 20 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56       sInfo.dwOSV
63f0: 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d  ersionInfoSize =
6400: 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a   sizeof(sInfo);.
6410: 20 20 20 20 20 20 6f 73 47 65 74 56 65 72 73 69        osGetVersi
6420: 6f 6e 45 78 41 28 26 73 49 6e 66 6f 29 3b 0a 20  onExA(&sInfo);. 
6430: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f       sqlite3_os_
6440: 74 79 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77 50  type = sInfo.dwP
6450: 6c 61 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f 50  latformId==VER_P
6460: 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54  LATFORM_WIN32_NT
6470: 20 3f 20 32 20 3a 20 31 3b 0a 20 20 20 20 7d 0a   ? 2 : 1;.    }.
6480: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
6490: 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 3b 0a 20  e3_os_type==2;. 
64a0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
64b0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a  ITE_OS_WINCE */.
64c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
64d0: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a  IN32_MALLOC./*.*
64e0: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
64f0: 73 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  s of memory..*/.
6500: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e  static void *win
6510: 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42  MemMalloc(int nB
6520: 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20  ytes){.  HANDLE 
6530: 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70  hHeap;.  void *p
6540: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
6550: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
6560: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
6570: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
6580: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
6590: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
65a0: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
65b0: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
65c0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
65d0: 41 4c 49 44 41 54 45 0a 20 20 61 73 73 65 72 74  ALIDATE.  assert
65e0: 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74   ( osHeapValidat
65f0: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
6600: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
6610: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
6620: 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  f.  assert( nByt
6630: 65 73 3e 3d 30 20 29 3b 0a 20 20 70 20 3d 20 6f  es>=0 );.  p = o
6640: 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70  sHeapAlloc(hHeap
6650: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
6660: 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45  EAP_FLAGS, (SIZE
6670: 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  _T)nBytes);.  if
6680: 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( !p ){.    sqli
6690: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
66a0: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
66b0: 20 48 65 61 70 41 6c 6c 6f 63 20 25 75 20 62 79   HeapAlloc %u by
66c0: 74 65 73 20 28 25 64 29 2c 20 68 65 61 70 3d 25  tes (%d), heap=%
66d0: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
66e0: 20 20 20 20 6e 42 79 74 65 73 2c 20 6f 73 47 65      nBytes, osGe
66f0: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76  tLastError(), (v
6700: 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d  oid*)hHeap);.  }
6710: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
6720: 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72  /*.** Free memor
6730: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
6740: 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69  d winMemFree(voi
6750: 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20 48 41  d *pPrior){.  HA
6760: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77  NDLE hHeap;..  w
6770: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
6780: 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69  ();.  hHeap = wi
6790: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20  nMemGetHeap();. 
67a0: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
67b0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  0 );.  assert( h
67c0: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
67d0: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
67e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
67f0: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
6800: 45 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73 48  E.  assert ( osH
6810: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
6820: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
6830: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69  HEAP_FLAGS, pPri
6840: 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  or) );.#endif.  
6850: 69 66 28 20 21 70 50 72 69 6f 72 20 29 20 72 65  if( !pPrior ) re
6860: 74 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69 6e 67  turn; /* Passing
6870: 20 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46 72 65   NULL to HeapFre
6880: 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20  e is undefined. 
6890: 2a 2f 0a 20 20 69 66 28 20 21 6f 73 48 65 61 70  */.  if( !osHeap
68a0: 46 72 65 65 28 68 48 65 61 70 2c 20 53 51 4c 49  Free(hHeap, SQLI
68b0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
68c0: 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 7b 0a  AGS, pPrior) ){.
68d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
68e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
68f0: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 46 72 65  ailed to HeapFre
6900: 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 64 29 2c  e block %p (%d),
6910: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
6920: 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69 6f             pPrio
6930: 72 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  r, osGetLastErro
6940: 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61  r(), (void*)hHea
6950: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
6960: 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65   Change the size
6970: 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   of an existing 
6980: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
6990: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
69a0: 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28   *winMemRealloc(
69b0: 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e  void *pPrior, in
69c0: 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41 4e  t nBytes){.  HAN
69d0: 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f 69  DLE hHeap;.  voi
69e0: 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41  d *p;..  winMemA
69f0: 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20  ssertMagic();.  
6a00: 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65  hHeap = winMemGe
6a10: 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72  tHeap();.  asser
6a20: 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20  t( hHeap!=0 );. 
6a30: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
6a40: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
6a50: 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66 20 53  ALUE );.#ifdef S
6a60: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
6a70: 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20 61 73  OC_VALIDATE.  as
6a80: 73 65 72 74 20 28 20 6f 73 48 65 61 70 56 61 6c  sert ( osHeapVal
6a90: 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c  idate(hHeap, SQL
6aa0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
6ab0: 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b  LAGS, pPrior) );
6ac0: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
6ad0: 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20  ( nBytes>=0 );. 
6ae0: 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 7b 0a   if( !pPrior ){.
6af0: 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 41 6c      p = osHeapAl
6b00: 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54  loc(hHeap, SQLIT
6b10: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
6b20: 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74  GS, (SIZE_T)nByt
6b30: 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  es);.  }else{.  
6b40: 20 20 70 20 3d 20 6f 73 48 65 61 70 52 65 41 6c    p = osHeapReAl
6b50: 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54  loc(hHeap, SQLIT
6b60: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
6b70: 47 53 2c 20 70 50 72 69 6f 72 2c 20 28 53 49 5a  GS, pPrior, (SIZ
6b80: 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d  E_T)nBytes);.  }
6b90: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
6ba0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
6bb0: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
6bc0: 65 64 20 74 6f 20 25 73 20 25 75 20 62 79 74 65  ed to %s %u byte
6bd0: 73 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22  s (%d), heap=%p"
6be0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6bf0: 20 20 70 50 72 69 6f 72 20 3f 20 22 48 65 61 70    pPrior ? "Heap
6c00: 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48 65 61 70  ReAlloc" : "Heap
6c10: 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65 73 2c 20  Alloc", nBytes, 
6c20: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
6c30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6c40: 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b    (void*)hHeap);
6c50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
6c60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6c70: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20   the size of an 
6c80: 6f 75 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f  outstanding allo
6c90: 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79 74 65 73  cation, in bytes
6ca0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6cb0: 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20  winMemSize(void 
6cc0: 2a 70 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48  *p){.  HANDLE hH
6cd0: 65 61 70 3b 0a 20 20 53 49 5a 45 5f 54 20 6e 3b  eap;.  SIZE_T n;
6ce0: 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ..  winMemAssert
6cf0: 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70  Magic();.  hHeap
6d00: 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70   = winMemGetHeap
6d10: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48  ();.  assert( hH
6d20: 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  eap!=0 );.  asse
6d30: 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c  rt( hHeap!=INVAL
6d40: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
6d50: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
6d60: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
6d70: 4c 49 44 41 54 45 0a 20 20 61 73 73 65 72 74 20  LIDATE.  assert 
6d80: 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65  ( osHeapValidate
6d90: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
6da0: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
6db0: 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66   NULL) );.#endif
6dc0: 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75  .  if( !p ) retu
6dd0: 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f 73 48 65  rn 0;.  n = osHe
6de0: 61 70 53 69 7a 65 28 68 48 65 61 70 2c 20 53 51  apSize(hHeap, SQ
6df0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
6e00: 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20 69 66 28  FLAGS, p);.  if(
6e10: 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d 31 20 29   n==(SIZE_T)-1 )
6e20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
6e30: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  g(SQLITE_NOMEM, 
6e40: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 53  "failed to HeapS
6e50: 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 64  ize block %p (%d
6e60: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
6e80: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
6e90: 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b  , (void*)hHeap);
6ea0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
6eb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74   }.  return (int
6ec0: 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75  )n;.}../*.** Rou
6ed0: 6e 64 20 75 70 20 61 20 72 65 71 75 65 73 74 20  nd up a request 
6ee0: 73 69 7a 65 20 74 6f 20 74 68 65 20 6e 65 78 74  size to the next
6ef0: 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69 6f   valid allocatio
6f00: 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
6f10: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e  c int winMemRoun
6f20: 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72 65  dup(int n){.  re
6f30: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
6f40: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73   Initialize this
6f50: 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74   module..*/.stat
6f60: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69  ic int winMemIni
6f70: 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  t(void *pAppData
6f80: 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20  ){.  winMemData 
6f90: 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28  *pWinMemData = (
6fa0: 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70  winMemData *)pAp
6fb0: 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70  pData;..  if( !p
6fc0: 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74  WinMemData ) ret
6fd0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
6fe0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  ;.  assert( pWin
6ff0: 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 3d 3d  MemData->magic==
7000: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 29 3b 0a  WINMEM_MAGIC );.
7010: 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61    if( !pWinMemDa
7020: 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20  ta->hHeap ){.   
7030: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48   pWinMemData->hH
7040: 65 61 70 20 3d 20 6f 73 48 65 61 70 43 72 65 61  eap = osHeapCrea
7050: 74 65 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  te(SQLITE_WIN32_
7060: 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20  HEAP_FLAGS,.    
7070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48    SQLITE_WIN32_H
70a0: 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 0a 20  EAP_INIT_SIZE,. 
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70d0: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33       SQLITE_WIN3
70e0: 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 29  2_HEAP_MAX_SIZE)
70f0: 3b 0a 20 20 20 20 69 66 28 20 21 70 57 69 6e 4d  ;.    if( !pWinM
7100: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b  emData->hHeap ){
7110: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  .      sqlite3_l
7120: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
7130: 0a 20 20 20 20 20 20 20 20 20 20 22 66 61 69 6c  .          "fail
7140: 65 64 20 74 6f 20 48 65 61 70 43 72 65 61 74 65  ed to HeapCreate
7150: 20 28 25 64 29 2c 20 66 6c 61 67 73 3d 25 75 2c   (%d), flags=%u,
7160: 20 69 6e 69 74 53 69 7a 65 3d 25 75 2c 20 6d 61   initSize=%u, ma
7170: 78 53 69 7a 65 3d 25 75 22 2c 0a 20 20 20 20 20  xSize=%u",.     
7180: 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72       osGetLastEr
7190: 72 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f 57 49  ror(), SQLITE_WI
71a0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a  N32_HEAP_FLAGS,.
71b0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
71c0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54  _WIN32_HEAP_INIT
71d0: 5f 53 49 5a 45 2c 20 53 51 4c 49 54 45 5f 57 49  _SIZE, SQLITE_WI
71e0: 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a  N32_HEAP_MAX_SIZ
71f0: 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  E);.      return
7200: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
7210: 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d     }.    pWinMem
7220: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 54  Data->bOwned = T
7230: 52 55 45 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  RUE;.  }.  asser
7240: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
7250: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
7260: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
7270: 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  a->hHeap!=INVALI
7280: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
7290: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
72a0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
72b0: 49 44 41 54 45 0a 20 20 61 73 73 65 72 74 28 20  IDATE.  assert( 
72c0: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 70  osHeapValidate(p
72d0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
72e0: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
72f0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c  HEAP_FLAGS, NULL
7300: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  ) );.#endif.  re
7310: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7320: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74 69  }../*.** Deiniti
7330: 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c  alize this modul
7340: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
7350: 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e  d winMemShutdown
7360: 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29  (void *pAppData)
7370: 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a  {.  winMemData *
7380: 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77  pWinMemData = (w
7390: 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70  inMemData *)pApp
73a0: 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57  Data;..  if( !pW
73b0: 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75  inMemData ) retu
73c0: 72 6e 3b 0a 20 20 69 66 28 20 70 57 69 6e 4d 65  rn;.  if( pWinMe
73d0: 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a  mData->hHeap ){.
73e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e      assert( pWin
73f0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d  MemData->hHeap!=
7400: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
7410: 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66 20 53  ALUE );.#ifdef S
7420: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
7430: 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20 20 20  OC_VALIDATE.    
7440: 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61  assert( osHeapVa
7450: 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61  lidate(pWinMemDa
7460: 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54  ta->hHeap, SQLIT
7470: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
7480: 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e  GS, NULL) );.#en
7490: 64 69 66 0a 20 20 20 20 69 66 28 20 70 57 69 6e  dif.    if( pWin
74a0: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
74b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73  ){.      if( !os
74c0: 48 65 61 70 44 65 73 74 72 6f 79 28 70 57 69 6e  HeapDestroy(pWin
74d0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 20  MemData->hHeap) 
74e0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
74f0: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
7500: 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  MEM, "failed to 
7510: 48 65 61 70 44 65 73 74 72 6f 79 20 28 25 64 29  HeapDestroy (%d)
7520: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
7530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7540: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
7550: 2c 20 28 76 6f 69 64 2a 29 70 57 69 6e 4d 65 6d  , (void*)pWinMem
7560: 44 61 74 61 2d 3e 68 48 65 61 70 29 3b 0a 20 20  Data->hHeap);.  
7570: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57 69 6e      }.      pWin
7580: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
7590: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20  = FALSE;.    }. 
75a0: 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e     pWinMemData->
75b0: 68 48 65 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  hHeap = NULL;.  
75c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c  }.}../*.** Popul
75d0: 61 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65  ate the low-leve
75e0: 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  l memory allocat
75f0: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  ion function poi
7600: 6e 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c 69  nters in.** sqli
7610: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
7620: 6d 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20  m with pointers 
7630: 74 6f 20 74 68 65 20 72 6f 75 74 69 6e 65 73 20  to the routines 
7640: 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 54 68  in this file. Th
7650: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 73  e.** arguments s
7660: 70 65 63 69 66 79 20 74 68 65 20 62 6c 6f 63 6b  pecify the block
7670: 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6d 61   of memory to ma
7680: 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nage..**.** This
7690: 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
76a0: 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74   called by sqlit
76b0: 65 33 5f 63 6f 6e 66 69 67 28 29 2c 20 61 6e 64  e3_config(), and
76c0: 20 74 68 65 72 65 66 6f 72 65 0a 2a 2a 20 69 73   therefore.** is
76d0: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f   not required to
76e0: 20 62 65 20 74 68 72 65 61 64 73 61 66 65 20 28   be threadsafe (
76f0: 69 74 20 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63  it is not)..*/.c
7700: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d  onst sqlite3_mem
7710: 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65  _methods *sqlite
7720: 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f 69  3MemGetWin32(voi
7730: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  d){.  static con
7740: 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d  st sqlite3_mem_m
7750: 65 74 68 6f 64 73 20 77 69 6e 4d 65 6d 4d 65 74  ethods winMemMet
7760: 68 6f 64 73 20 3d 20 7b 0a 20 20 20 20 77 69 6e  hods = {.    win
7770: 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 77  MemMalloc,.    w
7780: 69 6e 4d 65 6d 46 72 65 65 2c 0a 20 20 20 20 77  inMemFree,.    w
7790: 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20  inMemRealloc,.  
77a0: 20 20 77 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20    winMemSize,.  
77b0: 20 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c    winMemRoundup,
77c0: 0a 20 20 20 20 77 69 6e 4d 65 6d 49 6e 69 74 2c  .    winMemInit,
77d0: 0a 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64  .    winMemShutd
77e0: 6f 77 6e 2c 0a 20 20 20 20 26 77 69 6e 5f 6d 65  own,.    &win_me
77f0: 6d 5f 64 61 74 61 0a 20 20 7d 3b 0a 20 20 72 65  m_data.  };.  re
7800: 74 75 72 6e 20 26 77 69 6e 4d 65 6d 4d 65 74 68  turn &winMemMeth
7810: 6f 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c  ods;.}..void sql
7820: 69 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c  ite3MemSetDefaul
7830: 74 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  t(void){.  sqlit
7840: 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
7850: 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20  _CONFIG_MALLOC, 
7860: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e  sqlite3MemGetWin
7870: 33 32 28 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  32());.}.#endif 
7880: 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  /* SQLITE_WIN32_
7890: 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  MALLOC */../*.**
78a0: 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38   Convert a UTF-8
78b0: 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f   string to Micro
78c0: 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 28 55 54  soft Unicode (UT
78d0: 46 2d 31 36 3f 29 2e 20 0a 2a 2a 0a 2a 2a 20 53  F-16?). .**.** S
78e0: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
78f0: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
7900: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
7910: 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61  m malloc..*/.sta
7920: 74 69 63 20 4c 50 57 53 54 52 20 75 74 66 38 54  tic LPWSTR utf8T
7930: 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63  oUnicode(const c
7940: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
7950: 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20  .  int nChar;.  
7960: 4c 50 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65  LPWSTR zWideFile
7970: 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20 3d  name;..  nChar =
7980: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
7990: 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20  deChar(CP_UTF8, 
79a0: 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  0, zFilename, -1
79b0: 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 69 66  , NULL, 0);.  if
79c0: 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20  ( nChar==0 ){.  
79d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
79e0: 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20    zWideFilename 
79f0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
7a00: 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28 7a  ( nChar*sizeof(z
7a10: 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29  WideFilename[0])
7a20: 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 46   );.  if( zWideF
7a30: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
7a40: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7a50: 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74    nChar = osMult
7a60: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
7a70: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c  CP_UTF8, 0, zFil
7a80: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64 65  ename, -1, zWide
7a90: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
7aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ab0: 20 20 20 20 20 20 20 20 20 20 6e 43 68 61 72 29            nChar)
7ac0: 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30  ;.  if( nChar==0
7ad0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
7ae0: 66 72 65 65 28 7a 57 69 64 65 46 69 6c 65 6e 61  free(zWideFilena
7af0: 6d 65 29 3b 0a 20 20 20 20 7a 57 69 64 65 46 69  me);.    zWideFi
7b00: 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  lename = 0;.  }.
7b10: 20 20 72 65 74 75 72 6e 20 7a 57 69 64 65 46 69    return zWideFi
7b20: 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
7b30: 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f   Convert Microso
7b40: 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 55 54  ft Unicode to UT
7b50: 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68  F-8.  Space to h
7b60: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
7b70: 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f 62   string is.** ob
7b80: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
7b90: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  te3_malloc()..*/
7ba0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 6e  .static char *un
7bb0: 69 63 6f 64 65 54 6f 55 74 66 38 28 4c 50 43 57  icodeToUtf8(LPCW
7bc0: 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  STR zWideFilenam
7bd0: 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  e){.  int nByte;
7be0: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
7bf0: 6d 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f  me;..  nByte = o
7c00: 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  sWideCharToMulti
7c10: 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c  Byte(CP_UTF8, 0,
7c20: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20   zWideFilename, 
7c30: 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  -1, 0, 0, 0, 0);
7c40: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20  .  if( nByte == 
7c50: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
7c60: 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61  0;.  }.  zFilena
7c70: 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  me = sqlite3_mal
7c80: 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  loc( nByte );.  
7c90: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  if( zFilename==0
7ca0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
7cb0: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
7cc0: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
7cd0: 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30  iByte(CP_UTF8, 0
7ce0: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
7cf0: 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20   -1, zFilename, 
7d00: 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20  nByte,.         
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d20: 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20         0, 0);.  
7d30: 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29  if( nByte == 0 )
7d40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
7d50: 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ee(zFilename);. 
7d60: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30     zFilename = 0
7d70: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
7d80: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
7d90: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 41 4e  ** Convert an AN
7da0: 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63  SI string to Mic
7db0: 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c 20  rosoft Unicode, 
7dc0: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
7dd0: 63 75 72 72 65 6e 74 20 63 6f 64 65 70 61 67 65  current codepage
7de0: 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20 66 69   settings for fi
7df0: 6c 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a 20  le apis..** .** 
7e00: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
7e10: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
7e20: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  g is obtained.**
7e30: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
7e40: 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lloc..*/.static 
7e50: 4c 50 57 53 54 52 20 6d 62 63 73 54 6f 55 6e 69  LPWSTR mbcsToUni
7e60: 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20  code(const char 
7e70: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69  *zFilename){.  i
7e80: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 4c 50 57 53  nt nByte;.  LPWS
7e90: 54 52 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  TR zMbcsFilename
7ea0: 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65  ;.  int codepage
7eb0: 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73   = osAreFileApis
7ec0: 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20  ANSI() ? CP_ACP 
7ed0: 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e  : CP_OEMCP;..  n
7ee0: 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79  Byte = osMultiBy
7ef0: 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64  teToWideChar(cod
7f00: 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e  epage, 0, zFilen
7f10: 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 0a 20  ame, -1, NULL,. 
7f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7f40: 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29 3b  )*sizeof(WCHAR);
7f50: 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20  .  if( nByte==0 
7f60: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
7f70: 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 46 69 6c 65  .  }.  zMbcsFile
7f80: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  name = sqlite3_m
7f90: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a  alloc( nByte*siz
7fa0: 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  eof(zMbcsFilenam
7fb0: 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a  e[0]) );.  if( z
7fc0: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  MbcsFilename==0 
7fd0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
7fe0: 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f  .  }.  nByte = o
7ff0: 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  sMultiByteToWide
8000: 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30  Char(codepage, 0
8010: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
8020: 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c 0a   zMbcsFilename,.
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8050: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e 42  nByte);.  if( nB
8060: 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  yte==0 ){.    sq
8070: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 62 63 73  lite3_free(zMbcs
8080: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Filename);.    z
8090: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 30  MbcsFilename = 0
80a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
80b0: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  MbcsFilename;.}.
80c0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d  ./*.** Convert M
80d0: 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65  icrosoft Unicode
80e0: 20 74 6f 20 6d 75 6c 74 69 2d 62 79 74 65 20 63   to multi-byte c
80f0: 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 2c  haracter string,
8100: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a   based on the.**
8110: 20 75 73 65 72 27 73 20 41 4e 53 49 20 63 6f 64   user's ANSI cod
8120: 65 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  epage..**.** Spa
8130: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
8140: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
8150: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  s obtained from.
8160: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
8170: 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  c()..*/.static c
8180: 68 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 4d 62  har *unicodeToMb
8190: 63 73 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65  cs(LPCWSTR zWide
81a0: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74  Filename){.  int
81b0: 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a   nByte;.  char *
81c0: 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74  zFilename;.  int
81d0: 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73 41 72   codepage = osAr
81e0: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20  eFileApisANSI() 
81f0: 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45  ? CP_ACP : CP_OE
8200: 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20  MCP;..  nByte = 
8210: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
8220: 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20  iByte(codepage, 
8230: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
8240: 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  , -1, 0, 0, 0, 0
8250: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d  );.  if( nByte =
8260: 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  = 0 ){.    retur
8270: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  n 0;.  }.  zFile
8280: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  name = sqlite3_m
8290: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a  alloc( nByte );.
82a0: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
82b0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
82c0: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
82d0: 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  = osWideCharToMu
82e0: 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65  ltiByte(codepage
82f0: 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61  , 0, zWideFilena
8300: 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d  me, -1, zFilenam
8310: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
8320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8330: 20 20 20 6e 42 79 74 65 2c 20 30 2c 20 30 29 3b     nByte, 0, 0);
8340: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20  .  if( nByte == 
8350: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
8360: 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29  _free(zFilename)
8370: 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20  ;.    zFilename 
8380: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
8390: 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  n zFilename;.}..
83a0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 75  /*.** Convert mu
83b0: 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74 65  ltibyte characte
83c0: 72 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46 2d  r string to UTF-
83d0: 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  8.  Space to hol
83e0: 64 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 65  d the.** returne
83f0: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
8400: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
8410: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63  3_malloc()..*/.c
8420: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e  har *sqlite3_win
8430: 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
8440: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
8450: 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  ename){.  char *
8460: 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 20  zFilenameUtf8;. 
8470: 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65   LPWSTR zTmpWide
8480: 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20  ;..  zTmpWide = 
8490: 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a 46  mbcsToUnicode(zF
84a0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
84b0: 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20  zTmpWide==0 ){. 
84c0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
84d0: 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38  .  zFilenameUtf8
84e0: 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38   = unicodeToUtf8
84f0: 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71  (zTmpWide);.  sq
8500: 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57  lite3_free(zTmpW
8510: 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  ide);.  return z
8520: 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 7d 0a  FilenameUtf8;.}.
8530: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 55  ./*.** Convert U
8540: 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69 62 79 74  TF-8 to multibyt
8550: 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69  e character stri
8560: 6e 67 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  ng.  Space to ho
8570: 6c 64 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72  ld the .** retur
8580: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
8590: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
85a0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  te3_malloc()..*/
85b0: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77  .char *sqlite3_w
85c0: 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63  in32_utf8_to_mbc
85d0: 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  s(const char *zF
85e0: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72  ilename){.  char
85f0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b   *zFilenameMbcs;
8600: 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69  .  LPWSTR zTmpWi
8610: 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20  de;..  zTmpWide 
8620: 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28  = utf8ToUnicode(
8630: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
8640: 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b  ( zTmpWide==0 ){
8650: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
8660: 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 4d 62   }.  zFilenameMb
8670: 63 73 20 3d 20 75 6e 69 63 6f 64 65 54 6f 4d 62  cs = unicodeToMb
8680: 63 73 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  cs(zTmpWide);.  
8690: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
86a0: 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e  pWide);.  return
86b0: 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a   zFilenameMbcs;.
86c0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65  }.../*.** The re
86d0: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 67 65  turn value of ge
86e0: 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a 2a 2a  tLastErrorMsg.**
86f0: 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20   is zero if the 
8700: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69  error message fi
8710: 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  ts in the buffer
8720: 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a  , or non-zero.**
8730: 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74   otherwise (if t
8740: 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74  he message was t
8750: 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a 73 74  runcated)..*/.st
8760: 61 74 69 63 20 69 6e 74 20 67 65 74 4c 61 73 74  atic int getLast
8770: 45 72 72 6f 72 4d 73 67 28 44 57 4f 52 44 20 6c  ErrorMsg(DWORD l
8780: 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20 6e 42  astErrno, int nB
8790: 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
87a0: 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73 73  .  /* FormatMess
87b0: 61 67 65 20 72 65 74 75 72 6e 73 20 30 20 6f 6e  age returns 0 on
87c0: 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68 65 72   failure.  Other
87d0: 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72 65 74  wise it.  ** ret
87e0: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
87f0: 6f 66 20 54 43 48 41 52 73 20 77 72 69 74 74 65  of TCHARs writte
8800: 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  n to the output.
8810: 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65 78 63    ** buffer, exc
8820: 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72 6d 69  luding the termi
8830: 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61 72  nating null char
8840: 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64  ..  */.  DWORD d
8850: 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72  wLen = 0;.  char
8860: 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 69   *zOut = 0;..  i
8870: 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
8880: 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 57 69 64   LPWSTR zTempWid
8890: 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77  e = NULL;.    dw
88a0: 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65  Len = osFormatMe
88b0: 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45  ssageW(FORMAT_ME
88c0: 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42  SSAGE_ALLOCATE_B
88d0: 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20  UFFER |.        
88e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88f0: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
8900: 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20  AGE_FROM_SYSTEM 
8910: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
8930: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47  ORMAT_MESSAGE_IG
8940: 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20  NORE_INSERTS,.  
8950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8960: 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c             NULL,
8970: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61                la
8990: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89b0: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
89c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89d0: 20 20 20 20 20 20 28 4c 50 57 53 54 52 29 20 26        (LPWSTR) &
89e0: 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20  zTempWide,.     
89f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a00: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
8a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a20: 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20          0);.    
8a30: 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b  if( dwLen > 0 ){
8a40: 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  .      /* alloca
8a50: 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20  te a buffer and 
8a60: 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20  convert to UTF8 
8a70: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
8a80: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
8a90: 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20  c();.      zOut 
8aa0: 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  = unicodeToUtf8(
8ab0: 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20 20  zTempWide);.    
8ac0: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
8ad0: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
8ae0: 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79    /* free the sy
8af0: 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f  stem buffer allo
8b00: 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d  cated by FormatM
8b10: 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  essage */.      
8b20: 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d  osLocalFree(zTem
8b30: 70 57 69 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pWide);.    }.  
8b40: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
8b50: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
8b60: 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20   else{.    char 
8b70: 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20  *zTemp = NULL;. 
8b80: 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72     dwLen = osFor
8b90: 6d 61 74 4d 65 73 73 61 67 65 41 28 46 4f 52 4d  matMessageA(FORM
8ba0: 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43  AT_MESSAGE_ALLOC
8bb0: 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20  ATE_BUFFER |.   
8bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bd0: 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54            FORMAT
8be0: 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59  _MESSAGE_FROM_SY
8bf0: 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20  STEM |.         
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c10: 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41      FORMAT_MESSA
8c20: 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54  GE_IGNORE_INSERT
8c30: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c50: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
8c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c70: 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20     lastErrno,.  
8c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c90: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
8ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cb0: 20 20 20 20 20 20 20 20 20 20 20 28 4c 50 53 54             (LPST
8cc0: 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20 20  R) &zTemp,.     
8cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ce0: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
8cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d00: 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20          0);.    
8d10: 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b  if( dwLen > 0 ){
8d20: 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  .      /* alloca
8d30: 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20  te a buffer and 
8d40: 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20  convert to UTF8 
8d50: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
8d60: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
8d70: 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20  c();.      zOut 
8d80: 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
8d90: 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65  mbcs_to_utf8(zTe
8da0: 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  mp);.      sqlit
8db0: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
8dc0: 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72  c();.      /* fr
8dd0: 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75  ee the system bu
8de0: 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62  ffer allocated b
8df0: 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20  y FormatMessage 
8e00: 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c  */.      osLocal
8e10: 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20  Free(zTemp);.   
8e20: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
8e30: 69 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e 20 29  if( 0 == dwLen )
8e40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
8e50: 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75  printf(nBuf, zBu
8e60: 66 2c 20 22 4f 73 45 72 72 6f 72 20 30 78 25 78  f, "OsError 0x%x
8e70: 20 28 25 75 29 22 2c 20 6c 61 73 74 45 72 72 6e   (%u)", lastErrn
8e80: 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 20  o, lastErrno);. 
8e90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 63   }else{.    /* c
8ea0: 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66  opy a maximum of
8eb0: 20 6e 42 75 66 20 63 68 61 72 73 20 74 6f 20 6f   nBuf chars to o
8ec0: 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
8ed0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
8ee0: 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c  intf(nBuf, zBuf,
8ef0: 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20   "%s", zOut);.  
8f00: 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 55 54    /* free the UT
8f10: 46 38 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20  F8 buffer */.   
8f20: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
8f30: 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ut);.  }.  retur
8f40: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a  n 0;.}../*.**.**
8f50: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d   This function -
8f60: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69   winLogErrorAtLi
8f70: 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c 79 20 65  ne() - is only e
8f80: 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74  ver called via t
8f90: 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e 4c  he macro.** winL
8fa0: 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a  ogError()..**.**
8fb0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
8fc0: 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61   invoked after a
8fd0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
8fe0: 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e  n an OS function
8ff0: 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20 61 20 6d  ..** It logs a m
9000: 65 73 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c  essage using sql
9010: 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61  ite3_log() conta
9020: 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  ining the curren
9030: 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72  t value of.** er
9040: 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c 20 69 66  ror code and, if
9050: 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68   possible, the h
9060: 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71  uman-readable eq
9070: 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 0a 2a  uivalent from .*
9080: 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 2e  * FormatMessage.
9090: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
90a0: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
90b0: 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68   to the macro sh
90c0: 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f  ould be the erro
90d0: 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77  r code that.** w
90e0: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
90f0: 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20  to SQLite (e.g. 
9100: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
9110: 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ETE, SQLITE_CANT
9120: 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74  OPEN). .** The t
9130: 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72  wo subsequent ar
9140: 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62  guments should b
9150: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
9160: 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  e OS function th
9170: 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61 6e 64  at.** failed and
9180: 20 74 68 65 20 74 68 65 20 61 73 73 6f 63 69 61   the the associa
9190: 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ted file-system 
91a0: 70 61 74 68 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f  path, if any..*/
91b0: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45  .#define winLogE
91c0: 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20 20 20  rror(a,b,c,d)   
91d0: 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  winLogErrorAtLin
91e0: 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45  e(a,b,c,d,__LINE
91f0: 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 77  __).static int w
9200: 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  inLogErrorAtLine
9210: 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c  (.  int errcode,
9220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9230: 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72      /* SQLite er
9240: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 44 57  ror code */.  DW
9250: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 20  ORD lastErrno,  
9260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9270: 20 57 69 6e 33 32 20 6c 61 73 74 20 65 72 72 6f   Win32 last erro
9280: 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
9290: 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20  r *zFunc,       
92a0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
92b0: 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  f OS function th
92c0: 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63  at failed */.  c
92d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
92e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
92f0: 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f  * File path asso
9300: 63 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f  ciated with erro
9310: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65  r */.  int iLine
9320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9330: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
9340: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65   line number whe
9350: 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  re error occurre
9360: 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a  d */.){.  char z
9370: 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20 20 20 20  Msg[500];       
9380: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 75 6d            /* Hum
9390: 61 6e 20 72 65 61 64 61 62 6c 65 20 65 72 72 6f  an readable erro
93a0: 72 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  r text */.  int 
93b0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
93c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
93d0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
93e0: 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20    zMsg[0] = 0;. 
93f0: 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67   getLastErrorMsg
9400: 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73 69 7a 65  (lastErrno, size
9410: 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 29 3b  of(zMsg), zMsg);
9420: 0a 20 20 61 73 73 65 72 74 28 20 65 72 72 63 6f  .  assert( errco
9430: 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de!=SQLITE_OK );
9440: 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20  .  if( zPath==0 
9450: 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20  ) zPath = "";.  
9460: 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67 5b 69 5d  for(i=0; zMsg[i]
9470: 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72   && zMsg[i]!='\r
9480: 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c  ' && zMsg[i]!='\
9490: 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7a 4d 73  n'; i++){}.  zMs
94a0: 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  g[i] = 0;.  sqli
94b0: 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c  te3_log(errcode,
94c0: 0a 20 20 20 20 20 20 22 6f 73 5f 77 69 6e 2e 63  .      "os_win.c
94d0: 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25 73 29  :%d: (%d) %s(%s)
94e0: 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c   - %s",.      iL
94f0: 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20  ine, lastErrno, 
9500: 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 4d  zFunc, zPath, zM
9510: 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72  sg.  );..  retur
9520: 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a  n errcode;.}../*
9530: 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  .** The number o
9540: 66 20 74 69 6d 65 73 20 74 68 61 74 20 61 20 52  f times that a R
9550: 65 61 64 46 69 6c 65 28 29 2c 20 57 72 69 74 65  eadFile(), Write
9560: 46 69 6c 65 28 29 2c 20 61 6e 64 20 44 65 6c 65  File(), and Dele
9570: 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77 69 6c 6c  teFile().** will
9580: 20 62 65 20 72 65 74 72 69 65 64 20 66 6f 6c 6c   be retried foll
9590: 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69 6e 67 20  owing a locking 
95a0: 65 72 72 6f 72 20 2d 20 70 72 6f 62 61 62 6c 79  error - probably
95b0: 20 63 61 75 73 65 64 20 62 79 20 0a 2a 2a 20 61   caused by .** a
95c0: 6e 74 69 76 69 72 75 73 20 73 6f 66 74 77 61 72  ntivirus softwar
95d0: 65 2e 20 20 41 6c 73 6f 20 74 68 65 20 69 6e 69  e.  Also the ini
95e0: 74 69 61 6c 20 64 65 6c 61 79 20 62 65 66 6f 72  tial delay befor
95f0: 65 20 74 68 65 20 66 69 72 73 74 20 72 65 74 72  e the first retr
9600: 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c 61 79 20  y..** The delay 
9610: 69 6e 63 72 65 61 73 65 73 20 6c 69 6e 65 61 72  increases linear
9620: 6c 79 20 77 69 74 68 20 65 61 63 68 20 72 65 74  ly with each ret
9630: 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ry..*/.#ifndef S
9640: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
9650: 52 5f 52 45 54 52 59 0a 23 20 64 65 66 69 6e 65  R_RETRY.# define
9660: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
9670: 45 52 52 5f 52 45 54 52 59 20 31 30 0a 23 65 6e  ERR_RETRY 10.#en
9680: 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
9690: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
96a0: 45 54 52 59 5f 44 45 4c 41 59 0a 23 20 64 65 66  ETRY_DELAY.# def
96b0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
96c0: 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c  _IOERR_RETRY_DEL
96d0: 41 59 20 32 35 0a 23 65 6e 64 69 66 0a 73 74 61  AY 25.#endif.sta
96e0: 74 69 63 20 69 6e 74 20 77 69 6e 33 32 49 6f 65  tic int win32Ioe
96f0: 72 72 52 65 74 72 79 20 3d 20 53 51 4c 49 54 45  rrRetry = SQLITE
9700: 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54  _WIN32_IOERR_RET
9710: 52 59 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  RY;.static int w
9720: 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44 65  in32IoerrRetryDe
9730: 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e  lay = SQLITE_WIN
9740: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44  32_IOERR_RETRY_D
9750: 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ELAY;../*.** If 
9760: 61 20 52 65 61 64 46 69 6c 65 28 29 20 6f 72 20  a ReadFile() or 
9770: 57 72 69 74 65 46 69 6c 65 28 29 20 65 72 72 6f  WriteFile() erro
9780: 72 20 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65  r occurs, invoke
9790: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
97a0: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 73 68   to see if it sh
97b0: 6f 75 6c 64 20 62 65 20 72 65 74 72 69 65 64 2e  ould be retried.
97c0: 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 74 6f    Return TRUE to
97d0: 20 72 65 74 72 79 2e 20 20 52 65 74 75 72 6e 20   retry.  Return 
97e0: 46 41 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65  FALSE.** to give
97f0: 20 75 70 20 77 69 74 68 20 61 6e 20 65 72 72 6f   up with an erro
9800: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
9810: 20 72 65 74 72 79 49 6f 65 72 72 28 69 6e 74 20   retryIoerr(int 
9820: 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f 52 44 20  *pnRetry, DWORD 
9830: 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44 57 4f 52  *pError){.  DWOR
9840: 44 20 65 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  D e = osGetLastE
9850: 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 2a 70  rror();.  if( *p
9860: 6e 52 65 74 72 79 3e 3d 77 69 6e 33 32 49 6f 65  nRetry>=win32Ioe
9870: 72 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20 69  rrRetry ){.    i
9880: 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20  f( pError ){.   
9890: 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a     *pError = e;.
98a0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
98b0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 3d   0;.  }.  if( e=
98c0: 3d 45 52 52 4f 52 5f 41 43 43 45 53 53 5f 44 45  =ERROR_ACCESS_DE
98d0: 4e 49 45 44 20 7c 7c 0a 20 20 20 20 20 20 65 3d  NIED ||.      e=
98e0: 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c  =ERROR_LOCK_VIOL
98f0: 41 54 49 4f 4e 20 7c 7c 0a 20 20 20 20 20 20 65  ATION ||.      e
9900: 3d 3d 45 52 52 4f 52 5f 53 48 41 52 49 4e 47 5f  ==ERROR_SHARING_
9910: 56 49 4f 4c 41 54 49 4f 4e 20 29 7b 0a 20 20 20  VIOLATION ){.   
9920: 20 70 6f 72 74 61 62 6c 65 53 6c 65 65 70 28 77   portableSleep(w
9930: 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44 65  in32IoerrRetryDe
9940: 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29  lay*(1+*pnRetry)
9950: 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72  );.    ++*pnRetr
9960: 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  y;.    return 1;
9970: 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 72 72 6f  .  }.  if( pErro
9980: 72 20 29 7b 0a 20 20 20 20 2a 70 45 72 72 6f 72  r ){.    *pError
9990: 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = e;.  }.  retu
99a0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn 0;.}../*.** L
99b0: 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72 20 72  og a I/O error r
99c0: 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a 2a 2f  etry episode..*/
99d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 67  .static void log
99e0: 49 6f 65 72 72 28 69 6e 74 20 6e 52 65 74 72 79  Ioerr(int nRetry
99f0: 29 7b 0a 20 20 69 66 28 20 6e 52 65 74 72 79 20  ){.  if( nRetry 
9a00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
9a10: 6f 67 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  og(SQLITE_IOERR,
9a20: 20 0a 20 20 20 20 20 20 22 64 65 6c 61 79 65 64   .      "delayed
9a30: 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b 2f 73   %dms for lock/s
9a40: 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63 74 22  haring conflict"
9a50: 2c 0a 20 20 20 20 20 20 77 69 6e 33 32 49 6f 65  ,.      win32Ioe
9a60: 72 72 52 65 74 72 79 44 65 6c 61 79 2a 6e 52 65  rrRetryDelay*nRe
9a70: 74 72 79 2a 28 6e 52 65 74 72 79 2b 31 29 2f 32  try*(nRetry+1)/2
9a80: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  .    );.  }.}../
9a90: 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65  *.** Lock a file
9aa0: 20 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74   region..*/.stat
9ab0: 69 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46  ic BOOL winLockF
9ac0: 69 6c 65 28 0a 20 20 48 41 4e 44 4c 45 20 68 46  ile(.  HANDLE hF
9ad0: 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 66 6c 61  ile,.  DWORD fla
9ae0: 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73  gs,.  DWORD offs
9af0: 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f  etLow,.  DWORD o
9b00: 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f  ffsetHigh,.  DWO
9b10: 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a  RD numBytesLow,.
9b20: 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73    DWORD numBytes
9b30: 48 69 67 68 0a 29 7b 0a 20 20 69 66 28 20 69 73  High.){.  if( is
9b40: 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52  NT() ){.    OVER
9b50: 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20  LAPPED ovlp;.   
9b60: 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30   memset(&ovlp, 0
9b70: 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50  , sizeof(OVERLAP
9b80: 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e  PED));.    ovlp.
9b90: 4f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 4c  Offset = offsetL
9ba0: 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66  ow;.    ovlp.Off
9bb0: 73 65 74 48 69 67 68 20 3d 20 6f 66 66 73 65 74  setHigh = offset
9bc0: 48 69 67 68 3b 0a 20 20 20 20 72 65 74 75 72 6e  High;.    return
9bd0: 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 28 68 46   osLockFileEx(hF
9be0: 69 6c 65 2c 20 66 6c 61 67 73 2c 20 30 2c 20 6e  ile, flags, 0, n
9bf0: 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42  umBytesLow, numB
9c00: 79 74 65 73 48 69 67 68 2c 20 26 6f 76 6c 70 29  ytesHigh, &ovlp)
9c10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
9c20: 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65  eturn osLockFile
9c30: 28 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f  (hFile, offsetLo
9c40: 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e  w, offsetHigh, n
9c50: 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42  umBytesLow, numB
9c60: 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 7d  ytesHigh);.  }.}
9c70: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61  ../*.** Unlock a
9c80: 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 20 2a   file region.. *
9c90: 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  /.static BOOL wi
9ca0: 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 48  nUnlockFile(.  H
9cb0: 41 4e 44 4c 45 20 68 46 69 6c 65 2c 0a 20 20 44  ANDLE hFile,.  D
9cc0: 57 4f 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a  WORD offsetLow,.
9cd0: 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74 48 69    DWORD offsetHi
9ce0: 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42  gh,.  DWORD numB
9cf0: 79 74 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  ytesLow,.  DWORD
9d00: 20 6e 75 6d 42 79 74 65 73 48 69 67 68 0a 29 7b   numBytesHigh.){
9d10: 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
9d20: 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20  .    OVERLAPPED 
9d30: 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ovlp;.    memset
9d40: 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f  (&ovlp, 0, sizeo
9d50: 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a  f(OVERLAPPED));.
9d60: 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20      ovlp.Offset 
9d70: 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20  = offsetLow;.   
9d80: 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68   ovlp.OffsetHigh
9d90: 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20   = offsetHigh;. 
9da0: 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f     return osUnlo
9db0: 63 6b 46 69 6c 65 45 78 28 68 46 69 6c 65 2c 20  ckFileEx(hFile, 
9dc0: 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20  0, numBytesLow, 
9dd0: 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20 26 6f  numBytesHigh, &o
9de0: 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  vlp);.  }else{. 
9df0: 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f     return osUnlo
9e00: 63 6b 46 69 6c 65 28 68 46 69 6c 65 2c 20 6f 66  ckFile(hFile, of
9e10: 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48  fsetLow, offsetH
9e20: 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77  igh, numBytesLow
9e30: 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b  , numBytesHigh);
9e40: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  .  }.}..#if SQLI
9e50: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 2f 2a 2a 2a  TE_OS_WINCE./***
9e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9e90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9ea0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  ******.** This s
9eb0: 65 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  ection contains 
9ec0: 63 6f 64 65 20 66 6f 72 20 57 69 6e 43 45 20 6f  code for WinCE o
9ed0: 6e 6c 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 57 69  nly..*/./*.** Wi
9ee0: 6e 64 6f 77 73 20 43 45 20 64 6f 65 73 20 6e 6f  ndows CE does no
9ef0: 74 20 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69  t have a localti
9f00: 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  me() function.  
9f10: 53 6f 20 63 72 65 61 74 65 20 61 0a 2a 2a 20 73  So create a.** s
9f20: 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69  ubstitute..*/.#i
9f30: 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a  nclude <time.h>.
9f40: 73 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65  struct tm *__cde
9f50: 63 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e  cl localtime(con
9f60: 73 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a  st time_t *t).{.
9f70: 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
9f80: 74 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45  tm y;.  FILETIME
9f90: 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53   uTm, lTm;.  SYS
9fa0: 54 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73  TEMTIME pTm;.  s
9fb0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34  qlite3_int64 t64
9fc0: 3b 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20  ;.  t64 = *t;.  
9fd0: 74 36 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36  t64 = (t64 + 116
9fe0: 34 34 34 37 33 36 30 30 29 2a 31 30 30 30 30 30  44473600)*100000
9ff0: 30 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44  00;.  uTm.dwLowD
a000: 61 74 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44  ateTime = (DWORD
a010: 29 28 74 36 34 20 26 20 30 78 46 46 46 46 46 46  )(t64 & 0xFFFFFF
a020: 46 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67  FF);.  uTm.dwHig
a030: 68 44 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52  hDateTime= (DWOR
a040: 44 29 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20  D)(t64 >> 32);. 
a050: 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63   osFileTimeToLoc
a060: 61 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c  alFileTime(&uTm,
a070: 26 6c 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54  &lTm);.  osFileT
a080: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28  imeToSystemTime(
a090: 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e  &lTm,&pTm);.  y.
a0a0: 74 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59  tm_year = pTm.wY
a0b0: 65 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e  ear - 1900;.  y.
a0c0: 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f  tm_mon = pTm.wMo
a0d0: 6e 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f  nth - 1;.  y.tm_
a0e0: 77 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f  wday = pTm.wDayO
a0f0: 66 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64  fWeek;.  y.tm_md
a100: 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20  ay = pTm.wDay;. 
a110: 20 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d   y.tm_hour = pTm
a120: 2e 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d  .wHour;.  y.tm_m
a130: 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65  in = pTm.wMinute
a140: 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70  ;.  y.tm_sec = p
a150: 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65  Tm.wSecond;.  re
a160: 74 75 72 6e 20 26 79 3b 0a 7d 0a 0a 23 64 65 66  turn &y;.}..#def
a170: 69 6e 65 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49  ine HANDLE_TO_WI
a180: 4e 46 49 4c 45 28 61 29 20 28 77 69 6e 46 69 6c  NFILE(a) (winFil
a190: 65 2a 29 26 28 28 63 68 61 72 2a 29 61 29 5b 2d  e*)&((char*)a)[-
a1a0: 28 69 6e 74 29 6f 66 66 73 65 74 6f 66 28 77 69  (int)offsetof(wi
a1b0: 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a  nFile,h)]../*.**
a1c0: 20 41 63 71 75 69 72 65 20 61 20 6c 6f 63 6b 20   Acquire a lock 
a1d0: 6f 6e 20 74 68 65 20 68 61 6e 64 6c 65 20 68 0a  on the handle h.
a1e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
a1f0: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
a200: 28 48 41 4e 44 4c 45 20 68 29 7b 0a 20 20 20 44  (HANDLE h){.   D
a210: 57 4f 52 44 20 64 77 45 72 72 3b 0a 20 20 20 64  WORD dwErr;.   d
a220: 6f 20 7b 0a 20 20 20 20 20 64 77 45 72 72 20 3d  o {.     dwErr =
a230: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
a240: 4f 62 6a 65 63 74 28 68 2c 20 49 4e 46 49 4e 49  Object(h, INFINI
a250: 54 45 29 3b 0a 20 20 20 7d 20 77 68 69 6c 65 20  TE);.   } while 
a260: 28 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 4f  (dwErr != WAIT_O
a270: 42 4a 45 43 54 5f 30 20 26 26 20 64 77 45 72 72  BJECT_0 && dwErr
a280: 20 21 3d 20 57 41 49 54 5f 41 42 41 4e 44 4f 4e   != WAIT_ABANDON
a290: 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c  ED);.}./*.** Rel
a2a0: 65 61 73 65 20 61 20 6c 6f 63 6b 20 61 63 71 75  ease a lock acqu
a2b0: 69 72 65 64 20 62 79 20 77 69 6e 63 65 4d 75 74  ired by winceMut
a2c0: 65 78 41 63 71 75 69 72 65 28 29 0a 2a 2f 0a 23  exAcquire().*/.#
a2d0: 64 65 66 69 6e 65 20 77 69 6e 63 65 4d 75 74 65  define winceMute
a2e0: 78 52 65 6c 65 61 73 65 28 68 29 20 52 65 6c 65  xRelease(h) Rele
a2f0: 61 73 65 4d 75 74 65 78 28 68 29 0a 0a 2f 2a 0a  aseMutex(h)../*.
a300: 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 6d 75  ** Create the mu
a310: 74 65 78 20 61 6e 64 20 73 68 61 72 65 64 20 6d  tex and shared m
a320: 65 6d 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c  emory used for l
a330: 6f 63 6b 69 6e 67 20 69 6e 20 74 68 65 20 66 69  ocking in the fi
a340: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
a350: 20 70 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63   pFile.*/.static
a360: 20 42 4f 4f 4c 20 77 69 6e 63 65 43 72 65 61 74   BOOL winceCreat
a370: 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61 72  eLock(const char
a380: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 77 69 6e   *zFilename, win
a390: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
a3a0: 4c 50 57 53 54 52 20 7a 54 6f 6b 3b 0a 20 20 4c  LPWSTR zTok;.  L
a3b0: 50 57 53 54 52 20 7a 4e 61 6d 65 3b 0a 20 20 42  PWSTR zName;.  B
a3c0: 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45  OOL bInit = TRUE
a3d0: 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 75 74 66  ;..  zName = utf
a3e0: 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  8ToUnicode(zFile
a3f0: 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  name);.  if( zNa
a400: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  me==0 ){.    /* 
a410: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f  out of memory */
a420: 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41 4c 53  .    return FALS
a430: 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  E;.  }..  /* Ini
a440: 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61  tialize the loca
a450: 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20  l lockdata */.  
a460: 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e 6c  memset(&pFile->l
a470: 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ocal, 0, sizeof(
a480: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a  pFile->local));.
a490: 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68  .  /* Replace th
a4a0: 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72  e backslashes fr
a4b0: 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  om the filename 
a4c0: 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74  and lowercase it
a4d0: 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20  .  ** to derive 
a4e0: 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f  a mutex name. */
a4f0: 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61 72  .  zTok = osChar
a500: 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20  LowerW(zName);. 
a510: 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f   for (;*zTok;zTo
a520: 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a  k++){.    if (*z
a530: 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54  Tok == '\\') *zT
a540: 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20  ok = '_';.  }.. 
a550: 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20   /* Create/open 
a560: 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20  the named mutex 
a570: 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74  */.  pFile->hMut
a580: 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d 75 74  ex = osCreateMut
a590: 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c  exW(NULL, FALSE,
a5a0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 21   zName);.  if (!
a5b0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a  pFile->hMutex){.
a5c0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
a5d0: 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
a5e0: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e  Error();.    win
a5f0: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
a600: 45 52 52 4f 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  ERROR, pFile->la
a610: 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 63 65 43  stErrno, "winceC
a620: 72 65 61 74 65 4c 6f 63 6b 31 22 2c 20 7a 46 69  reateLock1", zFi
a630: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  lename);.    sql
a640: 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29  ite3_free(zName)
a650: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41 4c  ;.    return FAL
a660: 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63  SE;.  }..  /* Ac
a670: 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20  quire the mutex 
a680: 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e  before continuin
a690: 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75 74 65  g */.  winceMute
a6a0: 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
a6b0: 68 4d 75 74 65 78 29 3b 0a 20 20 0a 20 20 2f 2a  hMutex);.  .  /*
a6c0: 20 53 69 6e 63 65 20 74 68 65 20 6e 61 6d 65 73   Since the names
a6d0: 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65 78 65   of named mutexe
a6e0: 73 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c 20 66  s, semaphores, f
a6f0: 69 6c 65 20 6d 61 70 70 69 6e 67 73 20 65 74 63  ile mappings etc
a700: 20 61 72 65 20 0a 20 20 2a 2a 20 63 61 73 65 2d   are .  ** case-
a710: 73 65 6e 73 69 74 69 76 65 2c 20 74 61 6b 65 20  sensitive, take 
a720: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 61  advantage of tha
a730: 74 20 62 79 20 75 70 70 65 72 63 61 73 69 6e 67  t by uppercasing
a740: 20 74 68 65 20 6d 75 74 65 78 20 6e 61 6d 65 0a   the mutex name.
a750: 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e 67 20 74    ** and using t
a760: 68 61 74 20 61 73 20 74 68 65 20 73 68 61 72 65  hat as the share
a770: 64 20 66 69 6c 65 6d 61 70 70 69 6e 67 20 6e 61  d filemapping na
a780: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 6f 73 43 68 61  me..  */.  osCha
a790: 72 55 70 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a  rUpperW(zName);.
a7a0: 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64    pFile->hShared
a7b0: 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
a7c0: 61 70 70 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f  appingW(INVALID_
a7d0: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55  HANDLE_VALUE, NU
a7e0: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a800: 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
a810: 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20 73  _READWRITE, 0, s
a820: 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29  izeof(winceLock)
a830: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a850: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 29            zName)
a860: 3b 20 20 0a 0a 20 20 2f 2a 20 53 65 74 20 61 20  ;  ..  /* Set a 
a870: 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63 61  flag that indica
a880: 74 65 73 20 77 65 27 72 65 20 74 68 65 20 66 69  tes we're the fi
a890: 72 73 74 20 74 6f 20 63 72 65 61 74 65 20 74 68  rst to create th
a8a0: 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74 20 0a  e memory so it .
a8b0: 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a 65 72    ** must be zer
a8c0: 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  o-initialized */
a8d0: 0a 20 20 69 66 20 28 6f 73 47 65 74 4c 61 73 74  .  if (osGetLast
a8e0: 45 72 72 6f 72 28 29 20 3d 3d 20 45 52 52 4f 52  Error() == ERROR
a8f0: 5f 41 4c 52 45 41 44 59 5f 45 58 49 53 54 53 29  _ALREADY_EXISTS)
a900: 7b 0a 20 20 20 20 62 49 6e 69 74 20 3d 20 46 41  {.    bInit = FA
a910: 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  LSE;.  }..  sqli
a920: 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b  te3_free(zName);
a930: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 73 75 63  ..  /* If we suc
a940: 63 65 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67  ceeded in making
a950: 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
a960: 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69  ry handle, map i
a970: 74 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c  t. */.  if (pFil
a980: 65 2d 3e 68 53 68 61 72 65 64 29 7b 0a 20 20 20  e->hShared){.   
a990: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d   pFile->shared =
a9a0: 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d   (winceLock*)osM
a9b0: 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  apViewOfFile(pFi
a9c0: 6c 65 2d 3e 68 53 68 61 72 65 64 2c 20 0a 20 20  le->hShared, .  
a9d0: 20 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f             FILE_
a9e0: 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41  MAP_READ|FILE_MA
a9f0: 50 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 73  P_WRITE, 0, 0, s
aa00: 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29  izeof(winceLock)
aa10: 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 70  );.    /* If map
aa20: 70 69 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f  ping failed, clo
aa30: 73 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  se the shared me
aa40: 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 20  mory handle and 
aa50: 65 72 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 20  erase it */.    
aa60: 69 66 20 28 21 70 46 69 6c 65 2d 3e 73 68 61 72  if (!pFile->shar
aa70: 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ed){.      pFile
aa80: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
aa90: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
aaa0: 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f        winLogErro
aab0: 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  r(SQLITE_ERROR, 
aac0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
aad0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
aae0: 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63   "winceCreateLoc
aaf0: 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  k2", zFilename);
ab00: 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  .      osCloseHa
ab10: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61  ndle(pFile->hSha
ab20: 72 65 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  red);.      pFil
ab30: 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e 55 4c  e->hShared = NUL
ab40: 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  L;.    }.  }..  
ab50: 2f 2a 20 49 66 20 73 68 61 72 65 64 20 6d 65 6d  /* If shared mem
ab60: 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ory could not be
ab70: 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63   created, then c
ab80: 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20 61  lose the mutex a
ab90: 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20 69 66 20  nd fail */.  if 
aba0: 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20  (pFile->hShared 
abb0: 3d 3d 20 4e 55 4c 4c 29 7b 0a 20 20 20 20 77 69  == NULL){.    wi
abc0: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
abd0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
abe0: 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
abf0: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
ac00: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75  ;.    pFile->hMu
ac10: 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  tex = NULL;.    
ac20: 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20  return FALSE;.  
ac30: 7d 0a 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69 61  }.  .  /* Initia
ac40: 6c 69 7a 65 20 74 68 65 20 73 68 61 72 65 64 20  lize the shared 
ac50: 6d 65 6d 6f 72 79 20 69 66 20 77 65 27 72 65 20  memory if we're 
ac60: 73 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a 20  supposed to */. 
ac70: 20 69 66 20 28 62 49 6e 69 74 29 20 7b 0a 20 20   if (bInit) {.  
ac80: 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2d 3e    memset(pFile->
ac90: 73 68 61 72 65 64 2c 20 30 2c 20 73 69 7a 65 6f  shared, 0, sizeo
aca0: 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20  f(winceLock));. 
acb0: 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78   }..  winceMutex
acc0: 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
acd0: 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  Mutex);.  return
ace0: 20 54 52 55 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   TRUE;.}../*.** 
acf0: 44 65 73 74 72 6f 79 20 74 68 65 20 70 61 72 74  Destroy the part
ad00: 20 6f 66 20 77 69 6e 46 69 6c 65 20 74 68 61 74   of winFile that
ad10: 20 64 65 61 6c 73 20 77 69 74 68 20 77 69 6e 63   deals with winc
ad20: 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74 69  e locks.*/.stati
ad30: 63 20 76 6f 69 64 20 77 69 6e 63 65 44 65 73 74  c void winceDest
ad40: 72 6f 79 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20  royLock(winFile 
ad50: 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66 20 28 70  *pFile){.  if (p
ad60: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20  File->hMutex){. 
ad70: 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68     /* Acquire th
ad80: 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77  e mutex */.    w
ad90: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
ada0: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
adb0: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c  ..    /* The fol
adc0: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20 73 68  lowing blocks sh
add0: 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 61 73  ould probably as
ade0: 73 65 72 74 20 69 6e 20 64 65 62 75 67 20 6d 6f  sert in debug mo
adf0: 64 65 2c 20 62 75 74 20 74 68 65 79 0a 20 20 20  de, but they.   
ae00: 20 20 20 20 61 72 65 20 74 6f 20 63 6c 65 61 6e      are to clean
ae10: 75 70 20 69 6e 20 63 61 73 65 20 61 6e 79 20 6c  up in case any l
ae20: 6f 63 6b 73 20 72 65 6d 61 69 6e 65 64 20 6f 70  ocks remained op
ae30: 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46  en */.    if (pF
ae40: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
ae50: 65 72 73 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ers){.      pFil
ae60: 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64  e->shared->nRead
ae70: 65 72 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  ers --;.    }.  
ae80: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
ae90: 61 6c 2e 62 52 65 73 65 72 76 65 64 29 7b 0a 20  al.bReserved){. 
aea0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
aeb0: 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20  ed->bReserved = 
aec0: 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20  FALSE;.    }.   
aed0: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
aee0: 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20  l.bPending){.   
aef0: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
af00: 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c  ->bPending = FAL
af10: 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  SE;.    }.    if
af20: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
af30: 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20  Exclusive){.    
af40: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
af50: 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41  >bExclusive = FA
af60: 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  LSE;.    }..    
af70: 2f 2a 20 44 65 2d 72 65 66 65 72 65 6e 63 65 20  /* De-reference 
af80: 61 6e 64 20 63 6c 6f 73 65 20 6f 75 72 20 63 6f  and close our co
af90: 70 79 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  py of the shared
afa0: 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 2a   memory handle *
afb0: 2f 0a 20 20 20 20 6f 73 55 6e 6d 61 70 56 69 65  /.    osUnmapVie
afc0: 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73  wOfFile(pFile->s
afd0: 68 61 72 65 64 29 3b 0a 20 20 20 20 6f 73 43 6c  hared);.    osCl
afe0: 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
aff0: 3e 68 53 68 61 72 65 64 29 3b 0a 0a 20 20 20 20  >hShared);..    
b000: 2f 2a 20 44 6f 6e 65 20 77 69 74 68 20 74 68 65  /* Done with the
b010: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69   mutex */.    wi
b020: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
b030: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 20  pFile->hMutex); 
b040: 20 20 20 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48     .    osCloseH
b050: 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75  andle(pFile->hMu
b060: 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  tex);.    pFile-
b070: 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a  >hMutex = NULL;.
b080: 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e    }.}../* .** An
b090: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
b0a0: 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 28  of the LockFile(
b0b0: 29 20 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73  ) API of Windows
b0c0: 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69   for CE.*/.stati
b0d0: 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b  c BOOL winceLock
b0e0: 46 69 6c 65 28 0a 20 20 48 41 4e 44 4c 45 20 2a  File(.  HANDLE *
b0f0: 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20  phFile,.  DWORD 
b100: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c  dwFileOffsetLow,
b110: 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f  .  DWORD dwFileO
b120: 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f  ffsetHigh,.  DWO
b130: 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
b140: 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57  sToLockLow,.  DW
b150: 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
b160: 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a  esToLockHigh.){.
b170: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
b180: 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e   = HANDLE_TO_WIN
b190: 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20  FILE(phFile);.  
b1a0: 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46  BOOL bReturn = F
b1b0: 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  ALSE;..  UNUSED_
b1c0: 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65  PARAMETER(dwFile
b1d0: 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55  OffsetHigh);.  U
b1e0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
b1f0: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
b200: 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66  LockHigh);..  if
b210: 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78   (!pFile->hMutex
b220: 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20  ) return TRUE;. 
b230: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
b240: 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  re(pFile->hMutex
b250: 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74 69 6e 67  );..  /* Wanting
b260: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
b270: 63 6b 3f 20 2a 2f 0a 20 20 69 66 20 28 64 77 46  ck? */.  if (dwF
b280: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
b290: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49  (DWORD)SHARED_FI
b2a0: 52 53 54 0a 20 20 20 20 20 20 20 26 26 20 6e 4e  RST.       && nN
b2b0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
b2c0: 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  ckLow == (DWORD)
b2d0: 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20 20  SHARED_SIZE){.  
b2e0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61    if (pFile->sha
b2f0: 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 3d 3d  red->nReaders ==
b300: 20 30 20 26 26 20 70 46 69 6c 65 2d 3e 73 68 61   0 && pFile->sha
b310: 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
b320: 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 20 70 46  == 0){.       pF
b330: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78  ile->shared->bEx
b340: 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a  clusive = TRUE;.
b350: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f         pFile->lo
b360: 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d  cal.bExclusive =
b370: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 62 52   TRUE;.       bR
b380: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
b390: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
b3a0: 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 6c  nt a read-only l
b3b0: 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69  ock? */.  else i
b3c0: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
b3d0: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
b3e0: 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20 20 20  RED_FIRST &&.   
b3f0: 20 20 20 20 20 20 20 20 6e 4e 75 6d 62 65 72 4f          nNumberO
b400: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
b410: 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
b420: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45  File->shared->bE
b430: 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a  xclusive == 0){.
b440: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
b450: 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a  al.nReaders ++;.
b460: 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d        if (pFile-
b470: 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
b480: 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20 20 20 70  == 1){.        p
b490: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52  File->shared->nR
b4a0: 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20  eaders ++;.     
b4b0: 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e   }.      bReturn
b4c0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
b4d0: 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20   }..  /* Want a 
b4e0: 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20 2a 2f  pending lock? */
b4f0: 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69  .  else if (dwFi
b500: 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28  leOffsetLow == (
b510: 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 59  DWORD)PENDING_BY
b520: 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42  TE && nNumberOfB
b530: 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d  ytesToLockLow ==
b540: 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e   1){.    /* If n
b550: 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68  o pending lock h
b560: 61 73 20 62 65 65 6e 20 61 63 71 75 69 72 65 64  as been acquired
b570: 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 69  , then acquire i
b580: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69  t */.    if (pFi
b590: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e  le->shared->bPen
b5a0: 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20 20  ding == 0) {.   
b5b0: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
b5c0: 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55  ->bPending = TRU
b5d0: 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
b5e0: 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d  local.bPending =
b5f0: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65   TRUE;.      bRe
b600: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
b610: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e   }.  }..  /* Wan
b620: 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  t a reserved loc
b630: 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  k? */.  else if 
b640: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
b650: 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52   == (DWORD)RESER
b660: 56 45 44 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d  VED_BYTE && nNum
b670: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
b680: 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
b690: 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
b6a0: 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 3d 20 30  ->bReserved == 0
b6b0: 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
b6c0: 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
b6d0: 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ed = TRUE;.     
b6e0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52   pFile->local.bR
b6f0: 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a  eserved = TRUE;.
b700: 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
b710: 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
b720: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c  .  winceMutexRel
b730: 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
b740: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52  ex);.  return bR
b750: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
b760: 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  An implementatio
b770: 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63 6b 46  n of the UnlockF
b780: 69 6c 65 20 41 50 49 20 6f 66 20 57 69 6e 64 6f  ile API of Windo
b790: 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61  ws for CE.*/.sta
b7a0: 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 55 6e  tic BOOL winceUn
b7b0: 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 48 41 4e 44  lockFile(.  HAND
b7c0: 4c 45 20 2a 70 68 46 69 6c 65 2c 0a 20 20 44 57  LE *phFile,.  DW
b7d0: 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
b7e0: 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  Low,.  DWORD dwF
b7f0: 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20  ileOffsetHigh,. 
b800: 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
b810: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
b820: 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
b830: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
b840: 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  High.){.  winFil
b850: 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c  e *pFile = HANDL
b860: 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46  E_TO_WINFILE(phF
b870: 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65  ile);.  BOOL bRe
b880: 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20  turn = FALSE;.. 
b890: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
b8a0: 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69  R(dwFileOffsetHi
b8b0: 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  gh);.  UNUSED_PA
b8c0: 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f  RAMETER(nNumberO
b8d0: 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69  fBytesToUnlockHi
b8e0: 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46 69  gh);..  if (!pFi
b8f0: 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75  le->hMutex) retu
b900: 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65  rn TRUE;.  wince
b910: 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69  MutexAcquire(pFi
b920: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20  le->hMutex);..  
b930: 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72  /* Releasing a r
b940: 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20 61 6e  eader lock or an
b950: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
b960: 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f  */.  if (dwFileO
b970: 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
b980: 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 29  RD)SHARED_FIRST)
b990: 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20  {.    /* Did we 
b9a0: 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76  have an exclusiv
b9b0: 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 69  e lock? */.    i
b9c0: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
b9d0: 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20  bExclusive){.   
b9e0: 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65     assert(nNumbe
b9f0: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
ba00: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
ba10: 41 52 45 44 5f 53 49 5a 45 29 3b 0a 20 20 20 20  ARED_SIZE);.    
ba20: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
ba30: 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53  Exclusive = FALS
ba40: 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
ba50: 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
ba60: 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ve = FALSE;.    
ba70: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
ba80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
ba90: 44 69 64 20 77 65 20 6a 75 73 74 20 68 61 76 65  Did we just have
baa0: 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 3f 20   a reader lock? 
bab0: 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28  */.    else if (
bac0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
bad0: 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 61 73  aders){.      as
bae0: 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79  sert(nNumberOfBy
baf0: 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d  tesToUnlockLow =
bb00: 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
bb10: 53 49 5a 45 20 7c 7c 20 6e 4e 75 6d 62 65 72 4f  SIZE || nNumberO
bb20: 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f  fBytesToUnlockLo
bb30: 77 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20 20 70  w == 1);.      p
bb40: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
bb50: 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 69  ders --;.      i
bb60: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
bb70: 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 29 0a 20  nReaders == 0). 
bb80: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70       {.        p
bb90: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52  File->shared->nR
bba0: 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20  eaders --;.     
bbb0: 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e   }.      bReturn
bbc0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
bbd0: 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69   }..  /* Releasi
bbe0: 6e 67 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63  ng a pending loc
bbf0: 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  k */.  else if (
bc00: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
bc10: 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e  == (DWORD)PENDIN
bc20: 47 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65  G_BYTE && nNumbe
bc30: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
bc40: 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
bc50: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
bc60: 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20  bPending){.     
bc70: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50   pFile->local.bP
bc80: 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a  ending = FALSE;.
bc90: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
bca0: 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20  red->bPending = 
bcb0: 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65  FALSE;.      bRe
bcc0: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
bcd0: 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 6c 65   }.  }.  /* Rele
bce0: 61 73 69 6e 67 20 61 20 72 65 73 65 72 76 65 64  asing a reserved
bcf0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20   lock */.  else 
bd00: 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
bd10: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45  Low == (DWORD)RE
bd20: 53 45 52 56 45 44 5f 42 59 54 45 20 26 26 20 6e  SERVED_BYTE && n
bd30: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
bd40: 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  nlockLow == 1){.
bd50: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
bd60: 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20  ocal.bReserved) 
bd70: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
bd80: 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d  ocal.bReserved =
bd90: 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46   FALSE;.      pF
bda0: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65  ile->shared->bRe
bdb0: 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a  served = FALSE;.
bdc0: 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
bdd0: 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
bde0: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c  .  winceMutexRel
bdf0: 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
be00: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52  ex);.  return bR
be10: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
be20: 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  An implementatio
be30: 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c  n of the LockFil
be40: 65 45 78 28 29 20 41 50 49 20 6f 66 20 57 69 6e  eEx() API of Win
be50: 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73  dows for CE.*/.s
be60: 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65  tatic BOOL wince
be70: 4c 6f 63 6b 46 69 6c 65 45 78 28 0a 20 20 48 41  LockFileEx(.  HA
be80: 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a 20 20  NDLE *phFile,.  
be90: 44 57 4f 52 44 20 64 77 46 6c 61 67 73 2c 0a 20  DWORD dwFlags,. 
bea0: 20 44 57 4f 52 44 20 64 77 52 65 73 65 72 76 65   DWORD dwReserve
beb0: 64 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62  d,.  DWORD nNumb
bec0: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
bed0: 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d  ow,.  DWORD nNum
bee0: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
bef0: 48 69 67 68 2c 0a 20 20 4c 50 4f 56 45 52 4c 41  High,.  LPOVERLA
bf00: 50 50 45 44 20 6c 70 4f 76 65 72 6c 61 70 70 65  PPED lpOverlappe
bf10: 64 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d.){.  UNUSED_PA
bf20: 52 41 4d 45 54 45 52 28 64 77 52 65 73 65 72 76  RAMETER(dwReserv
bf30: 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ed);.  UNUSED_PA
bf40: 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f  RAMETER(nNumberO
bf50: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68  fBytesToLockHigh
bf60: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
bf70: 63 61 6c 6c 65 72 20 77 61 6e 74 73 20 61 20 73  caller wants a s
bf80: 68 61 72 65 64 20 72 65 61 64 20 6c 6f 63 6b 2c  hared read lock,
bf90: 20 66 6f 72 77 61 72 64 20 74 68 69 73 20 63 61   forward this ca
bfa0: 6c 6c 0a 20 20 2a 2a 20 74 6f 20 77 69 6e 63 65  ll.  ** to wince
bfb0: 4c 6f 63 6b 46 69 6c 65 20 2a 2f 0a 20 20 69 66  LockFile */.  if
bfc0: 20 28 6c 70 4f 76 65 72 6c 61 70 70 65 64 2d 3e   (lpOverlapped->
bfd0: 4f 66 66 73 65 74 20 3d 3d 20 28 44 57 4f 52 44  Offset == (DWORD
bfe0: 29 53 48 41 52 45 44 5f 46 49 52 53 54 20 26 26  )SHARED_FIRST &&
bff0: 0a 20 20 20 20 20 20 64 77 46 6c 61 67 73 20 3d  .      dwFlags =
c000: 3d 20 31 20 26 26 0a 20 20 20 20 20 20 6e 4e 75  = 1 &&.      nNu
c010: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
c020: 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53  kLow == (DWORD)S
c030: 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20 20 20  HARED_SIZE){.   
c040: 20 72 65 74 75 72 6e 20 77 69 6e 63 65 4c 6f 63   return winceLoc
c050: 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 53 48  kFile(phFile, SH
c060: 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 31  ARED_FIRST, 0, 1
c070: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
c080: 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 2f 2a 0a 2a  rn FALSE;.}./*.*
c090: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 70 65  * End of the spe
c0a0: 63 69 61 6c 20 63 6f 64 65 20 66 6f 72 20 77 69  cial code for wi
c0b0: 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  nce.************
c0c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c0d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c0e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c0f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c100: 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  */.#endif /* SQL
c110: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a  ITE_OS_WINCE */.
c120: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
c130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
c170: 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75  ** The next grou
c180: 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 69 6d  p of routines im
c190: 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f 4f 20  plement the I/O 
c1a0: 6d 65 74 68 6f 64 73 20 73 70 65 63 69 66 69 65  methods specifie
c1b0: 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 71 6c 69  d.** by the sqli
c1c0: 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
c1d0: 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  bject..*********
c1e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c1f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c220: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f  *****/../*.** So
c230: 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d  me Microsoft com
c240: 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73  pilers lack this
c250: 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a   definition..*/.
c260: 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f  #ifndef INVALID_
c270: 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
c280: 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49  .# define INVALI
c290: 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
c2a0: 45 52 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23  ER ((DWORD)-1).#
c2b0: 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
c2c0: 45 5f 4f 53 5f 57 49 4e 52 54 3d 3d 30 0a 2f 2a  E_OS_WINRT==0./*
c2d0: 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
c2e0: 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66  rent position of
c2f0: 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65   the file handle
c300: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
c310: 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  irst .** argumen
c320: 74 20 74 6f 20 6f 66 66 73 65 74 20 69 4f 66 66  t to offset iOff
c330: 73 65 74 20 77 69 74 68 69 6e 20 74 68 65 20 66  set within the f
c340: 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66  ile. If successf
c350: 75 6c 2c 20 72 65 74 75 72 6e 20 30 2e 20 0a 2a  ul, return 0. .*
c360: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74  * Otherwise, set
c370: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
c380: 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e  o and return non
c390: 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  -zero..*/.static
c3a0: 20 69 6e 74 20 73 65 65 6b 57 69 6e 46 69 6c 65   int seekWinFile
c3b0: 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c  (winFile *pFile,
c3c0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
c3d0: 4f 66 66 73 65 74 29 7b 0a 20 20 4c 4f 4e 47 20  Offset){.  LONG 
c3e0: 75 70 70 65 72 42 69 74 73 3b 20 20 20 20 20 20  upperBits;      
c3f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f             /* Mo
c400: 73 74 20 73 69 67 2e 20 33 32 20 62 69 74 73 20  st sig. 32 bits 
c410: 6f 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f  of new offset */
c420: 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74  .  LONG lowerBit
c430: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
c440: 20 20 20 2f 2a 20 4c 65 61 73 74 20 73 69 67 2e     /* Least sig.
c450: 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20   32 bits of new 
c460: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 44 57 4f 52  offset */.  DWOR
c470: 44 20 64 77 52 65 74 3b 20 20 20 20 20 20 20 20  D dwRet;        
c480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
c490: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
c4a0: 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28   SetFilePointer(
c4b0: 29 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73  ) */.  DWORD las
c4c0: 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20  tErrno;         
c4d0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
c4e0: 72 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c  returned by GetL
c4f0: 61 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20  astError() */.. 
c500: 20 75 70 70 65 72 42 69 74 73 20 3d 20 28 4c 4f   upperBits = (LO
c510: 4e 47 29 28 28 69 4f 66 66 73 65 74 3e 3e 33 32  NG)((iOffset>>32
c520: 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) & 0x7fffffff);
c530: 0a 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 28  .  lowerBits = (
c540: 4c 4f 4e 47 29 28 69 4f 66 66 73 65 74 20 26 20  LONG)(iOffset & 
c550: 30 78 66 66 66 66 66 66 66 66 29 3b 0a 0a 20 20  0xffffffff);..  
c560: 2f 2a 20 41 50 49 20 6f 64 64 69 74 79 3a 20 49  /* API oddity: I
c570: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 65  f successful, Se
c580: 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 72  tFilePointer() r
c590: 65 74 75 72 6e 73 20 61 20 64 77 6f 72 64 20 0a  eturns a dword .
c5a0: 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20    ** containing 
c5b0: 74 68 65 20 6c 6f 77 65 72 20 33 32 2d 62 69 74  the lower 32-bit
c5c0: 73 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c  s of the new fil
c5d0: 65 2d 6f 66 66 73 65 74 2e 20 4f 72 2c 20 69 66  e-offset. Or, if
c5e0: 20 69 74 20 66 61 69 6c 73 2c 0a 20 20 2a 2a 20   it fails,.  ** 
c5f0: 69 74 20 72 65 74 75 72 6e 73 20 49 4e 56 41 4c  it returns INVAL
c600: 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e  ID_SET_FILE_POIN
c610: 54 45 52 2e 20 48 6f 77 65 76 65 72 20 61 63 63  TER. However acc
c620: 6f 72 64 69 6e 67 20 74 6f 20 4d 53 44 4e 2c 20  ording to MSDN, 
c630: 0a 20 20 2a 2a 20 49 4e 56 41 4c 49 44 5f 53 45  .  ** INVALID_SE
c640: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 6d  T_FILE_POINTER m
c650: 61 79 20 61 6c 73 6f 20 62 65 20 61 20 76 61 6c  ay also be a val
c660: 69 64 20 6e 65 77 20 6f 66 66 73 65 74 2e 20 53  id new offset. S
c670: 6f 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a  o to determine .
c680: 20 20 2a 2a 20 77 68 65 74 68 65 72 20 61 6e 20    ** whether an 
c690: 65 72 72 6f 72 20 68 61 73 20 61 63 74 75 61 6c  error has actual
c6a0: 6c 79 20 6f 63 63 75 72 65 64 2c 20 69 74 20 69  ly occured, it i
c6b0: 73 20 61 6c 73 6f 20 6e 65 63 65 73 73 61 72 79  s also necessary
c6c0: 20 74 6f 20 63 61 6c 6c 20 0a 20 20 2a 2a 20 47   to call .  ** G
c6d0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2e 0a 20  etLastError().. 
c6e0: 20 2a 2f 0a 20 20 64 77 52 65 74 20 3d 20 6f 73   */.  dwRet = os
c6f0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 70  SetFilePointer(p
c700: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69  File->h, lowerBi
c710: 74 73 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20  ts, &upperBits, 
c720: 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20  FILE_BEGIN);..  
c730: 69 66 28 20 28 64 77 52 65 74 3d 3d 49 4e 56 41  if( (dwRet==INVA
c740: 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
c750: 4e 54 45 52 0a 20 20 20 20 20 20 26 26 20 28 28  NTER.      && ((
c760: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
c770: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e  tLastError())!=N
c780: 4f 5f 45 52 52 4f 52 29 29 20 29 7b 0a 20 20 20  O_ERROR)) ){.   
c790: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
c7a0: 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
c7b0: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
c7c0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b  QLITE_IOERR_SEEK
c7d0: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
c7e0: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
c7f0: 20 22 73 65 65 6b 57 69 6e 46 69 6c 65 22 2c 20   "seekWinFile", 
c800: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
c810: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
c820: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
c830: 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49  #else /* if SQLI
c840: 54 45 5f 4f 53 5f 57 49 4e 52 54 3d 3d 31 20 2a  TE_OS_WINRT==1 *
c850: 2f 0a 2f 2a 20 0a 2a 2a 20 53 61 6d 65 20 66 75  /./* .** Same fu
c860: 6e 63 74 69 6f 6e 20 61 73 20 61 62 6f 76 65 2c  nction as above,
c870: 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 69   except that thi
c880: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
c890: 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 77 69   works for.** wi
c8a0: 6e 64 6f 77 73 52 54 2e 0a 2a 2f 0a 73 74 61 74  ndowsRT..*/.stat
c8b0: 69 63 20 69 6e 74 20 73 65 65 6b 57 69 6e 46 69  ic int seekWinFi
c8c0: 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  le(winFile *pFil
c8d0: 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  e, sqlite3_int64
c8e0: 20 69 4f 66 66 73 65 74 29 7b 0a 20 20 4c 41 52   iOffset){.  LAR
c8f0: 47 45 5f 49 4e 54 45 47 45 52 20 78 3b 20 20 20  GE_INTEGER x;   
c900: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c910: 54 68 65 20 6e 65 77 20 6f 66 66 73 65 74 20 2a  The new offset *
c920: 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 74 3b 20 20  /.  BOOL bRet;  
c930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c940: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
c950: 75 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65  urned by SetFile
c960: 50 6f 69 6e 74 65 72 45 78 28 29 20 2a 2f 0a 0a  PointerEx() */..
c970: 20 20 78 2e 51 75 61 64 50 61 72 74 20 3d 20 69    x.QuadPart = i
c980: 4f 66 66 73 65 74 3b 0a 20 20 62 52 65 74 20 3d  Offset;.  bRet =
c990: 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65   osSetFilePointe
c9a0: 72 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 78 2c  rEx(pFile->h, x,
c9b0: 20 30 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b   0, FILE_BEGIN);
c9c0: 0a 0a 20 20 69 66 28 21 62 52 65 74 29 7b 0a 20  ..  if(!bRet){. 
c9d0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
c9e0: 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
c9f0: 72 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c  rror();.    winL
ca00: 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
ca10: 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65  OERR_SEEK, pFile
ca20: 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
ca30: 20 20 20 20 20 20 20 20 20 20 22 73 65 65 6b 57            "seekW
ca40: 69 6e 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e  inFile", pFile->
ca50: 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75  zPath);.    retu
ca60: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  rn 1;.  }..  ret
ca70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
ca80: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
ca90: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  ile..**.** It is
caa0: 20 72 65 70 6f 72 74 65 64 20 74 68 61 74 20 61   reported that a
cab0: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f  n attempt to clo
cac0: 73 65 20 61 20 68 61 6e 64 6c 65 20 6d 69 67 68  se a handle migh
cad0: 74 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 66  t sometimes.** f
cae0: 61 69 6c 2e 20 20 54 68 69 73 20 69 73 20 61 20  ail.  This is a 
caf0: 76 65 72 79 20 75 6e 72 65 61 73 6f 6e 61 62 6c  very unreasonabl
cb00: 65 20 72 65 73 75 6c 74 2c 20 62 75 74 20 57 69  e result, but Wi
cb10: 6e 64 6f 77 73 20 69 73 20 6e 6f 74 6f 72 69 6f  ndows is notorio
cb20: 75 73 0a 2a 2a 20 66 6f 72 20 62 65 69 6e 67 20  us.** for being 
cb30: 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 73 6f 20  unreasonable so 
cb40: 49 20 64 6f 20 6e 6f 74 20 64 6f 75 62 74 20 74  I do not doubt t
cb50: 68 61 74 20 69 74 20 6d 69 67 68 74 20 68 61 70  hat it might hap
cb60: 70 65 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20  pen.  If.** the 
cb70: 63 6c 6f 73 65 20 66 61 69 6c 73 2c 20 77 65 20  close fails, we 
cb80: 70 61 75 73 65 20 66 6f 72 20 31 30 30 20 6d 69  pause for 100 mi
cb90: 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74  lliseconds and t
cba0: 72 79 20 61 67 61 69 6e 2e 20 20 41 73 0a 2a 2a  ry again.  As.**
cbb0: 20 6d 61 6e 79 20 61 73 20 4d 58 5f 43 4c 4f 53   many as MX_CLOS
cbc0: 45 5f 41 54 54 45 4d 50 54 20 61 74 74 65 6d 70  E_ATTEMPT attemp
cbd0: 74 73 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20  ts to close the 
cbe0: 68 61 6e 64 6c 65 20 61 72 65 20 6d 61 64 65 20  handle are made 
cbf0: 62 65 66 6f 72 65 0a 2a 2a 20 67 69 76 69 6e 67  before.** giving
cc00: 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e   up and returnin
cc10: 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23  g an error..*/.#
cc20: 64 65 66 69 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f  define MX_CLOSE_
cc30: 41 54 54 45 4d 50 54 20 33 0a 73 74 61 74 69 63  ATTEMPT 3.static
cc40: 20 69 6e 74 20 77 69 6e 43 6c 6f 73 65 28 73 71   int winClose(sq
cc50: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
cc60: 0a 20 20 69 6e 74 20 72 63 2c 20 63 6e 74 20 3d  .  int rc, cnt =
cc70: 20 30 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70   0;.  winFile *p
cc80: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
cc90: 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )id;..  assert( 
cca0: 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  id!=0 );.  asser
ccb0: 74 28 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d  t( pFile->pShm==
ccc0: 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  0 );.  OSTRACE((
ccd0: 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 70 46  "CLOSE %d\n", pF
cce0: 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 64 6f 7b 0a  ile->h));.  do{.
ccf0: 20 20 20 20 72 63 20 3d 20 6f 73 43 6c 6f 73 65      rc = osClose
cd00: 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29  Handle(pFile->h)
cd10: 3b 0a 20 20 20 20 2f 2a 20 53 69 6d 75 6c 61 74  ;.    /* Simulat
cd20: 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 30 3b 20  eIOError( rc=0; 
cd30: 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54 54  cnt=MX_CLOSE_ATT
cd40: 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d 77  EMPT; ); */.  }w
cd50: 68 69 6c 65 28 20 72 63 3d 3d 30 20 26 26 20 2b  hile( rc==0 && +
cd60: 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f  +cnt < MX_CLOSE_
cd70: 41 54 54 45 4d 50 54 20 26 26 20 28 70 6f 72 74  ATTEMPT && (port
cd80: 61 62 6c 65 53 6c 65 65 70 28 31 30 30 29 2c 20  ableSleep(100), 
cd90: 31 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  1) );.#if SQLITE
cda0: 5f 4f 53 5f 57 49 4e 43 45 0a 23 64 65 66 69 6e  _OS_WINCE.#defin
cdb0: 65 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e  e WINCE_DELETION
cdc0: 5f 41 54 54 45 4d 50 54 53 20 33 0a 20 20 77 69  _ATTEMPTS 3.  wi
cdd0: 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 70  nceDestroyLock(p
cde0: 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 46 69  File);.  if( pFi
cdf0: 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
ce00: 73 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e  se ){.    int cn
ce10: 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  t = 0;.    while
ce20: 28 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 44  (.           osD
ce30: 65 6c 65 74 65 46 69 6c 65 57 28 70 46 69 6c 65  eleteFileW(pFile
ce40: 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
ce50: 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20  )==0.        && 
ce60: 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
ce70: 74 65 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c  tesW(pFile->zDel
ce80: 65 74 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78 66  eteOnClose)!=0xf
ce90: 66 66 66 66 66 66 66 20 0a 20 20 20 20 20 20 20  fffffff .       
cea0: 20 26 26 20 63 6e 74 2b 2b 20 3c 20 57 49 4e 43   && cnt++ < WINC
ceb0: 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d  E_DELETION_ATTEM
cec0: 50 54 53 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  PTS.    ){.     
ced0: 20 20 70 6f 72 74 61 62 6c 65 53 6c 65 65 70 28    portableSleep(
cee0: 31 30 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61  100);  /* Wait a
cef0: 20 6c 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74   little before t
cf00: 72 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20  rying again */. 
cf10: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
cf20: 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65  _free(pFile->zDe
cf30: 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20  leteOnClose);.  
cf40: 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41  }.#endif.  OSTRA
cf50: 43 45 28 28 22 43 4c 4f 53 45 20 25 64 20 25 73  CE(("CLOSE %d %s
cf60: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
cf70: 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  c ? "ok" : "fail
cf80: 65 64 22 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75  ed"));.  OpenCou
cf90: 6e 74 65 72 28 2d 31 29 3b 0a 20 20 72 65 74 75  nter(-1);.  retu
cfa0: 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f  rn rc ? SQLITE_O
cfb0: 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  K.            : 
cfc0: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
cfd0: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20  TE_IOERR_CLOSE, 
cfe0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
cff0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d000: 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
d010: 43 6c 6f 73 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  Close", pFile->z
d020: 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Path);.}../*.** 
d030: 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61  Read data from a
d040: 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66   file into a buf
d050: 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  fer.  Return SQL
d060: 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a  ITE_OK if all.**
d070: 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64   bytes were read
d080: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e   successfully an
d090: 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69  d SQLITE_IOERR i
d0a0: 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
d0b0: 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  ** wrong..*/.sta
d0c0: 74 69 63 20 69 6e 74 20 77 69 6e 52 65 61 64 28  tic int winRead(
d0d0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
d0e0: 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *id,          /*
d0f0: 20 46 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72   File to read fr
d100: 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  om */.  void *pB
d110: 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
d120: 20 20 20 2f 2a 20 57 72 69 74 65 20 63 6f 6e 74     /* Write cont
d130: 65 6e 74 20 69 6e 74 6f 20 74 68 69 73 20 62 75  ent into this bu
d140: 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 6d  ffer */.  int am
d150: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
d160: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d170: 66 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20  f bytes to read 
d180: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
d190: 36 34 20 6f 66 66 73 65 74 20 20 20 20 20 20 20  64 offset       
d1a0: 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
d1b0: 20 61 74 20 74 68 69 73 20 6f 66 66 73 65 74 20   at this offset 
d1c0: 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  */.){.  winFile 
d1d0: 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
d1e0: 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c 65 20  e*)id;  /* file 
d1f0: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57 4f 52  handle */.  DWOR
d200: 44 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20  D nRead;        
d210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
d220: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
d230: 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f  ctually read fro
d240: 6d 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  m file */.  int 
d250: 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20  nRetry = 0;     
d260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
d270: 75 6d 62 65 72 20 6f 66 20 72 65 74 72 79 73 20  umber of retrys 
d280: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  */..  assert( id
d290: 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  !=0 );.  Simulat
d2a0: 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
d2b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
d2c0: 44 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  D);.  OSTRACE(("
d2d0: 52 45 41 44 20 25 64 20 6c 6f 63 6b 3d 25 64 5c  READ %d lock=%d\
d2e0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46  n", pFile->h, pF
d2f0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b  ile->locktype));
d300: 0a 0a 20 20 69 66 28 20 73 65 65 6b 57 69 6e 46  ..  if( seekWinF
d310: 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ile(pFile, offse
d320: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  t) ){.    return
d330: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
d340: 7d 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52 65  }.  while( !osRe
d350: 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  adFile(pFile->h,
d360: 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65   pBuf, amt, &nRe
d370: 61 64 2c 20 30 29 20 29 7b 0a 20 20 20 20 44 57  ad, 0) ){.    DW
d380: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  ORD lastErrno;. 
d390: 20 20 20 69 66 28 20 72 65 74 72 79 49 6f 65 72     if( retryIoer
d3a0: 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74  r(&nRetry, &last
d3b0: 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75  Errno) ) continu
d3c0: 65 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  e;.    pFile->la
d3d0: 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
d3e0: 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rno;.    return 
d3f0: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
d400: 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c 20 70  TE_IOERR_READ, p
d410: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
d420: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77  .             "w
d430: 69 6e 52 65 61 64 22 2c 20 70 46 69 6c 65 2d 3e  inRead", pFile->
d440: 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 6c 6f  zPath);.  }.  lo
d450: 67 49 6f 65 72 72 28 6e 52 65 74 72 79 29 3b 0a  gIoerr(nRetry);.
d460: 20 20 69 66 28 20 6e 52 65 61 64 3c 28 44 57 4f    if( nRead<(DWO
d470: 52 44 29 61 6d 74 20 29 7b 0a 20 20 20 20 2f 2a  RD)amt ){.    /*
d480: 20 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66   Unread parts of
d490: 20 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74   the buffer must
d4a0: 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20   be zero-filled 
d4b0: 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28  */.    memset(&(
d4c0: 28 63 68 61 72 2a 29 70 42 75 66 29 5b 6e 52 65  (char*)pBuf)[nRe
d4d0: 61 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52 65 61  ad], 0, amt-nRea
d4e0: 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  d);.    return S
d4f0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
d500: 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 72  T_READ;.  }..  r
d510: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d520: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
d530: 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
d540: 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20  er into a file. 
d550: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
d560: 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20  K on success.** 
d570: 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
d580: 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c  ror code on fail
d590: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
d5a0: 6e 74 20 77 69 6e 57 72 69 74 65 28 0a 20 20 73  nt winWrite(.  s
d5b0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
d5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d5d0: 2a 20 46 69 6c 65 20 74 6f 20 77 72 69 74 65 20  * File to write 
d5e0: 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  into */.  const 
d5f0: 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
d600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
d610: 20 62 79 74 65 73 20 74 6f 20 62 65 20 77 72 69   bytes to be wri
d620: 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 6d  tten */.  int am
d630: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
d640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d650: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
d660: 77 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74  write */.  sqlit
d670: 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20  e3_int64 offset 
d680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
d690: 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69  fset into the fi
d6a0: 6c 65 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74  le to begin writ
d6b0: 69 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20 69  ing at */.){.  i
d6c0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
d6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d6e0: 2a 20 54 72 75 65 20 69 66 20 65 72 72 6f 72 20  * True if error 
d6f0: 68 61 73 20 6f 63 63 75 72 65 64 2c 20 65 6c 73  has occured, els
d700: 65 20 66 61 6c 73 65 20 2a 2f 0a 20 20 77 69 6e  e false */.  win
d710: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
d720: 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20  inFile*)id;  /* 
d730: 46 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  File handle */. 
d740: 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b   int nRetry = 0;
d750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d760: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
d770: 74 72 69 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65  tries */..  asse
d780: 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61  rt( amt>0 );.  a
d790: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
d7a0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
d7b0: 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
d7c0: 49 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a 20 20  IOERR_WRITE);.  
d7d0: 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
d7e0: 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
d7f0: 49 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53  ITE_FULL);..  OS
d800: 54 52 41 43 45 28 28 22 57 52 49 54 45 20 25 64  TRACE(("WRITE %d
d810: 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69   lock=%d\n", pFi
d820: 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
d830: 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 72 63 20  cktype));..  rc 
d840: 3d 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46  = seekWinFile(pF
d850: 69 6c 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ile, offset);.  
d860: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
d870: 20 75 38 20 2a 61 52 65 6d 20 3d 20 28 75 38 20   u8 *aRem = (u8 
d880: 2a 29 70 42 75 66 3b 20 20 20 20 20 20 20 20 2f  *)pBuf;        /
d890: 2a 20 44 61 74 61 20 79 65 74 20 74 6f 20 62 65  * Data yet to be
d8a0: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20   written */.    
d8b0: 69 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20  int nRem = amt; 
d8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d8d0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
d8e0: 20 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74   yet to be writt
d8f0: 65 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20  en */.    DWORD 
d900: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
d910: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
d920: 20 77 72 69 74 74 65 6e 20 62 79 20 65 61 63 68   written by each
d930: 20 57 72 69 74 65 46 69 6c 65 28 29 20 63 61 6c   WriteFile() cal
d940: 6c 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6c  l */.    DWORD l
d950: 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52  astErrno = NO_ER
d960: 52 4f 52 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20  ROR;   /* Value 
d970: 72 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c  returned by GetL
d980: 61 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20  astError() */.. 
d990: 20 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30     while( nRem>0
d9a0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6f   ){.      if( !o
d9b0: 73 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65  sWriteFile(pFile
d9c0: 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c  ->h, aRem, nRem,
d9d0: 20 26 6e 57 72 69 74 65 2c 20 30 29 20 29 7b 0a   &nWrite, 0) ){.
d9e0: 20 20 20 20 20 20 20 20 69 66 28 20 72 65 74 72          if( retr
d9f0: 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c 20  yIoerr(&nRetry, 
da00: 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63 6f  &lastErrno) ) co
da10: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
da20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
da30: 20 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 3c       if( nWrite<
da40: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
da50: 20 20 61 52 65 6d 20 2b 3d 20 6e 57 72 69 74 65    aRem += nWrite
da60: 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20  ;.      nRem -= 
da70: 6e 57 72 69 74 65 3b 0a 20 20 20 20 7d 0a 20 20  nWrite;.    }.  
da80: 20 20 69 66 28 20 6e 52 65 6d 3e 30 20 29 7b 0a    if( nRem>0 ){.
da90: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
daa0: 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
dab0: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  no;.      rc = 1
dac0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
dad0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28  f( rc ){.    if(
dae0: 20 20 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74     ( pFile->last
daf0: 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e  Errno==ERROR_HAN
db00: 44 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 0a  DLE_DISK_FULL ).
db10: 20 20 20 20 20 20 20 7c 7c 20 28 20 70 46 69 6c         || ( pFil
db20: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  e->lastErrno==ER
db30: 52 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 29  ROR_DISK_FULL ))
db40: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
db50: 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
db60: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  }.    return win
db70: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
db80: 49 4f 45 52 52 5f 57 52 49 54 45 2c 20 70 46 69  IOERR_WRITE, pFi
db90: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
dbb0: 57 72 69 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  Write", pFile->z
dbc0: 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Path);.  }else{.
dbd0: 20 20 20 20 6c 6f 67 49 6f 65 72 72 28 6e 52 65      logIoerr(nRe
dbe0: 74 72 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  try);.  }.  retu
dbf0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
dc00: 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
dc10: 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20  an open file to 
dc20: 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65  a specified size
dc30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
dc40: 69 6e 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74  inTruncate(sqlit
dc50: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c  e3_file *id, sql
dc60: 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65  ite3_int64 nByte
dc70: 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  ){.  winFile *pF
dc80: 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
dc90: 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e  id;  /* File han
dca0: 64 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dle object */.  
dcb0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
dcc0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
dcd0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
dce0: 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  or this function
dcf0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
dd00: 46 69 6c 65 20 29 3b 0a 0a 20 20 4f 53 54 52 41  File );..  OSTRA
dd10: 43 45 28 28 22 54 52 55 4e 43 41 54 45 20 25 64  CE(("TRUNCATE %d
dd20: 20 25 6c 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 2d   %lld\n", pFile-
dd30: 3e 68 2c 20 6e 42 79 74 65 29 29 3b 0a 20 20 53  >h, nByte));.  S
dd40: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
dd50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
dd60: 52 52 5f 54 52 55 4e 43 41 54 45 29 3b 0a 0a 20  RR_TRUNCATE);.. 
dd70: 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20   /* If the user 
dd80: 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61  has configured a
dd90: 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20   chunk-size for 
dda0: 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63  this file, trunc
ddb0: 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c  ate the.  ** fil
ddc0: 65 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e  e so that it con
ddd0: 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65  sists of an inte
dde0: 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  ger number of ch
ddf0: 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20  unks (i.e. the. 
de00: 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20   ** actual file 
de10: 73 69 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f  size after the o
de20: 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20  peration may be 
de30: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
de40: 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73  requested.  ** s
de50: 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ize)..  */.  if(
de60: 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e   pFile->szChunk>
de70: 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  0 ){.    nByte =
de80: 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65   ((nByte + pFile
de90: 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70  ->szChunk - 1)/p
dea0: 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a  File->szChunk) *
deb0: 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b   pFile->szChunk;
dec0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 45 6e  .  }..  /* SetEn
ded0: 64 4f 66 46 69 6c 65 28 29 20 72 65 74 75 72 6e  dOfFile() return
dee0: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20  s non-zero when 
def0: 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 7a  successful, or z
df00: 65 72 6f 20 77 68 65 6e 20 69 74 20 66 61 69 6c  ero when it fail
df10: 73 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 65 6b  s. */.  if( seek
df20: 57 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20 6e  WinFile(pFile, n
df30: 42 79 74 65 29 20 29 7b 0a 20 20 20 20 72 63 20  Byte) ){.    rc 
df40: 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
df50: 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
df60: 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ATE, pFile->last
df70: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
df80: 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65      "winTruncate
df90: 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  1", pFile->zPath
dfa0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 30  );.  }else if( 0
dfb0: 3d 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65  ==osSetEndOfFile
dfc0: 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20  (pFile->h) ){.  
dfd0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
dfe0: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
dff0: 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d 20  ror();.    rc = 
e000: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
e010: 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
e020: 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  E, pFile->lastEr
e030: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
e040: 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65 32 22    "winTruncate2"
e050: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
e060: 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
e070: 28 22 54 52 55 4e 43 41 54 45 20 25 64 20 25 6c  ("TRUNCATE %d %l
e080: 6c 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  ld %s\n", pFile-
e090: 3e 68 2c 20 6e 42 79 74 65 2c 20 72 63 20 3f 20  >h, nByte, rc ? 
e0a0: 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29  "failed" : "ok")
e0b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
e0c0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
e0d0: 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  _TEST./*.** Coun
e0e0: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
e0f0: 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f  fullsyncs and no
e100: 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69  rmal syncs.  Thi
e110: 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  s is used to tes
e120: 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20  t.** that syncs 
e130: 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72  and fullsyncs ar
e140: 65 20 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68  e occuring at th
e150: 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a  e right times..*
e160: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79  /.int sqlite3_sy
e170: 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e  nc_count = 0;.in
e180: 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79  t sqlite3_fullsy
e190: 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  nc_count = 0;.#e
e1a0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  ndif../*.** Make
e1b0: 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73   sure all writes
e1c0: 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72   to a particular
e1d0: 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74   file are commit
e1e0: 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a  ted to disk..*/.
e1f0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 79  static int winSy
e200: 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nc(sqlite3_file 
e210: 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  *id, int flags){
e220: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e230: 4e 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a  NO_SYNC.  /*.  *
e240: 2a 20 55 73 65 64 20 6f 6e 6c 79 20 77 68 65 6e  * Used only when
e250: 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
e260: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e 0a  is not defined..
e270: 20 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b     */.  BOOL rc;
e280: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
e290: 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
e2a0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
e2b0: 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c 0a 20 20  NO_SYNC) || \.  
e2c0: 20 20 28 64 65 66 69 6e 65 64 28 53 51 4c 49 54    (defined(SQLIT
e2d0: 45 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 6e  E_TEST) && defin
e2e0: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
e2f0: 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64  ).  /*.  ** Used
e300: 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f   when SQLITE_NO_
e310: 53 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69  SYNC is not defi
e320: 6e 65 64 20 61 6e 64 20 62 79 20 74 68 65 20 61  ned and by the a
e330: 73 73 65 72 74 28 29 20 61 6e 64 2f 6f 72 0a 20  ssert() and/or. 
e340: 20 2a 2a 20 4f 53 54 52 41 43 45 28 29 20 6d 61   ** OSTRACE() ma
e350: 63 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20 77 69  cros..   */.  wi
e360: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
e370: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 23 65 6c  winFile*)id;.#el
e380: 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
e390: 4d 45 54 45 52 28 69 64 29 3b 0a 23 65 6e 64 69  METER(id);.#endi
e3a0: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  f..  assert( pFi
e3b0: 6c 65 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b  le );.  /* Check
e3c0: 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c   that one of SQL
e3d0: 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
e3e0: 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73  or FULL was pass
e3f0: 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  ed */.  assert((
e400: 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
e410: 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a  ITE_SYNC_NORMAL.
e420: 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26        || (flags&
e430: 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
e440: 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20  NC_FULL.  );..  
e450: 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 25  OSTRACE(("SYNC %
e460: 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46  d lock=%d\n", pF
e470: 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
e480: 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a  ocktype));..  /*
e490: 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75   Unix cannot, bu
e4a0: 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d  t some systems m
e4b0: 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
e4c0: 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e  _FULL from here.
e4d0: 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20   This.  ** line 
e4e0: 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  is to test that 
e4f0: 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f  doing so does no
e500: 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62  t cause any prob
e510: 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  lems..  */.  Sim
e520: 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
e530: 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
e540: 45 5f 46 55 4c 4c 20 29 3b 0a 0a 23 69 66 6e 64  E_FULL );..#ifnd
e550: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
e560: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
e570: 52 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65 0a  R(flags);.#else.
e580: 20 20 69 66 28 20 28 66 6c 61 67 73 26 30 78 30    if( (flags&0x0
e590: 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
e5a0: 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69  FULL ){.    sqli
e5b0: 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
e5c0: 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  nt++;.  }.  sqli
e5d0: 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  te3_sync_count++
e5e0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
e5f0: 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69  f we compiled wi
e600: 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f  th the SQLITE_NO
e610: 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e  _SYNC flag, then
e620: 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20   syncing is a.  
e630: 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69  ** no-op.  */.#i
e640: 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
e650: 59 4e 43 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  YNC.  return SQL
e660: 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20  ITE_OK;.#else.  
e670: 72 63 20 3d 20 6f 73 46 6c 75 73 68 46 69 6c 65  rc = osFlushFile
e680: 42 75 66 66 65 72 73 28 70 46 69 6c 65 2d 3e 68  Buffers(pFile->h
e690: 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
e6a0: 72 72 6f 72 28 20 72 63 3d 46 41 4c 53 45 20 29  rror( rc=FALSE )
e6b0: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
e6c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e6d0: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
e6e0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
e6f0: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
e700: 6f 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  or();.    return
e710: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
e720: 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c  ITE_IOERR_FSYNC,
e730: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
e740: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
e750: 22 77 69 6e 53 79 6e 63 22 2c 20 70 46 69 6c 65  "winSync", pFile
e760: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 65  ->zPath);.  }.#e
e770: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ndif.}../*.** De
e780: 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72  termine the curr
e790: 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69  ent size of a fi
e7a0: 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73  le in bytes.*/.s
e7b0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c  tatic int winFil
e7c0: 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  eSize(sqlite3_fi
e7d0: 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f  le *id, sqlite3_
e7e0: 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  int64 *pSize){. 
e7f0: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
e800: 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
e810: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e820: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
e830: 20 69 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75   id!=0 );.  Simu
e840: 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
e850: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
e860: 46 53 54 41 54 29 3b 0a 23 69 66 20 53 51 4c 49  FSTAT);.#if SQLI
e870: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a  TE_OS_WINRT.  {.
e880: 20 20 20 20 46 49 4c 45 5f 53 54 41 4e 44 41 52      FILE_STANDAR
e890: 44 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20 20  D_INFO info;.   
e8a0: 20 69 66 28 20 6f 73 47 65 74 46 69 6c 65 49 6e   if( osGetFileIn
e8b0: 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c  formationByHandl
e8c0: 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 46 69  eEx(pFile->h, Fi
e8d0: 6c 65 53 74 61 6e 64 61 72 64 49 6e 66 6f 2c 0a  leStandardInfo,.
e8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e900: 20 20 20 20 20 26 69 6e 66 6f 2c 20 73 69 7a 65       &info, size
e910: 6f 66 28 69 6e 66 6f 29 29 20 29 7b 0a 20 20 20  of(info)) ){.   
e920: 20 20 20 2a 70 53 69 7a 65 20 3d 20 69 6e 66 6f     *pSize = info
e930: 2e 45 6e 64 4f 66 46 69 6c 65 2e 51 75 61 64 50  .EndOfFile.QuadP
e940: 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  art;.    }else{.
e950: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
e960: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
e970: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
e980: 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
e990: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  r(SQLITE_IOERR_F
e9a0: 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  STAT, pFile->las
e9b0: 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
e9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
e9d0: 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46  winFileSize", pF
e9e0: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
e9f0: 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b   }.  }.#else.  {
ea00: 0a 20 20 20 20 44 57 4f 52 44 20 75 70 70 65 72  .    DWORD upper
ea10: 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44 20  Bits;.    DWORD 
ea20: 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20 44  lowerBits;.    D
ea30: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
ea40: 0a 20 20 20 20 6c 6f 77 65 72 42 69 74 73 20 3d  .    lowerBits =
ea50: 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 28 70   osGetFileSize(p
ea60: 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65 72 42  File->h, &upperB
ea70: 69 74 73 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65  its);.    *pSize
ea80: 20 3d 20 28 28 28 73 71 6c 69 74 65 33 5f 69 6e   = (((sqlite3_in
ea90: 74 36 34 29 75 70 70 65 72 42 69 74 73 29 3c 3c  t64)upperBits)<<
eaa0: 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b  32) + lowerBits;
eab0: 0a 20 20 20 20 69 66 28 20 20 20 28 6c 6f 77 65  .    if(   (lowe
eac0: 72 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c 49 44  rBits == INVALID
ead0: 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20 20 20  _FILE_SIZE).    
eae0: 20 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e     && ((lastErrn
eaf0: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
eb00: 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29  or())!=NO_ERROR)
eb10: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
eb20: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
eb30: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63  tErrno;.      rc
eb40: 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
eb50: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
eb60: 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  T, pFile->lastEr
eb70: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
eb80: 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c    "winFileSize",
eb90: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
eba0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
ebb0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ebc0: 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f  ./*.** LOCKFILE_
ebd0: 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
ebe0: 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 6f 6e   is undefined on
ebf0: 20 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73 79   some Windows sy
ec00: 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65  stems..*/.#ifnde
ec10: 66 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f  f LOCKFILE_FAIL_
ec20: 49 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20 64 65  IMMEDIATELY.# de
ec30: 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  fine LOCKFILE_FA
ec40: 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 31  IL_IMMEDIATELY 1
ec50: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
ec60: 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53   LOCKFILE_EXCLUS
ec70: 49 56 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e  IVE_LOCK.# defin
ec80: 65 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55  e LOCKFILE_EXCLU
ec90: 53 49 56 45 5f 4c 4f 43 4b 20 32 0a 23 65 6e 64  SIVE_LOCK 2.#end
eca0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74 6f 72  if../*.** Histor
ecb0: 69 63 61 6c 6c 79 2c 20 53 51 4c 69 74 65 20 68  ically, SQLite h
ecc0: 61 73 20 75 73 65 64 20 62 6f 74 68 20 74 68 65  as used both the
ecd0: 20 4c 6f 63 6b 46 69 6c 65 20 61 6e 64 20 4c 6f   LockFile and Lo
ece0: 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f  ckFileEx functio
ecf0: 6e 73 2e 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  ns..** When the 
ed00: 4c 6f 63 6b 46 69 6c 65 20 66 75 6e 63 74 69 6f  LockFile functio
ed10: 6e 20 77 61 73 20 75 73 65 64 2c 20 69 74 20 77  n was used, it w
ed20: 61 73 20 61 6c 77 61 79 73 20 65 78 70 65 63 74  as always expect
ed30: 65 64 20 74 6f 20 66 61 69 6c 0a 2a 2a 20 69 6d  ed to fail.** im
ed40: 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74 68 65  mediately if the
ed50: 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20   lock could not 
ed60: 62 65 20 6f 62 74 61 69 6e 65 64 2e 20 20 41 6c  be obtained.  Al
ed70: 73 6f 2c 20 69 74 20 61 6c 77 61 79 73 20 65 78  so, it always ex
ed80: 70 65 63 74 65 64 20 74 6f 0a 2a 2a 20 6f 62 74  pected to.** obt
ed90: 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ain an exclusive
eda0: 20 6c 6f 63 6b 2e 20 20 54 68 65 73 65 20 66 6c   lock.  These fl
edb0: 61 67 73 20 61 72 65 20 75 73 65 64 20 77 69 74  ags are used wit
edc0: 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  h the LockFileEx
edd0: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64   function.** and
ede0: 20 72 65 66 6c 65 63 74 20 74 68 6f 73 65 20 65   reflect those e
edf0: 78 70 65 63 74 61 74 69 6f 6e 73 3b 20 74 68 65  xpectations; the
ee00: 72 65 66 6f 72 65 2c 20 74 68 65 79 20 73 68 6f  refore, they sho
ee10: 75 6c 64 20 6e 6f 74 20 62 65 20 63 68 61 6e 67  uld not be chang
ee20: 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ed..*/.#ifndef S
ee30: 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46  QLITE_LOCKFILE_F
ee40: 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51  LAGS.# define SQ
ee50: 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
ee60: 41 47 53 20 20 20 28 4c 4f 43 4b 46 49 4c 45 5f  AGS   (LOCKFILE_
ee70: 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
ee80: 20 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20   | \.           
ee90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eea0: 20 20 20 20 20 20 20 4c 4f 43 4b 46 49 4c 45 5f         LOCKFILE_
eeb0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
eec0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 75  #endif../*.** Cu
eed0: 72 72 65 6e 74 6c 79 2c 20 53 51 4c 69 74 65 20  rrently, SQLite 
eee0: 6e 65 76 65 72 20 63 61 6c 6c 73 20 74 68 65 20  never calls the 
eef0: 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74  LockFileEx funct
ef00: 69 6f 6e 20 77 69 74 68 6f 75 74 20 77 61 6e 74  ion without want
ef10: 69 6e 67 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20  ing the.** call 
ef20: 74 6f 20 66 61 69 6c 20 69 6d 6d 65 64 69 61 74  to fail immediat
ef30: 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ely if the lock 
ef40: 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e  cannot be obtain
ef50: 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ed..*/.#ifndef S
ef60: 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58  QLITE_LOCKFILEEX
ef70: 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20  _FLAGS.# define 
ef80: 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45  SQLITE_LOCKFILEE
ef90: 58 5f 46 4c 41 47 53 20 28 4c 4f 43 4b 46 49 4c  X_FLAGS (LOCKFIL
efa0: 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
efb0: 4c 59 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  LY).#endif../*.*
efc0: 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 61 64  * Acquire a read
efd0: 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66  er lock..** Diff
efe0: 65 72 65 6e 74 20 41 50 49 20 72 6f 75 74 69 6e  erent API routin
eff0: 65 73 20 61 72 65 20 63 61 6c 6c 65 64 20 64 65  es are called de
f000: 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
f010: 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a 2a  er or not this.*
f020: 2a 20 69 73 20 57 69 6e 39 78 20 6f 72 20 57 69  * is Win9x or Wi
f030: 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nNT..*/.static i
f040: 6e 74 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 77  nt getReadLock(w
f050: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
f060: 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 66 28    int res;.  if(
f070: 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72   isNT() ){.    r
f080: 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
f090: 28 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54  (pFile->h, SQLIT
f0a0: 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41  E_LOCKFILEEX_FLA
f0b0: 47 53 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  GS, SHARED_FIRST
f0c0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
f0d0: 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
f0e0: 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a  D_SIZE, 0);.  }.
f0f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
f100: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
f110: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 3b  lse{.    int lk;
f120: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  .    sqlite3_ran
f130: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 6c  domness(sizeof(l
f140: 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 70 46  k), &lk);.    pF
f150: 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
f160: 79 74 65 20 3d 20 28 73 68 6f 72 74 29 28 28 6c  yte = (short)((l
f170: 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25  k & 0x7fffffff)%
f180: 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31  (SHARED_SIZE - 1
f190: 29 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69  ));.    res = wi
f1a0: 6e 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d  nLockFile(pFile-
f1b0: 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
f1c0: 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20  ILE_FLAGS,.     
f1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1e0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46   SHARED_FIRST+pF
f1f0: 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
f200: 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  yte, 0, 1, 0);. 
f210: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
f220: 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  res == 0 ){.    
f230: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
f240: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
f250: 72 28 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e  r();.    /* No n
f260: 65 65 64 20 74 6f 20 6c 6f 67 20 61 20 66 61 69  eed to log a fai
f270: 6c 75 72 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  lure to lock */.
f280: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73    }.  return res
f290: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20  ;.}../*.** Undo 
f2a0: 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74  a readlock.*/.st
f2b0: 61 74 69 63 20 69 6e 74 20 75 6e 6c 6f 63 6b 52  atic int unlockR
f2c0: 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20  eadLock(winFile 
f2d0: 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72  *pFile){.  int r
f2e0: 65 73 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74  es;.  DWORD last
f2f0: 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 69 73 4e  Errno;.  if( isN
f300: 54 28 29 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  T() ){.    res =
f310: 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 70   winUnlockFile(p
f320: 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
f330: 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44  FIRST, 0, SHARED
f340: 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 23  _SIZE, 0);.  }.#
f350: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
f360: 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
f370: 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69  se{.    res = wi
f380: 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c  nUnlockFile(pFil
f390: 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
f3a0: 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  ST+pFile->shared
f3b0: 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20  LockByte, 0, 1, 
f3c0: 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  0);.  }.#endif. 
f3d0: 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20 28   if( res==0 && (
f3e0: 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  (lastErrno = osG
f3f0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d  etLastError())!=
f400: 45 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44  ERROR_NOT_LOCKED
f410: 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ) ){.    pFile->
f420: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
f430: 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f  Errno;.    winLo
f440: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
f450: 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c  ERR_UNLOCK, pFil
f460: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
f470: 20 20 20 20 20 20 20 20 20 20 20 22 75 6e 6c 6f             "unlo
f480: 63 6b 52 65 61 64 4c 6f 63 6b 22 2c 20 70 46 69  ckReadLock", pFi
f490: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
f4a0: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
f4b0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
f4c0: 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
f4d0: 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
f4e0: 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79  parameter lockty
f4f0: 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  pe - one.** of t
f500: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
f510: 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
f520: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
f530: 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
f540: 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
f550: 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
f560: 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
f570: 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
f580: 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
f590: 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
f5a0: 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
f5b0: 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
f5c0: 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
f5d0: 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
f5e0: 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
f5f0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
f600: 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
f610: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
f620: 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
f630: 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
f640: 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
f650: 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
f660: 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
f670: 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
f680: 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
f690: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
f6a0: 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
f6b0: 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
f6c0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
f6d0: 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
f6e0: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
f6f0: 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
f700: 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
f710: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
f720: 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
f730: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
f740: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
f750: 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
f760: 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
f770: 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
f780: 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
f790: 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28    The winUnlock(
f7a0: 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61  ) routine.** era
f7b0: 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74  ses all locks at
f7c0: 20 6f 6e 63 65 20 61 6e 64 20 72 65 74 75 72 6e   once and return
f7d0: 73 20 75 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  s us immediately
f7e0: 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65   to locking leve
f7f0: 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f  l 0..** It is no
f800: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f  t possible to lo
f810: 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
f820: 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65 70 20 61  level one step a
f830: 74 20 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a  t a time.  You.*
f840: 2a 20 6d 75 73 74 20 67 6f 20 73 74 72 61 69 67  * must go straig
f850: 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65  ht to locking le
f860: 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  vel 0..*/.static
f870: 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c   int winLock(sql
f880: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
f890: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
f8a0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
f8b0: 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  OK;    /* Return
f8c0: 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 72 6f   code from subro
f8d0: 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20  utines */.  int 
f8e0: 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
f8f0: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20     /* Result of 
f900: 61 20 57 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63  a Windows lock c
f910: 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77  all */.  int new
f920: 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20  Locktype;       
f930: 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f  /* Set pFile->lo
f940: 63 6b 74 79 70 65 20 74 6f 20 74 68 69 73 20 76  cktype to this v
f950: 61 6c 75 65 20 62 65 66 6f 72 65 20 65 78 69 74  alue before exit
f960: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74  ing */.  int got
f970: 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b  PendingLock = 0;
f980: 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 61 63  /* True if we ac
f990: 71 75 69 72 65 64 20 61 20 50 45 4e 44 49 4e 47  quired a PENDING
f9a0: 20 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d 65 20   lock this time 
f9b0: 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  */.  winFile *pF
f9c0: 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
f9d0: 69 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74  id;.  DWORD last
f9e0: 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52  Errno = NO_ERROR
f9f0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ;..  assert( id!
fa00: 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  =0 );.  OSTRACE(
fa10: 28 22 4c 4f 43 4b 20 25 64 20 25 64 20 77 61 73  ("LOCK %d %d was
fa20: 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20   %d(%d)\n",.    
fa30: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
fa40: 20 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65   locktype, pFile
fa50: 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c  ->locktype, pFil
fa60: 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e->sharedLockByt
fa70: 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  e));..  /* If th
fa80: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
fa90: 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
faa0: 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
fab0: 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
fac0: 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f  ** OsFile, do no
fad0: 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
fae0: 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65   the end_lock: e
faf0: 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
fb00: 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72  * sqlite3OsEnter
fb10: 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
fb20: 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
fb30: 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
fb40: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b  ->locktype>=lock
fb50: 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75  type ){.    retu
fb60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
fb70: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
fb80: 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
fb90: 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
fba0: 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  t.  */.  assert(
fbb0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
fbc0: 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63  !=NO_LOCK || loc
fbd0: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
fbe0: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
fbf0: 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e  locktype!=PENDIN
fc00: 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
fc10: 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45  rt( locktype!=RE
fc20: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
fc30: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
fc40: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
fc50: 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45    /* Lock the PE
fc60: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20  NDING_LOCK byte 
fc70: 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63  if we need to ac
fc80: 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20  quire a PENDING 
fc90: 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53  lock or.  ** a S
fca0: 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20  HARED lock.  If 
fcb0: 77 65 20 61 72 65 20 61 63 71 75 69 72 69 6e 67  we are acquiring
fcc0: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
fcd0: 74 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20  the acquisition 
fce0: 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44  of.  ** the PEND
fcf0: 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73  ING_LOCK byte is
fd00: 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f   temporary..  */
fd10: 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d  .  newLocktype =
fd20: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
fd30: 3b 0a 20 20 69 66 28 20 20 20 28 70 46 69 6c 65  ;.  if(   (pFile
fd40: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ->locktype==NO_L
fd50: 4f 43 4b 29 0a 20 20 20 20 20 7c 7c 20 28 20 20  OCK).     || (  
fd60: 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c   (locktype==EXCL
fd70: 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 20 20  USIVE_LOCK).    
fd80: 20 20 20 20 20 26 26 20 28 70 46 69 6c 65 2d 3e       && (pFile->
fd90: 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56  locktype==RESERV
fda0: 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20  ED_LOCK)).  ){. 
fdb0: 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a     int cnt = 3;.
fdc0: 20 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d      while( cnt--
fdd0: 3e 30 20 26 26 20 28 72 65 73 20 3d 20 77 69 6e  >0 && (res = win
fde0: 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e  LockFile(pFile->
fdf0: 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
fe00: 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20  LE_FLAGS,.      
fe10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe30: 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c     PENDING_BYTE,
fe40: 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b   0, 1, 0))==0 ){
fe50: 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 33 20  .      /* Try 3 
fe60: 74 69 6d 65 73 20 74 6f 20 67 65 74 20 74 68 65  times to get the
fe70: 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20   pending lock.  
fe80: 54 68 69 73 20 69 73 20 6e 65 65 64 65 64 20 74  This is needed t
fe90: 6f 20 77 6f 72 6b 0a 20 20 20 20 20 20 2a 2a 20  o work.      ** 
fea0: 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20  around problems 
feb0: 63 61 75 73 65 64 20 62 79 20 69 6e 64 65 78 69  caused by indexi
fec0: 6e 67 20 61 6e 64 2f 6f 72 20 61 6e 74 69 2d 76  ng and/or anti-v
fed0: 69 72 75 73 20 73 6f 66 74 77 61 72 65 20 6f 6e  irus software on
fee0: 0a 20 20 20 20 20 20 2a 2a 20 57 69 6e 64 6f 77  .      ** Window
fef0: 73 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20  s systems..     
ff00: 20 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75   ** If you are u
ff10: 73 69 6e 67 20 74 68 69 73 20 63 6f 64 65 20 61  sing this code a
ff20: 73 20 61 20 6d 6f 64 65 6c 20 66 6f 72 20 61 6c  s a model for al
ff30: 74 65 72 6e 61 74 69 76 65 20 56 46 53 65 73 2c  ternative VFSes,
ff40: 20 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a   do not.      **
ff50: 20 63 6f 70 79 20 74 68 69 73 20 72 65 74 72 79   copy this retry
ff60: 20 6c 6f 67 69 63 2e 20 20 49 74 20 69 73 20 61   logic.  It is a
ff70: 20 68 61 63 6b 20 69 6e 74 65 6e 64 65 64 20 66   hack intended f
ff80: 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79 2e  or Windows only.
ff90: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
ffa0: 4f 53 54 52 41 43 45 28 28 22 63 6f 75 6c 64 20  OSTRACE(("could 
ffb0: 6e 6f 74 20 67 65 74 20 61 20 50 45 4e 44 49 4e  not get a PENDIN
ffc0: 47 20 6c 6f 63 6b 2e 20 63 6e 74 3d 25 64 5c 6e  G lock. cnt=%d\n
ffd0: 22 2c 20 63 6e 74 29 29 3b 0a 20 20 20 20 20 20  ", cnt));.      
ffe0: 69 66 28 20 63 6e 74 20 29 20 70 6f 72 74 61 62  if( cnt ) portab
fff0: 6c 65 53 6c 65 65 70 28 31 29 3b 0a 20 20 20 20  leSleep(1);.    
10000 7d 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67  }.    gotPending
10010 4c 6f 63 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20  Lock = res;.    
10020 69 66 28 20 21 72 65 73 20 29 7b 0a 20 20 20 20  if( !res ){.    
10030 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
10040 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
10050 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
10060 41 63 71 75 69 72 65 20 61 20 73 68 61 72 65 64  Acquire a shared
10070 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28   lock.  */.  if(
10080 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
10090 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  D_LOCK && res ){
100a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
100b0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  le->locktype==NO
100c0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73  _LOCK );.    res
100d0 20 3d 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70   = getReadLock(p
100e0 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72  File);.    if( r
100f0 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
10100 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44  ocktype = SHARED
10110 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
10120 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
10130 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
10140 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  or();.    }.  }.
10150 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
10160 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20  RESERVED lock.  
10170 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
10180 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e==RESERVED_LOCK
10190 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61   && res ){.    a
101a0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
101b0 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
101c0 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  OCK );.    res =
101d0 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 70 46 69   winLockFile(pFi
101e0 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
101f0 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52 45  CKFILE_FLAGS, RE
10200 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
10210 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
10220 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
10230 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56  ocktype = RESERV
10240 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
10250 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72  se{.      lastEr
10260 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
10270 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20  rror();.    }.  
10280 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
10290 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20  a PENDING lock. 
102a0 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
102b0 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
102c0 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  CK && res ){.   
102d0 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50   newLocktype = P
102e0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20  ENDING_LOCK;.   
102f0 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
10300 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  = 0;.  }..  /* A
10310 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53  cquire an EXCLUS
10320 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  IVE lock.  */.  
10330 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
10340 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
10350 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72  res ){.    asser
10360 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
10370 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe>=SHARED_LOCK 
10380 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 75 6e 6c  );.    res = unl
10390 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  ockReadLock(pFil
103a0 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  e);.    OSTRACE(
103b0 28 22 75 6e 72 65 61 64 6c 6f 63 6b 20 3d 20 25  ("unreadlock = %
103c0 64 5c 6e 22 2c 20 72 65 73 29 29 3b 0a 20 20 20  d\n", res));.   
103d0 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69   res = winLockFi
103e0 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  le(pFile->h, SQL
103f0 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41  ITE_LOCKFILE_FLA
10400 47 53 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  GS, SHARED_FIRST
10410 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
10420 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
10430 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20  D_SIZE, 0);.    
10440 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
10450 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45   newLocktype = E
10460 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20  XCLUSIVE_LOCK;. 
10470 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10480 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
10490 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
104a0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 65 72      OSTRACE(("er
104b0 72 6f 72 2d 63 6f 64 65 20 3d 20 25 64 5c 6e 22  ror-code = %d\n"
104c0 2c 20 6c 61 73 74 45 72 72 6e 6f 29 29 3b 0a 20  , lastErrno));. 
104d0 20 20 20 20 20 67 65 74 52 65 61 64 4c 6f 63 6b       getReadLock
104e0 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
104f0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61   }..  /* If we a
10500 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e  re holding a PEN
10510 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f  DING lock that o
10520 75 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61  ught to be relea
10530 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72  sed, then.  ** r
10540 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20  elease it now.. 
10550 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e   */.  if( gotPen
10560 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b  dingLock && lock
10570 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
10580 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f  K ){.    winUnlo
10590 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
105a0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30   PENDING_BYTE, 0
105b0 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 1, 0);.  }..  
105c0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 73 74  /* Update the st
105d0 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  ate of the lock 
105e0 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20  has held in the 
105f0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
10600 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e  then.  ** return
10610 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
10620 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20   result code..  
10630 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a  */.  if( res ){.
10640 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10650 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
10660 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
10670 46 41 49 4c 45 44 20 25 64 20 74 72 79 69 6e 67  FAILED %d trying
10680 20 66 6f 72 20 25 64 20 62 75 74 20 67 6f 74 20   for %d but got 
10690 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
106a0 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b  .           lock
106b0 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70  type, newLocktyp
106c0 65 29 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  e));.    pFile->
106d0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
106e0 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20  Errno;.    rc = 
106f0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
10700 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
10710 70 65 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b  pe = (u8)newLock
10720 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72  type;.  return r
10730 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
10740 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
10750 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
10760 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
10770 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
10780 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
10790 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
107a0 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
107b0 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
107c0 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
107d0 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65  ro, otherwise ze
107e0 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
107f0 74 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76  t winCheckReserv
10800 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
10810 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
10820 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63  esOut){.  int rc
10830 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  ;.  winFile *pFi
10840 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
10850 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d;..  SimulateIO
10860 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
10870 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
10880 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
10890 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
108a0 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
108b0 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45  ->locktype>=RESE
108c0 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
108d0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54   rc = 1;.    OST
108e0 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
108f0 4f 43 4b 20 25 64 20 25 64 20 28 6c 6f 63 61 6c  OCK %d %d (local
10900 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
10910 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rc));.  }else{. 
10920 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46     rc = winLockF
10930 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 51  ile(pFile->h, SQ
10940 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
10950 41 47 53 2c 20 52 45 53 45 52 56 45 44 5f 42 59  AGS, RESERVED_BY
10960 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
10970 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
10980 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28    winUnlockFile(
10990 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56  pFile->h, RESERV
109a0 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  ED_BYTE, 0, 1, 0
109b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
109c0 3d 20 21 72 63 3b 0a 20 20 20 20 4f 53 54 52 41  = !rc;.    OSTRA
109d0 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
109e0 4b 20 25 64 20 25 64 20 28 72 65 6d 6f 74 65 29  K %d %d (remote)
109f0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
10a00 63 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73  c));.  }.  *pRes
10a10 4f 75 74 20 3d 20 72 63 3b 0a 20 20 72 65 74 75  Out = rc;.  retu
10a20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10a30 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
10a40 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
10a50 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
10a60 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65  r id to locktype
10a70 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d  .  locktype.** m
10a80 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
10a90 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
10aa0 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
10ab0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
10ac0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
10ad0 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
10ae0 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
10af0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
10b00 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
10b10 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
10b20 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74   no-op..**.** It
10b30 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
10b40 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
10b50 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74 68 65  e to fail if the
10b60 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
10b70 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20  .** is NO_LOCK. 
10b80 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
10b90 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41 52 45  rgument is SHARE
10ba0 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69 73  D_LOCK then this
10bb0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68   routine.** migh
10bc0 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
10bd0 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69 63  IOERR;.*/.static
10be0 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28 73   int winUnlock(s
10bf0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
10c00 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
10c10 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 77 69    int type;.  wi
10c20 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
10c30 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  winFile*)id;.  i
10c40 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
10c50 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  K;.  assert( pFi
10c60 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  le!=0 );.  asser
10c70 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41  t( locktype<=SHA
10c80 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f 53  RED_LOCK );.  OS
10c90 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25  TRACE(("UNLOCK %
10ca0 64 20 74 6f 20 25 64 20 77 61 73 20 25 64 28 25  d to %d was %d(%
10cb0 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  d)\n", pFile->h,
10cc0 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20   locktype,.     
10cd0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b       pFile->lock
10ce0 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61  type, pFile->sha
10cf0 72 65 64 4c 6f 63 6b 42 79 74 65 29 29 3b 0a 20  redLockByte));. 
10d00 20 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c   type = pFile->l
10d10 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 74  ocktype;.  if( t
10d20 79 70 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype>=EXCLUSIVE_L
10d30 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e  OCK ){.    winUn
10d40 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e  lockFile(pFile->
10d50 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  h, SHARED_FIRST,
10d60 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c   0, SHARED_SIZE,
10d70 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63   0);.    if( loc
10d80 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
10d90 43 4b 20 26 26 20 21 67 65 74 52 65 61 64 4c 6f  CK && !getReadLo
10da0 63 6b 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  ck(pFile) ){.   
10db0 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c     /* This shoul
10dc0 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 2e 20  d never happen. 
10dd0 20 57 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79   We should alway
10de0 73 20 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20  s be able to.   
10df0 20 20 20 2a 2a 20 72 65 61 63 71 75 69 72 65 20     ** reacquire 
10e00 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  the read lock */
10e10 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
10e20 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
10e30 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47  OERR_UNLOCK, osG
10e40 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
10e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
10e60 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c 65  inUnlock", pFile
10e70 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
10e80 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d    }.  if( type>=
10e90 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
10ea0 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  .    winUnlockFi
10eb0 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53  le(pFile->h, RES
10ec0 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31  ERVED_BYTE, 0, 1
10ed0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
10ee0 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
10ef0 4b 20 26 26 20 74 79 70 65 3e 3d 53 48 41 52 45  K && type>=SHARE
10f00 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 6e  D_LOCK ){.    un
10f10 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69  lockReadLock(pFi
10f20 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74  le);.  }.  if( t
10f30 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ype>=PENDING_LOC
10f40 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f  K ){.    winUnlo
10f50 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
10f60 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30   PENDING_BYTE, 0
10f70 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70  , 1, 0);.  }.  p
10f80 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
10f90 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20   (u8)locktype;. 
10fa0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10fb0 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73  *.** If *pArg is
10fc0 20 69 6e 69 74 69 74 69 61 6c 6c 79 20 6e 65 67   inititially neg
10fd0 61 74 69 76 65 20 74 68 65 6e 20 74 68 69 73 20  ative then this 
10fe0 69 73 20 61 20 71 75 65 72 79 2e 20 20 53 65 74  is a query.  Set
10ff0 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f   *pArg to.** 1 o
11000 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  r 0 depending on
11010 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
11020 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c  bit mask of pFil
11030 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20  e->ctrlFlags is 
11040 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  set..**.** If *p
11050 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74  Arg is 0 or 1, t
11060 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74  hen clear or set
11070 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66   the mask bit of
11080 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
11090 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
110a0 64 20 77 69 6e 4d 6f 64 65 42 69 74 28 77 69 6e  d winModeBit(win
110b0 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73  File *pFile, uns
110c0 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c  igned char mask,
110d0 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69   int *pArg){.  i
110e0 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20  f( *pArg<0 ){.  
110f0 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65    *pArg = (pFile
11100 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61  ->ctrlFlags & ma
11110 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20  sk)!=0;.  }else 
11120 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29  if( (*pArg)==0 )
11130 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
11140 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b  lFlags &= ~mask;
11150 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
11160 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
11170 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = mask;.  }.}../
11180 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e 64  *.** Control and
11190 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 6f 70   query of the op
111a0 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  en file handle..
111b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
111c0 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  nFileControl(sql
111d0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
111e0 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
111f0 67 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  g){.  winFile *p
11200 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
11210 29 69 64 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  )id;.  switch( o
11220 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  p ){.    case SQ
11230 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53  LITE_FCNTL_LOCKS
11240 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28  TATE: {.      *(
11250 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c  int*)pArg = pFil
11260 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20  e->locktype;.   
11270 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11280 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
11290 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f  ase SQLITE_LAST_
112a0 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a  ERRNO: {.      *
112b0 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 69 6e  (int*)pArg = (in
112c0 74 29 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  t)pFile->lastErr
112d0 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  no;.      return
112e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
112f0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
11300 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  E_FCNTL_CHUNK_SI
11310 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ZE: {.      pFil
11320 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69  e->szChunk = *(i
11330 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  nt *)pArg;.     
11340 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11350 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
11360 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
11370 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20  IZE_HINT: {.    
11380 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
11390 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20  hunk>0 ){.      
113a0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
113b0 6f 6c 64 53 7a 3b 0a 20 20 20 20 20 20 20 20 69  oldSz;.        i
113c0 6e 74 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53  nt rc = winFileS
113d0 69 7a 65 28 69 64 2c 20 26 6f 6c 64 53 7a 29 3b  ize(id, &oldSz);
113e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
113f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11400 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
11410 69 6e 74 36 34 20 6e 65 77 53 7a 20 3d 20 2a 28  int64 newSz = *(
11420 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70  sqlite3_int64*)p
11430 41 72 67 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Arg;.          i
11440 66 28 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20 29  f( newSz>oldSz )
11450 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 69  {.            Si
11460 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
11470 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20  ign(1);.        
11480 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e      rc = winTrun
11490 63 61 74 65 28 69 64 2c 20 6e 65 77 53 7a 29 3b  cate(id, newSz);
114a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 69 6d  .            Sim
114b0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
114c0 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20  gn(0);.         
114d0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
114e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
114f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
11500 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11510 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
11520 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53  QLITE_FCNTL_PERS
11530 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20  IST_WAL: {.     
11540 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c   winModeBit(pFil
11550 65 2c 20 57 49 4e 46 49 4c 45 5f 50 45 52 53 49  e, WINFILE_PERSI
11560 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41  ST_WAL, (int*)pA
11570 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rg);.      retur
11580 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
11590 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
115a0 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41  TE_FCNTL_POWERSA
115b0 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a  FE_OVERWRITE: {.
115c0 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74        winModeBit
115d0 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f  (pFile, WINFILE_
115e0 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67  PSOW, (int*)pArg
115f0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
11600 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
11610 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
11620 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20  _FCNTL_VFSNAME: 
11630 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a  {.      *(char**
11640 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f  )pArg = sqlite3_
11650 6d 70 72 69 6e 74 66 28 22 77 69 6e 33 32 22 29  mprintf("win32")
11660 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
11670 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
11680 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
11690 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52  FCNTL_WIN32_AV_R
116a0 45 54 52 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e  ETRY: {.      in
116b0 74 20 2a 61 20 3d 20 28 69 6e 74 2a 29 70 41 72  t *a = (int*)pAr
116c0 67 3b 0a 20 20 20 20 20 20 69 66 28 20 61 5b 30  g;.      if( a[0
116d0 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ]>0 ){.        w
116e0 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 20 3d  in32IoerrRetry =
116f0 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 7d 65 6c   a[0];.      }el
11700 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 30 5d  se{.        a[0]
11710 20 3d 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74   = win32IoerrRet
11720 72 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ry;.      }.    
11730 20 20 69 66 28 20 61 5b 31 5d 3e 30 20 29 7b 0a    if( a[1]>0 ){.
11740 20 20 20 20 20 20 20 20 77 69 6e 33 32 49 6f 65          win32Ioe
11750 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d 20 61  rrRetryDelay = a
11760 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  [1];.      }else
11770 7b 0a 20 20 20 20 20 20 20 20 61 5b 31 5d 20 3d  {.        a[1] =
11780 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79   win32IoerrRetry
11790 44 65 6c 61 79 3b 0a 20 20 20 20 20 20 7d 0a 20  Delay;.      }. 
117a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
117b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
117c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
117d0 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a  _NOTFOUND;.}../*
117e0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
117f0 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79  ector size in by
11800 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72  tes of the under
11810 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69  lying block devi
11820 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70  ce for.** the sp
11830 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68  ecified file. Th
11840 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  is is almost alw
11850 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62  ays 512 bytes, b
11860 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72  ut may be.** lar
11870 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76  ger for some dev
11880 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ices..**.** SQLi
11890 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20  te code assumes 
118a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
118b0 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c  nnot fail. It al
118c0 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  so assumes that.
118d0 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20  ** if two files 
118e0 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74  are created in t
118f0 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73  he same file-sys
11900 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69  tem directory (i
11910 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  .e..** a databas
11920 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61  e and its journa
11930 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65  l file) that the
11940 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
11950 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65  l be the.** same
11960 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74   for both..*/.st
11970 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 63 74  atic int winSect
11980 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
11990 69 6c 65 20 2a 69 64 29 7b 0a 20 20 28 76 6f 69  ile *id){.  (voi
119a0 64 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  d)id;.  return S
119b0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45  QLITE_DEFAULT_SE
119c0 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a  CTOR_SIZE;.}../*
119d0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65 63  .** Return a vec
119e0 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63 68  tor of device ch
119f0 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a 2a  aracteristics..*
11a00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
11a10 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
11a20 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69  stics(sqlite3_fi
11a30 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69 6e 46 69  le *id){.  winFi
11a40 6c 65 20 2a 70 20 3d 20 28 77 69 6e 46 69 6c 65  le *p = (winFile
11a50 2a 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  *)id;.  return S
11a60 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45  QLITE_IOCAP_UNDE
11a70 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
11a80 4e 20 7c 0a 20 20 20 20 20 20 20 20 20 28 28 70  N |.         ((p
11a90 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57 49  ->ctrlFlags & WI
11aa0 4e 46 49 4c 45 5f 50 53 4f 57 29 3f 53 51 4c 49  NFILE_PSOW)?SQLI
11ab0 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
11ac0 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 30 29 3b  FE_OVERWRITE:0);
11ad0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
11ae0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 20  TE_OMIT_WAL../* 
11af0 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77 69 6c 6c  .** Windows will
11b00 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75 20 63 72   only let you cr
11b10 65 61 74 65 20 66 69 6c 65 20 76 69 65 77 20 6d  eate file view m
11b20 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c  appings.** on al
11b30 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 67 72  location size gr
11b40 61 6e 75 6c 61 72 69 74 79 20 62 6f 75 6e 64 61  anularity bounda
11b50 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69 6e 67 20  ries..** During 
11b60 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28  sqlite3_os_init(
11b70 29 20 77 65 20 64 6f 20 61 20 47 65 74 53 79 73  ) we do a GetSys
11b80 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20  temInfo().** to 
11b90 67 65 74 20 74 68 65 20 67 72 61 6e 75 6c 61 72  get the granular
11ba0 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a 53 59 53  ity size..*/.SYS
11bb0 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73 49  TEM_INFO winSysI
11bc0 6e 66 6f 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  nfo;../*.** Help
11bd0 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
11be0 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e  obtain and relin
11bf0 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c  quish the global
11c00 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67   mutex. The.** g
11c10 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75  lobal mutex is u
11c20 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74  sed to protect t
11c30 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20 6f  he winLockInfo o
11c40 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20 0a  bjects used by .
11c50 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c  ** this file, al
11c60 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62  l of which may b
11c70 65 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74  e shared by mult
11c80 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a  iple threads..**
11c90 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77 69 6e  .** Function win
11ca0 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69  ShmMutexHeld() i
11cb0 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74  s used to assert
11cc0 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62  () that the glob
11cd0 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20  al mutex .** is 
11ce0 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72  held when requir
11cf0 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
11d00 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
11d10 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74  s part of assert
11d20 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  () .** statement
11d30 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  s. e.g..**.**   
11d40 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
11d50 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ().**     assert
11d60 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  ( winShmMutexHel
11d70 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69 6e 53  d() );.**   winS
11d80 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 0a 2a  hmLeaveMutex().*
11d90 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
11da0 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 76  nShmEnterMutex(v
11db0 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
11dc0 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69  mutex_enter(sqli
11dd0 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
11de0 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
11df0 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74  C_MASTER));.}.st
11e00 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d  atic void winShm
11e10 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29  LeaveMutex(void)
11e20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
11e30 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d  x_leave(sqlite3M
11e40 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
11e50 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
11e60 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66  STER));.}.#ifdef
11e70 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
11e80 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d  atic int winShmM
11e90 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b  utexHeld(void) {
11ea0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
11eb0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c  3_mutex_held(sql
11ec0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
11ed0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
11ee0 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23  IC_MASTER));.}.#
11ef0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  endif../*.** Obj
11f00 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72  ect used to repr
11f10 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65 20 66  esent a single f
11f20 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64 20 6d  ile opened and m
11f30 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76 69 64  mapped to provid
11f40 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f  e.** shared memo
11f50 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74 69 70  ry.  When multip
11f60 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72  le threads all r
11f70 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d  eference the sam
11f80 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79  e.** log-summary
11f90 2c 20 65 61 63 68 20 74 68 72 65 61 64 20 68 61  , each thread ha
11fa0 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46 69 6c  s its own winFil
11fb0 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68  e object, but th
11fc0 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20  ey all.** point 
11fd0 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74  to a single inst
11fe0 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
11ff0 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ect.  In other w
12000 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f  ords, each.** lo
12010 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f 70 65  g-summary is ope
12020 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65  ned only once pe
12030 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  r process..**.**
12040 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
12050 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20  () must be true 
12060 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72  when creating or
12070 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74   destroying.** t
12080 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68  his object or wh
12090 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77  ile reading or w
120a0 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  riting the follo
120b0 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a  wing fields:.**.
120c0 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 20  **      nRef.** 
120d0 20 20 20 20 20 70 4e 65 78 74 20 0a 2a 2a 0a 2a       pNext .**.*
120e0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
120f0 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d  fields are read-
12100 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f  only after the o
12110 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
12120 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69  :.** .**      fi
12130 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e  d.**      zFilen
12140 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72  ame.**.** Either
12150 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74 65   winShmNode.mute
12160 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f  x must be held o
12170 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65  r winShmNode.nRe
12180 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e 53  f==0 and.** winS
12190 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  hmMutexHeld() is
121a0 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64 69   true when readi
121b0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e  ng or writing an
121c0 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a  y other field.**
121d0 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
121e0 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74  re..**.*/.struct
121f0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20 20   winShmNode {.  
12200 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
12210 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75  utex;      /* Mu
12220 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68  tex to access th
12230 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  is object */.  c
12240 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
12250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
12260 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f  e of the file */
12270 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69 6c 65  .  winFile hFile
12280 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
12290 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f   File handle fro
122a0 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20  m winOpen */..  
122b0 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20  int szRegion;   
122c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
122d0 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d  ze of shared-mem
122e0 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20  ory regions */. 
122f0 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20   int nRegion;   
12300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
12310 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52  ize of array apR
12320 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63  egion */.  struc
12330 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20 20  t ShmRegion {.  
12340 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20    HANDLE hMap;  
12350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
12360 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 43  le handle from C
12370 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
12380 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4d   */.    void *pM
12390 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f 6e  ap;.  } *aRegion
123a0 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
123b0 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rno;           /
123c0 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72  * The Windows er
123d0 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73  rno from the las
123e0 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a  t I/O error */..
123f0 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
12400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12410 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53 68 6d  Number of winShm
12420 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
12430 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77  g to this */.  w
12440 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20  inShm *pFirst;  
12450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
12460 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20   winShm objects 
12470 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
12480 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65   */.  winShmNode
12490 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
124a0 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73 74   /* Next in list
124b0 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f   of all winShmNo
124c0 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69  de objects */.#i
124d0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
124e0 47 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64  G.  u8 nextShmId
124f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
12500 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65  * Next available
12510 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75 65   winShm.id value
12520 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
12530 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72  *.** A global ar
12540 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68  ray of all winSh
12550 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a 2a  mNode objects..*
12560 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d 4d  *.** The winShmM
12570 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20  utexHeld() must 
12580 62 65 20 74 72 75 65 20 77 68 69 6c 65 20 72 65  be true while re
12590 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
125a0 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73   this list..*/.s
125b0 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64 65  tatic winShmNode
125c0 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74   *winShmNodeList
125d0 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72   = 0;../*.** Str
125e0 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74 65  ucture used inte
125f0 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56  rnally by this V
12600 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  FS to record the
12610 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20   state of an.** 
12620 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  open shared memo
12630 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ry connection..*
12640 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
12650 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e  ng fields are in
12660 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74  itialized when t
12670 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72  his object is cr
12680 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65  eated and.** are
12690 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65   read-only there
126a0 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  after:.**.**    
126b0 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a  winShm.pShmNode.
126c0 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69 64 0a  **    winShm.id.
126d0 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20  **.** All other 
126e0 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f  fields are read/
126f0 77 72 69 74 65 2e 20 20 54 68 65 20 77 69 6e 53  write.  The winS
12700 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  hm.pShmNode->mut
12710 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  ex must be held.
12720 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69  ** while accessi
12730 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74  ng any read/writ
12740 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72  e fields..*/.str
12750 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77  uct winShm {.  w
12760 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
12770 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  ode;      /* The
12780 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e 53   underlying winS
12790 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f  hmNode object */
127a0 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74  .  winShm *pNext
127b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
127c0 20 4e 65 78 74 20 77 69 6e 53 68 6d 20 77 69 74   Next winShm wit
127d0 68 20 74 68 65 20 73 61 6d 65 20 77 69 6e 53 68  h the same winSh
127e0 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61  mNode */.  u8 ha
127f0 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20  sMutex;         
12800 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
12810 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 77 69 6e   holding the win
12820 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f  ShmNode mutex */
12830 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73  .  u16 sharedMas
12840 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
12850 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
12860 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
12870 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20  u16 exclMask;   
12880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
12890 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
128a0 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69  locks held */.#i
128b0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
128c0 47 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 20  G.  u8 id;      
128d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
128e0 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e  * Id of this con
128f0 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 69 74 73  nection with its
12900 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23   winShmNode */.#
12910 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
12920 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66  Constants used f
12930 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64  or locking.*/.#d
12940 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 42 41  efine WIN_SHM_BA
12950 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45  SE   ((22+SQLITE
12960 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20  _SHM_NLOCK)*4)  
12970 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c        /* first l
12980 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66  ock byte */.#def
12990 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 20  ine WIN_SHM_DMS 
129a0 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41 53 45     (WIN_SHM_BASE
129b0 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
129c0 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73  K)  /* deadman s
129d0 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  witch */../*.** 
129e0 41 70 70 6c 79 20 61 64 76 69 73 6f 72 79 20 6c  Apply advisory l
129f0 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e 20 62  ocks for all n b
12a00 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 61  ytes beginning a
12a10 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65 66 69  t ofst..*/.#defi
12a20 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20 31  ne _SHM_UNLCK  1
12a30 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 52 44  .#define _SHM_RD
12a40 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e 65 20 5f  LCK  2.#define _
12a50 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a 73 74 61  SHM_WRLCK  3.sta
12a60 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 53 79  tic int winShmSy
12a70 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e 53  stemLock(.  winS
12a80 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65 2c 20 20  hmNode *pFile,  
12a90 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73    /* Apply locks
12aa0 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68   to this open sh
12ab0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d  ared-memory segm
12ac0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63  ent */.  int loc
12ad0 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 2f  kType,         /
12ae0 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 5f 53  * _SHM_UNLCK, _S
12af0 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f 53 48  HM_RDLCK, or _SH
12b00 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74  M_WRLCK */.  int
12b10 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20   ofst,          
12b20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
12b30 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65  first byte to be
12b40 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64   locked/unlocked
12b50 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 20   */.  int nByte 
12b60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
12b70 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
12b80 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b  o lock or unlock
12b90 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
12ba0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
12bb0 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f  * Result code fo
12bc0 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69  rm Lock/UnlockFi
12bd0 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20  leEx() */..  /* 
12be0 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 77 69  Access to the wi
12bf0 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  nShmNode object 
12c00 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79  is serialized by
12c10 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20   the caller */. 
12c20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12c30 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 69 6c  _mutex_held(pFil
12c40 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 46 69  e->mutex) || pFi
12c50 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  le->nRef==0 );..
12c60 20 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63 71    /* Release/Acq
12c70 75 69 72 65 20 74 68 65 20 73 79 73 74 65 6d 2d  uire the system-
12c80 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20  level lock */.  
12c90 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53  if( lockType==_S
12ca0 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  HM_UNLCK ){.    
12cb0 72 63 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  rc = winUnlockFi
12cc0 6c 65 28 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e  le(pFile->hFile.
12cd0 68 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74  h, ofst, 0, nByt
12ce0 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e, 0);.  }else{.
12cf0 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
12d00 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61  e the locking pa
12d10 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20  rameters */.    
12d20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 20 3d 20  DWORD dwFlags = 
12d30 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
12d40 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20 20 20 69  MEDIATELY;.    i
12d50 66 28 20 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f  f( lockType == _
12d60 53 48 4d 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c  SHM_WRLCK ) dwFl
12d70 61 67 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f  ags |= LOCKFILE_
12d80 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a  EXCLUSIVE_LOCK;.
12d90 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b      rc = winLock
12da0 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 46 69 6c  File(pFile->hFil
12db0 65 2e 68 2c 20 64 77 46 6c 61 67 73 2c 20 6f 66  e.h, dwFlags, of
12dc0 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29  st, 0, nByte, 0)
12dd0 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72  ;.  }.  .  if( r
12de0 63 21 3d 20 30 20 29 7b 0a 20 20 20 20 72 63 20  c!= 0 ){.    rc 
12df0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
12e00 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
12e10 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 20 6f 73  >lastErrno =  os
12e20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
12e30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12e40 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  BUSY;.  }..  OST
12e50 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
12e60 25 64 20 25 73 20 25 73 20 30 78 25 30 38 6c 78  %d %s %s 0x%08lx
12e70 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
12e80 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c   pFile->hFile.h,
12e90 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d  .           rc==
12ea0 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
12eb0 20 3a 20 22 66 61 69 6c 65 64 22 2c 0a 20 20 20   : "failed",.   
12ec0 20 20 20 20 20 20 20 20 6c 6f 63 6b 54 79 70 65          lockType
12ed0 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 3f 20 22  ==_SHM_UNLCK ? "
12ee0 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 20 3a 20  UnlockFileEx" : 
12ef0 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 0a 20 20  "LockFileEx",.  
12f00 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
12f10 6c 61 73 74 45 72 72 6e 6f 29 29 3b 0a 0a 20 20  lastErrno));..  
12f20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12f30 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
12f40 63 65 73 20 74 6f 20 56 46 53 20 6d 65 74 68 6f  ces to VFS metho
12f50 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ds */.static int
12f60 20 77 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33   winOpen(sqlite3
12f70 5f 76 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72  _vfs*,const char
12f80 2a 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  *,sqlite3_file*,
12f90 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69  int,int*);.stati
12fa0 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28  c int winDelete(
12fb0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f  sqlite3_vfs *,co
12fc0 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a  nst char*,int);.
12fd0 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65  ./*.** Purge the
12fe0 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20   winShmNodeList 
12ff0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72  list of all entr
13000 69 65 73 20 77 69 74 68 20 77 69 6e 53 68 6d 4e  ies with winShmN
13010 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a  ode.nRef==0..**.
13020 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
13030 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
13040 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73  ry method; it is
13050 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74   a utility funct
13060 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79  ion called.** by
13070 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
13080 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73  ry methods..*/.s
13090 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
130a0 6d 50 75 72 67 65 28 73 71 6c 69 74 65 33 5f 76  mPurge(sqlite3_v
130b0 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 64 65  fs *pVfs, int de
130c0 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e  leteFlag){.  win
130d0 53 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20  ShmNode **pp;.  
130e0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20  winShmNode *p;. 
130f0 20 42 4f 4f 4c 20 62 52 63 3b 0a 20 20 61 73 73   BOOL bRc;.  ass
13100 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78  ert( winShmMutex
13110 48 65 6c 64 28 29 20 29 3b 0a 20 20 70 70 20 3d  Held() );.  pp =
13120 20 26 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74   &winShmNodeList
13130 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 20 3d 20  ;.  while( (p = 
13140 2a 70 70 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  *pp)!=0 ){.    i
13150 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  f( p->nRef==0 ){
13160 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
13170 20 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78      if( p->mutex
13180 20 29 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   ) sqlite3_mutex
13190 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b  _free(p->mutex);
131a0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
131b0 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b  i<p->nRegion; i+
131c0 2b 29 7b 0a 20 20 20 20 20 20 20 20 62 52 63 20  +){.        bRc 
131d0 3d 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46  = osUnmapViewOfF
131e0 69 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69  ile(p->aRegion[i
131f0 5d 2e 70 4d 61 70 29 3b 0a 20 20 20 20 20 20 20  ].pMap);.       
13200 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50   OSTRACE(("SHM-P
13210 55 52 47 45 20 70 69 64 2d 25 64 20 75 6e 6d 61  URGE pid-%d unma
13220 70 20 72 65 67 69 6f 6e 3d 25 64 20 25 73 5c 6e  p region=%d %s\n
13230 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
13240 20 20 20 20 28 69 6e 74 29 6f 73 47 65 74 43 75      (int)osGetCu
13250 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
13260 2c 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , i,.           
13270 20 20 20 20 20 20 62 52 63 20 3f 20 22 6f 6b 22        bRc ? "ok"
13280 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
13290 20 20 20 20 20 20 20 62 52 63 20 3d 20 6f 73 43         bRc = osC
132a0 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52  loseHandle(p->aR
132b0 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a  egion[i].hMap);.
132c0 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
132d0 28 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64 2d  ("SHM-PURGE pid-
132e0 25 64 20 63 6c 6f 73 65 20 72 65 67 69 6f 6e 3d  %d close region=
132f0 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
13300 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
13310 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
13320 65 73 73 49 64 28 29 2c 20 69 2c 0a 20 20 20 20  essId(), i,.    
13330 20 20 20 20 20 20 20 20 20 20 20 20 20 62 52 63               bRc
13340 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
13350 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  d"));.      }.  
13360 20 20 20 20 69 66 28 20 70 2d 3e 68 46 69 6c 65      if( p->hFile
13370 2e 68 20 21 3d 20 49 4e 56 41 4c 49 44 5f 48 41  .h != INVALID_HA
13380 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20  NDLE_VALUE ){.  
13390 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
133a0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
133b0 20 20 20 20 20 20 20 20 77 69 6e 43 6c 6f 73 65          winClose
133c0 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
133d0 29 26 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 20 20  )&p->hFile);.   
133e0 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
133f0 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
13400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
13410 20 64 65 6c 65 74 65 46 6c 61 67 20 29 7b 0a 20   deleteFlag ){. 
13420 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
13430 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
13440 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13450 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
13460 63 28 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e  c();.        win
13470 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 2d 3e  Delete(pVfs, p->
13480 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20  zFilename, 0);. 
13490 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
134a0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
134b0 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74  .        Simulat
134c0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
134d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
134e0 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
134f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
13500 72 65 65 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b  ree(p->aRegion);
13510 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
13520 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73  ree(p);.    }els
13530 65 7b 0a 20 20 20 20 20 20 70 70 20 3d 20 26 70  e{.      pp = &p
13540 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
13550 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e   }.}../*.** Open
13560 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
13570 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74  ry area associat
13580 65 64 20 77 69 74 68 20 64 61 74 61 62 61 73 65  ed with database
13590 20 66 69 6c 65 20 70 44 62 46 64 2e 0a 2a 2a 0a   file pDbFd..**.
135a0 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** When opening 
135b0 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d  a new shared-mem
135c0 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20  ory file, if no 
135d0 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20  other instances 
135e0 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20  of that.** file 
135f0 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  are currently op
13600 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63  en, in this proc
13610 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20  ess or in other 
13620 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a  processes, then.
13630 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74  ** the file must
13640 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
13650 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20   zero length or 
13660 68 61 76 65 20 69 74 73 20 68 65 61 64 65 72 20  have its header 
13670 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  cleared..*/.stat
13680 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 53 68  ic int winOpenSh
13690 61 72 65 64 4d 65 6d 6f 72 79 28 77 69 6e 46 69  aredMemory(winFi
136a0 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74  le *pDbFd){.  st
136b0 72 75 63 74 20 77 69 6e 53 68 6d 20 2a 70 3b 20  ruct winShm *p; 
136c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136d0 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
136e0 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  on to be opened 
136f0 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53  */.  struct winS
13700 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
13710 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 75   = 0;   /* The u
13720 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65  nderlying mmappe
13730 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  d file */.  int 
13740 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
13750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13760 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
13770 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  .  struct winShm
13780 4e 6f 64 65 20 2a 70 4e 65 77 3b 20 20 20 20 20  Node *pNew;     
13790 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61        /* Newly a
137a0 6c 6c 6f 63 61 74 65 64 20 77 69 6e 53 68 6d 4e  llocated winShmN
137b0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  ode */.  int nNa
137c0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
137d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
137e0 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20  ize of zName in 
137f0 62 79 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65  bytes */..  asse
13800 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d  rt( pDbFd->pShm=
13810 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20  =0 );    /* Not 
13820 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65  previously opene
13830 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  d */..  /* Alloc
13840 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
13850 65 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 73 68  e new sqlite3_sh
13860 6d 20 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20  m object.  Also 
13870 73 70 65 63 75 6c 61 74 69 76 65 6c 79 0a 20 20  speculatively.  
13880 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  ** allocate spac
13890 65 20 66 6f 72 20 61 20 6e 65 77 20 77 69 6e 53  e for a new winS
138a0 68 6d 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e  hmNode and filen
138b0 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20  ame..  */.  p = 
138c0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
138d0 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
138e0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
138f0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
13900 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  OMEM;.  memset(p
13910 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
13920 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  ;.  nName = sqli
13930 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62 46  te3Strlen30(pDbF
13940 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65  d->zPath);.  pNe
13950 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  w = sqlite3_mall
13960 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d  oc( sizeof(*pShm
13970 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20  Node) + nName + 
13980 31 37 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  17 );.  if( pNew
13990 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
139a0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
139b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
139c0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ERR_NOMEM;.  }. 
139d0 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
139e0 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b   sizeof(*pNew) +
139f0 20 6e 4e 61 6d 65 20 2b 20 31 37 29 3b 0a 20 20   nName + 17);.  
13a00 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  pNew->zFilename 
13a10 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
13a20 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ];.  sqlite3_snp
13a30 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c 20  rintf(nName+15, 
13a40 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  pNew->zFilename,
13a50 20 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46 64   "%s-shm", pDbFd
13a60 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c 69  ->zPath);.  sqli
13a70 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70  te3FileSuffix3(p
13a80 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e 65  DbFd->zPath, pNe
13a90 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 20 0a  w->zFilename); .
13aa0 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65  .  /* Look to se
13ab0 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  e if there is an
13ac0 20 65 78 69 73 74 69 6e 67 20 77 69 6e 53 68 6d   existing winShm
13ad0 4e 6f 64 65 20 74 68 61 74 20 63 61 6e 20 62 65  Node that can be
13ae0 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6e   used..  ** If n
13af0 6f 20 6d 61 74 63 68 69 6e 67 20 77 69 6e 53 68  o matching winSh
13b00 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20  mNode currently 
13b10 65 78 69 73 74 73 2c 20 63 72 65 61 74 65 20 61  exists, create a
13b20 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20   new one..  */. 
13b30 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
13b40 78 28 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d 4e  x();.  for(pShmN
13b50 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65  ode = winShmNode
13b60 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b 20  List; pShmNode; 
13b70 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64  pShmNode=pShmNod
13b80 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f  e->pNext){.    /
13b90 2a 20 54 42 44 20 6e 65 65 64 20 74 6f 20 63 6f  * TBD need to co
13ba0 6d 65 20 75 70 20 77 69 74 68 20 62 65 74 74 65  me up with bette
13bb0 72 20 6d 61 74 63 68 20 68 65 72 65 2e 20 20 50  r match here.  P
13bc0 65 72 68 61 70 73 0a 20 20 20 20 2a 2a 20 75 73  erhaps.    ** us
13bd0 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f 44  e FILE_ID_BOTH_D
13be0 49 52 5f 49 4e 46 4f 20 53 74 72 75 63 74 75 72  IR_INFO Structur
13bf0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
13c00 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
13c10 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65  (pShmNode->zFile
13c20 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c  name, pNew->zFil
13c30 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  ename)==0 ) brea
13c40 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68  k;.  }.  if( pSh
13c50 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c  mNode ){.    sql
13c60 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
13c70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53  .  }else{.    pS
13c80 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a 20  hmNode = pNew;. 
13c90 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20     pNew = 0;.   
13ca0 20 28 28 77 69 6e 46 69 6c 65 2a 29 28 26 70 53   ((winFile*)(&pS
13cb0 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29 2d  hmNode->hFile))-
13cc0 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e  >h = INVALID_HAN
13cd0 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20 70  DLE_VALUE;.    p
13ce0 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d  ShmNode->pNext =
13cf0 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b   winShmNodeList;
13d00 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65 4c  .    winShmNodeL
13d10 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a  ist = pShmNode;.
13d20 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d  .    pShmNode->m
13d30 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  utex = sqlite3_m
13d40 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
13d50 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
13d60 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
13d70 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
13d80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
13d90 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
13da0 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
13db0 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
13dc0 72 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62  rc = winOpen(pDb
13dd0 46 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20 20  Fd->pVfs,.      
13de0 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e             pShmN
13df0 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ode->zFilename, 
13e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
13e10 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
13e20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20 20  (UTF-8) */.     
13e30 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
13e40 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68 6d  ite3_file*)&pShm
13e50 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a  Node->hFile,  /*
13e60 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72   File handle her
13e70 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
13e80 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
13e90 4e 5f 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f  N_WAL | SQLITE_O
13ea0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
13eb0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
13ec0 54 45 2c 20 2f 2a 20 4d 6f 64 65 20 66 6c 61 67  TE, /* Mode flag
13ed0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  s */.           
13ee0 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66        0);.    if
13ef0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
13f00 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  ){.      goto sh
13f10 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
13f20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
13f30 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65  to see if anothe
13f40 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  r process is hol
13f50 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61  ding the dead-ma
13f60 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a  n switch..    **
13f70 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74   If not, truncat
13f80 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65  e the file to ze
13f90 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20  ro length. .    
13fa0 2a 2f 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68  */.    if( winSh
13fb0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
13fc0 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b  Node, _SHM_WRLCK
13fd0 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
13fe0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
13ff0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72        rc = winTr
14000 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f  uncate((sqlite3_
14010 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65  file *)&pShmNode
14020 2d 3e 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20  ->hFile, 0);.   
14030 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
14040 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
14050 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
14060 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
14070 4d 4f 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73 74  MOPEN, osGetLast
14080 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
14090 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4f 70            "winOp
140a0 65 6e 53 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a  enShm", pDbFd->z
140b0 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Path);.      }. 
140c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
140d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
140e0 20 20 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d      winShmSystem
140f0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
14100 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53  SHM_UNLCK, WIN_S
14110 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20  HM_DMS, 1);.    
14120 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73    rc = winShmSys
14130 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
14140 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 57 49  , _SHM_RDLCK, WI
14150 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20  N_SHM_DMS, 1);. 
14160 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
14170 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f  ) goto shm_open_
14180 65 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  err;.  }..  /* M
14190 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e  ake the new conn
141a0 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f  ection a child o
141b0 66 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65  f the winShmNode
141c0 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64   */.  p->pShmNod
141d0 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69  e = pShmNode;.#i
141e0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
141f0 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d  G.  p->id = pShm
14200 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b  Node->nextShmId+
14210 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d  +;.#endif.  pShm
14220 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  Node->nRef++;.  
14230 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b  pDbFd->pShm = p;
14240 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  .  winShmLeaveMu
14250 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  tex();..  /* The
14260 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
14270 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73   on pShmNode has
14280 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
14290 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a  cremented under.
142a0 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f    ** the cover o
142b0 66 20 74 68 65 20 77 69 6e 53 68 6d 45 6e 74 65  f the winShmEnte
142c0 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20 61  rMutex() mutex a
142d0 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66  nd the pointer f
142e0 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77  rom the.  ** new
142f0 20 28 73 74 72 75 63 74 20 77 69 6e 53 68 6d 29   (struct winShm)
14300 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70   object to the p
14310 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e  ShmNode has been
14320 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69   set. All that i
14330 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64  s.  ** left to d
14340 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65  o is to link the
14350 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f   new object into
14360 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
14370 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61   starting.  ** a
14380 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  t pShmNode->pFir
14390 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65  st. This must be
143a0 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64   done while hold
143b0 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65  ing the pShmNode
143c0 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75  ->mutex .  ** mu
143d0 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  tex..  */.  sqli
143e0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
143f0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
14400 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
14410 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
14420 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  .  pShmNode->pFi
14430 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74  rst = p;.  sqlit
14440 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
14450 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
14460 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14470 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  _OK;..  /* Jump 
14480 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f  here on any erro
14490 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72  r */.shm_open_er
144a0 72 3a 0a 20 20 77 69 6e 53 68 6d 53 79 73 74 65  r:.  winShmSyste
144b0 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
144c0 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f  _SHM_UNLCK, WIN_
144d0 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 77  SHM_DMS, 1);.  w
144e0 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  inShmPurge(pDbFd
144f0 2d 3e 70 56 66 73 2c 20 30 29 3b 20 20 20 20 20  ->pVfs, 0);     
14500 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72   /* This call fr
14510 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20  ees pShmNode if 
14520 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71  required */.  sq
14530 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
14540 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
14550 65 77 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61  ew);.  winShmLea
14560 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
14570 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
14580 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74   Close a connect
14590 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65  ion to shared-me
145a0 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68  mory.  Delete th
145b0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a  e underlying .**
145c0 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65   storage if dele
145d0 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a  teFlag is true..
145e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
145f0 6e 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c  nShmUnmap(.  sql
14600 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
14610 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
14620 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ase holding shar
14630 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  ed memory */.  i
14640 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20  nt deleteFlag   
14650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c            /* Del
14660 65 74 65 20 61 66 74 65 72 20 63 6c 6f 73 69 6e  ete after closin
14670 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  g if true */.){.
14680 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64    winFile *pDbFd
14690 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ;       /* Datab
146a0 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ase holding shar
146b0 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77  ed-memory */.  w
146c0 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20  inShm *p;       
146d0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
146e0 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f  ection to be clo
146f0 73 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e  sed */.  winShmN
14700 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f  ode *pShmNode; /
14710 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
14720 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
14730 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ile */.  winShm 
14740 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 2f  **pp;          /
14750 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
14760 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  er sibling conne
14770 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44 62  ctions */..  pDb
14780 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66  Fd = (winFile*)f
14790 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e  d;.  p = pDbFd->
147a0 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pShm;.  if( p==0
147b0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
147c0 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20  _OK;.  pShmNode 
147d0 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a  = p->pShmNode;..
147e0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e    /* Remove conn
147f0 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68  ection p from th
14800 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74  e set of connect
14810 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a  ions associated.
14820 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f    ** with pShmNo
14830 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
14840 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
14850 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
14860 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65  for(pp=&pShmNode
14870 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21  ->pFirst; (*pp)!
14880 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d  =p; pp = &(*pp)-
14890 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20  >pNext){}.  *pp 
148a0 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f  = p->pNext;..  /
148b0 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65  * Free the conne
148c0 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c  ction p */.  sql
148d0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
148e0 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b  pDbFd->pShm = 0;
148f0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
14900 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
14910 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49  >mutex);..  /* I
14920 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  f pShmNode->nRef
14930 20 68 61 73 20 72 65 61 63 68 65 64 20 30 2c 20   has reached 0, 
14940 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75  then close the u
14950 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73  nderlying.  ** s
14960 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
14970 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53  e, too */.  winS
14980 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  hmEnterMutex();.
14990 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
149a0 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  de->nRef>0 );.  
149b0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d  pShmNode->nRef--
149c0 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ;.  if( pShmNode
149d0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
149e0 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62   winShmPurge(pDb
149f0 46 64 2d 3e 70 56 66 73 2c 20 64 65 6c 65 74 65  Fd->pVfs, delete
14a00 46 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 77 69 6e  Flag);.  }.  win
14a10 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
14a20 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
14a30 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
14a40 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73  hange the lock s
14a50 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65  tate for a share
14a60 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
14a70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14a80 77 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71  winShmLock(.  sq
14a90 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
14aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
14ab0 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e  base file holdin
14ac0 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
14ad0 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  ory */.  int ofs
14ae0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
14af0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63      /* First loc
14b00 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  k to acquire or 
14b10 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
14b20 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   n,             
14b30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
14b40 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63  r of locks to ac
14b50 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65  quire or release
14b60 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
14b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b80 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
14b90 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a  ith the lock */.
14ba0 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44  ){.  winFile *pD
14bb0 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  bFd = (winFile*)
14bc0 66 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  fd;        /* Co
14bd0 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67  nnection holding
14be0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
14bf0 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20  /.  winShm *p = 
14c00 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20  pDbFd->pShm;    
14c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14c20 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62   shared memory b
14c30 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20  eing locked */. 
14c40 20 77 69 6e 53 68 6d 20 2a 70 58 3b 20 20 20 20   winShm *pX;    
14c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c60 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
14c70 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73  oping over all s
14c80 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 77 69 6e  iblings */.  win
14c90 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
14ca0 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
14cb0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14cc0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
14cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
14ce0 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  lt code */.  u16
14cf0 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20   mask;          
14d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d10 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f     /* Mask of lo
14d20 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72  cks to take or r
14d30 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73  elease */..  ass
14d40 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20  ert( ofst>=0 && 
14d50 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53  ofst+n<=SQLITE_S
14d60 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  HM_NLOCK );.  as
14d70 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20  sert( n>=1 );.  
14d80 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28  assert( flags==(
14d90 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
14da0 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  | SQLITE_SHM_SHA
14db0 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  RED).       || f
14dc0 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
14dd0 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  M_LOCK | SQLITE_
14de0 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20  SHM_EXCLUSIVE). 
14df0 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
14e00 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  (SQLITE_SHM_UNLO
14e10 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
14e20 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c  SHARED).       |
14e30 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
14e40 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
14e50 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
14e60 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  VE) );.  assert(
14e70 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20   n==1 || (flags 
14e80 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  & SQLITE_SHM_EXC
14e90 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a 20  LUSIVE)!=0 );.. 
14ea0 20 6d 61 73 6b 20 3d 20 28 75 31 36 29 28 28 31   mask = (u16)((1
14eb0 55 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28  U<<(ofst+n)) - (
14ec0 31 55 3c 3c 6f 66 73 74 29 29 3b 0a 20 20 61 73  1U<<ofst));.  as
14ed0 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73  sert( n>1 || mas
14ee0 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a  k==(1<<ofst) );.
14ef0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
14f00 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
14f10 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c  mutex);.  if( fl
14f20 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
14f30 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75  _UNLOCK ){.    u
14f40 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20  16 allMask = 0; 
14f50 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73  /* Mask of locks
14f60 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
14f70 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65  s */..    /* See
14f80 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73   if any siblings
14f90 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20   hold this same 
14fa0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28  lock */.    for(
14fb0 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
14fc0 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
14fd0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
14fe0 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e  ( pX==p ) contin
14ff0 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ue;.      assert
15000 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
15010 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70  & (p->exclMask|p
15020 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d  ->sharedMask))==
15030 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61  0 );.      allMa
15040 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64  sk |= pX->shared
15050 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Mask;.    }..   
15060 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73   /* Unlock the s
15070 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b  ystem-level lock
15080 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61  s */.    if( (ma
15090 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30  sk & allMask)==0
150a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
150b0 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
150c0 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55  pShmNode, _SHM_U
150d0 4e 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53  NLCK, ofst+WIN_S
150e0 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
150f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
15100 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
15110 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f    }..    /* Undo
15120 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73   the local locks
15130 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
15140 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15150 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26     p->exclMask &
15160 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  = ~mask;.      p
15170 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20  ->sharedMask &= 
15180 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20  ~mask;.    } .  
15190 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
151a0 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  & SQLITE_SHM_SHA
151b0 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61  RED ){.    u16 a
151c0 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f  llShared = 0;  /
151d0 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73  * Union of locks
151e0 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
151f0 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20  ions other than 
15200 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  "p" */..    /* F
15210 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68  ind out which sh
15220 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61  ared locks are a
15230 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73  lready held by s
15240 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
15250 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e  ns..    ** If an
15260 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64  y sibling alread
15270 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75  y holds an exclu
15280 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68  sive lock, go ah
15290 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ead and return. 
152a0 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53     ** SQLITE_BUS
152b0 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  Y..    */.    fo
152c0 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
152d0 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
152e0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
152f0 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  if( (pX->exclMas
15300 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a  k & mask)!=0 ){.
15310 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
15320 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
15330 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
15340 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64  .      allShared
15350 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
15360 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
15370 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63  * Get shared loc
15380 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d  ks at the system
15390 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73   level, if neces
153a0 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20  sary */.    if( 
153b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
153c0 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53  .      if( (allS
153d0 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30  hared & mask)==0
153e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
153f0 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
15400 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
15410 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e  _RDLCK, ofst+WIN
15420 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
15430 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15440 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15450 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
15460 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68  }..    /* Get th
15470 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c  e local shared l
15480 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
15490 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
154a0 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
154b0 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
154c0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
154d0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f   /* Make sure no
154e0 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
154f0 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20  ions hold locks 
15500 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20  that will block 
15510 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  this.    ** lock
15520 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65  .  If any do, re
15530 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
15540 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20   right away..   
15550 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
15560 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
15570 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
15580 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
15590 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
155a0 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73  sk)!=0 || (pX->s
155b0 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b  haredMask & mask
155c0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
155d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
155e0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
155f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15600 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65   .    /* Get the
15610 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
15620 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
15630 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73  evel.  Then if s
15640 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a  uccessful.    **
15650 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c   also mark the l
15660 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ocal connection 
15670 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e  as being locked.
15680 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
15690 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
156a0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53  .      rc = winS
156b0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
156c0 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43  mNode, _SHM_WRLC
156d0 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f  K, ofst+WIN_SHM_
156e0 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
156f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15700 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
15710 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d  ert( (p->sharedM
15720 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
15730 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63  ;.        p->exc
15740 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
15750 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15760 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
15770 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
15780 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41  >mutex);.  OSTRA
15790 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68  CE(("SHM-LOCK sh
157a0 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67  mid-%d, pid-%d g
157b0 6f 74 20 25 30 33 78 2c 25 30 33 78 20 25 73 5c  ot %03x,%03x %s\
157c0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
157d0 2d 3e 69 64 2c 20 28 69 6e 74 29 6f 73 47 65 74  ->id, (int)osGet
157e0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
157f0 28 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73  (), p->sharedMas
15800 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c 0a  k, p->exclMask,.
15810 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3f 20             rc ? 
15820 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29  "failed" : "ok")
15830 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
15840 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
15850 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72  nt a memory barr
15860 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65  ier or memory fe
15870 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65  nce on shared me
15880 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c  mory.  .**.** Al
15890 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72  l loads and stor
158a0 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20  es begun before 
158b0 74 68 65 20 62 61 72 72 69 65 72 20 6d 75 73 74  the barrier must
158c0 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65   complete before
158d0 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20  .** any load or 
158e0 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65  store begun afte
158f0 72 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a  r the barrier..*
15900 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
15910 6e 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73  nShmBarrier(.  s
15920 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20  qlite3_file *fd 
15930 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
15940 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  base holding the
15950 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
15960 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  /.){.  UNUSED_PA
15970 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 2f  RAMETER(fd);.  /
15980 2a 20 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 28  * MemoryBarrier(
15990 29 3b 20 2f 2f 20 64 6f 65 73 20 6e 6f 74 20 77  ); // does not w
159a0 6f 72 6b 20 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e  ork -- do not kn
159b0 6f 77 20 77 68 79 20 6e 6f 74 20 2a 2f 0a 20 20  ow why not */.  
159c0 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
159d0 28 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76  ();.  winShmLeav
159e0 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a  eMutex();.}../*.
159f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
15a00 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
15a10 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
15a20 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e  o region iRegion
15a30 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72   of the .** shar
15a40 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ed-memory associ
15a50 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61  ated with the da
15a60 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20  tabase file fd. 
15a70 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  Shared-memory re
15a80 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75  gions .** are nu
15a90 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20  mbered starting 
15aa0 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20  from zero. Each 
15ab0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
15ac0 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e  gion is szRegion
15ad0 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69   .** bytes in si
15ae0 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ze..**.** If an 
15af0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
15b00 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
15b10 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20  eturned and *pp 
15b20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
15b30 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
15b40 20 69 66 20 74 68 65 20 69 73 57 72 69 74 65 20   if the isWrite 
15b50 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 61  parameter is 0 a
15b60 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
15b70 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a   shared-memory.*
15b80 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  * region has not
15b90 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
15ba0 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20  (by any client, 
15bb0 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75  including one ru
15bc0 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65  nning in a.** se
15bd0 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c  parate process),
15be0 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74   then *pp is set
15bf0 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c   to NULL and SQL
15c00 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
15c10 20 49 66 20 0a 2a 2a 20 69 73 57 72 69 74 65 20   If .** isWrite 
15c20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20  is non-zero and 
15c30 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68  the requested sh
15c40 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
15c50 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a  on has not yet .
15c60 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ** been allocate
15c70 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74  d, it is allocat
15c80 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
15c90 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
15ca0 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
15cb0 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  region has alrea
15cc0 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
15cd0 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  d or is allocate
15ce0 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c  d by.** this cal
15cf0 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  l as described a
15d00 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73  bove, then it is
15d10 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69   mapped into thi
15d20 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20  s processes .** 
15d30 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28 69  address space (i
15d40 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
15d50 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74  ady), *pp is set
15d60 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
15d70 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f   mapped .** memo
15d80 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ry and SQLITE_OK
15d90 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
15da0 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d  atic int winShmM
15db0 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
15dc0 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
15dd0 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
15de0 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65  open on database
15df0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69   file */.  int i
15e00 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20  Region,         
15e10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
15e20 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65  gion to retrieve
15e30 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69   */.  int szRegi
15e40 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
15e50 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
15e60 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   regions */.  in
15e70 74 20 69 73 57 72 69 74 65 2c 20 20 20 20 20 20  t isWrite,      
15e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15e90 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20   True to extend 
15ea0 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72  file if necessar
15eb0 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61  y */.  void vola
15ec0 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20  tile **pp       
15ed0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d         /* OUT: M
15ee0 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  apped memory */.
15ef0 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44  ){.  winFile *pD
15f00 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  bFd = (winFile*)
15f10 66 64 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20  fd;.  winShm *p 
15f20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
15f30 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
15f40 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20  mNode;.  int rc 
15f50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
15f60 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 63  if( !p ){.    rc
15f70 20 3d 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64   = winOpenShared
15f80 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20  Memory(pDbFd);. 
15f90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
15fa0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
15fb0 3b 0a 20 20 20 20 70 20 3d 20 70 44 62 46 64 2d  ;.    p = pDbFd-
15fc0 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20 20 70 53 68  >pShm;.  }.  pSh
15fd0 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
15fe0 6f 64 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ode;..  sqlite3_
15ff0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
16000 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
16010 61 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e  assert( szRegion
16020 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65  ==pShmNode->szRe
16030 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65  gion || pShmNode
16040 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a  ->nRegion==0 );.
16050 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
16060 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f  >nRegion<=iRegio
16070 6e 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  n ){.    struct 
16080 53 68 6d 52 65 67 69 6f 6e 20 2a 61 70 4e 65 77  ShmRegion *apNew
16090 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
160a0 65 77 20 61 52 65 67 69 6f 6e 5b 5d 20 61 72 72  ew aRegion[] arr
160b0 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  ay */.    int nB
160c0 79 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31  yte = (iRegion+1
160d0 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20  )*szRegion;  /* 
160e0 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64  Minimum required
160f0 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20   file size */.  
16100 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
16110 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sz;             
16120 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
16130 73 69 7a 65 20 6f 66 20 77 61 6c 2d 69 6e 64 65  size of wal-inde
16140 78 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 70  x file */..    p
16150 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f  ShmNode->szRegio
16160 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20  n = szRegion;.. 
16170 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
16180 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f  ted region is no
16190 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  t mapped into th
161a0 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64  is processes add
161b0 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20  ress space..    
161c0 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
161d0 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 61  if it has been a
161e0 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69  llocated (i.e. i
161f0 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20  f the wal-index 
16200 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c  file is.    ** l
16210 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63  arge enough to c
16220 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75 65  ontain the reque
16230 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20  sted region)..  
16240 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 69    */.    rc = wi
16250 6e 46 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74  nFileSize((sqlit
16260 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e  e3_file *)&pShmN
16270 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 26 73 7a 29  ode->hFile, &sz)
16280 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
16290 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
162a0 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
162b0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
162c0 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73  HMSIZE, osGetLas
162d0 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
162e0 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d           "winShm
162f0 4d 61 70 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50  Map1", pDbFd->zP
16300 61 74 68 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ath);.      goto
16310 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
16320 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c    }..    if( sz<
16330 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 2f  nByte ){.      /
16340 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
16350 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f  memory region do
16360 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66  es not exist. If
16370 20 69 73 57 72 69 74 65 20 69 73 20 73 65 74 20   isWrite is set 
16380 74 6f 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  to.      ** zero
16390 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70  , exit early. *p
163a0 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  p will be set to
163b0 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
163c0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20  _OK returned..  
163d0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
163e0 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69  Alternatively, i
163f0 66 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e  f isWrite is non
16400 2d 7a 65 72 6f 2c 20 75 73 65 20 66 74 72 75 6e  -zero, use ftrun
16410 63 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61  cate() to alloca
16420 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  te.      ** the 
16430 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
16440 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a   region..      *
16450 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 57  /.      if( !isW
16460 72 69 74 65 20 29 20 67 6f 74 6f 20 73 68 6d 70  rite ) goto shmp
16470 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72  age_out;.      r
16480 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28  c = winTruncate(
16490 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
164a0 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
164b0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
164c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
164d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
164e0 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
164f0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
16500 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  ZE, osGetLastErr
16510 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
16520 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61         "winShmMa
16530 70 32 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  p2", pDbFd->zPat
16540 68 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  h);.        goto
16550 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
16560 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
16570 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75   /* Map the requ
16580 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
16590 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ion into this pr
165a0 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20  ocesses address 
165b0 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70  space. */.    ap
165c0 4e 65 77 20 3d 20 28 73 74 72 75 63 74 20 53 68  New = (struct Sh
165d0 6d 52 65 67 69 6f 6e 20 2a 29 73 71 6c 69 74 65  mRegion *)sqlite
165e0 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  3_realloc(.     
165f0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65     pShmNode->aRe
16600 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31  gion, (iRegion+1
16610 29 2a 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b 30  )*sizeof(apNew[0
16620 5d 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  ]).    );.    if
16630 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20  ( !apNew ){.    
16640 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
16650 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ERR_NOMEM;.     
16660 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
16670 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68  t;.    }.    pSh
16680 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 20 3d  mNode->aRegion =
16690 20 61 70 4e 65 77 3b 0a 0a 20 20 20 20 77 68 69   apNew;..    whi
166a0 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  le( pShmNode->nR
166b0 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29  egion<=iRegion )
166c0 7b 0a 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68  {.      HANDLE h
166d0 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Map;            
166e0 20 20 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70 70      /* file-mapp
166f0 69 6e 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ing handle */.  
16700 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 20 3d      void *pMap =
16710 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
16720 2f 2a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79  /* Mapped memory
16730 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 20 20 20   region */.     
16740 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73  .      hMap = os
16750 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
16760 67 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  g(pShmNode->hFil
16770 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  e.h, .          
16780 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57  NULL, PAGE_READW
16790 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20  RITE, 0, nByte, 
167a0 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 20 20  NULL.      );.  
167b0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48      OSTRACE(("SH
167c0 4d 2d 4d 41 50 20 70 69 64 2d 25 64 20 63 72 65  M-MAP pid-%d cre
167d0 61 74 65 20 72 65 67 69 6f 6e 3d 25 64 20 6e 62  ate region=%d nb
167e0 79 74 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20  yte=%d %s\n",.  
167f0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
16800 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  t)osGetCurrentPr
16810 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e  ocessId(), pShmN
16820 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 6e 42  ode->nRegion, nB
16830 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  yte,.           
16840 20 20 20 20 68 4d 61 70 20 3f 20 22 6f 6b 22 20      hMap ? "ok" 
16850 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
16860 20 20 20 20 69 66 28 20 68 4d 61 70 20 29 7b 0a      if( hMap ){.
16870 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66          int iOff
16880 73 65 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  set = pShmNode->
16890 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e  nRegion*szRegion
168a0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f  ;.        int iO
168b0 66 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66  ffsetShift = iOf
168c0 66 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66  fset % winSysInf
168d0 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72  o.dwAllocationGr
168e0 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20 20 20  anularity;.     
168f0 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56     pMap = osMapV
16900 69 65 77 4f 66 46 69 6c 65 28 68 4d 61 70 2c 20  iewOfFile(hMap, 
16910 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c  FILE_MAP_WRITE |
16920 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a   FILE_MAP_READ,.
16930 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 69              0, i
16940 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74  Offset - iOffset
16950 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20  Shift, szRegion 
16960 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20  + iOffsetShift. 
16970 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
16980 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
16990 4d 41 50 20 70 69 64 2d 25 64 20 6d 61 70 20 72  MAP pid-%d map r
169a0 65 67 69 6f 6e 3d 25 64 20 6f 66 66 73 65 74 3d  egion=%d offset=
169b0 25 64 20 73 69 7a 65 3d 25 64 20 25 73 5c 6e 22  %d size=%d %s\n"
169c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
169d0 20 20 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72     (int)osGetCur
169e0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
169f0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
16a00 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20 20 20  on, iOffset,.   
16a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a                sz
16a20 52 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22  Region, pMap ? "
16a30 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
16a40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16a50 69 66 28 20 21 70 4d 61 70 20 29 7b 0a 20 20 20  if( !pMap ){.   
16a60 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c       pShmNode->l
16a70 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
16a80 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
16a90 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
16aa0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
16ab0 52 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e  RR_SHMMAP, pShmN
16ac0 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ode->lastErrno,.
16ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ae0 20 22 77 69 6e 53 68 6d 4d 61 70 33 22 2c 20 70   "winShmMap3", p
16af0 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
16b00 20 20 20 20 20 20 69 66 28 20 68 4d 61 70 20 29        if( hMap )
16b10 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68   osCloseHandle(h
16b20 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  Map);.        go
16b30 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
16b40 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
16b50 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
16b60 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  [pShmNode->nRegi
16b70 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d 61 70 3b  on].pMap = pMap;
16b80 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
16b90 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64  >aRegion[pShmNod
16ba0 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d 61 70  e->nRegion].hMap
16bb0 20 3d 20 68 4d 61 70 3b 0a 20 20 20 20 20 20 70   = hMap;.      p
16bc0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
16bd0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73  ++;.    }.  }..s
16be0 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66  hmpage_out:.  if
16bf0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
16c00 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20  ion>iRegion ){. 
16c10 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d     int iOffset =
16c20 20 69 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f   iRegion*szRegio
16c30 6e 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73  n;.    int iOffs
16c40 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65  etShift = iOffse
16c50 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64  t % winSysInfo.d
16c60 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75  wAllocationGranu
16c70 6c 61 72 69 74 79 3b 0a 20 20 20 20 63 68 61 72  larity;.    char
16c80 20 2a 70 20 3d 20 28 63 68 61 72 20 2a 29 70 53   *p = (char *)pS
16c90 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b  hmNode->aRegion[
16ca0 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a 20  iRegion].pMap;. 
16cb0 20 20 20 2a 70 70 20 3d 20 28 76 6f 69 64 20 2a     *pp = (void *
16cc0 29 26 70 5b 69 4f 66 66 73 65 74 53 68 69 66 74  )&p[iOffsetShift
16cd0 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
16ce0 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  *pp = 0;.  }.  s
16cf0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
16d00 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
16d10 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
16d20 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66  ;.}..#else.# def
16d30 69 6e 65 20 77 69 6e 53 68 6d 4d 61 70 20 20 20  ine winShmMap   
16d40 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e    0.# define win
16d50 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64  ShmLock    0.# d
16d60 65 66 69 6e 65 20 77 69 6e 53 68 6d 42 61 72 72  efine winShmBarr
16d70 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20 77  ier 0.# define w
16d80 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23  inShmUnmap   0.#
16d90 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
16da0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
16db0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20   */../*.** Here 
16dc0 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ends the impleme
16dd0 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73  ntation of all s
16de0 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
16df0 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ods..**.********
16e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
16e10 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nd sqlite3_file 
16e20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  Methods ********
16e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e40 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
16e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e90 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  ******/../*.** T
16ea0 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e  his vector defin
16eb0 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f  es all the metho
16ec0 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72  ds that can oper
16ed0 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c  ate on an.** sql
16ee0 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77 69  ite3_file for wi
16ef0 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  n32..*/.static c
16f00 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
16f10 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74  methods winIoMet
16f20 68 6f 64 20 3d 20 7b 0a 20 20 32 2c 20 20 20 20  hod = {.  2,    
16f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
16f50 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c  rsion */.  winCl
16f60 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
16f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
16f80 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61  lose */.  winRea
16f90 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
16fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
16fb0 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65  ad */.  winWrite
16fc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16fd0 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74          /* xWrit
16fe0 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61  e */.  winTrunca
16ff0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
17000 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63         /* xTrunc
17010 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63  ate */.  winSync
17020 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17030 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e           /* xSyn
17040 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69  c */.  winFileSi
17050 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
17060 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53         /* xFileS
17070 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b  ize */.  winLock
17080 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17090 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
170a0 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b  k */.  winUnlock
170b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
170c0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
170d0 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b 52  k */.  winCheckR
170e0 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
170f0 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b         /* xCheck
17100 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a  ReservedLock */.
17110 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c    winFileControl
17120 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17130 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f    /* xFileContro
17140 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72  l */.  winSector
17150 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
17160 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f         /* xSecto
17170 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65  rSize */.  winDe
17180 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
17190 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 44  ics,       /* xD
171a0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
171b0 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  tics */.  winShm
171c0 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  Map,            
171d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
171e0 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  mMap */.  winShm
171f0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
17200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
17210 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68  mLock */.  winSh
17220 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20  mBarrier,       
17230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
17240 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 77  hmBarrier */.  w
17250 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 20 20 20  inShmUnmap      
17260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17270 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 7d  * xShmUnmap */.}
17280 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;../************
17290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
172a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
172b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
172c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
172d0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
172e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71  ************* sq
172f0 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
17300 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
17310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
17320 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
17330 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
17340 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
17350 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65  f methods on the
17360 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  .** sqlite3_vfs 
17370 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  object..*/../*.*
17380 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d  * Convert a UTF-
17390 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20  8 filename into 
173a0 77 68 61 74 65 76 65 72 20 66 6f 72 6d 20 74 68  whatever form th
173b0 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20  e underlying.** 
173c0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
173d0 20 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73   wants filenames
173e0 20 69 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68   in.  Space to h
173f0 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  old the result.*
17400 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  * is obtained fr
17410 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75  om malloc and mu
17420 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
17430 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
17440 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
17450 63 20 76 6f 69 64 20 2a 63 6f 6e 76 65 72 74 55  c void *convertU
17460 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73  tf8Filename(cons
17470 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
17480 65 29 7b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  e){.  void *zCon
17490 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66  verted = 0;.  if
174a0 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
174b0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 75 74 66  zConverted = utf
174c0 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  8ToUnicode(zFile
174d0 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65  name);.  }.#ifde
174e0 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
174f0 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
17500 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
17510 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75   sqlite3_win32_u
17520 74 66 38 5f 74 6f 5f 6d 62 63 73 28 7a 46 69 6c  tf8_to_mbcs(zFil
17530 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64  ename);.  }.#end
17540 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77  if.  /* caller w
17550 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f  ill handle out o
17560 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65  f memory */.  re
17570 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b  turn zConverted;
17580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
17590 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
175a0 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20  e name in zBuf. 
175b0 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 62 69   zBuf must be bi
175c0 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 68  g enough to.** h
175d0 6f 6c 64 20 61 74 20 70 56 66 73 2d 3e 6d 78 50  old at pVfs->mxP
175e0 61 74 68 6e 61 6d 65 20 63 68 61 72 61 63 74 65  athname characte
175f0 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
17600 74 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e  t getTempname(in
17610 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
17620 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  uf){.  static ch
17630 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20  ar zChars[] =.  
17640 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d    "abcdefghijklm
17650 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20  nopqrstuvwxyz". 
17660 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c     "ABCDEFGHIJKL
17670 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a  MNOPQRSTUVWXYZ".
17680 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22      "0123456789"
17690 3b 0a 20 20 73 69 7a 65 5f 74 20 69 2c 20 6a 3b  ;.  size_t i, j;
176a0 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 50 61 74  .  char zTempPat
176b0 68 5b 4d 41 58 5f 50 41 54 48 2b 32 5d 3b 0a 0a  h[MAX_PATH+2];..
176c0 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
176d0 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
176e0 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
176f0 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
17700 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
17710 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
17720 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
17730 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
17740 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
17750 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
17760 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  g. .  */.  Simul
17770 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
17780 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  rn SQLITE_IOERR 
17790 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  );..  if( sqlite
177a0 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
177b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
177c0 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
177d0 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c  H-30, zTempPath,
177e0 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 74   "%s", sqlite3_t
177f0 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a  emp_directory);.
17800 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 54    }else if( isNT
17810 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  () ){.    char *
17820 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 57 43 48 41  zMulti;.    WCHA
17830 52 20 7a 57 69 64 65 50 61 74 68 5b 4d 41 58 5f  R zWidePath[MAX_
17840 50 41 54 48 5d 3b 0a 20 20 20 20 6f 73 47 65 74  PATH];.    osGet
17850 54 65 6d 70 50 61 74 68 57 28 4d 41 58 5f 50 41  TempPathW(MAX_PA
17860 54 48 2d 33 30 2c 20 7a 57 69 64 65 50 61 74 68  TH-30, zWidePath
17870 29 3b 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20  );.    zMulti = 
17880 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 57  unicodeToUtf8(zW
17890 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 69 66  idePath);.    if
178a0 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20  ( zMulti ){.    
178b0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
178c0 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20  tf(MAX_PATH-30, 
178d0 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c  zTempPath, "%s",
178e0 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20   zMulti);.      
178f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 75  sqlite3_free(zMu
17900 6c 74 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  lti);.    }else{
17910 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
17920 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
17930 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64  ;.    }.  }.#ifd
17940 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
17950 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
17960 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38  .    char *zUtf8
17970 3b 0a 20 20 20 20 63 68 61 72 20 7a 4d 62 63 73  ;.    char zMbcs
17980 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a  Path[MAX_PATH];.
17990 20 20 20 20 6f 73 47 65 74 54 65 6d 70 50 61 74      osGetTempPat
179a0 68 41 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20  hA(MAX_PATH-30, 
179b0 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20  zMbcsPath);.    
179c0 7a 55 74 66 38 20 3d 20 73 71 6c 69 74 65 33 5f  zUtf8 = sqlite3_
179d0 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74  win32_mbcs_to_ut
179e0 66 38 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20  f8(zMbcsPath);. 
179f0 20 20 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a     if( zUtf8 ){.
17a00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
17a10 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d  printf(MAX_PATH-
17a20 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22  30, zTempPath, "
17a30 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20  %s", zUtf8);.   
17a40 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
17a50 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73  zUtf8);.    }els
17a60 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
17a70 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
17a80 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  EM;.    }.  }.#e
17a90 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ndif..  /* Check
17aa0 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74   that the output
17ab0 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67 65   buffer is large
17ac0 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20   enough for the 
17ad0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a  temporary file .
17ae0 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74    ** name. If it
17af0 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20   is not, return 
17b00 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20  SQLITE_ERROR..  
17b10 2a 2f 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65  */.  if( (sqlite
17b20 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 50  3Strlen30(zTempP
17b30 61 74 68 29 20 2b 20 73 71 6c 69 74 65 33 53 74  ath) + sqlite3St
17b40 72 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f 54 45  rlen30(SQLITE_TE
17b50 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20  MP_FILE_PREFIX) 
17b60 2b 20 31 38 29 20 3e 3d 20 6e 42 75 66 20 29 7b  + 18) >= nBuf ){
17b70 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17b80 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
17b90 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 33 53 74   for(i=sqlite3St
17ba0 72 6c 65 6e 33 30 28 7a 54 65 6d 70 50 61 74 68  rlen30(zTempPath
17bb0 29 3b 20 69 3e 30 20 26 26 20 7a 54 65 6d 70 50  ); i>0 && zTempP
17bc0 61 74 68 5b 69 2d 31 5d 3d 3d 27 5c 5c 27 3b 20  ath[i-1]=='\\'; 
17bd0 69 2d 2d 29 7b 7d 0a 20 20 7a 54 65 6d 70 50 61  i--){}.  zTempPa
17be0 74 68 5b 69 5d 20 3d 20 30 3b 0a 0a 20 20 73 71  th[i] = 0;..  sq
17bf0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
17c00 42 75 66 2d 31 38 2c 20 7a 42 75 66 2c 0a 20 20  Buf-18, zBuf,.  
17c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c20 20 22 25 73 5c 5c 22 53 51 4c 49 54 45 5f 54 45   "%s\\"SQLITE_TE
17c30 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20  MP_FILE_PREFIX, 
17c40 7a 54 65 6d 70 50 61 74 68 29 3b 0a 20 20 6a 20  zTempPath);.  j 
17c50 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
17c60 30 28 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69 74  0(zBuf);.  sqlit
17c70 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35  e3_randomness(15
17c80 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66  , &zBuf[j]);.  f
17c90 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b  or(i=0; i<15; i+
17ca0 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75  +, j++){.    zBu
17cb0 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68  f[j] = (char)zCh
17cc0 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20  ars[ ((unsigned 
17cd0 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73  char)zBuf[j])%(s
17ce0 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29  izeof(zChars)-1)
17cf0 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a   ];.  }.  zBuf[j
17d00 5d 20 3d 20 30 3b 0a 20 20 7a 42 75 66 5b 6a 2b  ] = 0;.  zBuf[j+
17d10 31 5d 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41  1] = 0;..  OSTRA
17d20 43 45 28 28 22 54 45 4d 50 20 46 49 4c 45 4e 41  CE(("TEMP FILENA
17d30 4d 45 3a 20 25 73 5c 6e 22 2c 20 7a 42 75 66 29  ME: %s\n", zBuf)
17d40 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
17d50 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  TE_OK; .}../*.**
17d60 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f   Open a file..*/
17d70 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f  .static int winO
17d80 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
17d90 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
17da0 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
17db0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
17dc0 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  ame,        /* N
17dd0 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
17de0 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c  (UTF-8) */.  sql
17df0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20  ite3_file *id,  
17e00 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
17e10 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65 20  the SQLite file 
17e20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20  handle here */. 
17e30 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
17e40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
17e50 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73 20 2a 2f  en mode flags */
17e60 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67  .  int *pOutFlag
17e70 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
17e80 53 74 61 74 75 73 20 72 65 74 75 72 6e 20 66 6c  Status return fl
17e90 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44  ags */.){.  HAND
17ea0 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44 20 6c 61  LE h;.  DWORD la
17eb0 73 74 45 72 72 6e 6f 3b 0a 20 20 44 57 4f 52 44  stErrno;.  DWORD
17ec0 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
17ed0 3b 0a 20 20 44 57 4f 52 44 20 64 77 53 68 61 72  ;.  DWORD dwShar
17ee0 65 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20 64  eMode;.  DWORD d
17ef0 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
17f00 74 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64 77  tion;.  DWORD dw
17f10 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
17f20 65 73 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c 49  es = 0;.#if SQLI
17f30 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e  TE_OS_WINCE.  in
17f40 74 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23 65  t isTemp = 0;.#e
17f50 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ndif.  winFile *
17f60 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
17f70 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a 43  *)id;.  void *zC
17f80 6f 6e 76 65 72 74 65 64 3b 20 20 20 20 20 20 20  onverted;       
17f90 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61         /* Filena
17fa0 6d 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69 6e  me in OS encodin
17fb0 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  g */.  const cha
17fc0 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a  r *zUtf8Name = z
17fd0 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d  Name; /* Filenam
17fe0 65 20 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64  e in UTF-8 encod
17ff0 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ing */.  int cnt
18000 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61   = 0;..  /* If a
18010 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73  rgument zPath is
18020 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c   a NULL pointer,
18030 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
18040 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70  s required to op
18050 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72  en.  ** a tempor
18060 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68  ary file. Use th
18070 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f  is buffer to sto
18080 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  re the file name
18090 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72   in..  */.  char
180a0 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41   zTmpname[MAX_PA
180b0 54 48 2b 32 5d 3b 20 20 20 20 20 2f 2a 20 42 75  TH+2];     /* Bu
180c0 66 66 65 72 20 75 73 65 64 20 74 6f 20 63 72 65  ffer used to cre
180d0 61 74 65 20 74 65 6d 70 20 66 69 6c 65 6e 61 6d  ate temp filenam
180e0 65 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d  e */..  int rc =
180f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
18100 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
18110 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  on Return Code *
18120 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  /.#if !defined(N
18130 44 45 42 55 47 29 20 7c 7c 20 53 51 4c 49 54 45  DEBUG) || SQLITE
18140 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20  _OS_WINCE.  int 
18150 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78  eType = flags&0x
18160 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79  FFFFFF00;  /* Ty
18170 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70  pe of file to op
18180 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  en */.#endif..  
18190 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20  int isExclusive 
181a0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
181b0 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
181c0 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65  E);.  int isDele
181d0 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
181e0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
181f0 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20  LETEONCLOSE);.  
18200 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20  int isCreate    
18210 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
18220 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
18230 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
18240 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
18250 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
18260 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
18270 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 6e  LY);.#endif.  in
18280 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d  t isReadWrite  =
18290 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
182a0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
182b0 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ;..#ifndef NDEBU
182c0 47 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 4a 6f  G.  int isOpenJo
182d0 75 72 6e 61 6c 20 3d 20 28 69 73 43 72 65 61 74  urnal = (isCreat
182e0 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20 65  e && (.        e
182f0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
18300 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
18310 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d   .     || eType=
18320 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
18330 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  N_JOURNAL .     
18340 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
18350 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a  _OPEN_WAL.  ));.
18360 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65  #endif..  /* Che
18370 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ck the following
18380 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
18390 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a  true: .  **.  **
183a0 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f     (a) Exactly o
183b0 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52  ne of the READWR
183c0 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59  ITE and READONLY
183d0 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73   flags must be s
183e0 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20  et, and .  **   
183f0 28 62 29 20 69 66 20 43 52 45 41 54 45 20 69 73  (b) if CREATE is
18400 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57   set, then READW
18410 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  RITE must also b
18420 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20  e set, and.  ** 
18430 20 20 28 63 29 20 69 66 20 45 58 43 4c 55 53 49    (c) if EXCLUSI
18440 56 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  VE is set, then 
18450 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f  CREATE must also
18460 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20   be set..  **   
18470 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43  (d) if DELETEONC
18480 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68 65  LOSE is set, the
18490 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
184a0 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a  so be set..  */.
184b0 20 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64    assert((isRead
184c0 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61  only==0 || isRea
184d0 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69  dWrite==0) && (i
184e0 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73  sReadWrite || is
184f0 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73  Readonly));.  as
18500 73 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30  sert(isCreate==0
18510 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29   || isReadWrite)
18520 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63  ;.  assert(isExc
18530 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43  lusive==0 || isC
18540 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74  reate);.  assert
18550 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20  (isDelete==0 || 
18560 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a  isCreate);..  /*
18570 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61   The main DB, ma
18580 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20  in journal, WAL 
18590 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20  file and master 
185a0 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65  journal are neve
185b0 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  r .  ** automati
185c0 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e  cally deleted. N
185d0 6f 72 20 61 72 65 20 74 68 65 79 20 65 76 65 72  or are they ever
185e0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
185f0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
18600 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
18610 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
18620 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
18630 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
18640 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
18650 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
18660 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
18670 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73  JOURNAL );.  ass
18680 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
18690 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
186a0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
186b0 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29  MASTER_JOURNAL )
186c0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
186d0 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
186e0 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
186f0 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20  E_OPEN_WAL );.. 
18700 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
18710 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
18720 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74  has set one of t
18730 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66  he "file-type" f
18740 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72  lags. */.  asser
18750 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  t( eType==SQLITE
18760 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20  _OPEN_MAIN_DB   
18770 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
18780 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
18790 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
187a0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
187b0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65  AIN_JOURNAL || e
187c0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
187d0 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a  N_TEMP_JOURNAL .
187e0 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
187f0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42  =SQLITE_OPEN_SUB
18800 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79  JOURNAL   || eTy
18810 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
18820 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a  MASTER_JOURNAL .
18830 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
18840 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41  =SQLITE_OPEN_TRA
18850 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79  NSIENT_DB || eTy
18860 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
18870 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65  WAL.  );..  asse
18880 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 55  rt( id!=0 );.  U
18890 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
188a0 70 56 66 73 29 3b 0a 0a 20 20 70 46 69 6c 65 2d  pVfs);..  pFile-
188b0 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e  >h = INVALID_HAN
188c0 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 20 20 2f 2a  DLE_VALUE;..  /*
188d0 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
188e0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
188f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c  function is NULL
18900 2c 20 67 65 6e 65 72 61 74 65 20 61 20 0a 20 20  , generate a .  
18910 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ** temporary fil
18920 65 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 0a 20  e name to use . 
18930 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74 66 38   */.  if( !zUtf8
18940 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Name ){.    asse
18950 72 74 28 69 73 44 65 6c 65 74 65 20 26 26 20 21  rt(isDelete && !
18960 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  isOpenJournal);.
18970 20 20 20 20 72 63 20 3d 20 67 65 74 54 65 6d 70      rc = getTemp
18980 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 2b 32 2c  name(MAX_PATH+2,
18990 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20   zTmpname);.    
189a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
189b0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
189c0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
189d0 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d 70  zUtf8Name = zTmp
189e0 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  name;.  }..  /* 
189f0 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
18a00 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65  es are double-ze
18a10 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66  ro terminated if
18a20 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20   they are not.  
18a30 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70 61 72  ** URIs with par
18a40 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c  ameters.  Hence,
18a50 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73   they can always
18a60 20 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a   be passed into.
18a70 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69    ** sqlite3_uri
18a80 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 0a 20 20  _parameter()..  
18a90 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 65 54  */.  assert( (eT
18aa0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
18ab0 5f 4d 41 49 4e 5f 44 42 29 20 7c 7c 20 28 66 6c  _MAIN_DB) || (fl
18ac0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
18ad0 4e 5f 55 52 49 29 20 7c 7c 0a 20 20 20 20 20 20  N_URI) ||.      
18ae0 20 20 7a 55 74 66 38 4e 61 6d 65 5b 73 74 72 6c    zUtf8Name[strl
18af0 65 6e 28 7a 55 74 66 38 4e 61 6d 65 29 2b 31 5d  en(zUtf8Name)+1]
18b00 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  ==0 );..  /* Con
18b10 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e 61 6d  vert the filenam
18b20 65 20 74 6f 20 74 68 65 20 73 79 73 74 65 6d 20  e to the system 
18b30 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a  encoding. */.  z
18b40 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
18b50 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
18b60 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66  zUtf8Name);.  if
18b70 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
18b80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
18b90 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
18ba0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52  ;.  }..  if( isR
18bb0 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20  eadWrite ){.    
18bc0 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20  dwDesiredAccess 
18bd0 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c  = GENERIC_READ |
18be0 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a   GENERIC_WRITE;.
18bf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 44    }else{.    dwD
18c00 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47  esiredAccess = G
18c10 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d  ENERIC_READ;.  }
18c20 0a 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50  ..  /* SQLITE_OP
18c30 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 69 73 20  EN_EXCLUSIVE is 
18c40 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  used to make sur
18c50 65 20 74 68 61 74 20 61 20 6e 65 77 20 66 69 6c  e that a new fil
18c60 65 20 69 73 20 0a 20 20 2a 2a 20 63 72 65 61 74  e is .  ** creat
18c70 65 64 2e 20 53 51 4c 69 74 65 20 64 6f 65 73 6e  ed. SQLite doesn
18c80 27 74 20 75 73 65 20 69 74 20 74 6f 20 69 6e 64  't use it to ind
18c90 69 63 61 74 65 20 22 65 78 63 6c 75 73 69 76 65  icate "exclusive
18ca0 20 61 63 63 65 73 73 22 20 0a 20 20 2a 2a 20 61   access" .  ** a
18cb0 73 20 69 74 20 69 73 20 75 73 75 61 6c 6c 79 20  s it is usually 
18cc0 75 6e 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f  understood..  */
18cd0 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69  .  if( isExclusi
18ce0 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65  ve ){.    /* Cre
18cf0 61 74 65 73 20 61 20 6e 65 77 20 66 69 6c 65 2c  ates a new file,
18d00 20 6f 6e 6c 79 20 69 66 20 69 74 20 64 6f 65 73   only if it does
18d10 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
18d20 73 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66  st. */.    /* If
18d30 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
18d40 2c 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20  , it fails. */. 
18d50 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
18d60 70 6f 73 69 74 69 6f 6e 20 3d 20 43 52 45 41 54  position = CREAT
18d70 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69  E_NEW;.  }else i
18d80 66 28 20 69 73 43 72 65 61 74 65 20 29 7b 0a 20  f( isCreate ){. 
18d90 20 20 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74     /* Open exist
18da0 69 6e 67 20 66 69 6c 65 2c 20 6f 72 20 63 72 65  ing file, or cre
18db0 61 74 65 20 69 66 20 69 74 20 64 6f 65 73 6e 27  ate if it doesn'
18dc0 74 20 65 78 69 73 74 20 2a 2f 0a 20 20 20 20 64  t exist */.    d
18dd0 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
18de0 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41  tion = OPEN_ALWA
18df0 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  YS;.  }else{.   
18e00 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c 65   /* Opens a file
18e10 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 65 78 69  , only if it exi
18e20 73 74 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72  sts. */.    dwCr
18e30 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
18e40 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e  n = OPEN_EXISTIN
18e50 47 3b 0a 20 20 7d 0a 0a 20 20 64 77 53 68 61 72  G;.  }..  dwShar
18e60 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48 41  eMode = FILE_SHA
18e70 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53  RE_READ | FILE_S
18e80 48 41 52 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69  HARE_WRITE;..  i
18e90 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23  f( isDelete ){.#
18ea0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
18eb0 43 45 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e  CE.    dwFlagsAn
18ec0 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49  dAttributes = FI
18ed0 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44  LE_ATTRIBUTE_HID
18ee0 44 45 4e 3b 0a 20 20 20 20 69 73 54 65 6d 70 20  DEN;.    isTemp 
18ef0 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64  = 1;.#else.    d
18f00 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
18f10 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49  tes = FILE_ATTRI
18f20 42 55 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20  BUTE_TEMPORARY. 
18f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
18f50 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48  FILE_ATTRIBUTE_H
18f60 49 44 44 45 4e 0a 20 20 20 20 20 20 20 20 20 20  IDDEN.          
18f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f80 20 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47       | FILE_FLAG
18f90 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45  _DELETE_ON_CLOSE
18fa0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
18fb0 7b 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64  {.    dwFlagsAnd
18fc0 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c  Attributes = FIL
18fd0 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d  E_ATTRIBUTE_NORM
18fe0 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70  AL;.  }.  /* Rep
18ff0 6f 72 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e  orts from the in
19000 74 65 72 6e 65 74 20 61 72 65 20 74 68 61 74 20  ternet are that 
19010 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 73 20 61  performance is a
19020 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65 74 74 65  lways.  ** bette
19030 72 20 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52  r if FILE_FLAG_R
19040 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69 73 20  ANDOM_ACCESS is 
19050 75 73 65 64 2e 20 20 54 69 63 6b 65 74 20 23 32  used.  Ticket #2
19060 36 39 39 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49  699. */.#if SQLI
19070 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77  TE_OS_WINCE.  dw
19080 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
19090 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f  es |= FILE_FLAG_
190a0 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23  RANDOM_ACCESS;.#
190b0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 69 73 4e  endif..  if( isN
190c0 54 28 29 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  T() ){.    while
190d0 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46  ( (h = osCreateF
190e0 69 6c 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43  ileW((LPCWSTR)zC
190f0 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
19100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19110 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65          dwDesire
19120 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20  dAccess,.       
19130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19140 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f         dwShareMo
19150 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20  de, NULL,.      
19160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19170 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69          dwCreati
19180 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20  onDisposition,. 
19190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191a0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46               dwF
191b0 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
191c0 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
191d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191e0 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44   NULL))==INVALID
191f0 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26  _HANDLE_VALUE &&
19200 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
19220 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
19230 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a  &lastErrno) ){}.
19240 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
19250 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
19260 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 77 68 69  .  else{.    whi
19270 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74  le( (h = osCreat
19280 65 46 69 6c 65 41 28 28 4c 50 43 53 54 52 29 7a  eFileA((LPCSTR)z
19290 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
192a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192b0 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72           dwDesir
192c0 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20  edAccess,.      
192d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192e0 20 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d          dwShareM
192f0 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20  ode, NULL,.     
19300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19310 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74           dwCreat
19320 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a  ionDisposition,.
19330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
19350 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
19360 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  es,.            
19370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19380 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49    NULL))==INVALI
19390 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26  D_HANDLE_VALUE &
193a0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
193b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193c0 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  retryIoerr(&cnt,
193d0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d   &lastErrno) ){}
193e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 6c 6f  .  }.#endif.  lo
193f0 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 0a 20 20  gIoerr(cnt);..  
19400 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25  OSTRACE(("OPEN %
19410 64 20 25 73 20 30 78 25 6c 78 20 25 73 5c 6e 22  d %s 0x%lx %s\n"
19420 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 68 2c  , .           h,
19430 20 7a 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65   zName, dwDesire
19440 64 41 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20  dAccess, .      
19450 20 20 20 20 20 68 3d 3d 49 4e 56 41 4c 49 44 5f       h==INVALID_
19460 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 3f 20 22  HANDLE_VALUE ? "
19470 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29  failed" : "ok"))
19480 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41  ;..  if( h==INVA
19490 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
194a0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
194b0 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
194c0 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
194d0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
194e0 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61  TOPEN, pFile->la
194f0 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 65  stErrno, "winOpe
19500 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a  n", zUtf8Name);.
19510 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
19520 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
19530 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
19540 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76  e && !isExclusiv
19550 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
19560 6e 20 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20  n winOpen(pVfs, 
19570 7a 4e 61 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20  zName, id, .    
19580 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73           ((flags
19590 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  |SQLITE_OPEN_REA
195a0 44 4f 4e 4c 59 29 26 7e 28 53 51 4c 49 54 45 5f  DONLY)&~(SQLITE_
195b0 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49  OPEN_CREATE|SQLI
195c0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
195d0 45 29 29 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b  E)), pOutFlags);
195e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
195f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19600 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
19610 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
19620 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20  pOutFlags ){.   
19630 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
19640 20 29 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46   ){.      *pOutF
19650 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
19660 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20  EN_READWRITE;.  
19670 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
19680 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49  pOutFlags = SQLI
19690 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
196a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6d  ;.    }.  }..  m
196b0 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20  emset(pFile, 0, 
196c0 73 69 7a 65 6f 66 28 2a 70 46 69 6c 65 29 29 3b  sizeof(*pFile));
196d0 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  .  pFile->pMetho
196e0 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64  d = &winIoMethod
196f0 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68  ;.  pFile->h = h
19700 3b 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  ;.  pFile->lastE
19710 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b  rrno = NO_ERROR;
19720 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66 73 20 3d  .  pFile->pVfs =
19730 20 70 56 66 73 3b 0a 20 20 70 46 69 6c 65 2d 3e   pVfs;.  pFile->
19740 70 53 68 6d 20 3d 20 30 3b 0a 20 20 70 46 69 6c  pShm = 0;.  pFil
19750 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65  e->zPath = zName
19760 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
19770 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d  uri_boolean(zNam
19780 65 2c 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54  e, "psow", SQLIT
19790 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  E_POWERSAFE_OVER
197a0 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 70 46  WRITE) ){.    pF
197b0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
197c0 3d 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a  = WINFILE_PSOW;.
197d0 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f    }..#if SQLITE_
197e0 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66 28 20 69  OS_WINCE.  if( i
197f0 73 52 65 61 64 57 72 69 74 65 20 26 26 20 65 54  sReadWrite && eT
19800 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
19810 5f 4d 41 49 4e 5f 44 42 0a 20 20 20 20 20 20 20  _MAIN_DB.       
19820 26 26 20 21 77 69 6e 63 65 43 72 65 61 74 65 4c  && !winceCreateL
19830 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 6c 65  ock(zName, pFile
19840 29 0a 20 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f  ).  ){.    osClo
19850 73 65 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20  seHandle(h);.   
19860 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
19870 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 72  onverted);.    r
19880 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
19890 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 7d 0a  TOPEN_BKPT;.  }.
198a0 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a    if( isTemp ){.
198b0 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65      pFile->zDele
198c0 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e  teOnClose = zCon
198d0 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a  verted;.  }else.
198e0 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73  #endif.  {.    s
198f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
19900 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 0a 20 20  verted);.  }..  
19910 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b  OpenCounter(+1);
19920 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19930 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
19940 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a  e named file..**
19950 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 57 69  .** Note that Wi
19960 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61  ndows does not a
19970 6c 6c 6f 77 20 61 20 66 69 6c 65 20 74 6f 20 62  llow a file to b
19980 65 20 64 65 6c 65 74 65 64 20 69 66 20 73 6f 6d  e deleted if som
19990 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65  e other.** proce
199a0 73 73 20 68 61 73 20 69 74 20 6f 70 65 6e 2e 20  ss has it open. 
199b0 20 53 6f 6d 65 74 69 6d 65 73 20 61 20 76 69 72   Sometimes a vir
199c0 75 73 20 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e  us scanner or in
199d0 64 65 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a  dexing program.*
199e0 2a 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f  * will open a jo
199f0 75 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72 74  urnal file short
19a00 6c 79 20 61 66 74 65 72 20 69 74 20 69 73 20 63  ly after it is c
19a10 72 65 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  reated in order 
19a20 74 6f 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65  to do.** whateve
19a30 72 20 69 74 20 64 6f 65 73 2e 20 20 57 68 69 6c  r it does.  Whil
19a40 65 20 74 68 69 73 20 6f 74 68 65 72 20 70 72 6f  e this other pro
19a50 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
19a60 74 68 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e  the.** file open
19a70 2c 20 77 65 20 77 69 6c 6c 20 62 65 20 75 6e 61  , we will be una
19a80 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 69 74  ble to delete it
19a90 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  .  To work aroun
19aa0 64 20 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65  d this.** proble
19ab0 6d 2c 20 77 65 20 64 65 6c 61 79 20 31 30 30 20  m, we delay 100 
19ac0 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64  milliseconds and
19ad0 20 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20 61   try to delete a
19ae0 67 61 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20  gain.  Up.** to 
19af0 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45  MX_DELETION_ATTE
19b00 4d 50 54 73 20 64 65 6c 65 74 69 6f 6e 20 61 74  MPTs deletion at
19b10 74 65 6d 70 74 73 20 61 72 65 20 72 75 6e 20 62  tempts are run b
19b20 65 66 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20  efore giving.** 
19b30 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67  up and returning
19b40 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74   an error..*/.st
19b50 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65  atic int winDele
19b60 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  te(.  sqlite3_vf
19b70 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
19b80 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e    /* Not used on
19b90 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73   win32 */.  cons
19ba0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
19bb0 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  e,      /* Name 
19bc0 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74  of file to delet
19bd0 65 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44  e */.  int syncD
19be0 69 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ir              
19bf0 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f     /* Not used o
19c00 6e 20 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20  n win32 */.){.  
19c10 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  int cnt = 0;.  i
19c20 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 6c  nt rc;.  DWORD l
19c30 61 73 74 45 72 72 6e 6f 3b 0a 20 20 76 6f 69 64  astErrno;.  void
19c40 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20   *zConverted;.  
19c50 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
19c60 28 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44  (pVfs);.  UNUSED
19c70 5f 50 41 52 41 4d 45 54 45 52 28 73 79 6e 63 44  _PARAMETER(syncD
19c80 69 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  ir);..  Simulate
19c90 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
19ca0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
19cb0 54 45 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65  TE);.  zConverte
19cc0 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46  d = convertUtf8F
19cd0 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  ilename(zFilenam
19ce0 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
19cf0 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rted==0 ){.    r
19d00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
19d10 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  RR_NOMEM;.  }.  
19d20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
19d30 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 77 68    rc = 1;.    wh
19d40 69 6c 65 28 20 6f 73 47 65 74 46 69 6c 65 41 74  ile( osGetFileAt
19d50 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65  tributesW(zConve
19d60 72 74 65 64 29 21 3d 49 4e 56 41 4c 49 44 5f 46  rted)!=INVALID_F
19d70 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 26  ILE_ATTRIBUTES &
19d80 26 0a 20 20 20 20 20 20 20 20 20 28 72 63 20 3d  &.         (rc =
19d90 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28 7a   osDeleteFileW(z
19da0 43 6f 6e 76 65 72 74 65 64 29 29 3d 3d 30 20 26  Converted))==0 &
19db0 26 20 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e  & retryIoerr(&cn
19dc0 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
19dd0 7b 7d 0a 20 20 20 20 72 63 20 3d 20 72 63 20 3f  {}.    rc = rc ?
19de0 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
19df0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23  ITE_ERROR;.  }.#
19e00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
19e10 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
19e20 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  se{.    rc = 1;.
19e30 20 20 20 20 77 68 69 6c 65 28 20 6f 73 47 65 74      while( osGet
19e40 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28  FileAttributesA(
19e50 7a 43 6f 6e 76 65 72 74 65 64 29 21 3d 49 4e 56  zConverted)!=INV
19e60 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
19e70 55 54 45 53 20 26 26 0a 20 20 20 20 20 20 20 20  UTES &&.        
19e80 20 28 72 63 20 3d 20 6f 73 44 65 6c 65 74 65 46   (rc = osDeleteF
19e90 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65 64 29  ileA(zConverted)
19ea0 29 3d 3d 30 20 26 26 20 72 65 74 72 79 49 6f 65  )==0 && retryIoe
19eb0 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
19ec0 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 72 63 20  rno) ){}.    rc 
19ed0 3d 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  = rc ? SQLITE_OK
19ee0 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
19ef0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
19f00 28 20 72 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  ( rc ){.    rc =
19f10 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
19f20 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
19f30 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  , lastErrno,.   
19f40 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 44 65            "winDe
19f50 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  lete", zFilename
19f60 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
19f70 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20  logIoerr(cnt);. 
19f80 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
19f90 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
19fa0 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45 54   OSTRACE(("DELET
19fb0 45 20 5c 22 25 73 5c 22 20 25 73 5c 6e 22 2c 20  E \"%s\" %s\n", 
19fc0 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 72 63 20 3f  zFilename, (rc ?
19fd0 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22   "failed" : "ok"
19fe0 20 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72   )));.  return r
19ff0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  c;.}../*.** Chec
1a000 6b 20 74 68 65 20 65 78 69 73 74 61 6e 63 65 20  k the existance 
1a010 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20 61 20  and status of a 
1a020 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1a030 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28 0a 20  int winAccess(. 
1a040 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1a050 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  fs,         /* N
1a060 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32  ot used on win32
1a070 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1a080 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20   *zFilename,    
1a090 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
1a0a0 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69   to check */.  i
1a0b0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
1a0c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70            /* Typ
1a0d0 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d 61 6b  e of test to mak
1a0e0 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  e on this file *
1a0f0 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  /.  int *pResOut
1a100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a110 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f  * OUT: Result */
1a120 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72  .){.  DWORD attr
1a130 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
1a140 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
1a150 6f 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  o;.  void *zConv
1a160 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f  erted;.  UNUSED_
1a170 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
1a180 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
1a190 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
1a1a0 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b  TE_IOERR_ACCESS;
1a1b0 20 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64   );.  zConverted
1a1c0 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69   = convertUtf8Fi
1a1d0 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  lename(zFilename
1a1e0 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  );.  if( zConver
1a1f0 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ted==0 ){.    re
1a200 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1a210 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  R_NOMEM;.  }.  i
1a220 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
1a230 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
1a240 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54    WIN32_FILE_ATT
1a250 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74  RIBUTE_DATA sAtt
1a260 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65  rData;.    memse
1a270 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c  t(&sAttrData, 0,
1a280 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74   sizeof(sAttrDat
1a290 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  a));.    while( 
1a2a0 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65  !(rc = osGetFile
1a2b0 41 74 74 72 69 62 75 74 65 73 45 78 57 28 28 4c  AttributesExW((L
1a2c0 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
1a2d0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
1a2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2f0 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61  GetFileExInfoSta
1a300 6e 64 61 72 64 2c 20 0a 20 20 20 20 20 20 20 20  ndard, .        
1a310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a320 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61 29       &sAttrData)
1a330 29 20 26 26 20 72 65 74 72 79 49 6f 65 72 72 28  ) && retryIoerr(
1a340 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
1a350 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 72 63  ) ){}.    if( rc
1a360 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72   ){.      /* For
1a370 20 61 6e 20 53 51 4c 49 54 45 5f 41 43 43 45 53   an SQLITE_ACCES
1a380 53 5f 45 58 49 53 54 53 20 71 75 65 72 79 2c 20  S_EXISTS query, 
1a390 74 72 65 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e  treat a zero-len
1a3a0 67 74 68 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  gth file.      *
1a3b0 2a 20 61 73 20 69 66 20 69 74 20 64 6f 65 73 20  * as if it does 
1a3c0 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20  not exist..     
1a3d0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 20 20   */.      if(   
1a3e0 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41   flags==SQLITE_A
1a3f0 43 43 45 53 53 5f 45 58 49 53 54 53 0a 20 20 20  CCESS_EXISTS.   
1a400 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44         && sAttrD
1a410 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67  ata.nFileSizeHig
1a420 68 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  h==0 .          
1a430 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69  && sAttrData.nFi
1a440 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a  leSizeLow==0 ){.
1a450 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 49          attr = I
1a460 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
1a470 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 65  IBUTES;.      }e
1a480 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74  lse{.        att
1a490 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77  r = sAttrData.dw
1a4a0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a  FileAttributes;.
1a4b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1a4c0 65 7b 0a 20 20 20 20 20 20 6c 6f 67 49 6f 65 72  e{.      logIoer
1a4d0 72 28 63 6e 74 29 3b 0a 20 20 20 20 20 20 69 66  r(cnt);.      if
1a4e0 28 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52  ( lastErrno!=ERR
1a4f0 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e  OR_FILE_NOT_FOUN
1a500 44 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e  D ){.        win
1a510 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1a520 49 4f 45 52 52 5f 41 43 43 45 53 53 2c 20 6c 61  IOERR_ACCESS, la
1a530 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 41 63 63  stErrno, "winAcc
1a540 65 73 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ess", zFilename)
1a550 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1a560 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
1a570 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  d);.        retu
1a580 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1a590 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20 7d 65  ACCESS;.      }e
1a5a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74  lse{.        att
1a5b0 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  r = INVALID_FILE
1a5c0 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20  _ATTRIBUTES;.   
1a5d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
1a5e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
1a5f0 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
1a600 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f  se{.    attr = o
1a610 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
1a620 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  esA((char*)zConv
1a630 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64  erted);.  }.#end
1a640 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  if.  sqlite3_fre
1a650 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
1a660 20 73 77 69 74 63 68 28 20 66 6c 61 67 73 20 29   switch( flags )
1a670 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
1a680 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20  E_ACCESS_READ:. 
1a690 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
1a6a0 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20  CCESS_EXISTS:.  
1a6b0 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49      rc = attr!=I
1a6c0 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
1a6d0 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 62 72  IBUTES;.      br
1a6e0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
1a6f0 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
1a700 57 52 49 54 45 3a 0a 20 20 20 20 20 20 72 63 20  WRITE:.      rc 
1a710 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f  = attr!=INVALID_
1a720 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20  FILE_ATTRIBUTES 
1a730 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
1a740 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54  (attr & FILE_ATT
1a750 52 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59 29  RIBUTE_READONLY)
1a760 3d 3d 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ==0;.      break
1a770 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
1a780 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49 6e       assert(!"In
1a790 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75  valid flags argu
1a7a0 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70  ment");.  }.  *p
1a7b0 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 72  ResOut = rc;.  r
1a7c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a7d0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20  .}.../*.** Turn 
1a7e0 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
1a7f0 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20  ame into a full 
1a800 70 61 74 68 6e 61 6d 65 2e 20 20 57 72 69 74 65  pathname.  Write
1a810 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61 74   the full.** pat
1a820 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74 5b  hname into zOut[
1a830 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20  ].  zOut[] will 
1a840 62 65 20 61 74 20 6c 65 61 73 74 20 70 56 66 73  be at least pVfs
1a850 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a 20  ->mxPathname.** 
1a860 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
1a870 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1a880 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20  FullPathname(.  
1a890 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1a8a0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
1a8b0 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20   Pointer to vfs 
1a8c0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73  object */.  cons
1a8d0 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76  t char *zRelativ
1a8e0 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73  e,        /* Pos
1a8f0 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69  sibly relative i
1a900 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69  nput path */.  i
1a910 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20 20  nt nFull,       
1a920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a930 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62  Size of output b
1a940 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a  uffer in bytes *
1a950 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20  /.  char *zFull 
1a960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a970 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66    /* Output buff
1a980 65 72 20 2a 2f 0a 29 7b 0a 20 20 0a 23 69 66 20  er */.){.  .#if 
1a990 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
1a9a0 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  __).  SimulateIO
1a9b0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
1a9c0 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20  LITE_ERROR );.  
1a9d0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1a9e0 28 6e 46 75 6c 6c 29 3b 0a 20 20 63 79 67 77 69  (nFull);.  cygwi
1a9f0 6e 5f 63 6f 6e 76 5f 74 6f 5f 66 75 6c 6c 5f 77  n_conv_to_full_w
1aa00 69 6e 33 32 5f 70 61 74 68 28 7a 52 65 6c 61 74  in32_path(zRelat
1aa10 69 76 65 2c 20 7a 46 75 6c 6c 29 3b 0a 20 20 72  ive, zFull);.  r
1aa20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1aa30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
1aa40 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53  ITE_OS_WINCE.  S
1aa50 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1aa60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1aa70 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ROR );.  UNUSED_
1aa80 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29  PARAMETER(nFull)
1aa90 3b 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68 61 73  ;.  /* WinCE has
1aaa0 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20 61   no concept of a
1aab0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
1aac0 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20 74  me, or so I am t
1aad0 6f 6c 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  old. */.  sqlite
1aae0 33 5f 73 6e 70 72 69 6e 74 66 28 70 56 66 73 2d  3_snprintf(pVfs-
1aaf0 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75  >mxPathname, zFu
1ab00 6c 6c 2c 20 22 25 73 22 2c 20 7a 52 65 6c 61 74  ll, "%s", zRelat
1ab10 69 76 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ive);.  return S
1ab20 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
1ab30 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
1ab40 5f 57 49 4e 43 45 20 26 26 20 21 64 65 66 69 6e  _WINCE && !defin
1ab50 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
1ab60 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 76 6f   int nByte;.  vo
1ab70 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  id *zConverted;.
1ab80 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a 20    char *zOut;.. 
1ab90 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 74 68   /* If this path
1aba0 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74   name begins wit
1abb0 68 20 22 2f 58 3a 22 2c 20 77 68 65 72 65 20 22  h "/X:", where "
1abc0 58 22 20 69 73 20 61 6e 79 20 61 6c 70 68 61 62  X" is any alphab
1abd0 65 74 69 63 0a 20 20 2a 2a 20 63 68 61 72 61 63  etic.  ** charac
1abe0 74 65 72 2c 20 64 69 73 63 61 72 64 20 74 68 65  ter, discard the
1abf0 20 69 6e 69 74 69 61 6c 20 22 2f 22 20 66 72 6f   initial "/" fro
1ac00 6d 20 74 68 65 20 70 61 74 68 6e 61 6d 65 2e 0a  m the pathname..
1ac10 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6c 61    */.  if( zRela
1ac20 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20  tive[0]=='/' && 
1ac30 73 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a  sqlite3Isalpha(z
1ac40 52 65 6c 61 74 69 76 65 5b 31 5d 29 20 26 26 20  Relative[1]) && 
1ac50 7a 52 65 6c 61 74 69 76 65 5b 32 5d 3d 3d 27 3a  zRelative[2]==':
1ac60 27 20 29 7b 0a 20 20 20 20 7a 52 65 6c 61 74 69  ' ){.    zRelati
1ac70 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ve++;.  }..  /* 
1ac80 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
1ac90 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
1aca0 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
1acb0 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
1acc0 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
1acd0 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
1ace0 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
1acf0 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
1ad00 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
1ad10 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68  tion failing. Th
1ad20 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c  is function coul
1ad30 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65  d fail if, for e
1ad40 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a  xample, the.  **
1ad50 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67   current working
1ad60 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
1ad70 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20  een unlinked..  
1ad80 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
1ad90 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
1ada0 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55  ITE_ERROR );.  U
1adb0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1adc0 6e 46 75 6c 6c 29 3b 0a 20 20 7a 43 6f 6e 76 65  nFull);.  zConve
1add0 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74  rted = convertUt
1ade0 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61  f8Filename(zRela
1adf0 74 69 76 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  tive);.  if( zCo
1ae00 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
1ae10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ae20 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
1ae30 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
1ae40 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d  .    LPWSTR zTem
1ae50 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f  p;.    nByte = o
1ae60 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
1ae70 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
1ae80 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 20  erted, 0, 0, 0) 
1ae90 2b 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d  + 3;.    zTemp =
1aea0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
1aeb0 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54   nByte*sizeof(zT
1aec0 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  emp[0]) );.    i
1aed0 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20  f( zTemp==0 ){. 
1aee0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1aef0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
1af00 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1af10 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
1af20 20 20 20 20 7d 0a 20 20 20 20 6f 73 47 65 74 46      }.    osGetF
1af30 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50  ullPathNameW((LP
1af40 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
1af50 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20  , nByte, zTemp, 
1af60 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
1af70 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
1af80 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 75 6e 69  ;.    zOut = uni
1af90 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70  codeToUtf8(zTemp
1afa0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1afb0 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a  ree(zTemp);.  }.
1afc0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
1afd0 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
1afe0 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
1aff0 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20  Temp;.    nByte 
1b000 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e  = osGetFullPathN
1b010 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  ameA((char*)zCon
1b020 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29  verted, 0, 0, 0)
1b030 20 2b 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20   + 3;.    zTemp 
1b040 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
1b050 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a  ( nByte*sizeof(z
1b060 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20  Temp[0]) );.    
1b070 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a  if( zTemp==0 ){.
1b080 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1b090 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
1b0a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1b0b0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
1b0c0 0a 20 20 20 20 7d 0a 20 20 20 20 6f 73 47 65 74  .    }.    osGet
1b0d0 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63  FullPathNameA((c
1b0e0 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c  har*)zConverted,
1b0f0 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30   nByte, zTemp, 0
1b100 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1b110 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
1b120 0a 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69  .    zOut = sqli
1b130 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
1b140 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20  o_utf8(zTemp);. 
1b150 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1b160 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65 6e 64  zTemp);.  }.#end
1b170 69 66 0a 20 20 69 66 28 20 7a 4f 75 74 20 29 7b  if.  if( zOut ){
1b180 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
1b190 72 69 6e 74 66 28 70 56 66 73 2d 3e 6d 78 50 61  rintf(pVfs->mxPa
1b1a0 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 2c 20 22  thname, zFull, "
1b1b0 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20  %s", zOut);.    
1b1c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
1b1d0 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
1b1e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
1b1f0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
1b200 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1b210 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
1b220 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b230 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
1b240 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61  ON./*.** Interfa
1b250 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20  ces for opening 
1b260 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  a shared library
1b270 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20  , finding entry 
1b280 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e  points.** within
1b290 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
1b2a0 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67  ary, and closing
1b2b0 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
1b2c0 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e  ary..*/./*.** In
1b2d0 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65  terfaces for ope
1b2e0 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69  ning a shared li
1b2f0 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65  brary, finding e
1b300 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77  ntry points.** w
1b310 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64  ithin the shared
1b320 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c   library, and cl
1b330 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  osing the shared
1b340 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61   library..*/.sta
1b350 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f  tic void *winDlO
1b360 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20  pen(sqlite3_vfs 
1b370 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61  *pVfs, const cha
1b380 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
1b390 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 76 6f 69   HANDLE h;.  voi
1b3a0 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  d *zConverted = 
1b3b0 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e  convertUtf8Filen
1b3c0 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
1b3d0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1b3e0 45 52 28 70 56 66 73 29 3b 0a 20 20 69 66 28 20  ER(pVfs);.  if( 
1b3f0 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
1b400 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1b410 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20   }.  if( isNT() 
1b420 29 7b 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61  ){.    h = osLoa
1b430 64 4c 69 62 72 61 72 79 57 28 28 4c 50 43 57 53  dLibraryW((LPCWS
1b440 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  TR)zConverted);.
1b450 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
1b460 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
1b470 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d  .  else{.    h =
1b480 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 28   osLoadLibraryA(
1b490 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
1b4a0 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  d);.  }.#endif. 
1b4b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
1b4c0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74  onverted);.  ret
1b4d0 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a  urn (void*)h;.}.
1b4e0 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44  static void winD
1b4f0 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  lError(sqlite3_v
1b500 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
1b510 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75  uf, char *zBufOu
1b520 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
1b530 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
1b540 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28  getLastErrorMsg(
1b550 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
1b560 2c 20 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 29  , nBuf, zBufOut)
1b570 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
1b580 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74  (*winDlSym(sqlit
1b590 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f  e3_vfs *pVfs, vo
1b5a0 69 64 20 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e  id *pHandle, con
1b5b0 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c  st char *zSymbol
1b5c0 29 29 28 76 6f 69 64 29 7b 0a 20 20 55 4e 55 53  ))(void){.  UNUS
1b5d0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
1b5e0 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  s);.  return (vo
1b5f0 69 64 28 2a 29 28 76 6f 69 64 29 29 6f 73 47 65  id(*)(void))osGe
1b600 74 50 72 6f 63 41 64 64 72 65 73 73 41 28 28 48  tProcAddressA((H
1b610 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 2c 20 7a  ANDLE)pHandle, z
1b620 53 79 6d 62 6f 6c 29 3b 0a 7d 0a 73 74 61 74 69  Symbol);.}.stati
1b630 63 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73  c void winDlClos
1b640 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  e(sqlite3_vfs *p
1b650 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  Vfs, void *pHand
1b660 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  le){.  UNUSED_PA
1b670 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
1b680 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79 28 28   osFreeLibrary((
1b690 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b  HANDLE)pHandle);
1b6a0 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53  .}.#else /* if S
1b6b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
1b6c0 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66  EXTENSION is def
1b6d0 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69  ined: */.  #defi
1b6e0 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a  ne winDlOpen  0.
1b6f0 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 45    #define winDlE
1b700 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65  rror 0.  #define
1b710 20 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20   winDlSym   0.  
1b720 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f  #define winDlClo
1b730 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  se 0.#endif.../*
1b740 0a 2a 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20  .** Write up to 
1b750 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61  nBuf bytes of ra
1b760 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42  ndomness into zB
1b770 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  uf..*/.static in
1b780 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28  t winRandomness(
1b790 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1b7a0 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
1b7b0 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e 74 20  r *zBuf){.  int 
1b7c0 6e 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f  n = 0;.  UNUSED_
1b7d0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
1b7e0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1b7f0 49 54 45 5f 54 45 53 54 29 0a 20 20 6e 20 3d 20  ITE_TEST).  n = 
1b800 6e 42 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 7a  nBuf;.  memset(z
1b810 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23  Buf, 0, nBuf);.#
1b820 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f  else.  if( sizeo
1b830 66 28 53 59 53 54 45 4d 54 49 4d 45 29 3c 3d 6e  f(SYSTEMTIME)<=n
1b840 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 53 59 53  Buf-n ){.    SYS
1b850 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20 6f  TEMTIME x;.    o
1b860 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26  sGetSystemTime(&
1b870 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  x);.    memcpy(&
1b880 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a  zBuf[n], &x, siz
1b890 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 6e 20 2b  eof(x));.    n +
1b8a0 3d 20 73 69 7a 65 6f 66 28 78 29 3b 0a 20 20 7d  = sizeof(x);.  }
1b8b0 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57  .  if( sizeof(DW
1b8c0 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  ORD)<=nBuf-n ){.
1b8d0 20 20 20 20 44 57 4f 52 44 20 70 69 64 20 3d 20      DWORD pid = 
1b8e0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1b8f0 65 73 73 49 64 28 29 3b 0a 20 20 20 20 6d 65 6d  essId();.    mem
1b900 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 70  cpy(&zBuf[n], &p
1b910 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29  id, sizeof(pid))
1b920 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
1b930 66 28 70 69 64 29 3b 0a 20 20 7d 0a 20 20 69 66  f(pid);.  }.  if
1b940 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c  ( sizeof(DWORD)<
1b950 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44  =nBuf-n ){.    D
1b960 57 4f 52 44 20 63 6e 74 20 3d 20 6f 73 47 65 74  WORD cnt = osGet
1b970 54 69 63 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20  TickCount();.   
1b980 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d   memcpy(&zBuf[n]
1b990 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63  , &cnt, sizeof(c
1b9a0 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  nt));.    n += s
1b9b0 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a  izeof(cnt);.  }.
1b9c0 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 41 52    if( sizeof(LAR
1b9d0 47 45 5f 49 4e 54 45 47 45 52 29 3c 3d 6e 42 75  GE_INTEGER)<=nBu
1b9e0 66 2d 6e 20 29 7b 0a 20 20 20 20 4c 41 52 47 45  f-n ){.    LARGE
1b9f0 5f 49 4e 54 45 47 45 52 20 69 3b 0a 20 20 20 20  _INTEGER i;.    
1ba00 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e  osQueryPerforman
1ba10 63 65 43 6f 75 6e 74 65 72 28 26 69 29 3b 0a 20  ceCounter(&i);. 
1ba20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
1ba30 6e 5d 2c 20 26 69 2c 20 73 69 7a 65 6f 66 28 69  n], &i, sizeof(i
1ba40 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ));.    n += siz
1ba50 65 6f 66 28 69 29 3b 0a 20 20 7d 0a 23 65 6e 64  eof(i);.  }.#end
1ba60 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  if.  return n;.}
1ba70 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66  .../*.** Sleep f
1ba80 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c  or a little whil
1ba90 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  e.  Return the a
1baa0 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c  mount of time sl
1bab0 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ept..*/.static i
1bac0 6e 74 20 77 69 6e 53 6c 65 65 70 28 73 71 6c 69  nt winSleep(sqli
1bad0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
1bae0 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20  nt microsec){.  
1baf0 70 6f 72 74 61 62 6c 65 53 6c 65 65 70 28 28 6d  portableSleep((m
1bb00 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30  icrosec+999)/100
1bb10 30 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  0);.  UNUSED_PAR
1bb20 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
1bb30 72 65 74 75 72 6e 20 28 28 6d 69 63 72 6f 73 65  return ((microse
1bb40 63 2b 39 39 39 29 2f 31 30 30 30 29 2a 31 30 30  c+999)/1000)*100
1bb50 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  0;.}../*.** The 
1bb60 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
1bb70 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20  le, if set to a 
1bb80 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20  non-zero value, 
1bb90 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
1bba0 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  s.** the number 
1bbb0 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  of seconds since
1bbc0 20 31 39 37 30 20 61 6e 64 20 69 73 20 75 73 65   1970 and is use
1bbd0 64 20 74 6f 20 73 65 74 20 74 68 65 20 72 65 73  d to set the res
1bbe0 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  ult of.** sqlite
1bbf0 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29  3OsCurrentTime()
1bc00 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e   during testing.
1bc10 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1bc20 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
1bc30 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
1bc40 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79  = 0;  /* Fake sy
1bc50 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63  stem time in sec
1bc60 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e  onds since 1970.
1bc70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   */.#endif../*.*
1bc80 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
1bc90 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
1bca0 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
1bcb0 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
1bcc0 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74  into *piNow.** t
1bcd0 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
1bce0 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75  and date as a Ju
1bcf0 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
1bd00 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30  times 86_400_000
1bd10 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77  .  In.** other w
1bd20 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f  ords, write into
1bd30 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62   *piNow the numb
1bd40 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
1bd50 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c  ds since the Jul
1bd60 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20  ian.** epoch of 
1bd70 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63  noon in Greenwic
1bd80 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34  h on November 24
1bd90 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72  , 4714 B.C accor
1bda0 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70  ding to the.** p
1bdb0 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69  roleptic Gregori
1bdc0 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a  an calendar..**.
1bdd0 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72  ** On success, r
1bde0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
1bdf0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1be00 45 52 52 4f 52 20 69 66 20 74 68 65 20 74 69 6d  ERROR if the tim
1be10 65 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63  e and date .** c
1be20 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
1be30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1be40 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  nCurrentTimeInt6
1be50 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  4(sqlite3_vfs *p
1be60 56 66 73 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  Vfs, sqlite3_int
1be70 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f 2a  64 *piNow){.  /*
1be80 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74   FILETIME struct
1be90 75 72 65 20 69 73 20 61 20 36 34 2d 62 69 74 20  ure is a 64-bit 
1bea0 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74 69  value representi
1beb0 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
1bec0 20 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73   .     100-nanos
1bed0 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 20  econd intervals 
1bee0 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31 2c  since January 1,
1bef0 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30 35   1601 (= JD 2305
1bf00 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20 20  813.5). .  */.  
1bf10 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 73  FILETIME ft;.  s
1bf20 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
1bf30 74 65 33 5f 69 6e 74 36 34 20 77 69 6e 46 69 6c  te3_int64 winFil
1bf40 65 74 69 6d 65 45 70 6f 63 68 20 3d 20 32 33 30  etimeEpoch = 230
1bf50 35 38 31 33 35 2a 28 73 71 6c 69 74 65 33 5f 69  58135*(sqlite3_i
1bf60 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 69  nt64)8640000;.#i
1bf70 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1bf80 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
1bf90 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e  sqlite3_int64 un
1bfa0 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38  ixEpoch = 244058
1bfb0 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  75*(sqlite3_int6
1bfc0 34 29 38 36 34 30 30 30 30 3b 0a 23 65 6e 64 69  4)8640000;.#endi
1bfd0 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74 6f  f.  /* 2^32 - to
1bfe0 20 61 76 6f 69 64 20 75 73 65 20 6f 66 20 4c 4c   avoid use of LL
1bff0 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20 69 6e   and warnings in
1c000 20 67 63 63 20 2a 2f 0a 20 20 73 74 61 74 69 63   gcc */.  static
1c010 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
1c020 6e 74 36 34 20 6d 61 78 33 32 42 69 74 56 61 6c  nt64 max32BitVal
1c030 75 65 20 3d 20 0a 20 20 20 20 20 20 28 73 71 6c  ue = .      (sql
1c040 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30  ite3_int64)20000
1c050 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33  00000 + (sqlite3
1c060 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 30 30  _int64)200000000
1c070 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  0 + (sqlite3_int
1c080 36 34 29 32 39 34 39 36 37 32 39 36 3b 0a 0a 23  64)294967296;..#
1c090 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1c0a0 43 45 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20  CE.  SYSTEMTIME 
1c0b0 74 69 6d 65 3b 0a 20 20 6f 73 47 65 74 53 79 73  time;.  osGetSys
1c0c0 74 65 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a  temTime(&time);.
1c0d0 20 20 2f 2a 20 69 66 20 53 79 73 74 65 6d 54 69    /* if SystemTi
1c0e0 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 29 20 66  meToFileTime() f
1c0f0 61 69 6c 73 2c 20 69 74 20 72 65 74 75 72 6e 73  ails, it returns
1c100 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28   zero. */.  if (
1c110 21 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46  !osSystemTimeToF
1c120 69 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c 26 66  ileTime(&time,&f
1c130 74 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t)){.    return 
1c140 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1c150 7d 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53  }.#else.  osGetS
1c160 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
1c170 69 6d 65 28 20 26 66 74 20 29 3b 0a 23 65 6e 64  ime( &ft );.#end
1c180 69 66 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77  if..  *piNow = w
1c190 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20  inFiletimeEpoch 
1c1a0 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28  +.            ((
1c1b0 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  ((sqlite3_int64)
1c1c0 66 74 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d  ft.dwHighDateTim
1c1d0 65 29 2a 6d 61 78 33 32 42 69 74 56 61 6c 75 65  e)*max32BitValue
1c1e0 29 20 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20  ) + .           
1c1f0 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74      (sqlite3_int
1c200 36 34 29 66 74 2e 64 77 4c 6f 77 44 61 74 65 54  64)ft.dwLowDateT
1c210 69 6d 65 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e  ime)/(sqlite3_in
1c220 74 36 34 29 31 30 30 30 30 3b 0a 0a 23 69 66 64  t64)10000;..#ifd
1c230 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1c240 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72   if( sqlite3_cur
1c250 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20  rent_time ){.   
1c260 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28   *piNow = 1000*(
1c270 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71  sqlite3_int64)sq
1c280 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
1c290 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a  me + unixEpoch;.
1c2a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55    }.#endif.  UNU
1c2b0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
1c2c0 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  fs);.  return SQ
1c2d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1c2e0 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
1c2f0 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
1c300 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
1c310 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
1c320 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74  the.** current t
1c330 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
1c340 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
1c350 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20  ber into *prNow 
1c360 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e  and.** return 0.
1c370 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
1c380 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
1c390 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
1c3a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1c3b0 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71  inCurrentTime(sq
1c3c0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
1c3d0 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b   double *prNow){
1c3e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
1c3f0 69 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20  ite3_int64 i;.  
1c400 72 63 20 3d 20 77 69 6e 43 75 72 72 65 6e 74 54  rc = winCurrentT
1c410 69 6d 65 49 6e 74 36 34 28 70 56 66 73 2c 20 26  imeInt64(pVfs, &
1c420 69 29 3b 0a 20 20 69 66 28 20 21 72 63 20 29 7b  i);.  if( !rc ){
1c430 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f  .    *prNow = i/
1c440 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a  86400000.0;.  }.
1c450 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1c460 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 69  /*.** The idea i
1c470 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  s that this func
1c480 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20  tion works like 
1c490 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  a combination of
1c4a0 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72  .** GetLastError
1c4b0 28 29 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73  () and FormatMes
1c4c0 73 61 67 65 28 29 20 6f 6e 20 57 69 6e 64 6f 77  sage() on Window
1c4d0 73 20 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a  s (or errno and.
1c4e0 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20  ** strerror_r() 
1c4f0 6f 6e 20 55 6e 69 78 29 2e 20 41 66 74 65 72 20  on Unix). After 
1c500 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
1c510 72 6e 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a  rned by an OS.**
1c520 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74   function, SQLit
1c530 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e  e calls this fun
1c540 63 74 69 6f 6e 20 77 69 74 68 20 7a 42 75 66 20  ction with zBuf 
1c550 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61  pointing to.** a
1c560 20 62 75 66 66 65 72 20 6f 66 20 6e 42 75 66 20   buffer of nBuf 
1c570 62 79 74 65 73 2e 20 54 68 65 20 4f 53 20 6c 61  bytes. The OS la
1c580 79 65 72 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c  yer should popul
1c590 61 74 65 20 74 68 65 0a 2a 2a 20 62 75 66 66 65  ate the.** buffe
1c5a0 72 20 77 69 74 68 20 61 20 6e 75 6c 2d 74 65 72  r with a nul-ter
1c5b0 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 65 6e  minated UTF-8 en
1c5c0 63 6f 64 65 64 20 65 72 72 6f 72 20 6d 65 73 73  coded error mess
1c5d0 61 67 65 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e  age.** describin
1c5e0 67 20 74 68 65 20 6c 61 73 74 20 49 4f 20 65 72  g the last IO er
1c5f0 72 6f 72 20 74 6f 20 68 61 76 65 20 6f 63 63 75  ror to have occu
1c600 72 72 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  rred within the 
1c610 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61  calling.** threa
1c620 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
1c630 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
1c640 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20 74   too large for t
1c650 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66  he supplied buff
1c660 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64  er,.** it should
1c670 20 62 65 20 74 72 75 6e 63 61 74 65 64 2e 20 54   be truncated. T
1c680 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
1c690 6f 66 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  of xGetLastError
1c6a0 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74  .** is zero if t
1c6b0 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
1c6c0 20 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66   fits in the buf
1c6d0 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  fer, or non-zero
1c6e0 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69  .** otherwise (i
1c6f0 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61  f the message wa
1c700 73 20 74 72 75 6e 63 61 74 65 64 29 2e 20 49 66  s truncated). If
1c710 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74   non-zero is ret
1c720 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69  urned,.** then i
1c730 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
1c740 72 79 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68  ry to include th
1c750 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  e nul-terminator
1c760 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e   character.** in
1c770 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
1c780 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75  er..**.** Not su
1c790 70 70 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f 72  pplying an error
1c7a0 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 68 61   message will ha
1c7b0 76 65 20 6e 6f 20 61 64 76 65 72 73 65 20 65 66  ve no adverse ef
1c7c0 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74  fect.** on SQLit
1c7d0 65 2e 20 49 74 20 69 73 20 66 69 6e 65 20 74 6f  e. It is fine to
1c7e0 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65   have an impleme
1c7f0 6e 74 61 74 69 6f 6e 20 74 68 61 74 20 6e 65 76  ntation that nev
1c800 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e  er.** returns an
1c810 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a   error message:.
1c820 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65 74  **.**   int xGet
1c830 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65  LastError(sqlite
1c840 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
1c850 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
1c860 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65 72  f){.**     asser
1c870 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29  t(zBuf[0]=='\0')
1c880 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20  ;.**     return 
1c890 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  0;.**   }.**.** 
1c8a0 48 6f 77 65 76 65 72 20 69 66 20 61 6e 20 65 72  However if an er
1c8b0 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73  ror message is s
1c8c0 75 70 70 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c  upplied, it will
1c8d0 20 62 65 20 69 6e 63 6f 72 70 6f 72 61 74 65 64   be incorporated
1c8e0 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 20 69 6e  .** by sqlite in
1c8f0 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  to the error mes
1c900 73 61 67 65 20 61 76 61 69 6c 61 62 6c 65 20 74  sage available t
1c910 6f 20 74 68 65 20 75 73 65 72 20 75 73 69 6e 67  o the user using
1c920 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  .** sqlite3_errm
1c930 73 67 28 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d  sg(), possibly m
1c940 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f 72 73 20  aking IO errors 
1c950 65 61 73 69 65 72 20 74 6f 20 64 65 62 75 67 2e  easier to debug.
1c960 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1c970 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73  inGetLastError(s
1c980 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1c990 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
1c9a0 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45   *zBuf){.  UNUSE
1c9b0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
1c9c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 4c  );.  return getL
1c9d0 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65  astErrorMsg(osGe
1c9e0 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42  tLastError(), nB
1c9f0 75 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a  uf, zBuf);.}../*
1ca00 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
1ca10 6e 64 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20  nd deinitialize 
1ca20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
1ca30 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a  stem interface..
1ca40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
1ca50 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20  s_init(void){.  
1ca60 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76  static sqlite3_v
1ca70 66 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20  fs winVfs = {.  
1ca80 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20    3,            
1ca90 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
1caa0 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66  on */.    sizeof
1cab0 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f  (winFile),     /
1cac0 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20  * szOsFile */.  
1cad0 20 20 4d 41 58 5f 50 41 54 48 2c 20 20 20 20 20    MAX_PATH,     
1cae0 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68         /* mxPath
1caf0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20  name */.    0,  
1cb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb10 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20   /* pNext */.   
1cb20 20 22 77 69 6e 33 32 22 2c 20 20 20 20 20 20 20   "win32",       
1cb30 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a        /* zName *
1cb40 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
1cb50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41             /* pA
1cb60 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69  ppData */.    wi
1cb70 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  nOpen,          
1cb80 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20     /* xOpen */. 
1cb90 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20     winDelete,   
1cba0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65          /* xDele
1cbb0 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63  te */.    winAcc
1cbc0 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ess,           /
1cbd0 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20  * xAccess */.   
1cbe0 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65   winFullPathname
1cbf0 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61  ,     /* xFullPa
1cc00 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69  thname */.    wi
1cc10 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  nDlOpen,        
1cc20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f     /* xDlOpen */
1cc30 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c  .    winDlError,
1cc40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
1cc50 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e  Error */.    win
1cc60 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20  DlSym,          
1cc70 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20    /* xDlSym */. 
1cc80 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20     winDlClose,  
1cc90 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c          /* xDlCl
1cca0 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61  ose */.    winRa
1ccb0 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20  ndomness,       
1ccc0 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a  /* xRandomness *
1ccd0 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20  /.    winSleep, 
1cce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
1ccf0 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43  leep */.    winC
1cd00 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20  urrentTime,     
1cd10 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
1cd20 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61   */.    winGetLa
1cd30 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20  stError,     /* 
1cd40 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f  xGetLastError */
1cd50 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54  .    winCurrentT
1cd60 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75  imeInt64, /* xCu
1cd70 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a  rrentTimeInt64 *
1cd80 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73 74  /.    winSetSyst
1cd90 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53  emCall,    /* xS
1cda0 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  etSystemCall */.
1cdb0 20 20 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d      winGetSystem
1cdc0 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74  Call,    /* xGet
1cdd0 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
1cde0 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43    winNextSystemC
1cdf0 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53  all,   /* xNextS
1ce00 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d  ystemCall */.  }
1ce10 3b 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63  ;..  /* Double-c
1ce20 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 53  heck that the aS
1ce30 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68  yscall[] array h
1ce40 61 73 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63  as been construc
1ce50 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74  ted.  ** correct
1ce60 6c 79 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20  ly.  See ticket 
1ce70 5b 62 62 33 61 38 36 65 38 39 30 63 38 65 39 36  [bb3a86e890c8e96
1ce80 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ab] */.  assert(
1ce90 20 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63   ArraySize(aSysc
1cea0 61 6c 6c 29 3d 3d 36 35 20 29 3b 0a 0a 23 69 66  all)==65 );..#if
1ceb0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
1cec0 0a 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20 6f 73  .  sleepObj = os
1ced0 43 72 65 61 74 65 45 76 65 6e 74 45 78 28 4e 55  CreateEventEx(NU
1cee0 4c 4c 2c 20 4e 55 4c 4c 2c 20 43 52 45 41 54 45  LL, NULL, CREATE
1cef0 5f 45 56 45 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45  _EVENT_MANUAL_RE
1cf00 53 45 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20  SET, .          
1cf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf20 20 20 20 20 20 20 20 20 45 56 45 4e 54 5f 41 4c          EVENT_AL
1cf30 4c 5f 41 43 43 45 53 53 29 3b 0a 23 65 6e 64 69  L_ACCESS);.#endi
1cf40 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
1cf50 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 2f 2a 20  E_OMIT_WAL.  /* 
1cf60 67 65 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61  get memory map a
1cf70 6c 6c 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c  llocation granul
1cf80 61 72 69 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65  arity */.  memse
1cf90 74 28 26 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30  t(&winSysInfo, 0
1cfa0 2c 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f  , sizeof(SYSTEM_
1cfb0 49 4e 46 4f 29 29 3b 0a 20 20 6f 73 47 65 74 53  INFO));.  osGetS
1cfc0 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79  ystemInfo(&winSy
1cfd0 73 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  sInfo);.  assert
1cfe0 28 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c  (winSysInfo.dwAl
1cff0 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72  locationGranular
1d000 69 74 79 20 3e 20 30 29 3b 0a 23 65 6e 64 69 66  ity > 0);.#endif
1d010 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ..  sqlite3_vfs_
1d020 72 65 67 69 73 74 65 72 28 26 77 69 6e 56 66 73  register(&winVfs
1d030 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  , 1);.  return S
1d040 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 69 6e  QLITE_OK; .}..in
1d050 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64  t sqlite3_os_end
1d060 28 76 6f 69 64 29 7b 20 0a 23 69 66 20 53 51 4c  (void){ .#if SQL
1d070 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 6f  ITE_OS_WINRT.  o
1d080 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c 65  sCloseHandle(sle
1d090 65 70 4f 62 6a 29 3b 0a 23 65 6e 64 69 66 0a 20  epObj);.#endif. 
1d0a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d0b0 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  K;.}..#endif /* 
1d0c0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f  SQLITE_OS_WIN */
1d0d0 0a                                               .