/ Hex Artifact Content
Login

Artifact ca9ff6340c72aa45adf5a444a036f3c87f437f0f:


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 23 69 66 6e 64 65 66 20 46  endif..#ifndef F
0330: 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 0a 23 20  ILE_FLAG_MASK.# 
0340: 64 65 66 69 6e 65 20 46 49 4c 45 5f 46 4c 41 47  define FILE_FLAG
0350: 5f 4d 41 53 4b 20 20 20 20 20 20 20 20 20 20 28  _MASK          (
0360: 30 78 46 46 33 43 30 30 30 30 29 0a 23 65 6e 64  0xFF3C0000).#end
0370: 69 66 0a 0a 23 69 66 6e 64 65 66 20 46 49 4c 45  if..#ifndef FILE
0380: 5f 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 0a  _ATTRIBUTE_MASK.
0390: 23 20 64 65 66 69 6e 65 20 46 49 4c 45 5f 41 54  # define FILE_AT
03a0: 54 52 49 42 55 54 45 5f 4d 41 53 4b 20 20 20 20  TRIBUTE_MASK    
03b0: 20 28 30 78 30 30 30 33 46 46 46 37 29 0a 23 65   (0x0003FFF7).#e
03c0: 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  ndif../* Forward
03d0: 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 74   references */.t
03e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77 69  ypedef struct wi
03f0: 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20 20 20 20  nShm winShm;    
0400: 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6e 6e         /* A conn
0410: 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64  ection to shared
0420: 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65 64  -memory */.typed
0430: 65 66 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  ef struct winShm
0440: 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f 64 65 3b  Node winShmNode;
0450: 20 20 20 2f 2a 20 41 20 72 65 67 69 6f 6e 20 6f     /* A region o
0460: 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  f shared-memory 
0470: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 43 45 20  */../*.** WinCE 
0480: 6c 61 63 6b 73 20 6e 61 74 69 76 65 20 73 75 70  lacks native sup
0490: 70 6f 72 74 20 66 6f 72 20 66 69 6c 65 20 6c 6f  port for file lo
04a0: 63 6b 69 6e 67 20 73 6f 20 77 65 20 68 61 76 65  cking so we have
04b0: 20 74 6f 20 66 61 6b 65 20 69 74 0a 2a 2a 20 77   to fake it.** w
04c0: 69 74 68 20 73 6f 6d 65 20 63 6f 64 65 20 6f 66  ith some code of
04d0: 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a 23 69 66   our own..*/.#if
04e0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
04f0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0500: 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  winceLock {.  in
0510: 74 20 6e 52 65 61 64 65 72 73 3b 20 20 20 20 20  t nReaders;     
0520: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
0530: 65 61 64 65 72 20 6c 6f 63 6b 73 20 6f 62 74 61  eader locks obta
0540: 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  ined */.  BOOL b
0550: 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 2f 2a  Pending;      /*
0560: 20 49 6e 64 69 63 61 74 65 73 20 61 20 70 65 6e   Indicates a pen
0570: 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62 65  ding lock has be
0580: 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20  en obtained */. 
0590: 20 42 4f 4f 4c 20 62 52 65 73 65 72 76 65 64 3b   BOOL bReserved;
05a0: 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65       /* Indicate
05b0: 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  s a reserved loc
05c0: 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69  k has been obtai
05d0: 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 45  ned */.  BOOL bE
05e0: 78 63 6c 75 73 69 76 65 3b 20 20 20 20 2f 2a 20  xclusive;    /* 
05f0: 49 6e 64 69 63 61 74 65 73 20 61 6e 20 65 78 63  Indicates an exc
0600: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 68 61 73 20  lusive lock has 
0610: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f  been obtained */
0620: 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b 0a 23 65  .} winceLock;.#e
0630: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
0640: 77 69 6e 46 69 6c 65 20 73 74 72 75 63 74 75 72  winFile structur
0650: 65 20 69 73 20 61 20 73 75 62 63 6c 61 73 73 20  e is a subclass 
0660: 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  of sqlite3_file*
0670: 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65   specific to the
0680: 20 77 69 6e 33 32 0a 2a 2a 20 70 6f 72 74 61 62   win32.** portab
0690: 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a 2f 0a  ility layer..*/.
06a0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
06b0: 69 6e 46 69 6c 65 20 77 69 6e 46 69 6c 65 3b 0a  inFile winFile;.
06c0: 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20 7b  struct winFile {
06d0: 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
06e0: 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65  _io_methods *pMe
06f0: 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75 73 74 20  thod; /*** Must 
0700: 62 65 20 66 69 72 73 74 20 2a 2a 2a 2f 0a 20 20  be first ***/.  
0710: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
0720: 73 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56  s;      /* The V
0730: 46 53 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20  FS used to open 
0740: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 48  this file */.  H
0750: 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20 20 20  ANDLE h;        
0760: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
0770: 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 74   for accessing t
0780: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  he file */.  u8 
0790: 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20  locktype;       
07a0: 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
07b0: 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 68  lock currently h
07c0: 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  eld on this file
07d0: 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73 68 61 72   */.  short shar
07e0: 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20 20 2f 2a  edLockByte;   /*
07f0: 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f 73 65 6e   Randomly chosen
0800: 20 62 79 74 65 20 75 73 65 64 20 61 73 20 61 20   byte used as a 
0810: 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20  shared lock */. 
0820: 20 75 38 20 63 74 72 6c 46 6c 61 67 73 3b 20 20   u8 ctrlFlags;  
0830: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
0840: 73 2e 20 20 53 65 65 20 57 49 4e 46 49 4c 45 5f  s.  See WINFILE_
0850: 2a 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 44 57 4f  * below */.  DWO
0860: 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20  RD lastErrno;   
0870: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e 64       /* The Wind
0880: 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74  ows errno from t
0890: 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f  he last I/O erro
08a0: 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  r */.  winShm *p
08b0: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Shm;           /
08c0: 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20 73 68  * Instance of sh
08d0: 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e 20 74  ared memory on t
08e0: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f  his file */.  co
08f0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b  nst char *zPath;
0900: 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61        /* Full pa
0910: 74 68 6e 61 6d 65 20 6f 66 20 74 68 69 73 20 66  thname of this f
0920: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 43  ile */.  int szC
0930: 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20  hunk;           
0940: 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65 20 63   /* Chunk size c
0950: 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46 43 4e  onfigured by FCN
0960: 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f  TL_CHUNK_SIZE */
0970: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
0980: 49 4e 43 45 0a 20 20 4c 50 57 53 54 52 20 7a 44  INCE.  LPWSTR zD
0990: 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20 20 2f  eleteOnClose;  /
09a0: 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
09b0: 6f 20 64 65 6c 65 74 65 20 77 68 65 6e 20 63 6c  o delete when cl
09c0: 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e 44 4c  osing */.  HANDL
09d0: 45 20 68 4d 75 74 65 78 3b 20 20 20 20 20 20 20  E hMutex;       
09e0: 20 20 20 2f 2a 20 4d 75 74 65 78 20 75 73 65 64     /* Mutex used
09f0: 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65   to control acce
0a00: 73 73 20 74 6f 20 73 68 61 72 65 64 20 6c 6f 63  ss to shared loc
0a10: 6b 20 2a 2f 20 20 0a 20 20 48 41 4e 44 4c 45 20  k */  .  HANDLE 
0a20: 68 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20  hShared;        
0a30: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
0a40: 79 20 73 65 67 6d 65 6e 74 20 75 73 65 64 20 66  y segment used f
0a50: 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  or locking */.  
0a60: 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c 3b  winceLock local;
0a70: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 73          /* Locks
0a80: 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68 69   obtained by thi
0a90: 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 77 69  s instance of wi
0aa0: 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 63 65  nFile */.  wince
0ab0: 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20 20 20  Lock *shared;   
0ac0: 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 68 61     /* Global sha
0ad0: 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79 20  red lock memory 
0ae0: 66 6f 72 20 74 68 65 20 66 69 6c 65 20 20 2a 2f  for the file  */
0af0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
0b00: 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  * Allowed values
0b10: 20 66 6f 72 20 77 69 6e 46 69 6c 65 2e 63 74 72   for winFile.ctr
0b20: 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  lFlags.*/.#defin
0b30: 65 20 57 49 4e 46 49 4c 45 5f 50 45 52 53 49 53  e WINFILE_PERSIS
0b40: 54 5f 57 41 4c 20 20 20 20 20 30 78 30 34 20 20  T_WAL     0x04  
0b50: 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74 20 57   /* Persistent W
0b60: 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 64 65 66 69  AL mode */.#defi
0b70: 6e 65 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 20  ne WINFILE_PSOW 
0b80: 20 20 20 20 20 20 20 20 20 20 20 30 78 31 30 20             0x10 
0b90: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41    /* SQLITE_IOCA
0ba0: 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
0bb0: 57 52 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20  WRITE */../*. * 
0bc0: 49 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  If compiled with
0bd0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
0be0: 4c 4c 4f 43 20 6f 6e 20 57 69 6e 64 6f 77 73 2c  LLOC on Windows,
0bf0: 20 77 65 20 77 69 6c 6c 20 75 73 65 20 74 68 65   we will use the
0c00: 0a 20 2a 20 76 61 72 69 6f 75 73 20 57 69 6e 33  . * various Win3
0c10: 32 20 41 50 49 20 68 65 61 70 20 66 75 6e 63 74  2 API heap funct
0c20: 69 6f 6e 73 20 69 6e 73 74 65 61 64 20 6f 66 20  ions instead of 
0c30: 6f 75 72 20 6f 77 6e 2e 0a 20 2a 2f 0a 23 69 66  our own.. */.#if
0c40: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
0c50: 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 20 2a 20 54 68  _MALLOC./*. * Th
0c60: 65 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f  e initial size o
0c70: 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63  f the Win32-spec
0c80: 69 66 69 63 20 68 65 61 70 2e 20 20 54 68 69 73  ific heap.  This
0c90: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65   value may be ze
0ca0: 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ro.. */.#ifndef 
0cb0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
0cc0: 50 5f 49 4e 49 54 5f 53 49 5a 45 0a 23 20 20 64  P_INIT_SIZE.#  d
0cd0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
0ce0: 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a  32_HEAP_INIT_SIZ
0cf0: 45 20 28 28 53 51 4c 49 54 45 5f 44 45 46 41 55  E ((SQLITE_DEFAU
0d00: 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 20 2a  LT_CACHE_SIZE) *
0d10: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d30: 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54            (SQLIT
0d40: 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
0d50: 49 5a 45 29 20 2b 20 34 31 39 34 33 30 34 29 0a  IZE) + 4194304).
0d60: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68  #endif../*. * Th
0d70: 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f  e maximum size o
0d80: 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63  f the Win32-spec
0d90: 69 66 69 63 20 68 65 61 70 2e 20 20 54 68 69 73  ific heap.  This
0da0: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65   value may be ze
0db0: 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ro.. */.#ifndef 
0dc0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
0dd0: 50 5f 4d 41 58 5f 53 49 5a 45 0a 23 20 20 64 65  P_MAX_SIZE.#  de
0de0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
0df0: 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 20  2_HEAP_MAX_SIZE 
0e00: 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   (0).#endif../*.
0e10: 20 2a 20 54 68 65 20 65 78 74 72 61 20 66 6c 61   * The extra fla
0e20: 67 73 20 74 6f 20 75 73 65 20 69 6e 20 63 61 6c  gs to use in cal
0e30: 6c 73 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20  ls to the Win32 
0e40: 68 65 61 70 20 41 50 49 73 2e 20 20 54 68 69 73  heap APIs.  This
0e50: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 0a 20 2a   value may be. *
0e60: 20 7a 65 72 6f 20 66 6f 72 20 74 68 65 20 64 65   zero for the de
0e70: 66 61 75 6c 74 20 62 65 68 61 76 69 6f 72 2e 0a  fault behavior..
0e80: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
0e90: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
0ea0: 41 47 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51  AGS.#  define SQ
0eb0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
0ec0: 46 4c 41 47 53 20 20 20 20 20 28 30 29 0a 23 65  FLAGS     (0).#e
0ed0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
0ee0: 77 69 6e 4d 65 6d 44 61 74 61 20 73 74 72 75 63  winMemData struc
0ef0: 74 75 72 65 20 73 74 6f 72 65 73 20 69 6e 66 6f  ture stores info
0f00: 72 6d 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64  rmation required
0f10: 20 62 79 20 74 68 65 20 57 69 6e 33 32 2d 73 70   by the Win32-sp
0f20: 65 63 69 66 69 63 0a 2a 2a 20 73 71 6c 69 74 65  ecific.** sqlite
0f30: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 69 6d  3_mem_methods im
0f40: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f  plementation..*/
0f50: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0f60: 77 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 4d 65  winMemData winMe
0f70: 6d 44 61 74 61 3b 0a 73 74 72 75 63 74 20 77 69  mData;.struct wi
0f80: 6e 4d 65 6d 44 61 74 61 20 7b 0a 23 69 66 6e 64  nMemData {.#ifnd
0f90: 65 66 20 4e 44 45 42 55 47 0a 20 20 75 33 32 20  ef NDEBUG.  u32 
0fa0: 6d 61 67 69 63 3b 20 20 20 20 2f 2a 20 4d 61 67  magic;    /* Mag
0fb0: 69 63 20 6e 75 6d 62 65 72 20 74 6f 20 64 65 74  ic number to det
0fc0: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 63 6f  ect structure co
0fd0: 72 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e  rruption. */.#en
0fe0: 64 69 66 0a 20 20 48 41 4e 44 4c 45 20 68 48 65  dif.  HANDLE hHe
0ff0: 61 70 3b 20 2f 2a 20 54 68 65 20 68 61 6e 64 6c  ap; /* The handl
1000: 65 20 74 6f 20 6f 75 72 20 68 65 61 70 2e 20 2a  e to our heap. *
1010: 2f 0a 20 20 42 4f 4f 4c 20 62 4f 77 6e 65 64 3b  /.  BOOL bOwned;
1020: 20 20 2f 2a 20 44 6f 20 77 65 20 6f 77 6e 20 74    /* Do we own t
1030: 68 65 20 68 65 61 70 20 28 69 2e 65 2e 20 64 65  he heap (i.e. de
1040: 73 74 72 6f 79 20 69 74 20 6f 6e 20 73 68 75 74  stroy it on shut
1050: 64 6f 77 6e 29 3f 20 2a 2f 0a 7d 3b 0a 0a 23 69  down)? */.};..#i
1060: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65  fndef NDEBUG.#de
1070: 66 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49  fine WINMEM_MAGI
1080: 43 20 20 20 20 20 30 78 34 32 62 32 38 33 30 62  C     0x42b2830b
1090: 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20  .#endif..static 
10a0: 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74  struct winMemDat
10b0: 61 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 20 3d  a win_mem_data =
10c0: 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   {.#ifndef NDEBU
10d0: 47 0a 20 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  G.  WINMEM_MAGIC
10e0: 2c 0a 23 65 6e 64 69 66 0a 20 20 4e 55 4c 4c 2c  ,.#endif.  NULL,
10f0: 20 46 41 4c 53 45 0a 7d 3b 0a 0a 23 69 66 6e 64   FALSE.};..#ifnd
1100: 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66 69 6e  ef NDEBUG.#defin
1110: 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61  e winMemAssertMa
1120: 67 69 63 28 29 20 61 73 73 65 72 74 28 20 77 69  gic() assert( wi
1130: 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63  n_mem_data.magic
1140: 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 29  ==WINMEM_MAGIC )
1150: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 77  .#else.#define w
1160: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
1170: 28 29 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  ().#endif..#defi
1180: 6e 65 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70  ne winMemGetHeap
1190: 28 29 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e  () win_mem_data.
11a0: 68 48 65 61 70 0a 0a 73 74 61 74 69 63 20 76 6f  hHeap..static vo
11b0: 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63  id *winMemMalloc
11c0: 28 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73 74  (int nBytes);.st
11d0: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d  atic void winMem
11e0: 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f  Free(void *pPrio
11f0: 72 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  r);.static void 
1200: 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76  *winMemRealloc(v
1210: 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74  oid *pPrior, int
1220: 20 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69 63   nBytes);.static
1230: 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28   int winMemSize(
1240: 76 6f 69 64 20 2a 70 29 3b 0a 73 74 61 74 69 63  void *p);.static
1250: 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64   int winMemRound
1260: 75 70 28 69 6e 74 20 6e 29 3b 0a 73 74 61 74 69  up(int n);.stati
1270: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74  c int winMemInit
1280: 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29  (void *pAppData)
1290: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  ;.static void wi
12a0: 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69  nMemShutdown(voi
12b0: 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 0a 63  d *pAppData);..c
12c0: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d  onst sqlite3_mem
12d0: 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65  _methods *sqlite
12e0: 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f 69  3MemGetWin32(voi
12f0: 64 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  d);.#endif /* SQ
1300: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
1310: 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  C */../*.** The 
1320: 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
1330: 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c 79 29  le is (normally)
1340: 20 73 65 74 20 6f 6e 63 65 20 61 6e 64 20 6e 65   set once and ne
1350: 76 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74  ver changes.** t
1360: 68 65 72 65 61 66 74 65 72 2e 20 20 49 74 20 72  hereafter.  It r
1370: 65 63 6f 72 64 73 20 77 68 65 74 68 65 72 20 74  ecords whether t
1380: 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
1390: 74 65 6d 20 69 73 20 57 69 6e 39 78 0a 2a 2a 20  tem is Win9x.** 
13a0: 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20  or WinNT..**.** 
13b0: 30 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73  0:   Operating s
13c0: 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a  ystem unknown..*
13d0: 2a 20 31 3a 20 20 20 4f 70 65 72 61 74 69 6e 67  * 1:   Operating
13e0: 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39 78   system is Win9x
13f0: 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72 61 74  ..** 2:   Operat
1400: 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69  ing system is Wi
1410: 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72  nNT..**.** In or
1420: 64 65 72 20 74 6f 20 66 61 63 69 6c 69 74 61 74  der to facilitat
1430: 65 20 74 65 73 74 69 6e 67 20 6f 6e 20 61 20 57  e testing on a W
1440: 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74 68 65  inNT system, the
1450: 20 74 65 73 74 20 66 69 78 74 75 72 65 0a 2a 2a   test fixture.**
1460: 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20 73 65   can manually se
1470: 74 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f 20  t this value to 
1480: 31 20 74 6f 20 65 6d 75 6c 61 74 65 20 57 69 6e  1 to emulate Win
1490: 39 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a  98 behavior..*/.
14a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
14b0: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  ST.int sqlite3_o
14c0: 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6c 73  s_type = 0;.#els
14d0: 65 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  e.static int sql
14e0: 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30  ite3_os_type = 0
14f0: 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53  ;.#endif..#if !S
1500: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
1510: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
1520: 52 54 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  RT.#  define SQL
1530: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
1540: 53 49 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53  SI.#endif..#if S
1550: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
1560: 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e  | SQLITE_OS_WINN
1570: 54 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  T || SQLITE_OS_W
1580: 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20 53  INRT.#  define S
1590: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
15a0: 57 49 44 45 0a 23 65 6e 64 69 66 0a 0a 23 69 66  WIDE.#endif..#if
15b0: 6e 64 65 66 20 53 59 53 43 41 4c 4c 0a 23 20 20  ndef SYSCALL.#  
15c0: 64 65 66 69 6e 65 20 53 59 53 43 41 4c 4c 20 73  define SYSCALL s
15d0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
15e0: 74 72 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53  tr.#endif..#if S
15f0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 2f  QLITE_OS_WINCE./
1600: 2a 0a 2a 2a 20 54 68 65 73 65 20 6d 61 63 72 6f  *.** These macro
1610: 73 20 61 72 65 20 6e 65 63 65 73 73 61 72 79 20  s are necessary 
1620: 62 65 63 61 75 73 65 20 57 69 6e 64 6f 77 73 20  because Windows 
1630: 43 45 20 64 6f 65 73 20 6e 6f 74 20 6e 61 74 69  CE does not nati
1640: 76 65 6c 79 20 73 75 70 70 6f 72 74 20 74 68 65  vely support the
1650: 0a 2a 2a 20 57 69 6e 33 32 20 41 50 49 73 20 4c  .** Win32 APIs L
1660: 6f 63 6b 46 69 6c 65 2c 20 55 6e 6c 6f 63 6b 46  ockFile, UnlockF
1670: 69 6c 65 2c 20 61 6e 64 20 4c 6f 63 6b 46 69 6c  ile, and LockFil
1680: 65 45 78 2e 0a 20 2a 2f 0a 0a 23 20 20 64 65 66  eEx.. */..#  def
1690: 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 28 61 2c 62  ine LockFile(a,b
16a0: 2c 63 2c 64 2c 65 29 20 20 20 20 20 20 20 77 69  ,c,d,e)       wi
16b0: 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26 61 2c 20  nceLockFile(&a, 
16c0: 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23 20 20 64  b, c, d, e).#  d
16d0: 65 66 69 6e 65 20 55 6e 6c 6f 63 6b 46 69 6c 65  efine UnlockFile
16e0: 28 61 2c 62 2c 63 2c 64 2c 65 29 20 20 20 20 20  (a,b,c,d,e)     
16f0: 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28  winceUnlockFile(
1700: 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a  &a, b, c, d, e).
1710: 23 20 20 64 65 66 69 6e 65 20 4c 6f 63 6b 46 69  #  define LockFi
1720: 6c 65 45 78 28 61 2c 62 2c 63 2c 64 2c 65 2c 66  leEx(a,b,c,d,e,f
1730: 29 20 20 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c  )   winceLockFil
1740: 65 45 78 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c  eEx(&a, b, c, d,
1750: 20 65 2c 20 66 29 0a 0a 2f 2a 0a 2a 2a 20 54 68   e, f)../*.** Th
1760: 65 73 65 20 61 72 65 20 74 68 65 20 73 70 65 63  ese are the spec
1770: 69 61 6c 20 73 79 73 63 61 6c 6c 20 68 61 63 6b  ial syscall hack
1780: 73 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 43 45  s for Windows CE
1790: 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 72  .  The locking r
17a0: 65 6c 61 74 65 64 0a 2a 2a 20 64 65 66 69 6e 65  elated.** define
17b0: 73 20 68 65 72 65 20 72 65 66 65 72 20 74 6f 20  s here refer to 
17c0: 74 68 65 20 6d 61 63 72 6f 73 20 64 65 66 69 6e  the macros defin
17d0: 65 64 20 6a 75 73 74 20 61 62 6f 76 65 2e 0a 20  ed just above.. 
17e0: 2a 2f 0a 0a 23 20 20 64 65 66 69 6e 65 20 6f 73  */..#  define os
17f0: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28  AreFileApisANSI(
1800: 29 20 20 20 20 20 20 20 31 0a 23 20 20 64 65 66  )       1.#  def
1810: 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 20 20  ine osLockFile  
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 6f                Lo
1830: 63 6b 46 69 6c 65 0a 23 20 20 64 65 66 69 6e 65  ckFile.#  define
1840: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 20 20   osUnlockFile   
1850: 20 20 20 20 20 20 20 20 20 20 20 55 6e 6c 6f 63             Unloc
1860: 6b 46 69 6c 65 0a 23 20 20 64 65 66 69 6e 65 20  kFile.#  define 
1870: 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20 20 20 20  osLockFileEx    
1880: 20 20 20 20 20 20 20 20 20 20 4c 6f 63 6b 46 69            LockFi
1890: 6c 65 45 78 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  leEx.#endif../*.
18a0: 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63  ** Many system c
18b0: 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73 65  alls are accesse
18c0: 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65  d through pointe
18d0: 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73  r-to-functions s
18e0: 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d  o that.** they m
18f0: 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e  ay be overridden
1900: 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66   at runtime to f
1910: 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20  acilitate fault 
1920: 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67  injection during
1930: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
1940: 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65  sandboxing.  The
1950: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79   following array
1960: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73   holds the names
1970: 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a   and pointers.**
1980: 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65   to all override
1990: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
19a0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  s..*/.static str
19b0: 75 63 74 20 77 69 6e 5f 73 79 73 63 61 6c 6c 20  uct win_syscall 
19c0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
19d0: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
19e0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
19f0: 20 73 79 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20   sytem call */. 
1a00: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
1a10: 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f  _ptr pCurrent; /
1a20: 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20  * Current value 
1a30: 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  of the system ca
1a40: 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ll */.  sqlite3_
1a50: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66  syscall_ptr pDef
1a60: 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74  ault; /* Default
1a70: 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73   value */.} aSys
1a80: 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 23 69 66 20 21  call[] = {.#if !
1a90: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
1aa0: 20 20 7b 20 22 41 72 65 46 69 6c 65 41 70 69 73    { "AreFileApis
1ab0: 41 4e 53 49 22 2c 20 20 20 20 20 20 20 20 20 28  ANSI",         (
1ac0: 53 59 53 43 41 4c 4c 29 41 72 65 46 69 6c 65 41  SYSCALL)AreFileA
1ad0: 70 69 73 41 4e 53 49 2c 20 20 20 20 20 20 20 20  pisANSI,        
1ae0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
1af0: 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
1b00: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
1b10: 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  (VOID))aSyscall[
1b20: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6c  0].pCurrent).#el
1b30: 73 65 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41  se.  { "AreFileA
1b40: 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20  pisANSI",       
1b50: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b70: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
1b80: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1b90: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
1ba0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
1bb0: 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72  _WIDE).  { "Char
1bc0: 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20 20 20  LowerW",        
1bd0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
1be0: 68 61 72 4c 6f 77 65 72 57 2c 20 20 20 20 20 20  harLowerW,      
1bf0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
1c00: 73 65 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65  se.  { "CharLowe
1c10: 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rW",            
1c20: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
1c50: 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72 4c  .#define osCharL
1c60: 6f 77 65 72 57 20 28 28 4c 50 57 53 54 52 28 57  owerW ((LPWSTR(W
1c70: 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29  INAPI*)(LPWSTR))
1c80: 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72  aSyscall[1].pCur
1c90: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
1ca0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65  E_OS_WINCE && de
1cb0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1cc0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
1cd0: 20 22 43 68 61 72 55 70 70 65 72 57 22 2c 20 20   "CharUpperW",  
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
1cf0: 43 41 4c 4c 29 43 68 61 72 55 70 70 65 72 57 2c  CALL)CharUpperW,
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
1d10: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 68  },.#else.  { "Ch
1d20: 61 72 55 70 70 65 72 57 22 2c 20 20 20 20 20 20  arUpperW",      
1d30: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
1d40: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
1d50: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
1d60: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
1d70: 73 43 68 61 72 55 70 70 65 72 57 20 28 28 4c 50  sCharUpperW ((LP
1d80: 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c 50  WSTR(WINAPI*)(LP
1d90: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32  WSTR))aSyscall[2
1da0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
1db0: 20 22 43 6c 6f 73 65 48 61 6e 64 6c 65 22 2c 20   "CloseHandle", 
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
1dd0: 43 41 4c 4c 29 43 6c 6f 73 65 48 61 6e 64 6c 65  CALL)CloseHandle
1de0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
1df0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c  },..#define osCl
1e00: 6f 73 65 48 61 6e 64 6c 65 20 28 28 42 4f 4f 4c  oseHandle ((BOOL
1e10: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
1e20: 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43  ))aSyscall[3].pC
1e30: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
1e40: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
1e50: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
1e60: 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c 20 20  "CreateFileA",  
1e70: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
1e80: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 41 2c  ALL)CreateFileA,
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
1ea0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
1eb0: 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20  ateFileA",      
1ec0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
1ed0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
1ee0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
1ef0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
1f00: 43 72 65 61 74 65 46 69 6c 65 41 20 28 28 48 41  CreateFileA ((HA
1f10: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
1f20: 43 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44  CSTR,DWORD,DWORD
1f30: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45  , \.        LPSE
1f40: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
1f50: 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41  S,DWORD,DWORD,HA
1f60: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 34  NDLE))aSyscall[4
1f70: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
1f80: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1f90: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
1fa0: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 57    { "CreateFileW
1fb0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
1fc0: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69  SYSCALL)CreateFi
1fd0: 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  leW,            
1fe0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
1ff0: 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20  "CreateFileW",  
2000: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
2010: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
2030: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
2040: 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57 20  e osCreateFileW 
2050: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
2060: 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c  )(LPCWSTR,DWORD,
2070: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
2080: 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52   LPSECURITY_ATTR
2090: 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f  IBUTES,DWORD,DWO
20a0: 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73 63  RD,HANDLE))aSysc
20b0: 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29  all[5].pCurrent)
20c0: 0a 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  ..  { "CreateFil
20d0: 65 4d 61 70 70 69 6e 67 22 2c 20 20 20 20 20 20  eMapping",      
20e0: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
20f0: 46 69 6c 65 4d 61 70 70 69 6e 67 2c 20 20 20 20  FileMapping,    
2100: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
2110: 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
2120: 70 69 6e 67 20 28 28 48 41 4e 44 4c 45 28 57 49  ping ((HANDLE(WI
2130: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
2140: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
2150: 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  TES, \.        D
2160: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
2170: 2c 4c 50 43 54 53 54 52 29 29 61 53 79 73 63 61  ,LPCTSTR))aSysca
2180: 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[6].pCurrent).
2190: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
21a0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
21b0: 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46  DE).  { "CreateF
21c0: 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20 20  ileMappingW",   
21d0: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
21e0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 2c 20  teFileMappingW, 
21f0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
2200: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d    { "CreateFileM
2210: 61 70 70 69 6e 67 57 22 2c 20 20 20 20 20 20 28  appingW",      (
2220: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2240: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
2250: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
2260: 6c 65 4d 61 70 70 69 6e 67 57 20 28 28 48 41 4e  leMappingW ((HAN
2270: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  DLE(WINAPI*)(HAN
2280: 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f 41  DLE,LPSECURITY_A
2290: 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20  TTRIBUTES, \.   
22a0: 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44       DWORD,DWORD
22b0: 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52 29 29  ,DWORD,LPCWSTR))
22c0: 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72  aSyscall[7].pCur
22d0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
22e0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
22f0: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43  HAS_WIDE).  { "C
2300: 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20 20 20  reateMutexW",   
2310: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
2320: 4c 29 43 72 65 61 74 65 4d 75 74 65 78 57 2c 20  L)CreateMutexW, 
2330: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2340: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74  #else.  { "Creat
2350: 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20 20  eMutexW",       
2360: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
2370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2380: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
2390: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72  if..#define osCr
23a0: 65 61 74 65 4d 75 74 65 78 57 20 28 28 48 41 4e  eateMutexW ((HAN
23b0: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53  DLE(WINAPI*)(LPS
23c0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
23d0: 45 53 2c 42 4f 4f 4c 2c 20 5c 0a 20 20 20 20 20  ES,BOOL, \.     
23e0: 20 20 20 4c 50 43 57 53 54 52 29 29 61 53 79 73     LPCWSTR))aSys
23f0: 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74  call[8].pCurrent
2400: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
2410: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2420: 41 4e 53 49 29 0a 20 20 7b 20 22 44 65 6c 65 74  ANSI).  { "Delet
2430: 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20  eFileA",        
2440: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65       (SYSCALL)De
2450: 6c 65 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20  leteFileA,      
2460: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
2470: 65 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c  e.  { "DeleteFil
2480: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eA",            
2490: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
24c0: 23 64 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65  #define osDelete
24d0: 46 69 6c 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e  FileA ((BOOL(WIN
24e0: 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53  API*)(LPCSTR))aS
24f0: 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65  yscall[9].pCurre
2500: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
2510: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
2520: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 44 65 6c  S_WIDE).  { "Del
2530: 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20  eteFileW",      
2540: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
2550: 44 65 6c 65 74 65 46 69 6c 65 57 2c 20 20 20 20  DeleteFileW,    
2560: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
2570: 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65 74 65 46  lse.  { "DeleteF
2580: 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ileW",          
2590: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
25c0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44 65 6c 65  ..#define osDele
25d0: 74 65 46 69 6c 65 57 20 28 28 42 4f 4f 4c 28 57  teFileW ((BOOL(W
25e0: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29  INAPI*)(LPCWSTR)
25f0: 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43  )aSyscall[10].pC
2600: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
2610: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b  ITE_OS_WINCE.  {
2620: 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61   "FileTimeToLoca
2630: 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53  lFileTime", (SYS
2640: 43 41 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f 4c  CALL)FileTimeToL
2650: 6f 63 61 6c 46 69 6c 65 54 69 6d 65 2c 20 30 20  ocalFileTime, 0 
2660: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 69  },.#else.  { "Fi
2670: 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c  leTimeToLocalFil
2680: 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c  eTime", (SYSCALL
2690: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
26a0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
26b0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
26c0: 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c  sFileTimeToLocal
26d0: 46 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28  FileTime ((BOOL(
26e0: 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 46  WINAPI*)(CONST F
26f0: 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20  ILETIME*, \.    
2700: 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29      LPFILETIME))
2710: 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75  aSyscall[11].pCu
2720: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
2730: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20  TE_OS_WINCE.  { 
2740: 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65  "FileTimeToSyste
2750: 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43  mTime",    (SYSC
2760: 41 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f 53 79  ALL)FileTimeToSy
2770: 73 74 65 6d 54 69 6d 65 2c 20 20 20 20 30 20 7d  stemTime,    0 }
2780: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c  ,.#else.  { "Fil
2790: 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d  eTimeToSystemTim
27a0: 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  e",    (SYSCALL)
27b0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
27c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
27d0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
27e0: 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d  FileTimeToSystem
27f0: 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  Time ((BOOL(WINA
2800: 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54  PI*)(CONST FILET
2810: 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20  IME*, \.        
2820: 4c 50 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53  LPSYSTEMTIME))aS
2830: 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72  yscall[12].pCurr
2840: 65 6e 74 29 0a 0a 20 20 7b 20 22 46 6c 75 73 68  ent)..  { "Flush
2850: 46 69 6c 65 42 75 66 66 65 72 73 22 2c 20 20 20  FileBuffers",   
2860: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6c       (SYSCALL)Fl
2870: 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 2c 20  ushFileBuffers, 
2880: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
2890: 66 69 6e 65 20 6f 73 46 6c 75 73 68 46 69 6c 65  fine osFlushFile
28a0: 42 75 66 66 65 72 73 20 28 28 42 4f 4f 4c 28 57  Buffers ((BOOL(W
28b0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29  INAPI*)(HANDLE))
28c0: 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75  aSyscall[13].pCu
28d0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
28e0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
28f0: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
2900: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22 2c  FormatMessageA",
2910: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
2920: 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  LL)FormatMessage
2930: 41 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  A,          0 },
2940: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d  .#else.  { "Form
2950: 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20  atMessageA",    
2960: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
2970: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2980: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
2990: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46  dif..#define osF
29a0: 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 20 28 28  ormatMessageA ((
29b0: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44  DWORD(WINAPI*)(D
29c0: 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f  WORD,LPCVOID,DWO
29d0: 52 44 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20  RD,DWORD,LPSTR, 
29e0: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
29f0: 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63 61  va_list*))aSysca
2a00: 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[14].pCurrent)
2a10: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
2a20: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
2a30: 49 44 45 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74  IDE).  { "Format
2a40: 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20 20 20  MessageW",      
2a50: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72      (SYSCALL)For
2a60: 6d 61 74 4d 65 73 73 61 67 65 57 2c 20 20 20 20  matMessageW,    
2a70: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
2a80: 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73  .  { "FormatMess
2a90: 61 67 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ageW",          
2aa0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
2ad0: 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d  define osFormatM
2ae0: 65 73 73 61 67 65 57 20 28 28 44 57 4f 52 44 28  essageW ((DWORD(
2af0: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c  WINAPI*)(DWORD,L
2b00: 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f  PCVOID,DWORD,DWO
2b10: 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20  RD,LPWSTR, \.   
2b20: 20 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69       DWORD,va_li
2b30: 73 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 35  st*))aSyscall[15
2b40: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
2b50: 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20   "FreeLibrary", 
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
2b70: 43 41 4c 4c 29 46 72 65 65 4c 69 62 72 61 72 79  CALL)FreeLibrary
2b80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
2b90: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 72  },..#define osFr
2ba0: 65 65 4c 69 62 72 61 72 79 20 28 28 42 4f 4f 4c  eeLibrary ((BOOL
2bb0: 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c  (WINAPI*)(HMODUL
2bc0: 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e  E))aSyscall[16].
2bd0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
2be0: 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
2bf0: 73 49 64 22 2c 20 20 20 20 20 28 53 59 53 43 41  sId",     (SYSCA
2c00: 4c 4c 29 47 65 74 43 75 72 72 65 6e 74 50 72 6f  LL)GetCurrentPro
2c10: 63 65 73 73 49 64 2c 20 20 20 20 20 30 20 7d 2c  cessId,     0 },
2c20: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 43  ..#define osGetC
2c30: 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 20  urrentProcessId 
2c40: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
2c50: 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  (VOID))aSyscall[
2c60: 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  17].pCurrent)..#
2c70: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
2c80: 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28 53  NCE && defined(S
2c90: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2ca0: 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 44 69  ANSI).  { "GetDi
2cb0: 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20 20  skFreeSpaceA",  
2cc0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
2cd0: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 2c  tDiskFreeSpaceA,
2ce0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
2cf0: 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72  e.  { "GetDiskFr
2d00: 65 65 53 70 61 63 65 41 22 2c 20 20 20 20 20 20  eeSpaceA",      
2d10: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d30: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
2d40: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69 73  #define osGetDis
2d50: 6b 46 72 65 65 53 70 61 63 65 41 20 28 28 42 4f  kFreeSpaceA ((BO
2d60: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53  OL(WINAPI*)(LPCS
2d70: 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f  TR,LPDWORD,LPDWO
2d80: 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20  RD,LPDWORD, \.  
2d90: 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61        LPDWORD))a
2da0: 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 72  Syscall[18].pCur
2db0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
2dc0: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64  TE_OS_WINCE && d
2dd0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
2de0: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
2df0: 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53 70  { "GetDiskFreeSp
2e00: 61 63 65 57 22 2c 20 20 20 20 20 20 20 28 53 59  aceW",       (SY
2e10: 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46 72 65  SCALL)GetDiskFre
2e20: 65 53 70 61 63 65 57 2c 20 20 20 20 20 20 20 30  eSpaceW,       0
2e30: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
2e40: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57  etDiskFreeSpaceW
2e50: 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ",       (SYSCAL
2e60: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
2e70: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2e80: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
2e90: 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53 70 61  osGetDiskFreeSpa
2ea0: 63 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ceW ((BOOL(WINAP
2eb0: 49 2a 29 28 4c 50 43 57 53 54 52 2c 4c 50 44 57  I*)(LPCWSTR,LPDW
2ec0: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57  ORD,LPDWORD,LPDW
2ed0: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
2ee0: 50 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  PDWORD))aSyscall
2ef0: 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [19].pCurrent)..
2f00: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
2f10: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
2f20: 49 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  I).  { "GetFileA
2f30: 74 74 72 69 62 75 74 65 73 41 22 2c 20 20 20 20  ttributesA",    
2f40: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69    (SYSCALL)GetFi
2f50: 6c 65 41 74 74 72 69 62 75 74 65 73 41 2c 20 20  leAttributesA,  
2f60: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
2f70: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
2f80: 62 75 74 65 73 41 22 2c 20 20 20 20 20 20 28 53  butesA",      (S
2f90: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
2fc0: 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74  fine osGetFileAt
2fd0: 74 72 69 62 75 74 65 73 41 20 28 28 44 57 4f 52  tributesA ((DWOR
2fe0: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  D(WINAPI*)(LPCST
2ff0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e  R))aSyscall[20].
3000: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3010: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
3020: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
3030: 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62  { "GetFileAttrib
3040: 75 74 65 73 57 22 2c 20 20 20 20 20 20 28 53 59  utesW",      (SY
3050: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74  SCALL)GetFileAtt
3060: 72 69 62 75 74 65 73 57 2c 20 20 20 20 20 20 30  ributesW,      0
3070: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
3080: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
3090: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
30a0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
30b0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
30c0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
30d0: 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
30e0: 74 65 73 57 20 28 28 44 57 4f 52 44 28 57 49 4e  tesW ((DWORD(WIN
30f0: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61  API*)(LPCWSTR))a
3100: 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72  Syscall[21].pCur
3110: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
3120: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3130: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
3140: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
3150: 45 78 57 22 2c 20 20 20 20 28 53 59 53 43 41 4c  ExW",    (SYSCAL
3160: 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  L)GetFileAttribu
3170: 74 65 73 45 78 57 2c 20 20 20 20 30 20 7d 2c 0a  tesExW,    0 },.
3180: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
3190: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 22  leAttributesExW"
31a0: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c  ,    (SYSCALL)0,
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
31d0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
31e0: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
31f0: 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  xW ((BOOL(WINAPI
3200: 2a 29 28 4c 50 43 57 53 54 52 2c 47 45 54 5f 46  *)(LPCWSTR,GET_F
3210: 49 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c  ILEEX_INFO_LEVEL
3220: 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 56  S, \.        LPV
3230: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 32  OID))aSyscall[22
3240: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3250: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
3260: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69 7a  .  { "GetFileSiz
3270: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
3280: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
32b0: 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20   "GetFileSize", 
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
32d0: 43 41 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a 65  CALL)GetFileSize
32e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
32f0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
3300: 6e 65 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65  ne osGetFileSize
3310: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
3320: 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52 44  )(HANDLE,LPDWORD
3330: 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70  ))aSyscall[23].p
3340: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
3350: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
3360: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
3370: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
3380: 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74  .  { "GetFullPat
3390: 68 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20  hNameA",        
33a0: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c  (SYSCALL)GetFull
33b0: 50 61 74 68 4e 61 6d 65 41 2c 20 20 20 20 20 20  PathNameA,      
33c0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
33d0: 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
33e0: 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  eA",        (SYS
33f0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
3400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3410: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
3420: 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68  ne osGetFullPath
3430: 4e 61 6d 65 41 20 28 28 44 57 4f 52 44 28 57 49  NameA ((DWORD(WI
3440: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57  NAPI*)(LPCSTR,DW
3450: 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20  ORD,LPSTR, \.   
3460: 20 20 20 20 20 4c 50 53 54 52 2a 29 29 61 53 79       LPSTR*))aSy
3470: 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65  scall[24].pCurre
3480: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
3490: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
34a0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
34b0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
34c0: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
34d0: 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68    { "GetFullPath
34e0: 4e 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28  NameW",        (
34f0: 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50  SYSCALL)GetFullP
3500: 61 74 68 4e 61 6d 65 57 2c 20 20 20 20 20 20 20  athNameW,       
3510: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3520: 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  "GetFullPathName
3530: 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  W",        (SYSC
3540: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
3550: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3560: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
3570: 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e  e osGetFullPathN
3580: 61 6d 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e  ameW ((DWORD(WIN
3590: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57  API*)(LPCWSTR,DW
35a0: 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20  ORD,LPWSTR, \.  
35b0: 20 20 20 20 20 20 4c 50 57 53 54 52 2a 29 29 61        LPWSTR*))a
35c0: 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72  Syscall[25].pCur
35d0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 4c  rent)..  { "GetL
35e0: 61 73 74 45 72 72 6f 72 22 2c 20 20 20 20 20 20  astError",      
35f0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
3600: 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20  etLastError,    
3610: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
3620: 65 66 69 6e 65 20 6f 73 47 65 74 4c 61 73 74 45  efine osGetLastE
3630: 72 72 6f 72 20 28 28 44 57 4f 52 44 28 57 49 4e  rror ((DWORD(WIN
3640: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
3650: 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e  call[26].pCurren
3660: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
3670: 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 20 54 68 65  S_WINCE.  /* The
3680: 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41   GetProcAddressA
3690: 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  () routine is on
36a0: 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
36b0: 57 69 6e 64 6f 77 73 20 43 45 2e 20 2a 2f 0a 20  Windows CE. */. 
36c0: 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65   { "GetProcAddre
36d0: 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53  ssA",         (S
36e0: 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41 64  YSCALL)GetProcAd
36f0: 64 72 65 73 73 41 2c 20 20 20 20 20 20 20 20 20  dressA,         
3700: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 2f 2a 20  0 },.#else.  /* 
3710: 41 6c 6c 20 6f 74 68 65 72 20 57 69 6e 64 6f 77  All other Window
3720: 73 20 70 6c 61 74 66 6f 72 6d 73 20 65 78 70 65  s platforms expe
3730: 63 74 20 47 65 74 50 72 6f 63 41 64 64 72 65 73  ct GetProcAddres
3740: 73 28 29 20 74 6f 20 74 61 6b 65 0a 20 20 2a 2a  s() to take.  **
3750: 20 61 6e 20 41 4e 53 49 20 73 74 72 69 6e 67 20   an ANSI string 
3760: 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  regardless of th
3770: 65 20 5f 55 4e 49 43 4f 44 45 20 73 65 74 74 69  e _UNICODE setti
3780: 6e 67 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72  ng */.  { "GetPr
3790: 6f 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20  ocAddressA",    
37a0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
37b0: 74 50 72 6f 63 41 64 64 72 65 73 73 2c 20 20 20  tProcAddress,   
37c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
37d0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
37e0: 74 50 72 6f 63 41 64 64 72 65 73 73 41 20 28 28  tProcAddressA ((
37f0: 46 41 52 50 52 4f 43 28 57 49 4e 41 50 49 2a 29  FARPROC(WINAPI*)
3800: 28 48 4d 4f 44 55 4c 45 2c 20 5c 0a 20 20 20 20  (HMODULE, \.    
3810: 20 20 20 20 4c 50 43 53 54 52 29 29 61 53 79 73      LPCSTR))aSys
3820: 63 61 6c 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e  call[27].pCurren
3830: 74 29 0a 0a 20 20 7b 20 22 47 65 74 53 79 73 74  t)..  { "GetSyst
3840: 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20  emInfo",        
3850: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53     (SYSCALL)GetS
3860: 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 20  ystemInfo,      
3870: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
3880: 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e  ne osGetSystemIn
3890: 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  fo ((VOID(WINAPI
38a0: 2a 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f  *)(LPSYSTEM_INFO
38b0: 29 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70  ))aSyscall[28].p
38c0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47  Current)..  { "G
38d0: 65 74 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20  etSystemTime",  
38e0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
38f0: 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 2c  L)GetSystemTime,
3900: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3910: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79  .#define osGetSy
3920: 73 74 65 6d 54 69 6d 65 20 28 28 56 4f 49 44 28  stemTime ((VOID(
3930: 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45  WINAPI*)(LPSYSTE
3940: 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b  MTIME))aSyscall[
3950: 32 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  29].pCurrent)..#
3960: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
3970: 4e 43 45 0a 20 20 7b 20 22 47 65 74 53 79 73 74  NCE.  { "GetSyst
3980: 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
3990: 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53  ", (SYSCALL)GetS
39a0: 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
39b0: 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ime, 0 },.#else.
39c0: 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69    { "GetSystemTi
39d0: 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28  meAsFileTime", (
39e0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a00: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3a10: 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65  efine osGetSyste
3a20: 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 20  mTimeAsFileTime 
3a30: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
3a40: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c   \.        LPFIL
3a50: 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b  ETIME))aSyscall[
3a60: 33 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  30].pCurrent)..#
3a70: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
3a80: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
3a90: 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61  ).  { "GetTempPa
3aa0: 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  thA",           
3ab0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d   (SYSCALL)GetTem
3ac0: 70 50 61 74 68 41 2c 20 20 20 20 20 20 20 20 20  pPathA,         
3ad0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3ae0: 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 41 22  { "GetTempPathA"
3af0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
3b00: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
3b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3b20: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
3b30: 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74  ine osGetTempPat
3b40: 68 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  hA ((DWORD(WINAP
3b50: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54 52 29  I*)(DWORD,LPSTR)
3b60: 29 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70 43  )aSyscall[31].pC
3b70: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
3b80: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
3b90: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3ba0: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
3bb0: 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68    { "GetTempPath
3bc0: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
3bd0: 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50  SYSCALL)GetTempP
3be0: 61 74 68 57 2c 20 20 20 20 20 20 20 20 20 20 20  athW,           
3bf0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3c00: 22 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20  "GetTempPathW", 
3c10: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
3c20: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
3c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3c40: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
3c50: 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57  e osGetTempPathW
3c60: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
3c70: 29 28 44 57 4f 52 44 2c 4c 50 57 53 54 52 29 29  )(DWORD,LPWSTR))
3c80: 61 53 79 73 63 61 6c 6c 5b 33 32 5d 2e 70 43 75  aSyscall[32].pCu
3c90: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74  rrent)..  { "Get
3ca0: 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20 20  TickCount",     
3cb0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3cc0: 47 65 74 54 69 63 6b 43 6f 75 6e 74 2c 20 20 20  GetTickCount,   
3cd0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
3ce0: 64 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b  define osGetTick
3cf0: 43 6f 75 6e 74 20 28 28 44 57 4f 52 44 28 57 49  Count ((DWORD(WI
3d00: 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79  NAPI*)(VOID))aSy
3d10: 73 63 61 6c 6c 5b 33 33 5d 2e 70 43 75 72 72 65  scall[33].pCurre
3d20: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
3d30: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
3d40: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74  S_ANSI).  { "Get
3d50: 56 65 72 73 69 6f 6e 45 78 41 22 2c 20 20 20 20  VersionExA",    
3d60: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3d70: 47 65 74 56 65 72 73 69 6f 6e 45 78 41 2c 20 20  GetVersionExA,  
3d80: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3d90: 6c 73 65 0a 20 20 7b 20 22 47 65 74 56 65 72 73  lse.  { "GetVers
3da0: 69 6f 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20  ionExA",        
3db0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dd0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3de0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 56  ..#define osGetV
3df0: 65 72 73 69 6f 6e 45 78 41 20 28 28 42 4f 4f 4c  ersionExA ((BOOL
3e00: 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20  (WINAPI*)( \.   
3e10: 20 20 20 20 20 4c 50 4f 53 56 45 52 53 49 4f 4e       LPOSVERSION
3e20: 49 4e 46 4f 41 29 29 61 53 79 73 63 61 6c 6c 5b  INFOA))aSyscall[
3e30: 33 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  34].pCurrent).. 
3e40: 20 7b 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20   { "HeapAlloc", 
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
3e60: 59 53 43 41 4c 4c 29 48 65 61 70 41 6c 6c 6f 63  YSCALL)HeapAlloc
3e70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3e80: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
3e90: 48 65 61 70 41 6c 6c 6f 63 20 28 28 4c 50 56 4f  HeapAlloc ((LPVO
3ea0: 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  ID(WINAPI*)(HAND
3eb0: 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  LE,DWORD, \.    
3ec0: 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73      SIZE_T))aSys
3ed0: 63 61 6c 6c 5b 33 35 5d 2e 70 43 75 72 72 65 6e  call[35].pCurren
3ee0: 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 43 72 65  t)..  { "HeapCre
3ef0: 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ate",           
3f00: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
3f10: 43 72 65 61 74 65 2c 20 20 20 20 20 20 20 20 20  Create,         
3f20: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
3f30: 6e 65 20 6f 73 48 65 61 70 43 72 65 61 74 65 20  ne osHeapCreate 
3f40: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
3f50: 29 28 44 57 4f 52 44 2c 53 49 5a 45 5f 54 2c 20  )(DWORD,SIZE_T, 
3f60: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
3f70: 29 29 61 53 79 73 63 61 6c 6c 5b 33 36 5d 2e 70  ))aSyscall[36].p
3f80: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48  Current)..  { "H
3f90: 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20 20 20  eapDestroy",    
3fa0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3fb0: 4c 29 48 65 61 70 44 65 73 74 72 6f 79 2c 20 20  L)HeapDestroy,  
3fc0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3fd0: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 44  .#define osHeapD
3fe0: 65 73 74 72 6f 79 20 28 28 42 4f 4f 4c 28 57 49  estroy ((BOOL(WI
3ff0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61  NAPI*)(HANDLE))a
4000: 53 79 73 63 61 6c 6c 5b 33 37 5d 2e 70 43 75 72  Syscall[37].pCur
4010: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70  rent)..  { "Heap
4020: 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20  Free",          
4030: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
4040: 65 61 70 46 72 65 65 2c 20 20 20 20 20 20 20 20  eapFree,        
4050: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
4060: 65 66 69 6e 65 20 6f 73 48 65 61 70 46 72 65 65  efine osHeapFree
4070: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4080: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50  (HANDLE,DWORD,LP
4090: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33  VOID))aSyscall[3
40a0: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  8].pCurrent)..  
40b0: 7b 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 2c  { "HeapReAlloc",
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
40d0: 53 43 41 4c 4c 29 48 65 61 70 52 65 41 6c 6c 6f  SCALL)HeapReAllo
40e0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  c,             0
40f0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48   },..#define osH
4100: 65 61 70 52 65 41 6c 6c 6f 63 20 28 28 4c 50 56  eapReAlloc ((LPV
4110: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OID(WINAPI*)(HAN
4120: 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44  DLE,DWORD,LPVOID
4130: 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45  , \.        SIZE
4140: 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 39 5d  _T))aSyscall[39]
4150: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
4160: 22 48 65 61 70 53 69 7a 65 22 2c 20 20 20 20 20  "HeapSize",     
4170: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4180: 41 4c 4c 29 48 65 61 70 53 69 7a 65 2c 20 20 20  ALL)HeapSize,   
4190: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
41a0: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  ,..#define osHea
41b0: 70 53 69 7a 65 20 28 28 53 49 5a 45 5f 54 28 57  pSize ((SIZE_T(W
41c0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
41d0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
41e0: 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c  LPCVOID))aSyscal
41f0: 6c 5b 34 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[40].pCurrent).
4200: 0a 20 20 7b 20 22 48 65 61 70 56 61 6c 69 64 61  .  { "HeapValida
4210: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
4220: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 56 61 6c  (SYSCALL)HeapVal
4230: 69 64 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  idate,          
4240: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
4250: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 20 28  osHeapValidate (
4260: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
4270: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20  ANDLE,DWORD, \. 
4280: 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29         LPCVOID))
4290: 61 53 79 73 63 61 6c 6c 5b 34 31 5d 2e 70 43 75  aSyscall[41].pCu
42a0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
42b0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
42c0: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
42d0: 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20  LoadLibraryA",  
42e0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
42f0: 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 41 2c  LL)LoadLibraryA,
4300: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4310: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64  .#else.  { "Load
4320: 4c 69 62 72 61 72 79 41 22 2c 20 20 20 20 20 20  LibraryA",      
4330: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4340: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4350: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4360: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c  dif..#define osL
4370: 6f 61 64 4c 69 62 72 61 72 79 41 20 28 28 48 4d  oadLibraryA ((HM
4380: 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ODULE(WINAPI*)(L
4390: 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PCSTR))aSyscall[
43a0: 34 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  42].pCurrent)..#
43b0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
43c0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
43d0: 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61  ).  { "LoadLibra
43e0: 72 79 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  ryW",           
43f0: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69   (SYSCALL)LoadLi
4400: 62 72 61 72 79 57 2c 20 20 20 20 20 20 20 20 20  braryW,         
4410: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4420: 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22  { "LoadLibraryW"
4430: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
4440: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4460: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4470: 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72  ine osLoadLibrar
4480: 79 57 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e  yW ((HMODULE(WIN
4490: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61  API*)(LPCWSTR))a
44a0: 53 79 73 63 61 6c 6c 5b 34 33 5d 2e 70 43 75 72  Syscall[43].pCur
44b0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 4c 6f 63 61  rent)..  { "Loca
44c0: 6c 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20  lFree",         
44d0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c        (SYSCALL)L
44e0: 6f 63 61 6c 46 72 65 65 2c 20 20 20 20 20 20 20  ocalFree,       
44f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
4500: 65 66 69 6e 65 20 6f 73 4c 6f 63 61 6c 46 72 65  efine osLocalFre
4510: 65 20 28 28 48 4c 4f 43 41 4c 28 57 49 4e 41 50  e ((HLOCAL(WINAP
4520: 49 2a 29 28 48 4c 4f 43 41 4c 29 29 61 53 79 73  I*)(HLOCAL))aSys
4530: 63 61 6c 6c 5b 34 34 5d 2e 70 43 75 72 72 65 6e  call[44].pCurren
4540: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
4550: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c 6f  OS_WINCE.  { "Lo
4560: 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  ckFile",        
4570: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4580: 29 4c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20  )LockFile,      
4590: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
45a0: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69  #define osLockFi
45b0: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
45c0: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
45d0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
45e0: 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53         DWORD))aS
45f0: 79 73 63 61 6c 6c 5b 34 35 5d 2e 70 43 75 72 72  yscall[45].pCurr
4600: 65 6e 74 29 0a 23 65 6c 73 65 0a 20 20 7b 20 22  ent).#else.  { "
4610: 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20  LockFile",      
4620: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4630: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4640: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4650: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51  .#endif..#if !SQ
4660: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
4670: 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20  { "LockFileEx", 
4680: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4690: 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 45 78  SCALL)LockFileEx
46a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
46b0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c   },..#define osL
46c0: 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c  ockFileEx ((BOOL
46d0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
46e0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f  ,DWORD,DWORD,DWO
46f0: 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  RD,DWORD, \.    
4700: 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44      LPOVERLAPPED
4710: 29 29 61 53 79 73 63 61 6c 6c 5b 34 36 5d 2e 70  ))aSyscall[46].p
4720: 43 75 72 72 65 6e 74 29 0a 23 65 6c 73 65 0a 20  Current).#else. 
4730: 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c   { "LockFileEx",
4740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
4750: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4770: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 20 20 7b  0 },.#endif..  {
4780: 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 22   "MapViewOfFile"
4790: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
47a0: 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69  CALL)MapViewOfFi
47b0: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 30 20  le,           0 
47c0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61  },..#define osMa
47d0: 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 4c 50  pViewOfFile ((LP
47e0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41  VOID(WINAPI*)(HA
47f0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
4800: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
4810: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61    SIZE_T))aSysca
4820: 6c 6c 5b 34 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[47].pCurrent)
4830: 0a 0a 20 20 7b 20 22 4d 75 6c 74 69 42 79 74 65  ..  { "MultiByte
4840: 54 6f 57 69 64 65 43 68 61 72 22 2c 20 20 20 20  ToWideChar",    
4850: 20 28 53 59 53 43 41 4c 4c 29 4d 75 6c 74 69 42   (SYSCALL)MultiB
4860: 79 74 65 54 6f 57 69 64 65 43 68 61 72 2c 20 20  yteToWideChar,  
4870: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
4880: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
4890: 64 65 43 68 61 72 20 28 28 69 6e 74 28 57 49 4e  deChar ((int(WIN
48a0: 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52 44  API*)(UINT,DWORD
48b0: 2c 4c 50 43 53 54 52 2c 69 6e 74 2c 4c 50 57 53  ,LPCSTR,int,LPWS
48c0: 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 69 6e  TR, \.        in
48d0: 74 29 29 61 53 79 73 63 61 6c 6c 5b 34 38 5d 2e  t))aSyscall[48].
48e0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
48f0: 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65  QueryPerformance
4900: 43 6f 75 6e 74 65 72 22 2c 20 28 53 59 53 43 41  Counter", (SYSCA
4910: 4c 4c 29 51 75 65 72 79 50 65 72 66 6f 72 6d 61  LL)QueryPerforma
4920: 6e 63 65 43 6f 75 6e 74 65 72 2c 20 30 20 7d 2c  nceCounter, 0 },
4930: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 51 75 65 72  ..#define osQuer
4940: 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e  yPerformanceCoun
4950: 74 65 72 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ter ((BOOL(WINAP
4960: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
4970: 41 52 47 45 5f 49 4e 54 45 47 45 52 2a 29 29 61  ARGE_INTEGER*))a
4980: 53 79 73 63 61 6c 6c 5b 34 39 5d 2e 70 43 75 72  Syscall[49].pCur
4990: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 52 65 61 64  rent)..  { "Read
49a0: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
49b0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 52        (SYSCALL)R
49c0: 65 61 64 46 69 6c 65 2c 20 20 20 20 20 20 20 20  eadFile,        
49d0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
49e0: 65 66 69 6e 65 20 6f 73 52 65 61 64 46 69 6c 65  efine osReadFile
49f0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4a00: 28 48 41 4e 44 4c 45 2c 4c 50 56 4f 49 44 2c 44  (HANDLE,LPVOID,D
4a10: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a  WORD,LPDWORD, \.
4a20: 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41          LPOVERLA
4a30: 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  PPED))aSyscall[5
4a40: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  0].pCurrent)..  
4a50: 7b 20 22 53 65 74 45 6e 64 4f 66 46 69 6c 65 22  { "SetEndOfFile"
4a60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
4a70: 53 43 41 4c 4c 29 53 65 74 45 6e 64 4f 66 46 69  SCALL)SetEndOfFi
4a80: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  le,            0
4a90: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53   },..#define osS
4aa0: 65 74 45 6e 64 4f 66 46 69 6c 65 20 28 28 42 4f  etEndOfFile ((BO
4ab0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
4ac0: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 31 5d  LE))aSyscall[51]
4ad0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4ae0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
4af0: 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e    { "SetFilePoin
4b00: 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 28  ter",          (
4b10: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b30: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4b40: 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 22  "SetFilePointer"
4b50: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
4b60: 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e 74  ALL)SetFilePoint
4b70: 65 72 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  er,          0 }
4b80: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4b90: 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74  e osSetFilePoint
4ba0: 65 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  er ((DWORD(WINAP
4bb0: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f 4e 47 2c  I*)(HANDLE,LONG,
4bc0: 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20 20 20 20  PLONG, \.       
4bd0: 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c   DWORD))aSyscall
4be0: 5b 35 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [52].pCurrent)..
4bf0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
4c00: 4e 52 54 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c  NRT.  { "Sleep",
4c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c20: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c40: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4c50: 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20 20    { "Sleep",    
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
4c70: 53 59 53 43 41 4c 4c 29 53 6c 65 65 70 2c 20 20  SYSCALL)Sleep,  
4c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c90: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4ca0: 65 66 69 6e 65 20 6f 73 53 6c 65 65 70 20 28 28  efine osSleep ((
4cb0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 44 57  VOID(WINAPI*)(DW
4cc0: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 33  ORD))aSyscall[53
4cd0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
4ce0: 20 22 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69   "SystemTimeToFi
4cf0: 6c 65 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53  leTime",    (SYS
4d00: 43 41 4c 4c 29 53 79 73 74 65 6d 54 69 6d 65 54  CALL)SystemTimeT
4d10: 6f 46 69 6c 65 54 69 6d 65 2c 20 20 20 20 30 20  oFileTime,    0 
4d20: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 79  },..#define osSy
4d30: 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69  stemTimeToFileTi
4d40: 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  me ((BOOL(WINAPI
4d50: 2a 29 28 43 4f 4e 53 54 20 53 59 53 54 45 4d 54  *)(CONST SYSTEMT
4d60: 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20  IME*, \.        
4d70: 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73  LPFILETIME))aSys
4d80: 63 61 6c 6c 5b 35 34 5d 2e 70 43 75 72 72 65 6e  call[54].pCurren
4d90: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
4da0: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55 6e  OS_WINCE.  { "Un
4db0: 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20  lockFile",      
4dc0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4dd0: 29 55 6e 6c 6f 63 6b 46 69 6c 65 2c 20 20 20 20  )UnlockFile,    
4de0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
4df0: 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b  #define osUnlock
4e00: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
4e10: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
4e20: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  D,DWORD,DWORD, \
4e30: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29  .        DWORD))
4e40: 61 53 79 73 63 61 6c 6c 5b 35 35 5d 2e 70 43 75  aSyscall[55].pCu
4e50: 72 72 65 6e 74 29 0a 23 65 6c 73 65 0a 20 20 7b  rrent).#else.  {
4e60: 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20   "UnlockFile",  
4e70: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4e80: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4ea0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  },.#endif..#if !
4eb0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
4ec0: 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45    { "UnlockFileE
4ed0: 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  x",            (
4ee0: 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69  SYSCALL)UnlockFi
4ef0: 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20 20 20  leEx,           
4f00: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
4f10: 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 20 28 28  sUnlockFileEx ((
4f20: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
4f30: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
4f40: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
4f50: 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29    LPOVERLAPPED))
4f60: 61 53 79 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75  aSyscall[56].pCu
4f70: 72 72 65 6e 74 29 0a 23 65 6c 73 65 0a 20 20 7b  rrent).#else.  {
4f80: 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c   "UnlockFileEx",
4f90: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4fa0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4fc0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22  },.#endif..  { "
4fd0: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 22  UnmapViewOfFile"
4fe0: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
4ff0: 4c 4c 29 55 6e 6d 61 70 56 69 65 77 4f 66 46 69  LL)UnmapViewOfFi
5000: 6c 65 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c  le,         0 },
5010: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6d 61  ..#define osUnma
5020: 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 42 4f  pViewOfFile ((BO
5030: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 56  OL(WINAPI*)(LPCV
5040: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 37  OID))aSyscall[57
5050: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5060: 20 22 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74   "WideCharToMult
5070: 69 42 79 74 65 22 2c 20 20 20 20 20 28 53 59 53  iByte",     (SYS
5080: 43 41 4c 4c 29 57 69 64 65 43 68 61 72 54 6f 4d  CALL)WideCharToM
5090: 75 6c 74 69 42 79 74 65 2c 20 20 20 20 20 30 20  ultiByte,     0 
50a0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 69  },..#define osWi
50b0: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
50c0: 65 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29  e ((int(WINAPI*)
50d0: 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 57  (UINT,DWORD,LPCW
50e0: 53 54 52 2c 69 6e 74 2c 4c 50 53 54 52 2c 69 6e  STR,int,LPSTR,in
50f0: 74 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  t, \.        LPC
5100: 53 54 52 2c 4c 50 42 4f 4f 4c 29 29 61 53 79 73  STR,LPBOOL))aSys
5110: 63 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e  call[58].pCurren
5120: 74 29 0a 0a 20 20 7b 20 22 57 72 69 74 65 46 69  t)..  { "WriteFi
5130: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
5140: 20 20 20 28 53 59 53 43 41 4c 4c 29 57 72 69 74     (SYSCALL)Writ
5150: 65 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  eFile,          
5160: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
5170: 6e 65 20 6f 73 57 72 69 74 65 46 69 6c 65 20 28  ne osWriteFile (
5180: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
5190: 41 4e 44 4c 45 2c 4c 50 43 56 4f 49 44 2c 44 57  ANDLE,LPCVOID,DW
51a0: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
51b0: 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50         LPOVERLAP
51c0: 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 39  PED))aSyscall[59
51d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
51e0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
51f0: 45 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76 65  E.  { "CreateEve
5200: 6e 74 45 78 22 2c 20 20 20 20 20 20 20 20 20 20  ntEx",          
5210: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
5220: 45 76 65 6e 74 45 78 2c 20 20 20 20 20 20 20 20  EventEx,        
5230: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
5240: 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74 45 78   osCreateEventEx
5250: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
5260: 2a 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54  *)(LPSECURITY_AT
5270: 54 52 49 42 55 54 45 53 2c 4c 50 43 54 53 54 52  TRIBUTES,LPCTSTR
5280: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
5290: 44 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  D,DWORD))aSyscal
52a0: 6c 5b 36 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[60].pCurrent).
52b0: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74  #else.  { "Creat
52c0: 65 45 76 65 6e 74 45 78 22 2c 20 20 20 20 20 20  eEventEx",      
52d0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
52e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52f0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5300: 69 66 0a 0a 20 20 7b 20 22 57 61 69 74 46 6f 72  if..  { "WaitFor
5310: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20  SingleObject",  
5320: 20 20 20 28 53 59 53 43 41 4c 4c 29 57 61 69 74     (SYSCALL)Wait
5330: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 2c  ForSingleObject,
5340: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
5350: 6e 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67  ne osWaitForSing
5360: 6c 65 4f 62 6a 65 63 74 20 28 28 44 57 4f 52 44  leObject ((DWORD
5370: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
5380: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
5390: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 31 5d 2e  D))aSyscall[61].
53a0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
53b0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
53c0: 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67    { "WaitForSing
53d0: 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28  leObjectEx",   (
53e0: 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53  SYSCALL)WaitForS
53f0: 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 2c 20 20  ingleObjectEx,  
5400: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
5410: 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  sWaitForSingleOb
5420: 6a 65 63 74 45 78 20 28 28 44 57 4f 52 44 28 57  jectEx ((DWORD(W
5430: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
5440: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
5450: 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36  BOOL))aSyscall[6
5460: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6c  2].pCurrent).#el
5470: 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53  se.  { "WaitForS
5480: 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20  ingleObjectEx", 
5490: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
54a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
54c0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
54d0: 57 49 4e 43 45 0a 20 20 7b 20 22 53 65 74 46 69  WINCE.  { "SetFi
54e0: 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20  lePointerEx",   
54f0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65       (SYSCALL)Se
5500: 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 2c 20  tFilePointerEx, 
5510: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
5520: 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f  fine osSetFilePo
5530: 69 6e 74 65 72 45 78 20 28 28 42 4f 4f 4c 28 57  interEx ((BOOL(W
5540: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
5550: 41 52 47 45 5f 49 4e 54 45 47 45 52 2c 20 5c 0a  ARGE_INTEGER, \.
5560: 20 20 20 20 20 20 20 20 50 4c 41 52 47 45 5f 49          PLARGE_I
5570: 4e 54 45 47 45 52 2c 44 57 4f 52 44 29 29 61 53  NTEGER,DWORD))aS
5580: 79 73 63 61 6c 6c 5b 36 33 5d 2e 70 43 75 72 72  yscall[63].pCurr
5590: 65 6e 74 29 0a 23 65 6c 73 65 0a 20 20 7b 20 22  ent).#else.  { "
55a0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78  SetFilePointerEx
55b0: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
55c0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
55d0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
55e0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51  .#endif..#if !SQ
55f0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
5600: 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d  { "GetFileInform
5610: 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22  ationByHandleEx"
5620: 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69  , (SYSCALL)GetFi
5630: 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48  leInformationByH
5640: 61 6e 64 6c 65 45 78 2c 20 30 20 7d 2c 0a 0a 23  andleEx, 0 },..#
5650: 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65  define osGetFile
5660: 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
5670: 64 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e  dleEx ((BOOL(WIN
5680: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a  API*)(HANDLE, \.
5690: 20 20 20 20 20 20 20 20 46 49 4c 45 5f 49 4e 46          FILE_INF
56a0: 4f 5f 42 59 5f 48 41 4e 44 4c 45 5f 43 4c 41 53  O_BY_HANDLE_CLAS
56b0: 53 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 29 29  S,LPVOID,DWORD))
56c0: 61 53 79 73 63 61 6c 6c 5b 36 34 5d 2e 70 43 75  aSyscall[64].pCu
56d0: 72 72 65 6e 74 29 0a 23 65 6c 73 65 0a 20 20 7b  rrent).#else.  {
56e0: 20 22 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61   "GetFileInforma
56f0: 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c  tionByHandleEx",
5700: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5720: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22  },.#endif..  { "
5730: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 45 78 22  MapViewOfFileEx"
5740: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
5750: 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  LL)MapViewOfFile
5760: 45 78 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c  Ex,         0 },
5770: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61 70 56  ..#define osMapV
5780: 69 65 77 4f 66 46 69 6c 65 45 78 20 28 28 4c 50  iewOfFileEx ((LP
5790: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41  VOID(WINAPI*)(HA
57a0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
57b0: 2c 44 57 4f 52 44 2c 53 49 5a 45 5f 54 2c 20 5c  ,DWORD,SIZE_T, \
57c0: 0a 20 20 20 20 20 20 20 20 4c 50 56 4f 49 44 29  .        LPVOID)
57d0: 29 61 53 79 73 63 61 6c 6c 5b 36 35 5d 2e 70 43  )aSyscall[65].pC
57e0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
57f0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
5800: 30 20 2f 2a 20 44 49 53 41 42 4c 45 44 3a 20 43  0 /* DISABLED: C
5810: 61 6e 20 62 65 20 63 6f 6d 70 69 6c 65 64 20 77  an be compiled w
5820: 69 74 68 20 57 69 6e 52 54 20 6f 6e 6c 79 2e 20  ith WinRT only. 
5830: 2a 2f 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  */.  { "CreateFi
5840: 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20 28 53  le2",         (S
5850: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c  YSCALL)CreateFil
5860: 65 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e2,             
5870: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5880: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 32 22   { "CreateFile2"
5890: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
58a0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
58b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58c0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
58d0: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c  fine osCreateFil
58e0: 65 32 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  e2 ((HANDLE(WINA
58f0: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f  PI*)(LPCWSTR,DWO
5900: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  RD,DWORD,DWORD, 
5910: 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 52 45 41  \.        LPCREA
5920: 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44  TEFILE2_EXTENDED
5930: 5f 50 41 52 41 4d 45 54 45 52 53 29 29 61 53 79  _PARAMETERS))aSy
5940: 73 63 61 6c 6c 5b 36 36 5d 2e 70 43 75 72 72 65  scall[66].pCurre
5950: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
5960: 4f 53 5f 57 49 4e 52 54 20 26 26 20 30 20 2f 2a  OS_WINRT && 0 /*
5970: 20 44 49 53 41 42 4c 45 44 3a 20 43 61 6e 20 62   DISABLED: Can b
5980: 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  e compiled with 
5990: 57 69 6e 52 54 20 6f 6e 6c 79 2e 20 2a 2f 0a 20  WinRT only. */. 
59a0: 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64   { "LoadPackaged
59b0: 4c 69 62 72 61 72 79 22 2c 20 28 53 59 53 43 41  Library", (SYSCA
59c0: 4c 4c 29 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c  LL)LoadPackagedL
59d0: 69 62 72 61 72 79 2c 20 20 20 20 20 20 20 20 20  ibrary,         
59e0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
59f0: 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72  LoadPackagedLibr
5a00: 61 72 79 22 2c 20 28 53 59 53 43 41 4c 4c 29 30  ary", (SYSCALL)0
5a10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5a30: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5a40: 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c   osLoadPackagedL
5a50: 69 62 72 61 72 79 20 28 28 48 4d 4f 44 55 4c 45  ibrary ((HMODULE
5a60: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
5a70: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  R, \.        DWO
5a80: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 37 5d  RD))aSyscall[67]
5a90: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f  .pCurrent)..}; /
5aa0: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f 76 65  * End of the ove
5ab0: 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d  rrideable system
5ac0: 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a   calls */../*.**
5ad0: 20 54 68 69 73 20 69 73 20 74 68 65 20 78 53 65   This is the xSe
5ae0: 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65  tSystemCall() me
5af0: 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f  thod of sqlite3_
5b00: 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74  vfs for all of t
5b10: 68 65 0a 2a 2a 20 22 77 69 6e 33 32 22 20 56 46  he.** "win32" VF
5b20: 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Ses.  Return SQL
5b30: 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63  ITE_OK opon succ
5b40: 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e  essfully updatin
5b50: 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20  g the.** system 
5b60: 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72  call pointer, or
5b70: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
5b80: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
5b90: 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20  configurable.** 
5ba0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65  system call name
5bb0: 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  d zName..*/.stat
5bc0: 69 63 20 69 6e 74 20 77 69 6e 53 65 74 53 79 73  ic int winSetSys
5bd0: 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74  temCall(.  sqlit
5be0: 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64  e3_vfs *pNotUsed
5bf0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
5c00: 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f  VFS pointer.  No
5c10: 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  t used */.  cons
5c20: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
5c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
5c40: 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c  e of system call
5c50: 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a   to override */.
5c60: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
5c70: 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20  l_ptr pNewFunc  
5c80: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
5c90: 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61  w system call va
5ca0: 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  lue */.){.  unsi
5cb0: 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e  gned int i;.  in
5cc0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  t rc = SQLITE_NO
5cd0: 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45  TFOUND;..  UNUSE
5ce0: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74  D_PARAMETER(pNot
5cf0: 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Used);.  if( zNa
5d00: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  me==0 ){.    /* 
5d10: 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67  If no zName is g
5d20: 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c  iven, restore al
5d30: 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74  l system calls t
5d40: 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a  o their default.
5d50: 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20      ** settings 
5d60: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a  and return NULL.
5d70: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
5d80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66  SQLITE_OK;.    f
5d90: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
5da0: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
5db0: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
5dc0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
5dd0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
5de0: 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ault ){.        
5df0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
5e00: 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b  rent = aSyscall[
5e10: 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20  i].pDefault;.   
5e20: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
5e30: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e  se{.    /* If zN
5e40: 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
5e50: 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c  , operate on onl
5e60: 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d  y the one system
5e70: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65   call.    ** spe
5e80: 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  cified..    */. 
5e90: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
5ea0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
5eb0: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
5ec0: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
5ed0: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
5ee0: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
5ef0: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
5f00: 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b     if( aSyscall[
5f10: 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29  i].pDefault==0 )
5f20: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53 79 73  {.          aSys
5f30: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
5f40: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
5f50: 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20  Current;.       
5f60: 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
5f70: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
5f80: 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d     if( pNewFunc=
5f90: 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20  =0 ) pNewFunc = 
5fa0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
5fb0: 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53  ault;.        aS
5fc0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
5fd0: 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20  nt = pNewFunc;. 
5fe0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5ff0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
6000: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6010: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
6020: 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74   value of a syst
6030: 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e  em call.  Return
6040: 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69   NULL if zName i
6050: 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67  s not a.** recog
6060: 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c  nized system cal
6070: 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73  l name.  NULL is
6080: 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
6090: 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c  f the system cal
60a0: 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c  l.** is currentl
60b0: 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  y undefined..*/.
60c0: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73  static sqlite3_s
60d0: 79 73 63 61 6c 6c 5f 70 74 72 20 77 69 6e 47 65  yscall_ptr winGe
60e0: 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73  tSystemCall(.  s
60f0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74  qlite3_vfs *pNot
6100: 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Used,.  const ch
6110: 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75  ar *zName.){.  u
6120: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a  nsigned int i;..
6130: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
6140: 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20  ER(pNotUsed);.  
6150: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
6160: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
6170: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
6180: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
6190: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79  trcmp(zName, aSy
61a0: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  scall[i].zName)=
61b0: 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73  =0 ) return aSys
61c0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
61d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
61e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
61f0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
6200: 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63  e first system c
6210: 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e  all after zName.
6220: 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c    If zName==NULL
6230: 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20  .** then return 
6240: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
6250: 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c  first system cal
6260: 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  l.  Return NULL 
6270: 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74  if zName.** is t
6280: 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63  he last system c
6290: 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20  all or if zName 
62a0: 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20  is not the name 
62b0: 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79  of a valid.** sy
62c0: 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74  stem call..*/.st
62d0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
62e0: 2a 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61  *winNextSystemCa
62f0: 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ll(sqlite3_vfs *
6300: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
6310: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d  Name){.  int i =
6320: 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50   -1;..  UNUSED_P
6330: 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69  ARAMETER(p);.  i
6340: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
6350: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
6360: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31  Size(aSyscall)-1
6370: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
6380: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
6390: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
63a0: 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
63b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
63c0: 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  ++; i<ArraySize(
63d0: 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b  aSyscall); i++){
63e0: 0a 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c  .    if( aSyscal
63f0: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30  l[i].pCurrent!=0
6400: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
6410: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d  ll[i].zName;.  }
6420: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
6430: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
6440: 69 6e 67 20 72 6f 75 74 69 6e 65 20 53 75 73 70  ing routine Susp
6450: 65 6e 64 73 20 74 68 65 20 74 68 72 65 61 64 20  ends the thread 
6460: 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6d 73 20  for at least ms 
6470: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 20 20 54  milliseconds.  T
6480: 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e  his is equivalen
6490: 74 0a 2a 2a 20 74 6f 20 74 68 65 20 77 69 6e 33  t.** to the win3
64a0: 32 20 53 6c 65 65 70 28 29 20 69 6e 74 65 72 66  2 Sleep() interf
64b0: 61 63 65 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  ace..*/.#if SQLI
64c0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 73 74 61 74  TE_OS_WINRT.stat
64d0: 69 63 20 48 41 4e 44 4c 45 20 73 6c 65 65 70 4f  ic HANDLE sleepO
64e0: 62 6a 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  bj;.static void 
64f0: 70 6f 72 74 61 62 6c 65 53 6c 65 65 70 28 69 6e  portableSleep(in
6500: 74 20 6d 73 29 7b 0a 20 20 6f 73 57 61 69 74 46  t ms){.  osWaitF
6510: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78  orSingleObjectEx
6520: 28 73 6c 65 65 70 4f 62 6a 2c 20 6d 73 2c 20 46  (sleepObj, ms, F
6530: 41 4c 53 45 29 3b 0a 7d 0a 23 65 6c 73 65 0a 73  ALSE);.}.#else.s
6540: 74 61 74 69 63 20 76 6f 69 64 20 70 6f 72 74 61  tatic void porta
6550: 62 6c 65 53 6c 65 65 70 28 69 6e 74 20 6d 73 29  bleSleep(int ms)
6560: 7b 0a 20 20 6f 73 53 6c 65 65 70 28 6d 73 29 3b  {.  osSleep(ms);
6570: 20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   .}.#endif../*.*
6580: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e  * Return true (n
6590: 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77 65 20 61  on-zero) if we a
65a0: 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72  re running under
65b0: 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57   WinNT, Win2K, W
65c0: 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43  inXP,.** or WinC
65d0: 45 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  E.  Return false
65e0: 20 28 7a 65 72 6f 29 20 66 6f 72 20 57 69 6e 39   (zero) for Win9
65f0: 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e  5, Win98, or Win
6600: 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69  ME..**.** Here i
6610: 73 20 61 6e 20 69 6e 74 65 72 65 73 74 69 6e 67  s an interesting
6620: 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a 20 20 57   observation:  W
6630: 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64  in95, Win98, and
6640: 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74   WinME lack.** t
6650: 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20  he LockFileEx() 
6660: 41 50 49 2e 20 20 42 75 74 20 77 65 20 63 61 6e  API.  But we can
6670: 20 73 74 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c   still staticall
6680: 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20 74  y link against t
6690: 68 61 74 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f  hat.** API as lo
66a0: 6e 67 20 61 73 20 77 65 20 64 6f 6e 27 74 20 63  ng as we don't c
66b0: 61 6c 6c 20 69 74 20 77 68 65 6e 20 72 75 6e 6e  all it when runn
66c0: 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e  ing Win95/98/ME.
66d0: 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74    A call to.** t
66e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
66f0: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
6700: 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 73 20   if the host is 
6710: 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a  Win95/98/ME or.*
6720: 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f  * WinNT/2K/XP so
6730: 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e   that we will kn
6740: 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ow whether or no
6750: 74 20 77 65 20 63 61 6e 20 73 61 66 65 6c 79 20  t we can safely 
6760: 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b  call.** the Lock
6770: 46 69 6c 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f  FileEx() API..*/
6780: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
6790: 49 4e 43 45 20 20 7c 7c 20 53 51 4c 49 54 45 5f  INCE  || SQLITE_
67a0: 4f 53 5f 57 49 4e 52 54 0a 23 20 64 65 66 69 6e  OS_WINRT.# defin
67b0: 65 20 69 73 4e 54 28 29 20 20 28 31 29 0a 23 65  e isNT()  (1).#e
67c0: 6c 73 65 0a 20 20 73 74 61 74 69 63 20 69 6e 74  lse.  static int
67d0: 20 69 73 4e 54 28 76 6f 69 64 29 7b 0a 20 20 20   isNT(void){.   
67e0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6f 73 5f   if( sqlite3_os_
67f0: 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  type==0 ){.     
6800: 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 20   OSVERSIONINFOA 
6810: 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 49 6e  sInfo;.      sIn
6820: 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e  fo.dwOSVersionIn
6830: 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28  foSize = sizeof(
6840: 73 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 6f 73  sInfo);.      os
6850: 47 65 74 56 65 72 73 69 6f 6e 45 78 41 28 26 73  GetVersionExA(&s
6860: 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
6870: 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 73  ite3_os_type = s
6880: 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49  Info.dwPlatformI
6890: 64 3d 3d 56 45 52 5f 50 4c 41 54 46 4f 52 4d 5f  d==VER_PLATFORM_
68a0: 57 49 4e 33 32 5f 4e 54 20 3f 20 32 20 3a 20 31  WIN32_NT ? 2 : 1
68b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
68c0: 72 6e 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  rn sqlite3_os_ty
68d0: 70 65 3d 3d 32 3b 0a 20 20 7d 0a 23 65 6e 64 69  pe==2;.  }.#endi
68e0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57  f /* SQLITE_OS_W
68f0: 49 4e 43 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20  INCE */..#ifdef 
6900: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
6910: 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  LOC./*.** Alloca
6920: 74 65 20 6e 42 79 74 65 73 20 6f 66 20 6d 65 6d  te nBytes of mem
6930: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ory..*/.static v
6940: 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f  oid *winMemMallo
6950: 63 28 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20  c(int nBytes){. 
6960: 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20   HANDLE hHeap;. 
6970: 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e   void *p;..  win
6980: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29  MemAssertMagic()
6990: 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d  ;.  hHeap = winM
69a0: 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61  emGetHeap();.  a
69b0: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20  ssert( hHeap!=0 
69c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
69d0: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
69e0: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 64  LE_VALUE );.#ifd
69f0: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
6a00: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a  MALLOC_VALIDATE.
6a10: 20 20 61 73 73 65 72 74 20 28 20 6f 73 48 65 61    assert ( osHea
6a20: 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c  pValidate(hHeap,
6a30: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
6a40: 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20  AP_FLAGS, NULL) 
6a50: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
6a60: 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b  rt( nBytes>=0 );
6a70: 0a 20 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c  .  p = osHeapAll
6a80: 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  oc(hHeap, SQLITE
6a90: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
6aa0: 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65  S, (SIZE_T)nByte
6ab0: 73 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  s);.  if( !p ){.
6ac0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
6ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
6ae0: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 41 6c 6c  ailed to HeapAll
6af0: 6f 63 20 25 75 20 62 79 74 65 73 20 28 25 64 29  oc %u bytes (%d)
6b00: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
6b10: 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74              nByt
6b20: 65 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  es, osGetLastErr
6b30: 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65  or(), (void*)hHe
6b40: 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ap);.  }.  retur
6b50: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  n p;.}../*.** Fr
6b60: 65 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  ee memory..*/.st
6b70: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d  atic void winMem
6b80: 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f  Free(void *pPrio
6b90: 72 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65  r){.  HANDLE hHe
6ba0: 61 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73  ap;..  winMemAss
6bb0: 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48  ertMagic();.  hH
6bc0: 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48  eap = winMemGetH
6bd0: 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28  eap();.  assert(
6be0: 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61   hHeap!=0 );.  a
6bf0: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e  ssert( hHeap!=IN
6c00: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
6c10: 55 45 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  UE );.#ifdef SQL
6c20: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
6c30: 5f 56 41 4c 49 44 41 54 45 0a 20 20 61 73 73 65  _VALIDATE.  asse
6c40: 72 74 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64  rt ( osHeapValid
6c50: 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ate(hHeap, SQLIT
6c60: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
6c70: 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23  GS, pPrior) );.#
6c80: 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 50 72  endif.  if( !pPr
6c90: 69 6f 72 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a  ior ) return; /*
6ca0: 20 50 61 73 73 69 6e 67 20 4e 55 4c 4c 20 74 6f   Passing NULL to
6cb0: 20 48 65 61 70 46 72 65 65 20 69 73 20 75 6e 64   HeapFree is und
6cc0: 65 66 69 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28  efined. */.  if(
6cd0: 20 21 6f 73 48 65 61 70 46 72 65 65 28 68 48 65   !osHeapFree(hHe
6ce0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
6cf0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72  _HEAP_FLAGS, pPr
6d00: 69 6f 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ior) ){.    sqli
6d10: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
6d20: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
6d30: 20 48 65 61 70 46 72 65 65 20 62 6c 6f 63 6b 20   HeapFree block 
6d40: 25 70 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70  %p (%d), heap=%p
6d50: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
6d60: 20 20 20 70 50 72 69 6f 72 2c 20 6f 73 47 65 74     pPrior, osGet
6d70: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f  LastError(), (vo
6d80: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a  id*)hHeap);.  }.
6d90: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
6da0: 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 65  the size of an e
6db0: 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61  xisting memory a
6dc0: 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  llocation.*/.sta
6dd0: 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d  tic void *winMem
6de0: 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50  Realloc(void *pP
6df0: 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73  rior, int nBytes
6e00: 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  ){.  HANDLE hHea
6e10: 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20  p;.  void *p;.. 
6e20: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
6e30: 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20  ic();.  hHeap = 
6e40: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b  winMemGetHeap();
6e50: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
6e60: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
6e70: 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f   hHeap!=INVALID_
6e80: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
6e90: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
6ea0: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
6eb0: 41 54 45 0a 20 20 61 73 73 65 72 74 20 28 20 6f  ATE.  assert ( o
6ec0: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48  sHeapValidate(hH
6ed0: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
6ee0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50  2_HEAP_FLAGS, pP
6ef0: 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a  rior) );.#endif.
6f00: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 73    assert( nBytes
6f10: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50  >=0 );.  if( !pP
6f20: 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 20 3d 20  rior ){.    p = 
6f30: 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61  osHeapAlloc(hHea
6f40: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
6f50: 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a  HEAP_FLAGS, (SIZ
6f60: 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d  E_T)nBytes);.  }
6f70: 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 6f 73  else{.    p = os
6f80: 48 65 61 70 52 65 41 6c 6c 6f 63 28 68 48 65 61  HeapReAlloc(hHea
6f90: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
6fa0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69  HEAP_FLAGS, pPri
6fb0: 6f 72 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74  or, (SIZE_T)nByt
6fc0: 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  es);.  }.  if( !
6fd0: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
6fe0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
6ff0: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 25 73  M, "failed to %s
7000: 20 25 75 20 62 79 74 65 73 20 28 25 64 29 2c 20   %u bytes (%d), 
7010: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
7020: 20 20 20 20 20 20 20 20 20 20 70 50 72 69 6f 72            pPrior
7030: 20 3f 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22   ? "HeapReAlloc"
7040: 20 3a 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20   : "HeapAlloc", 
7050: 6e 42 79 74 65 73 2c 20 6f 73 47 65 74 4c 61 73  nBytes, osGetLas
7060: 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
7070: 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
7080: 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72  )hHeap);.  }.  r
7090: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
70a0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
70b0: 65 20 6f 66 20 61 6e 20 6f 75 74 73 74 61 6e 64  e of an outstand
70c0: 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20  ing allocation, 
70d0: 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  in bytes..*/.sta
70e0: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69  tic int winMemSi
70f0: 7a 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 48  ze(void *p){.  H
7100: 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 53  ANDLE hHeap;.  S
7110: 49 5a 45 5f 54 20 6e 3b 0a 0a 20 20 77 69 6e 4d  IZE_T n;..  winM
7120: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b  emAssertMagic();
7130: 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65  .  hHeap = winMe
7140: 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73  mGetHeap();.  as
7150: 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29  sert( hHeap!=0 )
7160: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
7170: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
7180: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 64 65  E_VALUE );.#ifde
7190: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  f SQLITE_WIN32_M
71a0: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20  ALLOC_VALIDATE. 
71b0: 20 61 73 73 65 72 74 20 28 20 6f 73 48 65 61 70   assert ( osHeap
71c0: 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20  Validate(hHeap, 
71d0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
71e0: 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29  P_FLAGS, NULL) )
71f0: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21  ;.#endif.  if( !
7200: 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
7210: 6e 20 3d 20 6f 73 48 65 61 70 53 69 7a 65 28 68  n = osHeapSize(h
7220: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
7230: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70  32_HEAP_FLAGS, p
7240: 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 28 53 49 5a  );.  if( n==(SIZ
7250: 45 5f 54 29 2d 31 20 29 7b 0a 20 20 20 20 73 71  E_T)-1 ){.    sq
7260: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
7270: 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20  _NOMEM, "failed 
7280: 74 6f 20 48 65 61 70 53 69 7a 65 20 62 6c 6f 63  to HeapSize bloc
7290: 6b 20 25 70 20 28 25 64 29 2c 20 68 65 61 70 3d  k %p (%d), heap=
72a0: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
72b0: 20 20 20 20 20 70 2c 20 6f 73 47 65 74 4c 61 73       p, osGetLas
72c0: 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a  tError(), (void*
72d0: 29 68 48 65 61 70 29 3b 0a 20 20 20 20 72 65 74  )hHeap);.    ret
72e0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
72f0: 75 72 6e 20 28 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f  urn (int)n;.}../
7300: 2a 0a 2a 2a 20 52 6f 75 6e 64 20 75 70 20 61 20  *.** Round up a 
7310: 72 65 71 75 65 73 74 20 73 69 7a 65 20 74 6f 20  request size to 
7320: 74 68 65 20 6e 65 78 74 20 76 61 6c 69 64 20 61  the next valid a
7330: 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a  llocation size..
7340: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
7350: 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20  nMemRoundup(int 
7360: 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  n){.  return n;.
7370: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
7380: 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e  ize this module.
7390: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
73a0: 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a  inMemInit(void *
73b0: 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e  pAppData){.  win
73c0: 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d  MemData *pWinMem
73d0: 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61  Data = (winMemDa
73e0: 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a  ta *)pAppData;..
73f0: 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61    if( !pWinMemDa
7400: 74 61 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ta ) return SQLI
7410: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 61 73 73 65  TE_ERROR;.  asse
7420: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
7430: 3e 6d 61 67 69 63 3d 3d 57 49 4e 4d 45 4d 5f 4d  >magic==WINMEM_M
7440: 41 47 49 43 20 29 3b 0a 20 20 69 66 28 20 21 70  AGIC );.  if( !p
7450: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
7460: 70 20 29 7b 0a 20 20 20 20 70 57 69 6e 4d 65 6d  p ){.    pWinMem
7470: 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73  Data->hHeap = os
7480: 48 65 61 70 43 72 65 61 74 65 28 53 51 4c 49 54  HeapCreate(SQLIT
7490: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
74a0: 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  GS,.            
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74c0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
74d0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54  _WIN32_HEAP_INIT
74e0: 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 20 20 20  _SIZE,.         
74f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
7510: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d  ITE_WIN32_HEAP_M
7520: 41 58 5f 53 49 5a 45 29 3b 0a 20 20 20 20 69 66  AX_SIZE);.    if
7530: 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  ( !pWinMemData->
7540: 68 48 65 61 70 20 29 7b 0a 20 20 20 20 20 20 73  hHeap ){.      s
7550: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
7560: 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20  E_NOMEM,.       
7570: 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65     "failed to He
7580: 61 70 43 72 65 61 74 65 20 28 25 64 29 2c 20 66  apCreate (%d), f
7590: 6c 61 67 73 3d 25 75 2c 20 69 6e 69 74 53 69 7a  lags=%u, initSiz
75a0: 65 3d 25 75 2c 20 6d 61 78 53 69 7a 65 3d 25 75  e=%u, maxSize=%u
75b0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6f 73 47  ",.          osG
75c0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 53  etLastError(), S
75d0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
75e0: 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20  _FLAGS,.        
75f0: 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48    SQLITE_WIN32_H
7600: 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 20 53  EAP_INIT_SIZE, S
7610: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
7620: 5f 4d 41 58 5f 53 49 5a 45 29 3b 0a 20 20 20 20  _MAX_SIZE);.    
7630: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7640: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
7650: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
7660: 77 6e 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 7d  wned = TRUE;.  }
7670: 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d  .  assert( pWinM
7680: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 30  emData->hHeap!=0
7690: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57   );.  assert( pW
76a0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
76b0: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
76c0: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66  _VALUE );.#ifdef
76d0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
76e0: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20  LLOC_VALIDATE.  
76f0: 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61  assert( osHeapVa
7700: 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61  lidate(pWinMemDa
7710: 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54  ta->hHeap, SQLIT
7720: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
7730: 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e  GS, NULL) );.#en
7740: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
7750: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
7760: 20 44 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68   Deinitialize th
7770: 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74  is module..*/.st
7780: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d  atic void winMem
7790: 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70  Shutdown(void *p
77a0: 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d  AppData){.  winM
77b0: 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44  emData *pWinMemD
77c0: 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74  ata = (winMemDat
77d0: 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20  a *)pAppData;.. 
77e0: 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74   if( !pWinMemDat
77f0: 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  a ) return;.  if
7800: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  ( pWinMemData->h
7810: 48 65 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65  Heap ){.    asse
7820: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
7830: 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f  >hHeap!=INVALID_
7840: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
7850: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
7860: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
7870: 41 54 45 0a 20 20 20 20 61 73 73 65 72 74 28 20  ATE.    assert( 
7880: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 70  osHeapValidate(p
7890: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
78a0: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
78b0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c  HEAP_FLAGS, NULL
78c0: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ) );.#endif.    
78d0: 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  if( pWinMemData-
78e0: 3e 62 4f 77 6e 65 64 20 29 7b 0a 20 20 20 20 20  >bOwned ){.     
78f0: 20 69 66 28 20 21 6f 73 48 65 61 70 44 65 73 74   if( !osHeapDest
7900: 72 6f 79 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d  roy(pWinMemData-
7910: 3e 68 48 65 61 70 29 20 29 7b 0a 20 20 20 20 20  >hHeap) ){.     
7920: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
7930: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61  QLITE_NOMEM, "fa
7940: 69 6c 65 64 20 74 6f 20 48 65 61 70 44 65 73 74  iled to HeapDest
7950: 72 6f 79 20 28 25 64 29 2c 20 68 65 61 70 3d 25  roy (%d), heap=%
7960: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
7970: 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73          osGetLas
7980: 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a  tError(), (void*
7990: 29 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  )pWinMemData->hH
79a0: 65 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eap);.      }.  
79b0: 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d      pWinMemData-
79c0: 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b  >bOwned = FALSE;
79d0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d  .    }.    pWinM
79e0: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20  emData->hHeap = 
79f0: 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  NULL;.  }.}../*.
7a00: 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  ** Populate the 
7a10: 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79  low-level memory
7a20: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63   allocation func
7a30: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e  tion pointers in
7a40: 0a 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  .** sqlite3Globa
7a50: 6c 43 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20 70  lConfig.m with p
7a60: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 72  ointers to the r
7a70: 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20  outines in this 
7a80: 66 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67  file. The.** arg
7a90: 75 6d 65 6e 74 73 20 73 70 65 63 69 66 79 20 74  uments specify t
7aa0: 68 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f  he block of memo
7ab0: 72 79 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a  ry to manage..**
7ac0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7ad0: 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
7ae0: 62 79 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  by sqlite3_confi
7af0: 67 28 29 2c 20 61 6e 64 20 74 68 65 72 65 66 6f  g(), and therefo
7b00: 72 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71  re.** is not req
7b10: 75 69 72 65 64 20 74 6f 20 62 65 20 74 68 72 65  uired to be thre
7b20: 61 64 73 61 66 65 20 28 69 74 20 69 73 20 6e 6f  adsafe (it is no
7b30: 74 29 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c  t)..*/.const sql
7b40: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
7b50: 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57   *sqlite3MemGetW
7b60: 69 6e 33 32 28 76 6f 69 64 29 7b 0a 20 20 73 74  in32(void){.  st
7b70: 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
7b80: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77  e3_mem_methods w
7b90: 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b  inMemMethods = {
7ba0: 0a 20 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f  .    winMemMallo
7bb0: 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72 65  c,.    winMemFre
7bc0: 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65 61  e,.    winMemRea
7bd0: 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d  lloc,.    winMem
7be0: 53 69 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d  Size,.    winMem
7bf0: 52 6f 75 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e  Roundup,.    win
7c00: 4d 65 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e  MemInit,.    win
7c10: 4d 65 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20  MemShutdown,.   
7c20: 20 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20   &win_mem_data. 
7c30: 20 7d 3b 0a 20 20 72 65 74 75 72 6e 20 26 77 69   };.  return &wi
7c40: 6e 4d 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a  nMemMethods;.}..
7c50: 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53  void sqlite3MemS
7c60: 65 74 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b  etDefault(void){
7c70: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  .  sqlite3_confi
7c80: 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  g(SQLITE_CONFIG_
7c90: 4d 41 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d  MALLOC, sqlite3M
7ca0: 65 6d 47 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d  emGetWin32());.}
7cb0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7cc0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a  E_WIN32_MALLOC *
7cd0: 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  /../*.** Convert
7ce0: 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20   a UTF-8 string 
7cf0: 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69  to Microsoft Uni
7d00: 63 6f 64 65 20 28 55 54 46 2d 31 36 3f 29 2e 20  code (UTF-16?). 
7d10: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
7d20: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
7d30: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
7d40: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
7d50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53  ..*/.static LPWS
7d60: 54 52 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65  TR utf8ToUnicode
7d70: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
7d80: 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e  lename){.  int n
7d90: 43 68 61 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a  Char;.  LPWSTR z
7da0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20  WideFilename;.. 
7db0: 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69   nChar = osMulti
7dc0: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43  ByteToWideChar(C
7dd0: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65  P_UTF8, 0, zFile
7de0: 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20  name, -1, NULL, 
7df0: 30 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d  0);.  if( nChar=
7e00: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
7e10: 20 30 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65 46   0;.  }.  zWideF
7e20: 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ilename = sqlite
7e30: 33 5f 6d 61 6c 6c 6f 63 28 20 6e 43 68 61 72 2a  3_malloc( nChar*
7e40: 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c 65  sizeof(zWideFile
7e50: 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66  name[0]) );.  if
7e60: 28 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3d  ( zWideFilename=
7e70: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
7e80: 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68 61 72 20   0;.  }.  nChar 
7e90: 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  = osMultiByteToW
7ea0: 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c  ideChar(CP_UTF8,
7eb0: 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d   0, zFilename, -
7ec0: 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  1, zWideFilename
7ed0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ef0: 20 20 6e 43 68 61 72 29 3b 0a 20 20 69 66 28 20    nChar);.  if( 
7f00: 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20  nChar==0 ){.    
7f10: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69  sqlite3_free(zWi
7f20: 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  deFilename);.   
7f30: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d   zWideFilename =
7f40: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
7f50: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a   zWideFilename;.
7f60: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
7f70: 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f   Microsoft Unico
7f80: 64 65 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70  de to UTF-8.  Sp
7f90: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
7fa0: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
7fb0: 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66  is.** obtained f
7fc0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
7fd0: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
7fe0: 63 68 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 55  char *unicodeToU
7ff0: 74 66 38 28 4c 50 43 57 53 54 52 20 7a 57 69 64  tf8(LPCWSTR zWid
8000: 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e  eFilename){.  in
8010: 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20  t nByte;.  char 
8020: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e  *zFilename;..  n
8030: 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61  Byte = osWideCha
8040: 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f  rToMultiByte(CP_
8050: 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46 69  UTF8, 0, zWideFi
8060: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30  lename, -1, 0, 0
8070: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  , 0, 0);.  if( n
8080: 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Byte == 0 ){.   
8090: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
80a0: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   zFilename = sql
80b0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79  ite3_malloc( nBy
80c0: 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c  te );.  if( zFil
80d0: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ename==0 ){.    
80e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
80f0: 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68  nByte = osWideCh
8100: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50  arToMultiByte(CP
8110: 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46  _UTF8, 0, zWideF
8120: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69  ilename, -1, zFi
8130: 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a 20  lename, nByte,. 
8140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
8160: 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  , 0);.  if( nByt
8170: 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71  e == 0 ){.    sq
8180: 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65  lite3_free(zFile
8190: 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65  name);.    zFile
81a0: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  name = 0;.  }.  
81b0: 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65  return zFilename
81c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
81d0: 72 74 20 61 6e 20 41 4e 53 49 20 73 74 72 69 6e  rt an ANSI strin
81e0: 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55  g to Microsoft U
81f0: 6e 69 63 6f 64 65 2c 20 62 61 73 65 64 20 6f 6e  nicode, based on
8200: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
8210: 63 6f 64 65 70 61 67 65 20 73 65 74 74 69 6e 67  codepage setting
8220: 73 20 66 6f 72 20 66 69 6c 65 20 61 70 69 73 2e  s for file apis.
8230: 0a 2a 2a 20 0a 2a 2a 20 53 70 61 63 65 20 74 6f  .** .** Space to
8240: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
8250: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
8260: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71  ained.** from sq
8270: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 0a 2a 2f  lite3_malloc..*/
8280: 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52 20 6d  .static LPWSTR m
8290: 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e  bcsToUnicode(con
82a0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
82b0: 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  me){.  int nByte
82c0: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4d 62 63 73  ;.  LPWSTR zMbcs
82d0: 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20  Filename;.  int 
82e0: 63 6f 64 65 70 61 67 65 20 3d 20 6f 73 41 72 65  codepage = osAre
82f0: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f  FileApisANSI() ?
8300: 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d   CP_ACP : CP_OEM
8310: 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f  CP;..  nByte = o
8320: 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  sMultiByteToWide
8330: 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30  Char(codepage, 0
8340: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
8350: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8370: 20 20 20 20 20 20 20 30 29 2a 73 69 7a 65 6f 66         0)*sizeof
8380: 28 57 43 48 41 52 29 3b 0a 20 20 69 66 28 20 6e  (WCHAR);.  if( n
8390: 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Byte==0 ){.    r
83a0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
83b0: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 73  MbcsFilename = s
83c0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e  qlite3_malloc( n
83d0: 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62 63  Byte*sizeof(zMbc
83e0: 73 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b  sFilename[0]) );
83f0: 0a 20 20 69 66 28 20 7a 4d 62 63 73 46 69 6c 65  .  if( zMbcsFile
8400: 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  name==0 ){.    r
8410: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
8420: 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79  Byte = osMultiBy
8430: 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64  teToWideChar(cod
8440: 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e  epage, 0, zFilen
8450: 61 6d 65 2c 20 2d 31 2c 20 7a 4d 62 63 73 46 69  ame, -1, zMbcsFi
8460: 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8480: 20 20 20 20 20 20 20 20 6e 42 79 74 65 29 3b 0a          nByte);.
8490: 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29    if( nByte==0 )
84a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
84b0: 65 65 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  ee(zMbcsFilename
84c0: 29 3b 0a 20 20 20 20 7a 4d 62 63 73 46 69 6c 65  );.    zMbcsFile
84d0: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  name = 0;.  }.  
84e0: 72 65 74 75 72 6e 20 7a 4d 62 63 73 46 69 6c 65  return zMbcsFile
84f0: 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  name;.}../*.** C
8500: 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74  onvert Microsoft
8510: 20 55 6e 69 63 6f 64 65 20 74 6f 20 6d 75 6c 74   Unicode to mult
8520: 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72  i-byte character
8530: 20 73 74 72 69 6e 67 2c 20 62 61 73 65 64 20 6f   string, based o
8540: 6e 20 74 68 65 0a 2a 2a 20 75 73 65 72 27 73 20  n the.** user's 
8550: 41 4e 53 49 20 63 6f 64 65 70 61 67 65 2e 0a 2a  ANSI codepage..*
8560: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
8570: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
8580: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
8590: 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
85a0: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  e3_malloc()..*/.
85b0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 6e 69  static char *uni
85c0: 63 6f 64 65 54 6f 4d 62 63 73 28 4c 50 43 57 53  codeToMbcs(LPCWS
85d0: 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  TR zWideFilename
85e0: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ){.  int nByte;.
85f0: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
8600: 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67  e;.  int codepag
8610: 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69  e = osAreFileApi
8620: 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50  sANSI() ? CP_ACP
8630: 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20   : CP_OEMCP;..  
8640: 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68  nByte = osWideCh
8650: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f  arToMultiByte(co
8660: 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65  depage, 0, zWide
8670: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c  Filename, -1, 0,
8680: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28   0, 0, 0);.  if(
8690: 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20   nByte == 0 ){. 
86a0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
86b0: 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73  .  zFilename = s
86c0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e  qlite3_malloc( n
86d0: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46  Byte );.  if( zF
86e0: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
86f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
8700: 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65    nByte = osWide
8710: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28  CharToMultiByte(
8720: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69  codepage, 0, zWi
8730: 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20  deFilename, -1, 
8740: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
8750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8760: 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65             nByte
8770: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  , 0, 0);.  if( n
8780: 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Byte == 0 ){.   
8790: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
87a0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46  ilename);.    zF
87b0: 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ilename = 0;.  }
87c0: 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e  .  return zFilen
87d0: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ame;.}../*.** Co
87e0: 6e 76 65 72 74 20 6d 75 6c 74 69 62 79 74 65 20  nvert multibyte 
87f0: 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67  character string
8800: 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63   to UTF-8.  Spac
8810: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a  e to hold the.**
8820: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
8830: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
8840: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
8850: 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  ()..*/.char *sql
8860: 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f  ite3_win32_mbcs_
8870: 74 6f 5f 75 74 66 38 28 63 6f 6e 73 74 20 63 68  to_utf8(const ch
8880: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
8890: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
88a0: 65 55 74 66 38 3b 0a 20 20 4c 50 57 53 54 52 20  eUtf8;.  LPWSTR 
88b0: 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d  zTmpWide;..  zTm
88c0: 70 57 69 64 65 20 3d 20 6d 62 63 73 54 6f 55 6e  pWide = mbcsToUn
88d0: 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
88e0: 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65  ;.  if( zTmpWide
88f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
8900: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  n 0;.  }.  zFile
8910: 6e 61 6d 65 55 74 66 38 20 3d 20 75 6e 69 63 6f  nameUtf8 = unico
8920: 64 65 54 6f 55 74 66 38 28 7a 54 6d 70 57 69 64  deToUtf8(zTmpWid
8930: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
8940: 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  ee(zTmpWide);.  
8950: 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65  return zFilename
8960: 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  Utf8;.}../*.** C
8970: 6f 6e 76 65 72 74 20 55 54 46 2d 38 20 74 6f 20  onvert UTF-8 to 
8980: 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63  multibyte charac
8990: 74 65 72 20 73 74 72 69 6e 67 2e 20 20 53 70 61  ter string.  Spa
89a0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 0a  ce to hold the .
89b0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  ** returned stri
89c0: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
89d0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
89e0: 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  oc()..*/.char *s
89f0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
8a00: 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74 20  8_to_mbcs(const 
8a10: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
8a20: 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  {.  char *zFilen
8a30: 61 6d 65 4d 62 63 73 3b 0a 20 20 4c 50 57 53 54  ameMbcs;.  LPWST
8a40: 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a  R zTmpWide;..  z
8a50: 54 6d 70 57 69 64 65 20 3d 20 75 74 66 38 54 6f  TmpWide = utf8To
8a60: 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d  Unicode(zFilenam
8a70: 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69  e);.  if( zTmpWi
8a80: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  de==0 ){.    ret
8a90: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69  urn 0;.  }.  zFi
8aa0: 6c 65 6e 61 6d 65 4d 62 63 73 20 3d 20 75 6e 69  lenameMbcs = uni
8ab0: 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54 6d 70 57  codeToMbcs(zTmpW
8ac0: 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ide);.  sqlite3_
8ad0: 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a  free(zTmpWide);.
8ae0: 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61    return zFilena
8af0: 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  meMbcs;.}.../*.*
8b00: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
8b10: 75 65 20 6f 66 20 67 65 74 4c 61 73 74 45 72 72  ue of getLastErr
8b20: 6f 72 4d 73 67 0a 2a 2a 20 69 73 20 7a 65 72 6f  orMsg.** is zero
8b30: 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   if the error me
8b40: 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74 68  ssage fits in th
8b50: 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e  e buffer, or non
8b60: 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69  -zero.** otherwi
8b70: 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73 61  se (if the messa
8b80: 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  ge was truncated
8b90: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
8ba0: 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67   getLastErrorMsg
8bb0: 28 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f  (DWORD lastErrno
8bc0: 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
8bd0: 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f   *zBuf){.  /* Fo
8be0: 72 6d 61 74 4d 65 73 73 61 67 65 20 72 65 74 75  rmatMessage retu
8bf0: 72 6e 73 20 30 20 6f 6e 20 66 61 69 6c 75 72 65  rns 0 on failure
8c00: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 69 74 0a  .  Otherwise it.
8c10: 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65    ** returns the
8c20: 20 6e 75 6d 62 65 72 20 6f 66 20 54 43 48 41 52   number of TCHAR
8c30: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
8c40: 20 6f 75 74 70 75 74 0a 20 20 2a 2a 20 62 75 66   output.  ** buf
8c50: 66 65 72 2c 20 65 78 63 6c 75 64 69 6e 67 20 74  fer, excluding t
8c60: 68 65 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e  he terminating n
8c70: 75 6c 6c 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20  ull char..  */. 
8c80: 20 44 57 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30   DWORD dwLen = 0
8c90: 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d  ;.  char *zOut =
8ca0: 20 30 3b 0a 0a 20 20 69 66 28 20 69 73 4e 54 28   0;..  if( isNT(
8cb0: 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) ){.#if SQLITE_
8cc0: 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 57 43 48  OS_WINRT.    WCH
8cd0: 41 52 20 7a 54 65 6d 70 57 69 64 65 5b 4d 41 58  AR zTempWide[MAX
8ce0: 5f 50 41 54 48 2b 31 5d 3b 20 2f 2a 20 4e 4f 54  _PATH+1]; /* NOT
8cf0: 45 3a 20 53 6f 6d 65 77 68 61 74 20 61 72 62 69  E: Somewhat arbi
8d00: 74 72 61 72 79 2e 20 2a 2f 0a 20 20 20 20 64 77  trary. */.    dw
8d10: 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65  Len = osFormatMe
8d20: 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45  ssageW(FORMAT_ME
8d30: 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45  SSAGE_FROM_SYSTE
8d40: 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  M |.            
8d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d60: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
8d70: 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a  IGNORE_INSERTS,.
8d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c               NUL
8da0: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8dc0: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
8dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8de0: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e00: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 57 69 64          zTempWid
8e10: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
8e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e30: 4d 41 58 5f 50 41 54 48 2c 0a 20 20 20 20 20 20  MAX_PATH,.      
8e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e50: 20 20 20 20 20 20 20 30 29 3b 0a 23 65 6c 73 65         0);.#else
8e60: 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d  .    LPWSTR zTem
8e70: 70 57 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  pWide = NULL;.  
8e80: 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d    dwLen = osForm
8e90: 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41  atMessageW(FORMA
8ea0: 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41  T_MESSAGE_ALLOCA
8eb0: 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20  TE_BUFFER |.    
8ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ed0: 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f           FORMAT_
8ee0: 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53  MESSAGE_FROM_SYS
8ef0: 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEM |.          
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f10: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
8f20: 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53  E_IGNORE_INSERTS
8f30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
8f50: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
8f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f70: 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20    lastErrno,.   
8f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f90: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fb0: 20 20 20 20 20 20 20 20 20 20 28 4c 50 57 53 54            (LPWST
8fc0: 52 29 20 26 7a 54 65 6d 70 57 69 64 65 2c 0a 20  R) &zTempWide,. 
8fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9000: 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a              0);.
9010: 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 64  #endif.    if( d
9020: 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20  wLen > 0 ){.    
9030: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20    /* allocate a 
9040: 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65  buffer and conve
9050: 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20  rt to UTF8 */.  
9060: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
9070: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
9080: 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 75 6e 69        zOut = uni
9090: 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70  codeToUtf8(zTemp
90a0: 57 69 64 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Wide);.      sql
90b0: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
90c0: 6c 6f 63 28 29 3b 0a 23 69 66 20 21 53 51 4c 49  loc();.#if !SQLI
90d0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
90e0: 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79    /* free the sy
90f0: 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f  stem buffer allo
9100: 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d  cated by FormatM
9110: 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  essage */.      
9120: 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d  osLocalFree(zTem
9130: 70 57 69 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20  pWide);.#endif. 
9140: 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20     }.  }.#ifdef 
9150: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
9160: 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
9170: 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 20 3d 20    char *zTemp = 
9180: 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20  NULL;.    dwLen 
9190: 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  = osFormatMessag
91a0: 65 41 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47  eA(FORMAT_MESSAG
91b0: 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45  E_ALLOCATE_BUFFE
91c0: 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  R |.            
91d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91e0: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
91f0: 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20  FROM_SYSTEM |.  
9200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9210: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
9220: 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45  T_MESSAGE_IGNORE
9230: 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20  _INSERTS,.      
9240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9250: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20         NULL,.   
9260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9270: 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 45 72            lastEr
9280: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
9290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92a0: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
92b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92c0: 20 20 28 4c 50 53 54 52 29 20 26 7a 54 65 6d 70    (LPSTR) &zTemp
92d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
92e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
92f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
9310: 29 3b 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e  );.    if( dwLen
9320: 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a   > 0 ){.      /*
9330: 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66   allocate a buff
9340: 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74  er and convert t
9350: 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20  o UTF8 */.      
9360: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
9370: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
9380: 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33    zOut = sqlite3
9390: 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75  _win32_mbcs_to_u
93a0: 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  tf8(zTemp);.    
93b0: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
93c0: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
93d0: 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79    /* free the sy
93e0: 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f  stem buffer allo
93f0: 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d  cated by FormatM
9400: 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  essage */.      
9410: 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d  osLocalFree(zTem
9420: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  p);.    }.  }.#e
9430: 6e 64 69 66 0a 20 20 69 66 28 20 30 20 3d 3d 20  ndif.  if( 0 == 
9440: 64 77 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  dwLen ){.    sql
9450: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
9460: 75 66 2c 20 7a 42 75 66 2c 20 22 4f 73 45 72 72  uf, zBuf, "OsErr
9470: 6f 72 20 30 78 25 78 20 28 25 75 29 22 2c 20 6c  or 0x%x (%u)", l
9480: 61 73 74 45 72 72 6e 6f 2c 20 6c 61 73 74 45 72  astErrno, lastEr
9490: 72 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rno);.  }else{. 
94a0: 20 20 20 2f 2a 20 63 6f 70 79 20 61 20 6d 61 78     /* copy a max
94b0: 69 6d 75 6d 20 6f 66 20 6e 42 75 66 20 63 68 61  imum of nBuf cha
94c0: 72 73 20 74 6f 20 6f 75 74 70 75 74 20 62 75 66  rs to output buf
94d0: 66 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  fer */.    sqlit
94e0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
94f0: 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 4f  , zBuf, "%s", zO
9500: 75 74 29 3b 0a 20 20 20 20 2f 2a 20 66 72 65 65  ut);.    /* free
9510: 20 74 68 65 20 55 54 46 38 20 62 75 66 66 65 72   the UTF8 buffer
9520: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
9530: 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a  free(zOut);.  }.
9540: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
9550: 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  *.**.** This fun
9560: 63 74 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45 72  ction - winLogEr
9570: 72 6f 72 41 74 4c 69 6e 65 28 29 20 2d 20 69 73  rorAtLine() - is
9580: 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65   only ever calle
9590: 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a  d via the macro.
95a0: 2a 2a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 29  ** winLogError()
95b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
95c0: 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  tine is invoked 
95d0: 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f  after an error o
95e0: 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66  ccurs in an OS f
95f0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c  unction..** It l
9600: 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75 73  ogs a message us
9610: 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ing sqlite3_log(
9620: 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  ) containing the
9630: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
9640: 66 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  f.** error code 
9650: 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65  and, if possible
9660: 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64  , the human-read
9670: 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20  able equivalent 
9680: 66 72 6f 6d 20 0a 2a 2a 20 46 6f 72 6d 61 74 4d  from .** FormatM
9690: 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  essage..**.** Th
96a0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
96b0: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d   passed to the m
96c0: 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74  acro should be t
96d0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68  he error code th
96e0: 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65  at.** will be re
96f0: 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65  turned to SQLite
9700: 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f   (e.g. SQLITE_IO
9710: 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49  ERR_DELETE, SQLI
9720: 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a  TE_CANTOPEN). .*
9730: 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73 65 71  * The two subseq
9740: 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73  uent arguments s
9750: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d  hould be the nam
9760: 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63  e of the OS func
9770: 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69  tion that.** fai
9780: 6c 65 64 20 61 6e 64 20 74 68 65 20 74 68 65 20  led and the the 
9790: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
97a0: 73 79 73 74 65 6d 20 70 61 74 68 2c 20 69 66 20  system path, if 
97b0: 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  any..*/.#define 
97c0: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c  winLogError(a,b,
97d0: 63 2c 64 29 20 20 20 77 69 6e 4c 6f 67 45 72 72  c,d)   winLogErr
97e0: 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 64  orAtLine(a,b,c,d
97f0: 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69  ,__LINE__).stati
9800: 63 20 69 6e 74 20 77 69 6e 4c 6f 67 45 72 72 6f  c int winLogErro
9810: 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65  rAtLine(.  int e
9820: 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20  rrcode,         
9830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
9840: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
9850: 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  */.  DWORD lastE
9860: 72 72 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  rrno,           
9870: 20 20 20 20 20 2f 2a 20 57 69 6e 33 32 20 6c 61       /* Win32 la
9880: 73 74 20 65 72 72 6f 72 20 2a 2f 0a 20 20 63 6f  st error */.  co
9890: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
98b0: 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63   Name of OS func
98c0: 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64  tion that failed
98d0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
98e0: 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
98f0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61        /* File pa
9900: 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  th associated wi
9910: 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e  th error */.  in
9920: 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20  t iLine         
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9940: 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d   Source line num
9950: 62 65 72 20 77 68 65 72 65 20 65 72 72 6f 72 20  ber where error 
9960: 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20  occurred */.){. 
9970: 20 63 68 61 72 20 7a 4d 73 67 5b 35 30 30 5d 3b   char zMsg[500];
9980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9990: 20 2f 2a 20 48 75 6d 61 6e 20 72 65 61 64 61 62   /* Human readab
99a0: 6c 65 20 65 72 72 6f 72 20 74 65 78 74 20 2a 2f  le error text */
99b0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99d0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
99e0: 65 72 20 2a 2f 0a 0a 20 20 7a 4d 73 67 5b 30 5d  er */..  zMsg[0]
99f0: 20 3d 20 30 3b 0a 20 20 67 65 74 4c 61 73 74 45   = 0;.  getLastE
9a00: 72 72 6f 72 4d 73 67 28 6c 61 73 74 45 72 72 6e  rrorMsg(lastErrn
9a10: 6f 2c 20 73 69 7a 65 6f 66 28 7a 4d 73 67 29 2c  o, sizeof(zMsg),
9a20: 20 7a 4d 73 67 29 3b 0a 20 20 61 73 73 65 72 74   zMsg);.  assert
9a30: 28 20 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54  ( errcode!=SQLIT
9a40: 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50  E_OK );.  if( zP
9a50: 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d  ath==0 ) zPath =
9a60: 20 22 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   "";.  for(i=0; 
9a70: 7a 4d 73 67 5b 69 5d 20 26 26 20 7a 4d 73 67 5b  zMsg[i] && zMsg[
9a80: 69 5d 21 3d 27 5c 72 27 20 26 26 20 7a 4d 73 67  i]!='\r' && zMsg
9a90: 5b 69 5d 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b  [i]!='\n'; i++){
9aa0: 7d 0a 20 20 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b  }.  zMsg[i] = 0;
9ab0: 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65  .  sqlite3_log(e
9ac0: 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f  rrcode,.      "o
9ad0: 73 5f 77 69 6e 2e 63 3a 25 64 3a 20 28 25 64 29  s_win.c:%d: (%d)
9ae0: 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20   %s(%s) - %s",. 
9af0: 20 20 20 20 20 69 4c 69 6e 65 2c 20 6c 61 73 74       iLine, last
9b00: 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50  Errno, zFunc, zP
9b10: 61 74 68 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a  ath, zMsg.  );..
9b20: 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65    return errcode
9b30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e  ;.}../*.** The n
9b40: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
9b50: 68 61 74 20 61 20 52 65 61 64 46 69 6c 65 28 29  hat a ReadFile()
9b60: 2c 20 57 72 69 74 65 46 69 6c 65 28 29 2c 20 61  , WriteFile(), a
9b70: 6e 64 20 44 65 6c 65 74 65 46 69 6c 65 28 29 0a  nd DeleteFile().
9b80: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69  ** will be retri
9b90: 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c  ed following a l
9ba0: 6f 63 6b 69 6e 67 20 65 72 72 6f 72 20 2d 20 70  ocking error - p
9bb0: 72 6f 62 61 62 6c 79 20 63 61 75 73 65 64 20 62  robably caused b
9bc0: 79 20 0a 2a 2a 20 61 6e 74 69 76 69 72 75 73 20  y .** antivirus 
9bd0: 73 6f 66 74 77 61 72 65 2e 20 20 41 6c 73 6f 20  software.  Also 
9be0: 74 68 65 20 69 6e 69 74 69 61 6c 20 64 65 6c 61  the initial dela
9bf0: 79 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  y before the fir
9c00: 73 74 20 72 65 74 72 79 2e 0a 2a 2a 20 54 68 65  st retry..** The
9c10: 20 64 65 6c 61 79 20 69 6e 63 72 65 61 73 65 73   delay increases
9c20: 20 6c 69 6e 65 61 72 6c 79 20 77 69 74 68 20 65   linearly with e
9c30: 61 63 68 20 72 65 74 72 79 2e 0a 2a 2f 0a 23 69  ach retry..*/.#i
9c40: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
9c50: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 0a 23  32_IOERR_RETRY.#
9c60: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
9c70: 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59  IN32_IOERR_RETRY
9c80: 20 31 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64   10.#endif.#ifnd
9c90: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
9ca0: 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41  IOERR_RETRY_DELA
9cb0: 59 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  Y.# define SQLIT
9cc0: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
9cd0: 54 52 59 5f 44 45 4c 41 59 20 32 35 0a 23 65 6e  TRY_DELAY 25.#en
9ce0: 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20 77  dif.static int w
9cf0: 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 20 3d  in32IoerrRetry =
9d00: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
9d10: 45 52 52 5f 52 45 54 52 59 3b 0a 73 74 61 74 69  ERR_RETRY;.stati
9d20: 63 20 69 6e 74 20 77 69 6e 33 32 49 6f 65 72 72  c int win32Ioerr
9d30: 52 65 74 72 79 44 65 6c 61 79 20 3d 20 53 51 4c  RetryDelay = SQL
9d40: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
9d50: 52 45 54 52 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a  RETRY_DELAY;../*
9d60: 0a 2a 2a 20 49 66 20 61 20 52 65 61 64 46 69 6c  .** If a ReadFil
9d70: 65 28 29 20 6f 72 20 57 72 69 74 65 46 69 6c 65  e() or WriteFile
9d80: 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
9d90: 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75   invoke this rou
9da0: 74 69 6e 65 0a 2a 2a 20 74 6f 20 73 65 65 20 69  tine.** to see i
9db0: 66 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 72  f it should be r
9dc0: 65 74 72 69 65 64 2e 20 20 52 65 74 75 72 6e 20  etried.  Return 
9dd0: 54 52 55 45 20 74 6f 20 72 65 74 72 79 2e 20 20  TRUE to retry.  
9de0: 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
9df0: 74 6f 20 67 69 76 65 20 75 70 20 77 69 74 68 20  to give up with 
9e00: 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  an error..*/.sta
9e10: 74 69 63 20 69 6e 74 20 72 65 74 72 79 49 6f 65  tic int retryIoe
9e20: 72 72 28 69 6e 74 20 2a 70 6e 52 65 74 72 79 2c  rr(int *pnRetry,
9e30: 20 44 57 4f 52 44 20 2a 70 45 72 72 6f 72 29 7b   DWORD *pError){
9e40: 0a 20 20 44 57 4f 52 44 20 65 20 3d 20 6f 73 47  .  DWORD e = osG
9e50: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
9e60: 20 69 66 28 20 2a 70 6e 52 65 74 72 79 3e 3d 77   if( *pnRetry>=w
9e70: 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 20 29  in32IoerrRetry )
9e80: 7b 0a 20 20 20 20 69 66 28 20 70 45 72 72 6f 72  {.    if( pError
9e90: 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f   ){.      *pErro
9ea0: 72 20 3d 20 65 3b 0a 20 20 20 20 7d 0a 20 20 20  r = e;.    }.   
9eb0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
9ec0: 20 69 66 28 20 65 3d 3d 45 52 52 4f 52 5f 41 43   if( e==ERROR_AC
9ed0: 43 45 53 53 5f 44 45 4e 49 45 44 20 7c 7c 0a 20  CESS_DENIED ||. 
9ee0: 20 20 20 20 20 65 3d 3d 45 52 52 4f 52 5f 4c 4f       e==ERROR_LO
9ef0: 43 4b 5f 56 49 4f 4c 41 54 49 4f 4e 20 7c 7c 0a  CK_VIOLATION ||.
9f00: 20 20 20 20 20 20 65 3d 3d 45 52 52 4f 52 5f 53        e==ERROR_S
9f10: 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e  HARING_VIOLATION
9f20: 20 29 7b 0a 20 20 20 20 70 6f 72 74 61 62 6c 65   ){.    portable
9f30: 53 6c 65 65 70 28 77 69 6e 33 32 49 6f 65 72 72  Sleep(win32Ioerr
9f40: 52 65 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70  RetryDelay*(1+*p
9f50: 6e 52 65 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b  nRetry));.    ++
9f60: 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20 20 72 65  *pnRetry;.    re
9f70: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
9f80: 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ( pError ){.    
9f90: 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 7d  *pError = e;.  }
9fa0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
9fb0: 2f 2a 0a 2a 2a 20 4c 6f 67 20 61 20 49 2f 4f 20  /*.** Log a I/O 
9fc0: 65 72 72 6f 72 20 72 65 74 72 79 20 65 70 69 73  error retry epis
9fd0: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ode..*/.static v
9fe0: 6f 69 64 20 6c 6f 67 49 6f 65 72 72 28 69 6e 74  oid logIoerr(int
9ff0: 20 6e 52 65 74 72 79 29 7b 0a 20 20 69 66 28 20   nRetry){.  if( 
a000: 6e 52 65 74 72 79 20 29 7b 0a 20 20 20 20 73 71  nRetry ){.    sq
a010: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
a020: 5f 49 4f 45 52 52 2c 20 0a 20 20 20 20 20 20 22  _IOERR, .      "
a030: 64 65 6c 61 79 65 64 20 25 64 6d 73 20 66 6f 72  delayed %dms for
a040: 20 6c 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63 6f   lock/sharing co
a050: 6e 66 6c 69 63 74 22 2c 0a 20 20 20 20 20 20 77  nflict",.      w
a060: 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44 65  in32IoerrRetryDe
a070: 6c 61 79 2a 6e 52 65 74 72 79 2a 28 6e 52 65 74  lay*nRetry*(nRet
a080: 72 79 2b 31 29 2f 32 0a 20 20 20 20 29 3b 0a 20  ry+1)/2.    );. 
a090: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b   }.}../*.** Lock
a0a0: 20 61 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a   a file region..
a0b0: 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
a0c0: 69 6e 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 48 41  inLockFile(.  HA
a0d0: 4e 44 4c 45 20 68 46 69 6c 65 2c 0a 20 20 44 57  NDLE hFile,.  DW
a0e0: 4f 52 44 20 66 6c 61 67 73 2c 0a 20 20 44 57 4f  ORD flags,.  DWO
a0f0: 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20  RD offsetLow,.  
a100: 44 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68  DWORD offsetHigh
a110: 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74  ,.  DWORD numByt
a120: 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e  esLow,.  DWORD n
a130: 75 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 20  umBytesHigh.){. 
a140: 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20   if( isNT() ){. 
a150: 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76     OVERLAPPED ov
a160: 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  lp;.    memset(&
a170: 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ovlp, 0, sizeof(
a180: 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20  OVERLAPPED));.  
a190: 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20    ovlp.Offset = 
a1a0: 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f  offsetLow;.    o
a1b0: 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d  vlp.OffsetHigh =
a1c0: 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20   offsetHigh;.   
a1d0: 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69   return osLockFi
a1e0: 6c 65 45 78 28 68 46 69 6c 65 2c 20 66 6c 61 67  leEx(hFile, flag
a1f0: 73 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f  s, 0, numBytesLo
a200: 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c  w, numBytesHigh,
a210: 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65   &ovlp);.  }else
a220: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c  {.    return osL
a230: 6f 63 6b 46 69 6c 65 28 68 46 69 6c 65 2c 20 6f  ockFile(hFile, o
a240: 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74  ffsetLow, offset
a250: 48 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f  High, numBytesLo
a260: 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29  w, numBytesHigh)
a270: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  ;.  }.}../*.** U
a280: 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67  nlock a file reg
a290: 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ion.. */.static 
a2a0: 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  BOOL winUnlockFi
a2b0: 6c 65 28 0a 20 20 48 41 4e 44 4c 45 20 68 46 69  le(.  HANDLE hFi
a2c0: 6c 65 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73  le,.  DWORD offs
a2d0: 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f  etLow,.  DWORD o
a2e0: 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f  ffsetHigh,.  DWO
a2f0: 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a  RD numBytesLow,.
a300: 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73    DWORD numBytes
a310: 48 69 67 68 0a 29 7b 0a 20 20 69 66 28 20 69 73  High.){.  if( is
a320: 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52  NT() ){.    OVER
a330: 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20  LAPPED ovlp;.   
a340: 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30   memset(&ovlp, 0
a350: 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50  , sizeof(OVERLAP
a360: 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e  PED));.    ovlp.
a370: 4f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 4c  Offset = offsetL
a380: 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66  ow;.    ovlp.Off
a390: 73 65 74 48 69 67 68 20 3d 20 6f 66 66 73 65 74  setHigh = offset
a3a0: 48 69 67 68 3b 0a 20 20 20 20 72 65 74 75 72 6e  High;.    return
a3b0: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28   osUnlockFileEx(
a3c0: 68 46 69 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74  hFile, 0, numByt
a3d0: 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48  esLow, numBytesH
a3e0: 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d  igh, &ovlp);.  }
a3f0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
a400: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 68 46   osUnlockFile(hF
a410: 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20  ile, offsetLow, 
a420: 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42  offsetHigh, numB
a430: 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65  ytesLow, numByte
a440: 73 48 69 67 68 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  sHigh);.  }.}..#
a450: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
a460: 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  CE./************
a470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a4a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
a4b0: 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 63 6f   This section co
a4c0: 6e 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72 20  ntains code for 
a4d0: 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 2f  WinCE only..*/./
a4e0: 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 43 45 20  *.** Windows CE 
a4f0: 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20  does not have a 
a500: 6c 6f 63 61 6c 74 69 6d 65 28 29 20 66 75 6e 63  localtime() func
a510: 74 69 6f 6e 2e 20 20 53 6f 20 63 72 65 61 74 65  tion.  So create
a520: 20 61 0a 2a 2a 20 73 75 62 73 74 69 74 75 74 65   a.** substitute
a530: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 74  ..*/.#include <t
a540: 69 6d 65 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d  ime.h>.struct tm
a550: 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74   *__cdecl localt
a560: 69 6d 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74  ime(const time_t
a570: 20 2a 74 29 0a 7b 0a 20 20 73 74 61 74 69 63 20   *t).{.  static 
a580: 73 74 72 75 63 74 20 74 6d 20 79 3b 0a 20 20 46  struct tm y;.  F
a590: 49 4c 45 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d  ILETIME uTm, lTm
a5a0: 3b 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20 70  ;.  SYSTEMTIME p
a5b0: 54 6d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  Tm;.  sqlite3_in
a5c0: 74 36 34 20 74 36 34 3b 0a 20 20 74 36 34 20 3d  t64 t64;.  t64 =
a5d0: 20 2a 74 3b 0a 20 20 74 36 34 20 3d 20 28 74 36   *t;.  t64 = (t6
a5e0: 34 20 2b 20 31 31 36 34 34 34 37 33 36 30 30 29  4 + 11644473600)
a5f0: 2a 31 30 30 30 30 30 30 30 3b 0a 20 20 75 54 6d  *10000000;.  uTm
a600: 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d  .dwLowDateTime =
a610: 20 28 44 57 4f 52 44 29 28 74 36 34 20 26 20 30   (DWORD)(t64 & 0
a620: 78 46 46 46 46 46 46 46 46 29 3b 0a 20 20 75 54  xFFFFFFFF);.  uT
a630: 6d 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65  m.dwHighDateTime
a640: 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20 3e 3e  = (DWORD)(t64 >>
a650: 20 33 32 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69   32);.  osFileTi
a660: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
a670: 65 28 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20  e(&uTm,&lTm);.  
a680: 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74  osFileTimeToSyst
a690: 65 6d 54 69 6d 65 28 26 6c 54 6d 2c 26 70 54 6d  emTime(&lTm,&pTm
a6a0: 29 3b 0a 20 20 79 2e 74 6d 5f 79 65 61 72 20 3d  );.  y.tm_year =
a6b0: 20 70 54 6d 2e 77 59 65 61 72 20 2d 20 31 39 30   pTm.wYear - 190
a6c0: 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20  0;.  y.tm_mon = 
a6d0: 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a  pTm.wMonth - 1;.
a6e0: 20 20 79 2e 74 6d 5f 77 64 61 79 20 3d 20 70 54    y.tm_wday = pT
a6f0: 6d 2e 77 44 61 79 4f 66 57 65 65 6b 3b 0a 20 20  m.wDayOfWeek;.  
a700: 79 2e 74 6d 5f 6d 64 61 79 20 3d 20 70 54 6d 2e  y.tm_mday = pTm.
a710: 77 44 61 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75  wDay;.  y.tm_hou
a720: 72 20 3d 20 70 54 6d 2e 77 48 6f 75 72 3b 0a 20  r = pTm.wHour;. 
a730: 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e   y.tm_min = pTm.
a740: 77 4d 69 6e 75 74 65 3b 0a 20 20 79 2e 74 6d 5f  wMinute;.  y.tm_
a750: 73 65 63 20 3d 20 70 54 6d 2e 77 53 65 63 6f 6e  sec = pTm.wSecon
a760: 64 3b 0a 20 20 72 65 74 75 72 6e 20 26 79 3b 0a  d;.  return &y;.
a770: 7d 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c  }..#define HANDL
a780: 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20  E_TO_WINFILE(a) 
a790: 28 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61  (winFile*)&((cha
a7a0: 72 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73  r*)a)[-(int)offs
a7b0: 65 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d  etof(winFile,h)]
a7c0: 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
a7d0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61  a lock on the ha
a7e0: 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63  ndle h.*/.static
a7f0: 20 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78   void winceMutex
a800: 41 63 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68  Acquire(HANDLE h
a810: 29 7b 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72  ){.   DWORD dwEr
a820: 72 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  r;.   do {.     
a830: 64 77 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f  dwErr = osWaitFo
a840: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c  rSingleObject(h,
a850: 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d   INFINITE);.   }
a860: 20 77 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d   while (dwErr !=
a870: 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26   WAIT_OBJECT_0 &
a880: 26 20 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f  & dwErr != WAIT_
a890: 41 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a  ABANDONED);.}./*
a8a0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f  .** Release a lo
a8b0: 63 6b 20 61 63 71 75 69 72 65 64 20 62 79 20 77  ck acquired by w
a8c0: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
a8d0: 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69  ().*/.#define wi
a8e0: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
a8f0: 68 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28  h) ReleaseMutex(
a900: 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  h)../*.** Create
a910: 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73   the mutex and s
a920: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65  hared memory use
a930: 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e  d for locking in
a940: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73   the file.** des
a950: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f  criptor pFile.*/
a960: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
a970: 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e  ceCreateLock(con
a980: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
a990: 6d 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  me, winFile *pFi
a9a0: 6c 65 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54  le){.  LPWSTR zT
a9b0: 6f 6b 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61  ok;.  LPWSTR zNa
a9c0: 6d 65 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74  me;.  BOOL bInit
a9d0: 20 3d 20 54 52 55 45 3b 0a 0a 20 20 7a 4e 61 6d   = TRUE;..  zNam
a9e0: 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64  e = utf8ToUnicod
a9f0: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
aa00: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  if( zName==0 ){.
aa10: 20 20 20 20 2f 2a 20 6f 75 74 20 6f 66 20 6d 65      /* out of me
aa20: 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 72 65 74 75  mory */.    retu
aa30: 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20  rn FALSE;.  }.. 
aa40: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
aa50: 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74  he local lockdat
aa60: 61 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70  a */.  memset(&p
aa70: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2c 20 30 2c 20  File->local, 0, 
aa80: 73 69 7a 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f  sizeof(pFile->lo
aa90: 63 61 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70  cal));..  /* Rep
aaa0: 6c 61 63 65 20 74 68 65 20 62 61 63 6b 73 6c 61  lace the backsla
aab0: 73 68 65 73 20 66 72 6f 6d 20 74 68 65 20 66 69  shes from the fi
aac0: 6c 65 6e 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72  lename and lower
aad0: 63 61 73 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20  case it.  ** to 
aae0: 64 65 72 69 76 65 20 61 20 6d 75 74 65 78 20 6e  derive a mutex n
aaf0: 61 6d 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d  ame. */.  zTok =
ab00: 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e   osCharLowerW(zN
ab10: 61 6d 65 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a  ame);.  for (;*z
ab20: 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20  Tok;zTok++){.   
ab30: 20 69 66 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c   if (*zTok == '\
ab40: 5c 27 29 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b  \') *zTok = '_';
ab50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74  .  }..  /* Creat
ab60: 65 2f 6f 70 65 6e 20 74 68 65 20 6e 61 6d 65 64  e/open the named
ab70: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c   mutex */.  pFil
ab80: 65 2d 3e 68 4d 75 74 65 78 20 3d 20 6f 73 43 72  e->hMutex = osCr
ab90: 65 61 74 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c  eateMutexW(NULL,
aba0: 20 46 41 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a   FALSE, zName);.
abb0: 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d    if (!pFile->hM
abc0: 75 74 65 78 29 7b 0a 20 20 20 20 70 46 69 6c 65  utex){.    pFile
abd0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
abe0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
abf0: 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
ac00: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 70 46  SQLITE_ERROR, pF
ac10: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20  ile->lastErrno, 
ac20: 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b  "winceCreateLock
ac30: 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  1", zFilename);.
ac40: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ac50: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  (zName);.    ret
ac60: 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a  urn FALSE;.  }..
ac70: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65    /* Acquire the
ac80: 20 6d 75 74 65 78 20 62 65 66 6f 72 65 20 63 6f   mutex before co
ac90: 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77 69  ntinuing */.  wi
aca0: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
acb0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
acc0: 20 20 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74 68    .  /* Since th
acd0: 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64  e names of named
ace0: 20 6d 75 74 65 78 65 73 2c 20 73 65 6d 61 70 68   mutexes, semaph
acf0: 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61 70 70 69  ores, file mappi
ad00: 6e 67 73 20 65 74 63 20 61 72 65 20 0a 20 20 2a  ngs etc are .  *
ad10: 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65  * case-sensitive
ad20: 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65  , take advantage
ad30: 20 6f 66 20 74 68 61 74 20 62 79 20 75 70 70 65   of that by uppe
ad40: 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65  rcasing the mute
ad50: 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20  x name.  ** and 
ad60: 75 73 69 6e 67 20 74 68 61 74 20 61 73 20 74 68  using that as th
ad70: 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d 61 70  e shared filemap
ad80: 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a  ping name..  */.
ad90: 20 20 6f 73 43 68 61 72 55 70 70 65 72 57 28 7a    osCharUpperW(z
ada0: 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e  Name);.  pFile->
adb0: 68 53 68 61 72 65 64 20 3d 20 6f 73 43 72 65 61  hShared = osCrea
adc0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 49  teFileMappingW(I
add0: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
ade0: 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20  LUE, NULL,.     
adf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae10: 20 20 20 50 41 47 45 5f 52 45 41 44 57 52 49 54     PAGE_READWRIT
ae20: 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e  E, 0, sizeof(win
ae30: 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20  ceLock),.       
ae40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae60: 20 7a 4e 61 6d 65 29 3b 20 20 0a 0a 20 20 2f 2a   zName);  ..  /*
ae70: 20 53 65 74 20 61 20 66 6c 61 67 20 74 68 61 74   Set a flag that
ae80: 20 69 6e 64 69 63 61 74 65 73 20 77 65 27 72 65   indicates we're
ae90: 20 74 68 65 20 66 69 72 73 74 20 74 6f 20 63 72   the first to cr
aea0: 65 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  eate the memory 
aeb0: 73 6f 20 69 74 20 0a 20 20 2a 2a 20 6d 75 73 74  so it .  ** must
aec0: 20 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c   be zero-initial
aed0: 69 7a 65 64 20 2a 2f 0a 20 20 69 66 20 28 6f 73  ized */.  if (os
aee0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 3d  GetLastError() =
aef0: 3d 20 45 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f  = ERROR_ALREADY_
af00: 45 58 49 53 54 53 29 7b 0a 20 20 20 20 62 49 6e  EXISTS){.    bIn
af10: 69 74 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a  it = FALSE;.  }.
af20: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
af30: 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66  zName);..  /* If
af40: 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e   we succeeded in
af50: 20 6d 61 6b 69 6e 67 20 74 68 65 20 73 68 61 72   making the shar
af60: 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65  ed memory handle
af70: 2c 20 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69  , map it. */.  i
af80: 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  f (pFile->hShare
af90: 64 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73  d){.    pFile->s
afa0: 68 61 72 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f  hared = (winceLo
afb0: 63 6b 2a 29 6f 73 4d 61 70 56 69 65 77 4f 66 46  ck*)osMapViewOfF
afc0: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72  ile(pFile->hShar
afd0: 65 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ed, .           
afe0: 20 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c    FILE_MAP_READ|
aff0: 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20  FILE_MAP_WRITE, 
b000: 30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e  0, 0, sizeof(win
b010: 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a  ceLock));.    /*
b020: 20 49 66 20 6d 61 70 70 69 6e 67 20 66 61 69 6c   If mapping fail
b030: 65 64 2c 20 63 6c 6f 73 65 20 74 68 65 20 73 68  ed, close the sh
b040: 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64  ared memory hand
b050: 6c 65 20 61 6e 64 20 65 72 61 73 65 20 69 74 20  le and erase it 
b060: 2a 2f 0a 20 20 20 20 69 66 20 28 21 70 46 69 6c  */.    if (!pFil
b070: 65 2d 3e 73 68 61 72 65 64 29 7b 0a 20 20 20 20  e->shared){.    
b080: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
b090: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
b0a0: 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e  ror();.      win
b0b0: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
b0c0: 45 52 52 4f 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  ERROR, pFile->la
b0d0: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
b0e0: 20 20 20 20 20 20 20 20 22 77 69 6e 63 65 43 72          "winceCr
b0f0: 65 61 74 65 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c  eateLock2", zFil
b100: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6f 73  ename);.      os
b110: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
b120: 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20 20 20  e->hShared);.   
b130: 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65     pFile->hShare
b140: 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  d = NULL;.    }.
b150: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61    }..  /* If sha
b160: 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64  red memory could
b170: 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64 2c   not be created,
b180: 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20   then close the 
b190: 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c 20 2a  mutex and fail *
b1a0: 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68  /.  if (pFile->h
b1b0: 53 68 61 72 65 64 20 3d 3d 20 4e 55 4c 4c 29 7b  Shared == NULL){
b1c0: 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52  .    winceMutexR
b1d0: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
b1e0: 75 74 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f  utex);.    osClo
b1f0: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
b200: 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69  hMutex);.    pFi
b210: 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c  le->hMutex = NUL
b220: 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41  L;.    return FA
b230: 4c 53 45 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  LSE;.  }.  .  /*
b240: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
b250: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66  shared memory if
b260: 20 77 65 27 72 65 20 73 75 70 70 6f 73 65 64 20   we're supposed 
b270: 74 6f 20 2a 2f 0a 20 20 69 66 20 28 62 49 6e 69  to */.  if (bIni
b280: 74 29 20 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  t) {.    memset(
b290: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30  pFile->shared, 0
b2a0: 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f  , sizeof(winceLo
b2b0: 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e  ck));.  }..  win
b2c0: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
b2d0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
b2e0: 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 7d 0a   return TRUE;.}.
b2f0: 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74  ./*.** Destroy t
b300: 68 65 20 70 61 72 74 20 6f 66 20 77 69 6e 46 69  he part of winFi
b310: 6c 65 20 74 68 61 74 20 64 65 61 6c 73 20 77 69  le that deals wi
b320: 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a  th wince locks.*
b330: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
b340: 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77  nceDestroyLock(w
b350: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
b360: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75    if (pFile->hMu
b370: 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71  tex){.    /* Acq
b380: 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20 2a  uire the mutex *
b390: 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78  /.    winceMutex
b3a0: 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
b3b0: 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20  Mutex);..    /* 
b3c0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
b3d0: 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f 62  ocks should prob
b3e0: 61 62 6c 79 20 61 73 73 65 72 74 20 69 6e 20 64  ably assert in d
b3f0: 65 62 75 67 20 6d 6f 64 65 2c 20 62 75 74 20 74  ebug mode, but t
b400: 68 65 79 0a 20 20 20 20 20 20 20 61 72 65 20 74  hey.       are t
b410: 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20 63 61 73  o cleanup in cas
b420: 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61  e any locks rema
b430: 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20  ined open */.   
b440: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
b450: 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20  l.nReaders){.   
b460: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
b470: 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20  ->nReaders --;. 
b480: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69     }.    if (pFi
b490: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
b4a0: 76 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ved){.      pFil
b4b0: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
b4c0: 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  rved = FALSE;.  
b4d0: 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c    }.    if (pFil
b4e0: 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e  e->local.bPendin
b4f0: 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  g){.      pFile-
b500: 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
b510: 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d  g = FALSE;.    }
b520: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
b530: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
b540: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
b550: 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
b560: 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ve = FALSE;.    
b570: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65 66  }..    /* De-ref
b580: 65 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65  erence and close
b590: 20 6f 75 72 20 63 6f 70 79 20 6f 66 20 74 68 65   our copy of the
b5a0: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68   shared memory h
b5b0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 6f 73 55  andle */.    osU
b5c0: 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  nmapViewOfFile(p
b5d0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20  File->shared);. 
b5e0: 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
b5f0: 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29  (pFile->hShared)
b600: 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77  ;..    /* Done w
b610: 69 74 68 20 74 68 65 20 6d 75 74 65 78 20 2a 2f  ith the mutex */
b620: 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52  .    winceMutexR
b630: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
b640: 75 74 65 78 29 3b 20 20 20 20 0a 20 20 20 20 6f  utex);    .    o
b650: 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
b660: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20  le->hMutex);.   
b670: 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d   pFile->hMutex =
b680: 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   NULL;.  }.}../*
b690: 20 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e   .** An implemen
b6a0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f  tation of the Lo
b6b0: 63 6b 46 69 6c 65 28 29 20 41 50 49 20 6f 66 20  ckFile() API of 
b6c0: 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a  Windows for CE.*
b6d0: 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  /.static BOOL wi
b6e0: 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 48  nceLockFile(.  H
b6f0: 41 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a 20  ANDLE *phFile,. 
b700: 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66   DWORD dwFileOff
b710: 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
b720: 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
b730: 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
b740: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
b750: 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62  w,.  DWORD nNumb
b760: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48  erOfBytesToLockH
b770: 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65  igh.){.  winFile
b780: 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45   *pFile = HANDLE
b790: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69  _TO_WINFILE(phFi
b7a0: 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74  le);.  BOOL bRet
b7b0: 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20  urn = FALSE;..  
b7c0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
b7d0: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67  (dwFileOffsetHig
b7e0: 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  h);.  UNUSED_PAR
b7f0: 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66  AMETER(nNumberOf
b800: 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29  BytesToLockHigh)
b810: 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d  ;..  if (!pFile-
b820: 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20  >hMutex) return 
b830: 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74  TRUE;.  winceMut
b840: 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
b850: 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  >hMutex);..  /* 
b860: 57 61 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75  Wanting an exclu
b870: 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  sive lock? */.  
b880: 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
b890: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
b8a0: 41 52 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20  ARED_FIRST.     
b8b0: 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79    && nNumberOfBy
b8c0: 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
b8d0: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49  (DWORD)SHARED_SI
b8e0: 5a 45 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69  ZE){.    if (pFi
b8f0: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61  le->shared->nRea
b900: 64 65 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69  ders == 0 && pFi
b910: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63  le->shared->bExc
b920: 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20  lusive == 0){.  
b930: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
b940: 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
b950: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46   TRUE;.       pF
b960: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
b970: 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20  usive = TRUE;.  
b980: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
b990: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
b9a0: 20 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64    /* Want a read
b9b0: 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  -only lock? */. 
b9c0: 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
b9d0: 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
b9e0: 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54  ORD)SHARED_FIRST
b9f0: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e   &&.           n
ba00: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
ba10: 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
ba20: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61    if (pFile->sha
ba30: 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
ba40: 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69  == 0){.      pFi
ba50: 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
ba60: 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20  rs ++;.      if 
ba70: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
ba80: 65 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20  eaders == 1){.  
ba90: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
baa0: 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b  red->nReaders ++
bab0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bac0: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
bad0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
bae0: 57 61 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c  Want a pending l
baf0: 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69  ock? */.  else i
bb00: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
bb10: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e  ow == (DWORD)PEN
bb20: 44 49 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e 75  DING_BYTE && nNu
bb30: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
bb40: 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
bb50: 2f 2a 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67  /* If no pending
bb60: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61   lock has been a
bb70: 63 71 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63  cquired, then ac
bb80: 71 75 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20  quire it */.    
bb90: 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
bba0: 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30  d->bPending == 0
bbb0: 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
bbc0: 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
bbd0: 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  g = TRUE;.      
bbe0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
bbf0: 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20  nding = TRUE;.  
bc00: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
bc10: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
bc20: 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72   /* Want a reser
bc30: 76 65 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65  ved lock? */.  e
bc40: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
bc50: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
bc60: 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 20  D)RESERVED_BYTE 
bc70: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
bc80: 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  sToLockLow == 1)
bc90: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
bca0: 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
bcb0: 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20  ed == 0) {.     
bcc0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
bcd0: 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45  bReserved = TRUE
bce0: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
bcf0: 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d  ocal.bReserved =
bd00: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65   TRUE;.      bRe
bd10: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
bd20: 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d   }.  }..  winceM
bd30: 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
bd40: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65  e->hMutex);.  re
bd50: 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a  turn bReturn;.}.
bd60: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  ./*.** An implem
bd70: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
bd80: 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f  UnlockFile API o
bd90: 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45  f Windows for CE
bda0: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
bdb0: 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28  winceUnlockFile(
bdc0: 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69 6c  .  HANDLE *phFil
bdd0: 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  e,.  DWORD dwFil
bde0: 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57  eOffsetLow,.  DW
bdf0: 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
be00: 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  High,.  DWORD nN
be10: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
be20: 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  lockLow,.  DWORD
be30: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
be40: 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20  oUnlockHigh.){. 
be50: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
be60: 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46  = HANDLE_TO_WINF
be70: 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42  ILE(phFile);.  B
be80: 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41  OOL bReturn = FA
be90: 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  LSE;..  UNUSED_P
bea0: 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65 4f  ARAMETER(dwFileO
beb0: 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55 4e  ffsetHigh);.  UN
bec0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
bed0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
bee0: 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69  nlockHigh);..  i
bef0: 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65  f (!pFile->hMute
bf00: 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a  x) return TRUE;.
bf10: 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
bf20: 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
bf30: 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73  x);..  /* Releas
bf40: 69 6e 67 20 61 20 72 65 61 64 65 72 20 6c 6f 63  ing a reader loc
bf50: 6b 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76  k or an exclusiv
bf60: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20 28  e lock */.  if (
bf70: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
bf80: 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
bf90: 5f 46 49 52 53 54 29 7b 0a 20 20 20 20 2f 2a 20  _FIRST){.    /* 
bfa0: 44 69 64 20 77 65 20 68 61 76 65 20 61 6e 20 65  Did we have an e
bfb0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a  xclusive lock? *
bfc0: 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  /.    if (pFile-
bfd0: 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
bfe0: 65 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e){.      assert
bff0: 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54  (nNumberOfBytesT
c000: 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44  oUnlockLow == (D
c010: 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45  WORD)SHARED_SIZE
c020: 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
c030: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
c040: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
c050: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
c060: 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53  Exclusive = FALS
c070: 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
c080: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 0a   = TRUE;.    }..
c090: 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 6a 75      /* Did we ju
c0a0: 73 74 20 68 61 76 65 20 61 20 72 65 61 64 65 72  st have a reader
c0b0: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c   lock? */.    el
c0c0: 73 65 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f  se if (pFile->lo
c0d0: 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20  cal.nReaders){. 
c0e0: 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d       assert(nNum
c0f0: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
c100: 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  ckLow == (DWORD)
c110: 53 48 41 52 45 44 5f 53 49 5a 45 20 7c 7c 20 6e  SHARED_SIZE || n
c120: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
c130: 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b 0a  nlockLow == 1);.
c140: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
c150: 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a  al.nReaders --;.
c160: 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d        if (pFile-
c170: 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
c180: 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 20 20  == 0).      {.  
c190: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
c1a0: 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d  red->nReaders --
c1b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c1c0: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
c1d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
c1e0: 52 65 6c 65 61 73 69 6e 67 20 61 20 70 65 6e 64  Releasing a pend
c1f0: 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c  ing lock */.  el
c200: 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
c210: 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
c220: 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 26 26  )PENDING_BYTE &&
c230: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
c240: 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  oUnlockLow == 1)
c250: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
c260: 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29  >local.bPending)
c270: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
c280: 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20  ocal.bPending = 
c290: 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69  FALSE;.      pFi
c2a0: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e  le->shared->bPen
c2b0: 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20  ding = FALSE;.  
c2c0: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
c2d0: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  UE;.    }.  }.  
c2e0: 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72  /* Releasing a r
c2f0: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a  eserved lock */.
c300: 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c    else if (dwFil
c310: 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44  eOffsetLow == (D
c320: 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f 42 59  WORD)RESERVED_BY
c330: 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42  TE && nNumberOfB
c340: 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
c350: 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
c360: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73  File->local.bRes
c370: 65 72 76 65 64 29 20 7b 0a 20 20 20 20 20 20 70  erved) {.      p
c380: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73  File->local.bRes
c390: 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  erved = FALSE;. 
c3a0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
c3b0: 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20  ed->bReserved = 
c3c0: 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65  FALSE;.      bRe
c3d0: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
c3e0: 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d   }.  }..  winceM
c3f0: 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
c400: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65  e->hMutex);.  re
c410: 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a  turn bReturn;.}.
c420: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  ./*.** An implem
c430: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
c440: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49  LockFileEx() API
c450: 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20   of Windows for 
c460: 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  CE.*/.static BOO
c470: 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45  L winceLockFileE
c480: 78 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46  x(.  HANDLE *phF
c490: 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  ile,.  DWORD dwF
c4a0: 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 64 77  lags,.  DWORD dw
c4b0: 52 65 73 65 72 76 65 64 2c 0a 20 20 44 57 4f 52  Reserved,.  DWOR
c4c0: 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
c4d0: 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f  ToLockLow,.  DWO
c4e0: 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
c4f0: 73 54 6f 4c 6f 63 6b 48 69 67 68 2c 0a 20 20 4c  sToLockHigh,.  L
c500: 50 4f 56 45 52 4c 41 50 50 45 44 20 6c 70 4f 76  POVERLAPPED lpOv
c510: 65 72 6c 61 70 70 65 64 0a 29 7b 0a 20 20 55 4e  erlapped.){.  UN
c520: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
c530: 77 52 65 73 65 72 76 65 64 29 3b 0a 20 20 55 4e  wReserved);.  UN
c540: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
c550: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
c560: 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 2f 2a 20  ockHigh);..  /* 
c570: 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 77 61  If the caller wa
c580: 6e 74 73 20 61 20 73 68 61 72 65 64 20 72 65 61  nts a shared rea
c590: 64 20 6c 6f 63 6b 2c 20 66 6f 72 77 61 72 64 20  d lock, forward 
c5a0: 74 68 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20 74  this call.  ** t
c5b0: 6f 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 20  o winceLockFile 
c5c0: 2a 2f 0a 20 20 69 66 20 28 6c 70 4f 76 65 72 6c  */.  if (lpOverl
c5d0: 61 70 70 65 64 2d 3e 4f 66 66 73 65 74 20 3d 3d  apped->Offset ==
c5e0: 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46   (DWORD)SHARED_F
c5f0: 49 52 53 54 20 26 26 0a 20 20 20 20 20 20 64 77  IRST &&.      dw
c600: 46 6c 61 67 73 20 3d 3d 20 31 20 26 26 0a 20 20  Flags == 1 &&.  
c610: 20 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74      nNumberOfByt
c620: 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  esToLockLow == (
c630: 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
c640: 45 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  E){.    return w
c650: 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70 68 46  inceLockFile(phF
c660: 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ile, SHARED_FIRS
c670: 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  T, 0, 1, 0);.  }
c680: 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b  .  return FALSE;
c690: 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20  .}./*.** End of 
c6a0: 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f 64 65  the special code
c6b0: 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a   for wince.*****
c6c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c700: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66  ********/.#endif
c710: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   /* SQLITE_OS_WI
c720: 4e 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  NCE */../*******
c730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c770: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ******.** The ne
c780: 78 74 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  xt group of rout
c790: 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74  ines implement t
c7a0: 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 73  he I/O methods s
c7b0: 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 74  pecified.** by t
c7c0: 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
c7d0: 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a  thods object..**
c7e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c7f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
c830: 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f 73  *.** Some Micros
c840: 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61  oft compilers la
c850: 63 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74 69  ck this definiti
c860: 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49  on..*/.#ifndef I
c870: 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
c880: 50 4f 49 4e 54 45 52 0a 23 20 64 65 66 69 6e 65  POINTER.# define
c890: 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c   INVALID_SET_FIL
c8a0: 45 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 4f 52  E_POINTER ((DWOR
c8b0: 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 23 69  D)-1).#endif..#i
c8c0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
c8d0: 54 3d 3d 30 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  T==0./*.** Move 
c8e0: 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
c8f0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65  tion of the file
c900: 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61   handle passed a
c910: 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20  s the first .** 
c920: 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73  argument to offs
c930: 65 74 20 69 4f 66 66 73 65 74 20 77 69 74 68 69  et iOffset withi
c940: 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73  n the file. If s
c950: 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
c960: 6e 20 30 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  n 0. .** Otherwi
c970: 73 65 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c  se, set pFile->l
c980: 61 73 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74  astErrno and ret
c990: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f  urn non-zero..*/
c9a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
c9b0: 57 69 6e 46 69 6c 65 28 77 69 6e 46 69 6c 65 20  WinFile(winFile 
c9c0: 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f  *pFile, sqlite3_
c9d0: 69 6e 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a  int64 iOffset){.
c9e0: 20 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73    LONG upperBits
c9f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ca00: 20 20 2f 2a 20 4d 6f 73 74 20 73 69 67 2e 20 33    /* Most sig. 3
ca10: 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66  2 bits of new of
ca20: 66 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20 6c  fset */.  LONG l
ca30: 6f 77 65 72 42 69 74 73 3b 20 20 20 20 20 20 20  owerBits;       
ca40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61            /* Lea
ca50: 73 74 20 73 69 67 2e 20 33 32 20 62 69 74 73 20  st sig. 32 bits 
ca60: 6f 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f  of new offset */
ca70: 0a 20 20 44 57 4f 52 44 20 64 77 52 65 74 3b 20  .  DWORD dwRet; 
ca80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca90: 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
caa0: 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65 50  rned by SetFileP
cab0: 6f 69 6e 74 65 72 28 29 20 2a 2f 0a 20 20 44 57  ointer() */.  DW
cac0: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  ORD lastErrno;  
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cae0: 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
caf0: 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28  by GetLastError(
cb00: 29 20 2a 2f 0a 0a 20 20 75 70 70 65 72 42 69 74  ) */..  upperBit
cb10: 73 20 3d 20 28 4c 4f 4e 47 29 28 28 69 4f 66 66  s = (LONG)((iOff
cb20: 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66  set>>32) & 0x7ff
cb30: 66 66 66 66 66 29 3b 0a 20 20 6c 6f 77 65 72 42  fffff);.  lowerB
cb40: 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 69 4f 66  its = (LONG)(iOf
cb50: 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66  fset & 0xfffffff
cb60: 66 29 3b 0a 0a 20 20 2f 2a 20 41 50 49 20 6f 64  f);..  /* API od
cb70: 64 69 74 79 3a 20 49 66 20 73 75 63 63 65 73 73  dity: If success
cb80: 66 75 6c 2c 20 53 65 74 46 69 6c 65 50 6f 69 6e  ful, SetFilePoin
cb90: 74 65 72 28 29 20 72 65 74 75 72 6e 73 20 61 20  ter() returns a 
cba0: 64 77 6f 72 64 20 0a 20 20 2a 2a 20 63 6f 6e 74  dword .  ** cont
cbb0: 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 77 65 72  aining the lower
cbc0: 20 33 32 2d 62 69 74 73 20 6f 66 20 74 68 65 20   32-bits of the 
cbd0: 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73 65 74 2e  new file-offset.
cbe0: 20 4f 72 2c 20 69 66 20 69 74 20 66 61 69 6c 73   Or, if it fails
cbf0: 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74 75 72 6e  ,.  ** it return
cc00: 73 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  s INVALID_SET_FI
cc10: 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48 6f 77 65  LE_POINTER. Howe
cc20: 76 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ver according to
cc30: 20 4d 53 44 4e 2c 20 0a 20 20 2a 2a 20 49 4e 56   MSDN, .  ** INV
cc40: 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f  ALID_SET_FILE_PO
cc50: 49 4e 54 45 52 20 6d 61 79 20 61 6c 73 6f 20 62  INTER may also b
cc60: 65 20 61 20 76 61 6c 69 64 20 6e 65 77 20 6f 66  e a valid new of
cc70: 66 73 65 74 2e 20 53 6f 20 74 6f 20 64 65 74 65  fset. So to dete
cc80: 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74  rmine .  ** whet
cc90: 68 65 72 20 61 6e 20 65 72 72 6f 72 20 68 61 73  her an error has
cca0: 20 61 63 74 75 61 6c 6c 79 20 6f 63 63 75 72 65   actually occure
ccb0: 64 2c 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 65  d, it is also ne
ccc0: 63 65 73 73 61 72 79 20 74 6f 20 63 61 6c 6c 20  cessary to call 
ccd0: 0a 20 20 2a 2a 20 47 65 74 4c 61 73 74 45 72 72  .  ** GetLastErr
cce0: 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77 52  or()..  */.  dwR
ccf0: 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f  et = osSetFilePo
cd00: 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20  inter(pFile->h, 
cd10: 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70 70 65  lowerBits, &uppe
cd20: 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49  rBits, FILE_BEGI
cd30: 4e 29 3b 0a 0a 20 20 69 66 28 20 28 64 77 52 65  N);..  if( (dwRe
cd40: 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  t==INVALID_SET_F
cd50: 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 20 20 20 20  ILE_POINTER.    
cd60: 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f    && ((lastErrno
cd70: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
cd80: 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 29  r())!=NO_ERROR))
cd90: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
cda0: 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
cdb0: 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
cdc0: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
cdd0: 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e  RR_SEEK, pFile->
cde0: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
cdf0: 20 20 20 20 20 20 20 20 22 73 65 65 6b 57 69 6e          "seekWin
ce00: 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  File", pFile->zP
ce10: 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ath);.    return
ce20: 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   1;.  }..  retur
ce30: 6e 20 30 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20  n 0;.}.#else /* 
ce40: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
ce50: 52 54 3d 3d 31 20 2a 2f 0a 2f 2a 20 0a 2a 2a 20  RT==1 */./* .** 
ce60: 53 61 6d 65 20 66 75 6e 63 74 69 6f 6e 20 61 73  Same function as
ce70: 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74   above, except t
ce80: 68 61 74 20 74 68 69 73 20 69 6d 70 6c 65 6d 65  hat this impleme
ce90: 6e 74 61 74 69 6f 6e 20 77 6f 72 6b 73 20 66 6f  ntation works fo
cea0: 72 0a 2a 2a 20 77 69 6e 64 6f 77 73 52 54 2e 0a  r.** windowsRT..
ceb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
cec0: 65 6b 57 69 6e 46 69 6c 65 28 77 69 6e 46 69 6c  ekWinFile(winFil
ced0: 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65  e *pFile, sqlite
cee0: 33 5f 69 6e 74 36 34 20 69 4f 66 66 73 65 74 29  3_int64 iOffset)
cef0: 7b 0a 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45  {.  LARGE_INTEGE
cf00: 52 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  R x;            
cf10: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f      /* The new o
cf20: 66 66 73 65 74 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ffset */.  BOOL 
cf30: 62 52 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  bRet;           
cf40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
cf50: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
cf60: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78  SetFilePointerEx
cf70: 28 29 20 2a 2f 0a 0a 20 20 78 2e 51 75 61 64 50  () */..  x.QuadP
cf80: 61 72 74 20 3d 20 69 4f 66 66 73 65 74 3b 0a 20  art = iOffset;. 
cf90: 20 62 52 65 74 20 3d 20 6f 73 53 65 74 46 69 6c   bRet = osSetFil
cfa0: 65 50 6f 69 6e 74 65 72 45 78 28 70 46 69 6c 65  ePointerEx(pFile
cfb0: 2d 3e 68 2c 20 78 2c 20 30 2c 20 46 49 4c 45 5f  ->h, x, 0, FILE_
cfc0: 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 21 62  BEGIN);..  if(!b
cfd0: 52 65 74 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  Ret){.    pFile-
cfe0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
cff0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
d000: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
d010: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b  QLITE_IOERR_SEEK
d020: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
d030: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
d040: 20 22 73 65 65 6b 57 69 6e 46 69 6c 65 22 2c 20   "seekWinFile", 
d050: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
d060: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
d070: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
d080: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c  #endif../*.** Cl
d090: 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  ose a file..**.*
d0a0: 2a 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64  * It is reported
d0b0: 20 74 68 61 74 20 61 6e 20 61 74 74 65 6d 70 74   that an attempt
d0c0: 20 74 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e 64   to close a hand
d0d0: 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65 74 69 6d  le might sometim
d0e0: 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68 69  es.** fail.  Thi
d0f0: 73 20 69 73 20 61 20 76 65 72 79 20 75 6e 72 65  s is a very unre
d100: 61 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74 2c  asonable result,
d110: 20 62 75 74 20 57 69 6e 64 6f 77 73 20 69 73 20   but Windows is 
d120: 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f 72  notorious.** for
d130: 20 62 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e 61   being unreasona
d140: 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74 20  ble so I do not 
d150: 64 6f 75 62 74 20 74 68 61 74 20 69 74 20 6d 69  doubt that it mi
d160: 67 68 74 20 68 61 70 70 65 6e 2e 20 20 49 66 0a  ght happen.  If.
d170: 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20 66 61 69  ** the close fai
d180: 6c 73 2c 20 77 65 20 70 61 75 73 65 20 66 6f 72  ls, we pause for
d190: 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64   100 millisecond
d1a0: 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e  s and try again.
d1b0: 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73 20    As.** many as 
d1c0: 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54  MX_CLOSE_ATTEMPT
d1d0: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c 6f   attempts to clo
d1e0: 73 65 20 74 68 65 20 68 61 6e 64 6c 65 20 61 72  se the handle ar
d1f0: 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a 2a  e made before.**
d200: 20 67 69 76 69 6e 67 20 75 70 20 61 6e 64 20 72   giving up and r
d210: 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
d220: 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58  r..*/.#define MX
d230: 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 33  _CLOSE_ATTEMPT 3
d240: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43  .static int winC
d250: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
d260: 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63  e *id){.  int rc
d270: 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69 6e  , cnt = 0;.  win
d280: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
d290: 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61  inFile*)id;..  a
d2a0: 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
d2b0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
d2c0: 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 20 20 4f 53  >pShm==0 );.  OS
d2d0: 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64  TRACE(("CLOSE %d
d2e0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
d2f0: 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d 20  .  do{.    rc = 
d300: 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
d310: 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a 20  ile->h);.    /* 
d320: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
d330: 20 72 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c   rc=0; cnt=MX_CL
d340: 4f 53 45 5f 41 54 54 45 4d 50 54 3b 20 29 3b 20  OSE_ATTEMPT; ); 
d350: 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  */.  }while( rc=
d360: 3d 30 20 26 26 20 2b 2b 63 6e 74 20 3c 20 4d 58  =0 && ++cnt < MX
d370: 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 26  _CLOSE_ATTEMPT &
d380: 26 20 28 70 6f 72 74 61 62 6c 65 53 6c 65 65 70  & (portableSleep
d390: 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23 69 66  (100), 1) );.#if
d3a0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
d3b0: 0a 23 64 65 66 69 6e 65 20 57 49 4e 43 45 5f 44  .#define WINCE_D
d3c0: 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53  ELETION_ATTEMPTS
d3d0: 20 33 0a 20 20 77 69 6e 63 65 44 65 73 74 72 6f   3.  winceDestro
d3e0: 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  yLock(pFile);.  
d3f0: 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  if( pFile->zDele
d400: 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20  teOnClose ){.   
d410: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
d420: 20 20 77 68 69 6c 65 28 0a 20 20 20 20 20 20 20    while(.       
d430: 20 20 20 20 6f 73 44 65 6c 65 74 65 46 69 6c 65      osDeleteFile
d440: 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65  W(pFile->zDelete
d450: 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20 20 20 20  OnClose)==0.    
d460: 20 20 20 20 26 26 20 6f 73 47 65 74 46 69 6c 65      && osGetFile
d470: 41 74 74 72 69 62 75 74 65 73 57 28 70 46 69 6c  AttributesW(pFil
d480: 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
d490: 65 29 21 3d 30 78 66 66 66 66 66 66 66 66 20 0a  e)!=0xffffffff .
d4a0: 20 20 20 20 20 20 20 20 26 26 20 63 6e 74 2b 2b          && cnt++
d4b0: 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f   < WINCE_DELETIO
d4c0: 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20 20 20 29  N_ATTEMPTS.    )
d4d0: 7b 0a 20 20 20 20 20 20 20 70 6f 72 74 61 62 6c  {.       portabl
d4e0: 65 53 6c 65 65 70 28 31 30 30 29 3b 20 20 2f 2a  eSleep(100);  /*
d4f0: 20 57 61 69 74 20 61 20 6c 69 74 74 6c 65 20 62   Wait a little b
d500: 65 66 6f 72 65 20 74 72 79 69 6e 67 20 61 67 61  efore trying aga
d510: 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  in */.    }.    
d520: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69  sqlite3_free(pFi
d530: 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
d540: 73 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  se);.  }.#endif.
d550: 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53    OSTRACE(("CLOS
d560: 45 20 25 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c  E %d %s\n", pFil
d570: 65 2d 3e 68 2c 20 72 63 20 3f 20 22 6f 6b 22 20  e->h, rc ? "ok" 
d580: 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
d590: 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b  OpenCounter(-1);
d5a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53  .  return rc ? S
d5b0: 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20  QLITE_OK.       
d5c0: 20 20 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72 72       : winLogErr
d5d0: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
d5e0: 43 4c 4f 53 45 2c 20 6f 73 47 65 74 4c 61 73 74  CLOSE, osGetLast
d5f0: 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d610: 20 20 20 22 77 69 6e 43 6c 6f 73 65 22 2c 20 70     "winClose", p
d620: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a  File->zPath);.}.
d630: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61  ./*.** Read data
d640: 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74   from a file int
d650: 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74  o a buffer.  Ret
d660: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
d670: 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65   all.** bytes we
d680: 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66  re read successf
d690: 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  ully and SQLITE_
d6a0: 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e  IOERR if anythin
d6b0: 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
d6c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
d6d0: 69 6e 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65  inRead(.  sqlite
d6e0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20  3_file *id,     
d6f0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20       /* File to 
d700: 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 76  read from */.  v
d710: 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
d720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
d730: 74 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20  te content into 
d740: 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20  this buffer */. 
d750: 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20   int amt,       
d760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
d770: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
d780: 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69  o read */.  sqli
d790: 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
d7a0: 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
d7b0: 72 65 61 64 69 6e 67 20 61 74 20 74 68 69 73 20  reading at this 
d7c0: 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 77  offset */.){.  w
d7d0: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
d7e0: 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f  (winFile*)id;  /
d7f0: 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f  * file handle */
d800: 0a 20 20 44 57 4f 52 44 20 6e 52 65 61 64 3b 20  .  DWORD nRead; 
d810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d820: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d830: 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
d840: 65 61 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f  ead from file */
d850: 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20  .  int nRetry = 
d860: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
d870: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d880: 72 65 74 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73  retrys */..  ass
d890: 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
d8a0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
d8b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
d8c0: 45 52 52 5f 52 45 41 44 29 3b 0a 20 20 4f 53 54  ERR_READ);.  OST
d8d0: 52 41 43 45 28 28 22 52 45 41 44 20 25 64 20 6c  RACE(("READ %d l
d8e0: 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ock=%d\n", pFile
d8f0: 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
d900: 74 79 70 65 29 29 3b 0a 0a 20 20 69 66 28 20 73  type));..  if( s
d910: 65 65 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c 65  eekWinFile(pFile
d920: 2c 20 6f 66 66 73 65 74 29 20 29 7b 0a 20 20 20  , offset) ){.   
d930: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
d940: 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  ULL;.  }.  while
d950: 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46  ( !osReadFile(pF
d960: 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  ile->h, pBuf, am
d970: 74 2c 20 26 6e 52 65 61 64 2c 20 30 29 20 29 7b  t, &nRead, 0) ){
d980: 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45  .    DWORD lastE
d990: 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 72 65  rrno;.    if( re
d9a0: 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79  tryIoerr(&nRetry
d9b0: 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20  , &lastErrno) ) 
d9c0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 46  continue;.    pF
d9d0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
d9e0: 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
d9f0: 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
da00: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
da10: 52 45 41 44 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  READ, pFile->las
da20: 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
da30: 20 20 20 20 20 22 77 69 6e 52 65 61 64 22 2c 20       "winRead", 
da40: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
da50: 20 7d 0a 20 20 6c 6f 67 49 6f 65 72 72 28 6e 52   }.  logIoerr(nR
da60: 65 74 72 79 29 3b 0a 20 20 69 66 28 20 6e 52 65  etry);.  if( nRe
da70: 61 64 3c 28 44 57 4f 52 44 29 61 6d 74 20 29 7b  ad<(DWORD)amt ){
da80: 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70  .    /* Unread p
da90: 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 66  arts of the buff
daa0: 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d  er must be zero-
dab0: 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65  filled */.    me
dac0: 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42  mset(&((char*)pB
dad0: 75 66 29 5b 6e 52 65 61 64 5d 2c 20 30 2c 20 61  uf)[nRead], 0, a
dae0: 6d 74 2d 6e 52 65 61 64 29 3b 0a 20 20 20 20 72  mt-nRead);.    r
daf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
db00: 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20  RR_SHORT_READ;. 
db10: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
db20: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
db30: 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d   Write data from
db40: 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61   a buffer into a
db50: 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53   file.  Return S
db60: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
db70: 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ess.** or some o
db80: 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
db90: 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
dba0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69  tatic int winWri
dbb0: 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  te(.  sqlite3_fi
dbc0: 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
dbd0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f        /* File to
dbe0: 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20   write into */. 
dbf0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
dc00: 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
dc10: 20 2f 2a 20 54 68 65 20 62 79 74 65 73 20 74 6f   /* The bytes to
dc20: 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20   be written */. 
dc30: 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20   int amt,       
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc50: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
dc60: 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  tes to write */.
dc70: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
dc80: 6f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20  offset          
dc90: 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
dca0: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67   the file to beg
dcb0: 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f  in writing at */
dcc0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dce0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
dcf0: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
dd00: 65 64 2c 20 65 6c 73 65 20 66 61 6c 73 65 20 2a  ed, else false *
dd10: 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  /.  winFile *pFi
dd20: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
dd30: 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64  d;  /* File hand
dd40: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74  le */.  int nRet
dd50: 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ry = 0;         
dd60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
dd70: 72 20 6f 66 20 72 65 74 72 69 65 73 20 2a 2f 0a  r of retries */.
dd80: 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30  .  assert( amt>0
dd90: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46   );.  assert( pF
dda0: 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  ile );.  Simulat
ddb0: 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
ddc0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
ddd0: 54 45 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44  TE);.  SimulateD
dde0: 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65 74  iskfullError(ret
ddf0: 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29  urn SQLITE_FULL)
de00: 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57  ;..  OSTRACE(("W
de10: 52 49 54 45 20 25 64 20 6c 6f 63 6b 3d 25 64 5c  RITE %d lock=%d\
de20: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46  n", pFile->h, pF
de30: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b  ile->locktype));
de40: 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b 57 69 6e  ..  rc = seekWin
de50: 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73  File(pFile, offs
de60: 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30  et);.  if( rc==0
de70: 20 29 7b 0a 20 20 20 20 75 38 20 2a 61 52 65 6d   ){.    u8 *aRem
de80: 20 3d 20 28 75 38 20 2a 29 70 42 75 66 3b 20 20   = (u8 *)pBuf;  
de90: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 79 65        /* Data ye
dea0: 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  t to be written 
deb0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d 20  */.    int nRem 
dec0: 3d 20 61 6d 74 3b 20 20 20 20 20 20 20 20 20 20  = amt;          
ded0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
dee0: 66 20 62 79 74 65 73 20 79 65 74 20 74 6f 20 62  f bytes yet to b
def0: 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20  e written */.   
df00: 20 44 57 4f 52 44 20 6e 57 72 69 74 65 3b 20 20   DWORD nWrite;  
df10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
df20: 2a 20 42 79 74 65 73 20 77 72 69 74 74 65 6e 20  * Bytes written 
df30: 62 79 20 65 61 63 68 20 57 72 69 74 65 46 69 6c  by each WriteFil
df40: 65 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 20 20  e() call */.    
df50: 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20  DWORD lastErrno 
df60: 3d 20 4e 4f 5f 45 52 52 4f 52 3b 20 20 20 2f 2a  = NO_ERROR;   /*
df70: 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
df80: 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28  by GetLastError(
df90: 29 20 2a 2f 0a 0a 20 20 20 20 77 68 69 6c 65 28  ) */..    while(
dfa0: 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20   nRem>0 ){.     
dfb0: 20 69 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c   if( !osWriteFil
dfc0: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d  e(pFile->h, aRem
dfd0: 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c  , nRem, &nWrite,
dfe0: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69   0) ){.        i
dff0: 66 28 20 72 65 74 72 79 49 6f 65 72 72 28 26 6e  f( retryIoerr(&n
e000: 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e  Retry, &lastErrn
e010: 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  o) ) continue;. 
e020: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e030: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
e040: 6e 57 72 69 74 65 3c 3d 30 20 29 20 62 72 65 61  nWrite<=0 ) brea
e050: 6b 3b 0a 20 20 20 20 20 20 61 52 65 6d 20 2b 3d  k;.      aRem +=
e060: 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6e   nWrite;.      n
e070: 52 65 6d 20 2d 3d 20 6e 57 72 69 74 65 3b 0a 20  Rem -= nWrite;. 
e080: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52 65     }.    if( nRe
e090: 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69  m>0 ){.      pFi
e0a0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
e0b0: 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
e0c0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
e0d0: 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   }..  if( rc ){.
e0e0: 20 20 20 20 69 66 28 20 20 20 28 20 70 46 69 6c      if(   ( pFil
e0f0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  e->lastErrno==ER
e100: 52 4f 52 5f 48 41 4e 44 4c 45 5f 44 49 53 4b 5f  ROR_HANDLE_DISK_
e110: 46 55 4c 4c 20 29 0a 20 20 20 20 20 20 20 7c 7c  FULL ).       ||
e120: 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   ( pFile->lastEr
e130: 72 6e 6f 3d 3d 45 52 52 4f 52 5f 44 49 53 4b 5f  rno==ERROR_DISK_
e140: 46 55 4c 4c 20 29 29 7b 0a 20 20 20 20 20 20 72  FULL )){.      r
e150: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
e160: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  L;.    }.    ret
e170: 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
e180: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
e190: 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  TE, pFile->lastE
e1a0: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
e1b0: 20 20 20 22 77 69 6e 57 72 69 74 65 22 2c 20 70     "winWrite", p
e1c0: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
e1d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 67 49 6f  }else{.    logIo
e1e0: 65 72 72 28 6e 52 65 74 72 79 29 3b 0a 20 20 7d  err(nRetry);.  }
e1f0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e200: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  _OK;.}../*.** Tr
e210: 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66  uncate an open f
e220: 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69  ile to a specifi
e230: 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69  ed size.*/.stati
e240: 63 20 69 6e 74 20 77 69 6e 54 72 75 6e 63 61 74  c int winTruncat
e250: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
e260: 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  id, sqlite3_int6
e270: 34 20 6e 42 79 74 65 29 7b 0a 20 20 77 69 6e 46  4 nByte){.  winF
e280: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
e290: 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46  nFile*)id;  /* F
e2a0: 69 6c 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63  ile handle objec
e2b0: 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  t */.  int rc = 
e2c0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
e2d0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
e2e0: 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 66   code for this f
e2f0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73  unction */..  as
e300: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a  sert( pFile );..
e310: 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e    OSTRACE(("TRUN
e320: 43 41 54 45 20 25 64 20 25 6c 6c 64 5c 6e 22 2c  CATE %d %lld\n",
e330: 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65   pFile->h, nByte
e340: 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  ));.  SimulateIO
e350: 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
e360: 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
e370: 54 45 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  TE);..  /* If th
e380: 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69  e user has confi
e390: 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69  gured a chunk-si
e3a0: 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ze for this file
e3b0: 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
e3c0: 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74   ** file so that
e3d0: 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20   it consists of 
e3e0: 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65  an integer numbe
e3f0: 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65  r of chunks (i.e
e400: 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61  . the.  ** actua
e410: 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65  l file size afte
e420: 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  r the operation 
e430: 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20 74 68  may be larger th
e440: 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
e450: 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a  .  ** size)..  *
e460: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  /.  if( pFile->s
e470: 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20  zChunk>0 ){.    
e480: 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20  nByte = ((nByte 
e490: 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  + pFile->szChunk
e4a0: 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43   - 1)/pFile->szC
e4b0: 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73  hunk) * pFile->s
e4c0: 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  zChunk;.  }..  /
e4d0: 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 29  * SetEndOfFile()
e4e0: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
e4f0: 6f 20 77 68 65 6e 20 73 75 63 63 65 73 73 66 75  o when successfu
e500: 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e 20  l, or zero when 
e510: 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 69  it fails. */.  i
e520: 66 28 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70  f( seekWinFile(p
e530: 46 69 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b 0a  File, nByte) ){.
e540: 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
e550: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
e560: 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c  R_TRUNCATE, pFil
e570: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
e580: 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 54             "winT
e590: 72 75 6e 63 61 74 65 31 22 2c 20 70 46 69 6c 65  runcate1", pFile
e5a0: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73  ->zPath);.  }els
e5b0: 65 20 69 66 28 20 30 3d 3d 6f 73 53 65 74 45 6e  e if( 0==osSetEn
e5c0: 64 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  dOfFile(pFile->h
e5d0: 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ) ){.    pFile->
e5e0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
e5f0: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
e600: 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
e610: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
e620: 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d  TRUNCATE, pFile-
e630: 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
e640: 20 20 20 20 20 20 20 20 20 22 77 69 6e 54 72 75           "winTru
e650: 6e 63 61 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e  ncate2", pFile->
e660: 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 4f  zPath);.  }..  O
e670: 53 54 52 41 43 45 28 28 22 54 52 55 4e 43 41 54  STRACE(("TRUNCAT
e680: 45 20 25 64 20 25 6c 6c 64 20 25 73 5c 6e 22 2c  E %d %lld %s\n",
e690: 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65   pFile->h, nByte
e6a0: 2c 20 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20  , rc ? "failed" 
e6b0: 3a 20 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75  : "ok"));.  retu
e6c0: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
e6d0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
e6e0: 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
e6f0: 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73  ber of fullsyncs
e700: 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63   and normal sync
e710: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
e720: 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74   to test.** that
e730: 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73   syncs and fulls
e740: 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e  yncs are occurin
e750: 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74  g at the right t
e760: 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  imes..*/.int sql
e770: 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20  ite3_sync_count 
e780: 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  = 0;.int sqlite3
e790: 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20  _fullsync_count 
e7a0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
e7b0: 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  ** Make sure all
e7c0: 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72   writes to a par
e7d0: 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65  ticular file are
e7e0: 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69   committed to di
e7f0: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  sk..*/.static in
e800: 74 20 77 69 6e 53 79 6e 63 28 73 71 6c 69 74 65  t winSync(sqlite
e810: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
e820: 66 6c 61 67 73 29 7b 0a 23 69 66 6e 64 65 66 20  flags){.#ifndef 
e830: 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
e840: 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20 6f 6e   /*.  ** Used on
e850: 6c 79 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e  ly when SQLITE_N
e860: 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64 65  O_SYNC is not de
e870: 66 69 6e 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 42  fined..   */.  B
e880: 4f 4f 4c 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23  OOL rc;.#endif.#
e890: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
e8a0: 55 47 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  UG) || !defined(
e8b0: 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20  SQLITE_NO_SYNC) 
e8c0: 7c 7c 20 5c 0a 20 20 20 20 28 64 65 66 69 6e 65  || \.    (define
e8d0: 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26  d(SQLITE_TEST) &
e8e0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
e8f0: 5f 44 45 42 55 47 29 29 0a 20 20 2f 2a 0a 20 20  _DEBUG)).  /*.  
e900: 2a 2a 20 55 73 65 64 20 77 68 65 6e 20 53 51 4c  ** Used when SQL
e910: 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e  ITE_NO_SYNC is n
e920: 6f 74 20 64 65 66 69 6e 65 64 20 61 6e 64 20 62  ot defined and b
e930: 79 20 74 68 65 20 61 73 73 65 72 74 28 29 20 61  y the assert() a
e940: 6e 64 2f 6f 72 0a 20 20 2a 2a 20 4f 53 54 52 41  nd/or.  ** OSTRA
e950: 43 45 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 20  CE() macros..   
e960: 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  */.  winFile *pF
e970: 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
e980: 69 64 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53  id;.#else.  UNUS
e990: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 29  ED_PARAMETER(id)
e9a0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
e9b0: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 2f  rt( pFile );.  /
e9c0: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65  * Check that one
e9d0: 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f   of SQLITE_SYNC_
e9e0: 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77  NORMAL or FULL w
e9f0: 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61  as passed */.  a
ea00: 73 73 65 72 74 28 28 66 6c 61 67 73 26 30 78 30  ssert((flags&0x0
ea10: 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
ea20: 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20  NORMAL.      || 
ea30: 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
ea40: 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20  LITE_SYNC_FULL. 
ea50: 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   );..  OSTRACE((
ea60: 22 53 59 4e 43 20 25 64 20 6c 6f 63 6b 3d 25 64  "SYNC %d lock=%d
ea70: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
ea80: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
ea90: 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e  ;..  /* Unix can
eaa0: 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79  not, but some sy
eab0: 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e  stems may return
eac0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f   SQLITE_FULL fro
ead0: 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a  m here. This.  *
eae0: 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73  * line is to tes
eaf0: 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20  t that doing so 
eb00: 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61  does not cause a
eb10: 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a  ny problems..  *
eb20: 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b  /.  SimulateDisk
eb30: 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72  fullError( retur
eb40: 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b  n SQLITE_FULL );
eb50: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
eb60: 5f 54 45 53 54 0a 20 20 55 4e 55 53 45 44 5f 50  _TEST.  UNUSED_P
eb70: 41 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b  ARAMETER(flags);
eb80: 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 28 66 6c  .#else.  if( (fl
eb90: 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
eba0: 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20  E_SYNC_FULL ){. 
ebb0: 20 20 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73     sqlite3_fulls
ebc0: 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d  ync_count++;.  }
ebd0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f  .  sqlite3_sync_
ebe0: 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
ebf0: 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70  .  /* If we comp
ec00: 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51  iled with the SQ
ec10: 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61  LITE_NO_SYNC fla
ec20: 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20  g, then syncing 
ec30: 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a  is a.  ** no-op.
ec40: 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
ec50: 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 65 74  TE_NO_SYNC.  ret
ec60: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
ec70: 65 6c 73 65 0a 20 20 72 63 20 3d 20 6f 73 46 6c  else.  rc = osFl
ec80: 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 28 70  ushFileBuffers(p
ec90: 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 53 69 6d 75  File->h);.  Simu
eca0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
ecb0: 46 41 4c 53 45 20 29 3b 0a 20 20 69 66 28 20 72  FALSE );.  if( r
ecc0: 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
ecd0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
ece0: 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  se{.    pFile->l
ecf0: 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
ed00: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
ed10: 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
ed20: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
ed30: 5f 46 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c  _FSYNC, pFile->l
ed40: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
ed50: 20 20 20 20 20 20 20 22 77 69 6e 53 79 6e 63 22         "winSync"
ed60: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
ed70: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
ed80: 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74  *.** Determine t
ed90: 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
eda0: 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74  of a file in byt
edb0: 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es.*/.static int
edc0: 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c   winFileSize(sql
edd0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73  ite3_file *id, s
ede0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 53  qlite3_int64 *pS
edf0: 69 7a 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  ize){.  winFile 
ee00: 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
ee10: 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20  e*)id;.  int rc 
ee20: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
ee30: 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
ee40: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
ee50: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
ee60: 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a 23  _IOERR_FSTAT);.#
ee70: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
ee80: 52 54 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 5f  RT.  {.    FILE_
ee90: 53 54 41 4e 44 41 52 44 5f 49 4e 46 4f 20 69 6e  STANDARD_INFO in
eea0: 66 6f 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65  fo;.    if( osGe
eeb0: 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  tFileInformation
eec0: 42 79 48 61 6e 64 6c 65 45 78 28 70 46 69 6c 65  ByHandleEx(pFile
eed0: 2d 3e 68 2c 20 46 69 6c 65 53 74 61 6e 64 61 72  ->h, FileStandar
eee0: 64 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20  dInfo,.         
eef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 26 69 6e 66              &inf
ef10: 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  o, sizeof(info))
ef20: 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65   ){.      *pSize
ef30: 20 3d 20 69 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c   = info.EndOfFil
ef40: 65 2e 51 75 61 64 50 61 72 74 3b 0a 20 20 20 20  e.QuadPart;.    
ef50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
ef60: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
ef70: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
ef80: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
ef90: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
efa0: 49 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69  IOERR_FSTAT, pFi
efb0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
efc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efd0: 20 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69        "winFileSi
efe0: 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ze", pFile->zPat
eff0: 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  h);.    }.  }.#e
f000: 6c 73 65 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52  lse.  {.    DWOR
f010: 44 20 75 70 70 65 72 42 69 74 73 3b 0a 20 20 20  D upperBits;.   
f020: 20 44 57 4f 52 44 20 6c 6f 77 65 72 42 69 74 73   DWORD lowerBits
f030: 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74  ;.    DWORD last
f040: 45 72 72 6e 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65  Errno;..    lowe
f050: 72 42 69 74 73 20 3d 20 6f 73 47 65 74 46 69 6c  rBits = osGetFil
f060: 65 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20  eSize(pFile->h, 
f070: 26 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20 20  &upperBits);.   
f080: 20 2a 70 53 69 7a 65 20 3d 20 28 28 28 73 71 6c   *pSize = (((sql
f090: 69 74 65 33 5f 69 6e 74 36 34 29 75 70 70 65 72  ite3_int64)upper
f0a0: 42 69 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77  Bits)<<32) + low
f0b0: 65 72 42 69 74 73 3b 0a 20 20 20 20 69 66 28 20  erBits;.    if( 
f0c0: 20 20 28 6c 6f 77 65 72 42 69 74 73 20 3d 3d 20    (lowerBits == 
f0d0: 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 53 49 5a  INVALID_FILE_SIZ
f0e0: 45 29 0a 20 20 20 20 20 20 20 26 26 20 28 28 6c  E).       && ((l
f0f0: 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
f100: 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f  LastError())!=NO
f110: 5f 45 52 52 4f 52 29 20 29 7b 0a 20 20 20 20 20  _ERROR) ){.     
f120: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
f130: 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
f140: 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
f150: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
f160: 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d  RR_FSTAT, pFile-
f170: 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
f180: 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 69 6c           "winFil
f190: 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  eSize", pFile->z
f1a0: 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Path);.    }.  }
f1b0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
f1c0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f   rc;.}../*.** LO
f1d0: 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
f1e0: 44 49 41 54 45 4c 59 20 69 73 20 75 6e 64 65 66  DIATELY is undef
f1f0: 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e  ined on some Win
f200: 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f  dows systems..*/
f210: 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c  .#ifndef LOCKFIL
f220: 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
f230: 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b  LY.# define LOCK
f240: 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
f250: 41 54 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a  ATELY 1.#endif..
f260: 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45  #ifndef LOCKFILE
f270: 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a  _EXCLUSIVE_LOCK.
f280: 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c  # define LOCKFIL
f290: 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  E_EXCLUSIVE_LOCK
f2a0: 20 32 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   2.#endif../*.**
f2b0: 20 48 69 73 74 6f 72 69 63 61 6c 6c 79 2c 20 53   Historically, S
f2c0: 51 4c 69 74 65 20 68 61 73 20 75 73 65 64 20 62  QLite has used b
f2d0: 6f 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  oth the LockFile
f2e0: 20 61 6e 64 20 4c 6f 63 6b 46 69 6c 65 45 78 20   and LockFileEx 
f2f0: 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 57 68  functions..** Wh
f300: 65 6e 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20  en the LockFile 
f310: 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 75 73 65  function was use
f320: 64 2c 20 69 74 20 77 61 73 20 61 6c 77 61 79 73  d, it was always
f330: 20 65 78 70 65 63 74 65 64 20 74 6f 20 66 61 69   expected to fai
f340: 6c 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79  l.** immediately
f350: 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 6f 75   if the lock cou
f360: 6c 64 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e  ld not be obtain
f370: 65 64 2e 20 20 41 6c 73 6f 2c 20 69 74 20 61 6c  ed.  Also, it al
f380: 77 61 79 73 20 65 78 70 65 63 74 65 64 20 74 6f  ways expected to
f390: 0a 2a 2a 20 6f 62 74 61 69 6e 20 61 6e 20 65 78  .** obtain an ex
f3a0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 54  clusive lock.  T
f3b0: 68 65 73 65 20 66 6c 61 67 73 20 61 72 65 20 75  hese flags are u
f3c0: 73 65 64 20 77 69 74 68 20 74 68 65 20 4c 6f 63  sed with the Loc
f3d0: 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e  kFileEx function
f3e0: 0a 2a 2a 20 61 6e 64 20 72 65 66 6c 65 63 74 20  .** and reflect 
f3f0: 74 68 6f 73 65 20 65 78 70 65 63 74 61 74 69 6f  those expectatio
f400: 6e 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 74  ns; therefore, t
f410: 68 65 79 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  hey should not b
f420: 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 69  e changed..*/.#i
f430: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43  fndef SQLITE_LOC
f440: 4b 46 49 4c 45 5f 46 4c 41 47 53 0a 23 20 64 65  KFILE_FLAGS.# de
f450: 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  fine SQLITE_LOCK
f460: 46 49 4c 45 5f 46 4c 41 47 53 20 20 20 28 4c 4f  FILE_FLAGS   (LO
f470: 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
f480: 44 49 41 54 45 4c 59 20 7c 20 5c 0a 20 20 20 20  DIATELY | \.    
f490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 4f                LO
f4b0: 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45  CKFILE_EXCLUSIVE
f4c0: 5f 4c 4f 43 4b 29 0a 23 65 6e 64 69 66 0a 0a 2f  _LOCK).#endif../
f4d0: 2a 0a 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20  *.** Currently, 
f4e0: 53 51 4c 69 74 65 20 6e 65 76 65 72 20 63 61 6c  SQLite never cal
f4f0: 6c 73 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45  ls the LockFileE
f500: 78 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f  x function witho
f510: 75 74 20 77 61 6e 74 69 6e 67 20 74 68 65 0a 2a  ut wanting the.*
f520: 2a 20 63 61 6c 6c 20 74 6f 20 66 61 69 6c 20 69  * call to fail i
f530: 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74 68  mmediately if th
f540: 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65  e lock cannot be
f550: 20 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 23 69   obtained..*/.#i
f560: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43  fndef SQLITE_LOC
f570: 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 0a 23 20  KFILEEX_FLAGS.# 
f580: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f  define SQLITE_LO
f590: 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 20 28  CKFILEEX_FLAGS (
f5a0: 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
f5b0: 4d 45 44 49 41 54 45 4c 59 29 0a 23 65 6e 64 69  MEDIATELY).#endi
f5c0: 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  f../*.** Acquire
f5d0: 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a   a reader lock..
f5e0: 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50 49  ** Different API
f5f0: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61   routines are ca
f600: 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f  lled depending o
f610: 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
f620: 20 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39   this.** is Win9
f630: 78 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73  x or WinNT..*/.s
f640: 74 61 74 69 63 20 69 6e 74 20 67 65 74 52 65 61  tatic int getRea
f650: 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70  dLock(winFile *p
f660: 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73  File){.  int res
f670: 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  ;.  if( isNT() )
f680: 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c  {.    res = winL
f690: 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  ockFile(pFile->h
f6a0: 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  , SQLITE_LOCKFIL
f6b0: 45 45 58 5f 46 4c 41 47 53 2c 20 53 48 41 52 45  EEX_FLAGS, SHARE
f6c0: 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20 20  D_FIRST, 0,.    
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6e0: 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30    SHARED_SIZE, 0
f6f0: 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  );.  }.#ifdef SQ
f700: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
f710: 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
f720: 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69  int lk;.    sqli
f730: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
f740: 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b  izeof(lk), &lk);
f750: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72  .    pFile->shar
f760: 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73 68  edLockByte = (sh
f770: 6f 72 74 29 28 28 6c 6b 20 26 20 30 78 37 66 66  ort)((lk & 0x7ff
f780: 66 66 66 66 66 29 25 28 53 48 41 52 45 44 5f 53  fffff)%(SHARED_S
f790: 49 5a 45 20 2d 20 31 29 29 3b 0a 20 20 20 20 72  IZE - 1));.    r
f7a0: 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
f7b0: 28 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54  (pFile->h, SQLIT
f7c0: 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
f7d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f7e0: 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46          SHARED_F
f7f0: 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72  IRST+pFile->shar
f800: 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31  edLockByte, 0, 1
f810: 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
f820: 0a 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20  .  if( res == 0 
f830: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
f840: 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
f850: 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
f860: 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f  /* No need to lo
f870: 67 20 61 20 66 61 69 6c 75 72 65 20 74 6f 20 6c  g a failure to l
f880: 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  ock */.  }.  ret
f890: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
f8a0: 2a 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63  * Undo a readloc
f8b0: 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  k.*/.static int 
f8c0: 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77  unlockReadLock(w
f8d0: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
f8e0: 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 44 57 4f    int res;.  DWO
f8f0: 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
f900: 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
f910: 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63    res = winUnloc
f920: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
f930: 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
f940: 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
f950: 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
f960: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
f970: 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 72  SI.  else{.    r
f980: 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  es = winUnlockFi
f990: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  le(pFile->h, SHA
f9a0: 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d  RED_FIRST+pFile-
f9b0: 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c  >sharedLockByte,
f9c0: 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23   0, 1, 0);.  }.#
f9d0: 65 6e 64 69 66 0a 20 20 69 66 28 20 72 65 73 3d  endif.  if( res=
f9e0: 3d 30 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e  =0 && ((lastErrn
f9f0: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
fa00: 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 4e 4f 54  or())!=ERROR_NOT
fa10: 5f 4c 4f 43 4b 45 44 29 20 29 7b 0a 20 20 20 20  _LOCKED) ){.    
fa20: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
fa30: 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
fa40: 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
fa50: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
fa60: 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  K, pFile->lastEr
fa70: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
fa80: 20 20 22 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63    "unlockReadLoc
fa90: 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  k", pFile->zPath
faa0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
fab0: 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  res;.}../*.** Lo
fac0: 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
fad0: 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
fae0: 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
faf0: 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a   locktype - one.
fb00: 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
fb10: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
fb20: 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
fb30: 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
fb40: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
fb50: 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
fb60: 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
fb70: 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
fb80: 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
fb90: 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
fba0: 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
fbb0: 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
fbc0: 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
fbd0: 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
fbe0: 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
fbf0: 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
fc00: 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
fc10: 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
fc20: 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
fc30: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
fc40: 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
fc50: 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
fc60: 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
fc70: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
fc80: 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
fc90: 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
fca0: 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
fcb0: 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
fcc0: 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
fcd0: 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
fce0: 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
fcf0: 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
fd00: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
fd10: 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
fd20: 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
fd30: 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
fd40: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
fd50: 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
fd60: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
fd70: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
fd80: 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
fd90: 61 20 6c 6f 63 6b 2e 20 20 54 68 65 20 77 69 6e  a lock.  The win
fda0: 55 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65  Unlock() routine
fdb0: 0a 2a 2a 20 65 72 61 73 65 73 20 61 6c 6c 20 6c  .** erases all l
fdc0: 6f 63 6b 73 20 61 74 20 6f 6e 63 65 20 61 6e 64  ocks at once and
fdd0: 20 72 65 74 75 72 6e 73 20 75 73 20 69 6d 6d 65   returns us imme
fde0: 64 69 61 74 65 6c 79 20 74 6f 20 6c 6f 63 6b 69  diately to locki
fdf0: 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20 49  ng level 0..** I
fe00: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
fe10: 65 20 74 6f 20 6c 6f 77 65 72 20 74 68 65 20 6c  e to lower the l
fe20: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 65  ocking level one
fe30: 20 73 74 65 70 20 61 74 20 61 20 74 69 6d 65 2e   step at a time.
fe40: 20 20 59 6f 75 0a 2a 2a 20 6d 75 73 74 20 67 6f    You.** must go
fe50: 20 73 74 72 61 69 67 68 74 20 74 6f 20 6c 6f 63   straight to loc
fe60: 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f  king level 0..*/
fe70: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c  .static int winL
fe80: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
fe90: 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
fea0: 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pe){.  int rc = 
feb0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a  SQLITE_OK;    /*
fec0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
fed0: 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f  m subroutines */
fee0: 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20  .  int res = 1; 
fef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
ff00: 75 6c 74 20 6f 66 20 61 20 57 69 6e 64 6f 77 73  ult of a Windows
ff10: 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20   lock call */.  
ff20: 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b  int newLocktype;
ff30: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70 46         /* Set pF
ff40: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f  ile->locktype to
ff50: 20 74 68 69 73 20 76 61 6c 75 65 20 62 65 66 6f   this value befo
ff60: 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20  re exiting */.  
ff70: 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f  int gotPendingLo
ff80: 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69  ck = 0;/* True i
ff90: 66 20 77 65 20 61 63 71 75 69 72 65 64 20 61 20  f we acquired a 
ffa0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69  PENDING lock thi
ffb0: 73 20 74 69 6d 65 20 2a 2f 0a 20 20 77 69 6e 46  s time */.  winF
ffc0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
ffd0: 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f  nFile*)id;.  DWO
ffe0: 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e  RD lastErrno = N
fff0: 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73 73 65  O_ERROR;..  asse
10000 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f  rt( id!=0 );.  O
10010 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 64  STRACE(("LOCK %d
10020 20 25 64 20 77 61 73 20 25 64 28 25 64 29 5c 6e   %d was %d(%d)\n
10030 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
10040 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
10050 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
10060 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  e, pFile->shared
10070 4c 6f 63 6b 42 79 74 65 29 29 3b 0a 0a 20 20 2f  LockByte));..  /
10080 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
10090 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
100a0 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
100b0 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
100c0 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65   the.  ** OsFile
100d0 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
100e0 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f  n't use the end_
100f0 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c  lock: exit path,
10100 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   as.  ** sqlite3
10110 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  OsEnterMutex() h
10120 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
10130 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
10140 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
10150 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
10160 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10170 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
10180 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
10190 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
101a0 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20   correct.  */.  
101b0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
101c0 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b  ocktype!=NO_LOCK
101d0 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   || locktype==SH
101e0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
101f0 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
10200 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
10210 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
10220 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype!=RESERVED_LO
10230 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK || pFile->loc
10240 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
10250 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b  CK );..  /* Lock
10260 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   the PENDING_LOC
10270 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e 65 65  K byte if we nee
10280 64 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 50  d to acquire a P
10290 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20  ENDING lock or. 
102a0 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63   ** a SHARED loc
102b0 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 63  k.  If we are ac
102c0 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
102d0 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69   lock, the acqui
102e0 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74  sition of.  ** t
102f0 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  he PENDING_LOCK 
10300 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72  byte is temporar
10310 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63  y..  */.  newLoc
10320 6b 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c  ktype = pFile->l
10330 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 20  ocktype;.  if(  
10340 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
10350 65 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20  e==NO_LOCK).    
10360 20 7c 7c 20 28 20 20 20 28 6c 6f 63 6b 74 79 70   || (   (locktyp
10370 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
10380 4b 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  K).         && (
10390 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
103a0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 29  =RESERVED_LOCK))
103b0 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e  .  ){.    int cn
103c0 74 20 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c 65  t = 3;.    while
103d0 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65  ( cnt-->0 && (re
103e0 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  s = winLockFile(
103f0 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
10400 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
10410 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10430 20 20 20 20 20 20 20 20 20 20 50 45 4e 44 49 4e            PENDIN
10440 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  G_BYTE, 0, 1, 0)
10450 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
10460 20 54 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20   Try 3 times to 
10470 67 65 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20  get the pending 
10480 6c 6f 63 6b 2e 20 20 54 68 69 73 20 69 73 20 6e  lock.  This is n
10490 65 65 64 65 64 20 74 6f 20 77 6f 72 6b 0a 20 20  eeded to work.  
104a0 20 20 20 20 2a 2a 20 61 72 6f 75 6e 64 20 70 72      ** around pr
104b0 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79  oblems caused by
104c0 20 69 6e 64 65 78 69 6e 67 20 61 6e 64 2f 6f 72   indexing and/or
104d0 20 61 6e 74 69 2d 76 69 72 75 73 20 73 6f 66 74   anti-virus soft
104e0 77 61 72 65 20 6f 6e 0a 20 20 20 20 20 20 2a 2a  ware on.      **
104f0 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73   Windows systems
10500 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 79 6f  ..      ** If yo
10510 75 20 61 72 65 20 75 73 69 6e 67 20 74 68 69 73  u are using this
10520 20 63 6f 64 65 20 61 73 20 61 20 6d 6f 64 65 6c   code as a model
10530 20 66 6f 72 20 61 6c 74 65 72 6e 61 74 69 76 65   for alternative
10540 20 56 46 53 65 73 2c 20 64 6f 20 6e 6f 74 0a 20   VFSes, do not. 
10550 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 74 68 69       ** copy thi
10560 73 20 72 65 74 72 79 20 6c 6f 67 69 63 2e 20 20  s retry logic.  
10570 49 74 20 69 73 20 61 20 68 61 63 6b 20 69 6e 74  It is a hack int
10580 65 6e 64 65 64 20 66 6f 72 20 57 69 6e 64 6f 77  ended for Window
10590 73 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2f  s only..      */
105a0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
105b0 22 63 6f 75 6c 64 20 6e 6f 74 20 67 65 74 20 61  "could not get a
105c0 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 20 63   PENDING lock. c
105d0 6e 74 3d 25 64 5c 6e 22 2c 20 63 6e 74 29 29 3b  nt=%d\n", cnt));
105e0 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 20 29  .      if( cnt )
105f0 20 70 6f 72 74 61 62 6c 65 53 6c 65 65 70 28 31   portableSleep(1
10600 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74  );.    }.    got
10610 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65  PendingLock = re
10620 73 3b 0a 20 20 20 20 69 66 28 20 21 72 65 73 20  s;.    if( !res 
10630 29 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72  ){.      lastErr
10640 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
10650 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ror();.    }.  }
10660 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61  ..  /* Acquire a
10670 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a   shared lock.  *
10680 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
10690 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
106a0 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65   res ){.    asse
106b0 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
106c0 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a  ype==NO_LOCK );.
106d0 20 20 20 20 72 65 73 20 3d 20 67 65 74 52 65 61      res = getRea
106e0 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
106f0 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
10700 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d     newLocktype =
10710 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
10720 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
10730 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
10740 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
10750 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71   }.  }..  /* Acq
10760 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20  uire a RESERVED 
10770 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
10780 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56  locktype==RESERV
10790 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29  ED_LOCK && res )
107a0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  {.    assert( pF
107b0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53  ile->locktype==S
107c0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
107d0 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46    res = winLockF
107e0 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 51  ile(pFile->h, SQ
107f0 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
10800 41 47 53 2c 20 52 45 53 45 52 56 45 44 5f 42 59  AGS, RESERVED_BY
10810 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
10820 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
10830 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d     newLocktype =
10840 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a   RESERVED_LOCK;.
10850 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10860 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
10870 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
10880 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
10890 63 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47  cquire a PENDING
108a0 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28   lock.  */.  if(
108b0 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
108c0 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73  SIVE_LOCK && res
108d0 20 29 7b 0a 20 20 20 20 6e 65 77 4c 6f 63 6b 74   ){.    newLockt
108e0 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ype = PENDING_LO
108f0 43 4b 3b 0a 20 20 20 20 67 6f 74 50 65 6e 64 69  CK;.    gotPendi
10900 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a  ngLock = 0;.  }.
10910 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e  .  /* Acquire an
10920 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 0a   EXCLUSIVE lock.
10930 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
10940 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
10950 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20  OCK && res ){.  
10960 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
10970 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48 41 52 45  >locktype>=SHARE
10980 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65  D_LOCK );.    re
10990 73 20 3d 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f  s = unlockReadLo
109a0 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 4f  ck(pFile);.    O
109b0 53 54 52 41 43 45 28 28 22 75 6e 72 65 61 64 6c  STRACE(("unreadl
109c0 6f 63 6b 20 3d 20 25 64 5c 6e 22 2c 20 72 65 73  ock = %d\n", res
109d0 29 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69  ));.    res = wi
109e0 6e 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d  nLockFile(pFile-
109f0 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
10a00 49 4c 45 5f 46 4c 41 47 53 2c 20 53 48 41 52 45  ILE_FLAGS, SHARE
10a10 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20 20  D_FIRST, 0,.    
10a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a30 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30    SHARED_SIZE, 0
10a40 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29  );.    if( res )
10a50 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74  {.      newLockt
10a60 79 70 65 20 3d 20 45 58 43 4c 55 53 49 56 45 5f  ype = EXCLUSIVE_
10a70 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LOCK;.    }else{
10a80 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
10a90 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
10aa0 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  r();.      OSTRA
10ab0 43 45 28 28 22 65 72 72 6f 72 2d 63 6f 64 65 20  CE(("error-code 
10ac0 3d 20 25 64 5c 6e 22 2c 20 6c 61 73 74 45 72 72  = %d\n", lastErr
10ad0 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 65 74 52  no));.      getR
10ae0 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  eadLock(pFile);.
10af0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
10b00 49 66 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e  If we are holdin
10b10 67 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  g a PENDING lock
10b20 20 74 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62   that ought to b
10b30 65 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e  e released, then
10b40 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74  .  ** release it
10b50 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
10b60 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
10b70 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  && locktype==SHA
10b80 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
10b90 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46  winUnlockFile(pF
10ba0 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  ile->h, PENDING_
10bb0 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
10bc0 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
10bd0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
10be0 65 20 6c 6f 63 6b 20 68 61 73 20 68 65 6c 64 20  e lock has held 
10bf0 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  in the file desc
10c00 72 69 70 74 6f 72 20 74 68 65 6e 0a 20 20 2a 2a  riptor then.  **
10c10 20 72 65 74 75 72 6e 20 74 68 65 20 61 70 70 72   return the appr
10c20 6f 70 72 69 61 74 65 20 72 65 73 75 6c 74 20 63  opriate result c
10c30 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ode..  */.  if( 
10c40 72 65 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  res ){.    rc = 
10c50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
10c60 73 65 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  se{.    OSTRACE(
10c70 28 22 4c 4f 43 4b 20 46 41 49 4c 45 44 20 25 64  ("LOCK FAILED %d
10c80 20 74 72 79 69 6e 67 20 66 6f 72 20 25 64 20 62   trying for %d b
10c90 75 74 20 67 6f 74 20 25 64 5c 6e 22 2c 20 70 46  ut got %d\n", pF
10ca0 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
10cb0 20 20 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77     locktype, new
10cc0 4c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 20 20  Locktype));.    
10cd0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
10ce0 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
10cf0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
10d00 53 59 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  SY;.  }.  pFile-
10d10 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29  >locktype = (u8)
10d20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20 20 72  newLocktype;.  r
10d30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
10d40 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10d50 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
10d60 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
10d70 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
10d80 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
10d90 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
10da0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
10db0 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
10dc0 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a   held, return.**
10dd0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72   non-zero, other
10de0 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  wise zero..*/.st
10df0 61 74 69 63 20 69 6e 74 20 77 69 6e 43 68 65 63  atic int winChec
10e00 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
10e10 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
10e20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
10e30 20 69 6e 74 20 72 63 3b 0a 20 20 77 69 6e 46 69   int rc;.  winFi
10e40 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
10e50 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
10e60 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
10e70 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
10e80 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
10e90 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72  OCK; );..  asser
10ea0 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 69 66  t( id!=0 );.  if
10eb0 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
10ec0 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e>=RESERVED_LOCK
10ed0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a   ){.    rc = 1;.
10ee0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
10ef0 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
10f00 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69   (local)\n", pFi
10f10 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d  le->h, rc));.  }
10f20 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 77  else{.    rc = w
10f30 69 6e 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65  inLockFile(pFile
10f40 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
10f50 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52 45 53 45  FILE_FLAGS, RESE
10f60 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
10f70 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
10f80 29 7b 0a 20 20 20 20 20 20 77 69 6e 55 6e 6c 6f  ){.      winUnlo
10f90 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
10fa0 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
10fb0 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, 1, 0);.    }.
10fc0 20 20 20 20 72 63 20 3d 20 21 72 63 3b 0a 20 20      rc = !rc;.  
10fd0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
10fe0 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28   WR-LOCK %d %d (
10ff0 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 70 46 69 6c  remote)\n", pFil
11000 65 2d 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d 0a  e->h, rc));.  }.
11010 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63 3b    *pResOut = rc;
11020 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11030 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  _OK;.}../*.** Lo
11040 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
11050 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
11060 73 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c  scriptor id to l
11070 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79  ocktype.  lockty
11080 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  pe.** must be ei
11090 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
110a0 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
110b0 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
110c0 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
110d0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
110e0 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
110f0 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
11100 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
11110 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
11120 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
11130 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70  *.** It is not p
11140 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73  ossible for this
11150 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c   routine to fail
11160 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
11170 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f  rgument.** is NO
11180 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 73  _LOCK.  If the s
11190 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
111a0 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68  s SHARED_LOCK th
111b0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
111c0 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20  ** might return 
111d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f  SQLITE_IOERR;.*/
111e0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55  .static int winU
111f0 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
11200 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
11210 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 74 79 70  type){.  int typ
11220 65 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  e;.  winFile *pF
11230 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
11240 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  id;.  int rc = S
11250 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
11260 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a  rt( pFile!=0 );.
11270 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
11280 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe<=SHARED_LOCK 
11290 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
112a0 4e 4c 4f 43 4b 20 25 64 20 74 6f 20 25 64 20 77  NLOCK %d to %d w
112b0 61 73 20 25 64 28 25 64 29 5c 6e 22 2c 20 70 46  as %d(%d)\n", pF
112c0 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
112d0 2c 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  ,.          pFil
112e0 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69  e->locktype, pFi
112f0 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
11300 74 65 29 29 3b 0a 20 20 74 79 70 65 20 3d 20 70  te));.  type = p
11310 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a  File->locktype;.
11320 20 20 69 66 28 20 74 79 70 65 3e 3d 45 58 43 4c    if( type>=EXCL
11330 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
11340 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28    winUnlockFile(
11350 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
11360 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45  _FIRST, 0, SHARE
11370 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20  D_SIZE, 0);.    
11380 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
11390 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21 67 65  ARED_LOCK && !ge
113a0 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  tReadLock(pFile)
113b0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
113c0 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
113d0 61 70 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c  appen.  We shoul
113e0 64 20 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65  d always be able
113f0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   to.      ** rea
11400 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
11410 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63  lock */.      rc
11420 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
11430 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
11440 43 4b 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  CK, osGetLastErr
11450 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
11460 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22       "winUnlock"
11470 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
11480 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
11490 20 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f   type>=RESERVED_
114a0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55  LOCK ){.    winU
114b0 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d  nlockFile(pFile-
114c0 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  >h, RESERVED_BYT
114d0 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  E, 0, 1, 0);.  }
114e0 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
114f0 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65  =NO_LOCK && type
11500 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  >=SHARED_LOCK ){
11510 0a 20 20 20 20 75 6e 6c 6f 63 6b 52 65 61 64 4c  .    unlockReadL
11520 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a  ock(pFile);.  }.
11530 20 20 69 66 28 20 74 79 70 65 3e 3d 50 45 4e 44    if( type>=PEND
11540 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ING_LOCK ){.    
11550 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46  winUnlockFile(pF
11560 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  ile->h, PENDING_
11570 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
11580 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63    }.  pFile->loc
11590 6b 74 79 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b  ktype = (u8)lock
115a0 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72  type;.  return r
115b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a  c;.}../*.** If *
115c0 70 41 72 67 20 69 73 20 69 6e 69 74 69 74 69 61  pArg is inititia
115d0 6c 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68 65  lly negative the
115e0 6e 20 74 68 69 73 20 69 73 20 61 20 71 75 65 72  n this is a quer
115f0 79 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f  y.  Set *pArg to
11600 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e  .** 1 or 0 depen
11610 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
11620 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20  or not bit mask 
11630 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  of pFile->ctrlFl
11640 61 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a  ags is set..**.*
11650 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 30 20  * If *pArg is 0 
11660 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72  or 1, then clear
11670 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b   or set the mask
11680 20 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63   bit of pFile->c
11690 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61  trlFlags..*/.sta
116a0 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 6f 64 65  tic void winMode
116b0 42 69 74 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  Bit(winFile *pFi
116c0 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  le, unsigned cha
116d0 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72  r mask, int *pAr
116e0 67 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c  g){.  if( *pArg<
116f0 30 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d  0 ){.    *pArg =
11700 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61   (pFile->ctrlFla
11710 67 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20  gs & mask)!=0;. 
11720 20 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72   }else if( (*pAr
11730 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69  g)==0 ){.    pFi
11740 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d  le->ctrlFlags &=
11750 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b   ~mask;.  }else{
11760 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
11770 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20  Flags |= mask;. 
11780 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74   }.}../*.** Cont
11790 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20 6f 66  rol and query of
117a0 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 68   the open file h
117b0 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
117c0 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74   int winFileCont
117d0 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
117e0 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f   *id, int op, vo
117f0 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 69 6e  id *pArg){.  win
11800 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
11810 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77  inFile*)id;.  sw
11820 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
11830 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
11840 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20  L_LOCKSTATE: {. 
11850 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
11860 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   = pFile->lockty
11870 70 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  pe;.      return
11880 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
11890 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
118a0 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a  E_LAST_ERRNO: {.
118b0 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
118c0 67 20 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e  g = (int)pFile->
118d0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
118e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
118f0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
11900 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  e SQLITE_FCNTL_C
11910 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  HUNK_SIZE: {.   
11920 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e     pFile->szChun
11930 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67  k = *(int *)pArg
11940 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
11950 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
11960 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
11970 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a  FCNTL_SIZE_HINT:
11980 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69   {.      if( pFi
11990 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b  le->szChunk>0 ){
119a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
119b0 5f 69 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a 20 20  _int64 oldSz;.  
119c0 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77        int rc = w
119d0 69 6e 46 69 6c 65 53 69 7a 65 28 69 64 2c 20 26  inFileSize(id, &
119e0 6f 6c 64 53 7a 29 3b 0a 20 20 20 20 20 20 20 20  oldSz);.        
119f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11a00 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
11a10 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 65 77  qlite3_int64 new
11a20 53 7a 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f 69  Sz = *(sqlite3_i
11a30 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20  nt64*)pArg;.    
11a40 20 20 20 20 20 20 69 66 28 20 6e 65 77 53 7a 3e        if( newSz>
11a50 6f 6c 64 53 7a 20 29 7b 0a 20 20 20 20 20 20 20  oldSz ){.       
11a60 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
11a70 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
11a80 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
11a90 77 69 6e 54 72 75 6e 63 61 74 65 28 69 64 2c 20  winTruncate(id, 
11aa0 6e 65 77 53 7a 29 3b 0a 20 20 20 20 20 20 20 20  newSz);.        
11ab0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
11ac0 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
11ad0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11ae0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75    }.        retu
11af0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
11b00 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11b10 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
11b20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
11b30 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20  TL_PERSIST_WAL: 
11b40 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42  {.      winModeB
11b50 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c  it(pFile, WINFIL
11b60 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28  E_PERSIST_WAL, (
11b70 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  int*)pArg);.    
11b80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11b90 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
11ba0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
11bb0 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
11bc0 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e  ITE: {.      win
11bd0 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57  ModeBit(pFile, W
11be0 49 4e 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e  INFILE_PSOW, (in
11bf0 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20  t*)pArg);.      
11c00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11c10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
11c20 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46   SQLITE_FCNTL_VF
11c30 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a  SNAME: {.      *
11c40 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73  (char**)pArg = s
11c50 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
11c60 77 69 6e 33 32 22 29 3b 0a 20 20 20 20 20 20 72  win32");.      r
11c70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11c80 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
11c90 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e  SQLITE_FCNTL_WIN
11ca0 33 32 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a 20  32_AV_RETRY: {. 
11cb0 20 20 20 20 20 69 6e 74 20 2a 61 20 3d 20 28 69       int *a = (i
11cc0 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  nt*)pArg;.      
11cd0 69 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20 20  if( a[0]>0 ){.  
11ce0 20 20 20 20 20 20 77 69 6e 33 32 49 6f 65 72 72        win32Ioerr
11cf0 52 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20  Retry = a[0];.  
11d00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11d10 20 20 20 61 5b 30 5d 20 3d 20 77 69 6e 33 32 49     a[0] = win32I
11d20 6f 65 72 72 52 65 74 72 79 3b 0a 20 20 20 20 20  oerrRetry;.     
11d30 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 5b 31   }.      if( a[1
11d40 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ]>0 ){.        w
11d50 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44 65  in32IoerrRetryDe
11d60 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20  lay = a[1];.    
11d70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11d80 20 61 5b 31 5d 20 3d 20 77 69 6e 33 32 49 6f 65   a[1] = win32Ioe
11d90 72 72 52 65 74 72 79 44 65 6c 61 79 3b 0a 20 20  rrRetryDelay;.  
11da0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
11db0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
11dc0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
11dd0 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
11de0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
11df0 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  n the sector siz
11e00 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68  e in bytes of th
11e10 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f  e underlying blo
11e20 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a  ck device for.**
11e30 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
11e40 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d  ile. This is alm
11e50 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62  ost always 512 b
11e60 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65  ytes, but may be
11e70 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73  .** larger for s
11e80 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a  ome devices..**.
11e90 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61  ** SQLite code a
11ea0 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63  ssumes this func
11eb0 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tion cannot fail
11ec0 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65  . It also assume
11ed0 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f  s that.** if two
11ee0 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74   files are creat
11ef0 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66  ed in the same f
11f00 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63  ile-system direc
11f10 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20  tory (i.e..** a 
11f20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73  database and its
11f30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74   journal file) t
11f40 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73  hat the sector s
11f50 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a  ize will be the.
11f60 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68  ** same for both
11f70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11f80 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 28 73 71  winSectorSize(sq
11f90 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
11fa0 0a 20 20 28 76 6f 69 64 29 69 64 3b 0a 20 20 72  .  (void)id;.  r
11fb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46  eturn SQLITE_DEF
11fc0 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
11fd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
11fe0 6e 20 61 20 76 65 63 74 6f 72 20 6f 66 20 64 65  n a vector of de
11ff0 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
12000 74 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tics..*/.static 
12010 69 6e 74 20 77 69 6e 44 65 76 69 63 65 43 68 61  int winDeviceCha
12020 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c  racteristics(sql
12030 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
12040 20 20 77 69 6e 46 69 6c 65 20 2a 70 20 3d 20 28    winFile *p = (
12050 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 72  winFile*)id;.  r
12060 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43  eturn SQLITE_IOC
12070 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57  AP_UNDELETABLE_W
12080 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20 20 20 20 20  HEN_OPEN |.     
12090 20 20 20 20 28 28 70 2d 3e 63 74 72 6c 46 6c 61      ((p->ctrlFla
120a0 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 50 53 4f  gs & WINFILE_PSO
120b0 57 29 3f 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  W)?SQLITE_IOCAP_
120c0 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
120d0 49 54 45 3a 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE:0);.}..#ifnd
120e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
120f0 41 4c 0a 0a 2f 2a 20 0a 2a 2a 20 57 69 6e 64 6f  AL../* .** Windo
12100 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c 65 74  ws will only let
12110 20 79 6f 75 20 63 72 65 61 74 65 20 66 69 6c 65   you create file
12120 20 76 69 65 77 20 6d 61 70 70 69 6e 67 73 0a 2a   view mappings.*
12130 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  * on allocation 
12140 73 69 7a 65 20 67 72 61 6e 75 6c 61 72 69 74 79  size granularity
12150 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a 2a 2a 20   boundaries..** 
12160 44 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f  During sqlite3_o
12170 73 5f 69 6e 69 74 28 29 20 77 65 20 64 6f 20 61  s_init() we do a
12180 20 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 29   GetSystemInfo()
12190 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20 67  .** to get the g
121a0 72 61 6e 75 6c 61 72 69 74 79 20 73 69 7a 65 2e  ranularity size.
121b0 0a 2a 2f 0a 53 59 53 54 45 4d 5f 49 4e 46 4f 20  .*/.SYSTEM_INFO 
121c0 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a 2f 2a 0a  winSysInfo;../*.
121d0 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
121e0 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ons to obtain an
121f0 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65  d relinquish the
12200 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54   global mutex. T
12210 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74  he.** global mut
12220 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  ex is used to pr
12230 6f 74 65 63 74 20 74 68 65 20 77 69 6e 4c 6f 63  otect the winLoc
12240 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 75 73  kInfo objects us
12250 65 64 20 62 79 20 0a 2a 2a 20 74 68 69 73 20 66  ed by .** this f
12260 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63  ile, all of whic
12270 68 20 6d 61 79 20 62 65 20 73 68 61 72 65 64 20  h may be shared 
12280 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65  by multiple thre
12290 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74  ads..**.** Funct
122a0 69 6f 6e 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  ion winShmMutexH
122b0 65 6c 64 28 29 20 69 73 20 75 73 65 64 20 74 6f  eld() is used to
122c0 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74   assert() that t
122d0 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  he global mutex 
122e0 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e  .** is held when
122f0 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
12300 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
12310 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   used as part of
12320 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74   assert() .** st
12330 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a  atements. e.g..*
12340 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 45 6e 74  *.**   winShmEnt
12350 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20  erMutex().**    
12360 20 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d   assert( winShmM
12370 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a  utexHeld() );.**
12380 20 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75     winShmLeaveMu
12390 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  tex().*/.static 
123a0 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74 65 72  void winShmEnter
123b0 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
123c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
123d0 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
123e0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
123f0 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
12400 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
12410 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
12420 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
12430 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
12440 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
12450 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
12460 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
12470 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
12480 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20  EBUG.static int 
12490 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
124a0 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e  void) {.  return
124b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
124c0 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78  eld(sqlite3Mutex
124d0 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
124e0 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
124f0 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ));.}.#endif../*
12500 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20  .** Object used 
12510 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 73  to represent a s
12520 69 6e 67 6c 65 20 66 69 6c 65 20 6f 70 65 6e 65  ingle file opene
12530 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 20 74 6f  d and mmapped to
12540 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73 68 61 72   provide.** shar
12550 65 64 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e  ed memory.  When
12560 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
12570 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20  s all reference 
12580 74 68 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d  the same.** log-
12590 73 75 6d 6d 61 72 79 2c 20 65 61 63 68 20 74 68  summary, each th
125a0 72 65 61 64 20 68 61 73 20 69 74 73 20 6f 77 6e  read has its own
125b0 20 77 69 6e 46 69 6c 65 20 6f 62 6a 65 63 74 2c   winFile object,
125c0 20 62 75 74 20 74 68 65 79 20 61 6c 6c 0a 2a 2a   but they all.**
125d0 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67   point to a sing
125e0 6c 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  le instance of t
125f0 68 69 73 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20  his object.  In 
12600 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63  other words, eac
12610 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79  h.** log-summary
12620 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 6c 79 20   is opened only 
12630 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73 73  once per process
12640 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75  ..**.** winShmMu
12650 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
12660 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65 61  e true when crea
12670 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69  ting or destroyi
12680 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63  ng.** this objec
12690 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69  t or while readi
126a0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
126b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
126c0 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e  ds:.**.**      n
126d0 52 65 66 0a 2a 2a 20 20 20 20 20 20 70 4e 65 78  Ref.**      pNex
126e0 74 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  t .**.** The fol
126f0 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72  lowing fields ar
12700 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65  e read-only afte
12710 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  r the object is 
12720 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20  created:.** .** 
12730 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20       fid.**     
12740 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a   zFilename.**.**
12750 20 45 69 74 68 65 72 20 77 69 6e 53 68 6d 4e 6f   Either winShmNo
12760 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  de.mutex must be
12770 20 68 65 6c 64 20 6f 72 20 77 69 6e 53 68 6d 4e   held or winShmN
12780 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a  ode.nRef==0 and.
12790 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  ** winShmMutexHe
127a0 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65  ld() is true whe
127b0 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  n reading or wri
127c0 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66  ting any other f
127d0 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  ield.** in this 
127e0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f  structure..**.*/
127f0 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f  .struct winShmNo
12800 64 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  de {.  sqlite3_m
12810 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20  utex *mutex;    
12820 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63    /* Mutex to ac
12830 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74  cess this object
12840 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
12850 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
12860 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
12870 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  file */.  winFil
12880 65 20 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20  e hFile;        
12890 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e       /* File han
128a0 64 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70 65 6e  dle from winOpen
128b0 20 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52 65 67   */..  int szReg
128c0 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
128d0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61    /* Size of sha
128e0 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
128f0 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67  ns */.  int nReg
12900 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
12910 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72     /* Size of ar
12920 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a  ray apRegion */.
12930 20 20 73 74 72 75 63 74 20 53 68 6d 52 65 67 69    struct ShmRegi
12940 6f 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20  on {.    HANDLE 
12950 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  hMap;           
12960 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
12970 20 66 72 6f 6d 20 43 72 65 61 74 65 46 69 6c 65   from CreateFile
12980 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20 20 76  Mapping */.    v
12990 6f 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a  oid *pMap;.  } *
129a0 61 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f 52 44  aRegion;.  DWORD
129b0 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20   lastErrno;     
129c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e        /* The Win
129d0 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20  dows errno from 
129e0 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72  the last I/O err
129f0 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52 65  or */..  int nRe
12a00 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
12a10 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
12a20 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20   winShm objects 
12a30 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
12a40 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 46   */.  winShm *pF
12a50 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
12a60 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d 20 6f   /* All winShm o
12a70 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20  bjects pointing 
12a80 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e  to this */.  win
12a90 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74 3b 20  ShmNode *pNext; 
12aa0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
12ab0 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 77  in list of all w
12ac0 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
12ad0 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
12ae0 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 6e 65  TE_DEBUG.  u8 ne
12af0 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20  xtShmId;        
12b00 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76        /* Next av
12b10 61 69 6c 61 62 6c 65 20 77 69 6e 53 68 6d 2e 69  ailable winShm.i
12b20 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69  d value */.#endi
12b30 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c  f.};../*.** A gl
12b40 6f 62 61 6c 20 61 72 72 61 79 20 6f 66 20 61 6c  obal array of al
12b50 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a  l winShmNode obj
12b60 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ects..**.** The 
12b70 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
12b80 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77  ) must be true w
12b90 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20  hile reading or 
12ba0 77 72 69 74 69 6e 67 20 74 68 69 73 20 6c 69 73  writing this lis
12bb0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 77 69 6e  t..*/.static win
12bc0 53 68 6d 4e 6f 64 65 20 2a 77 69 6e 53 68 6d 4e  ShmNode *winShmN
12bd0 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  odeList = 0;../*
12be0 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73  .** Structure us
12bf0 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79  ed internally by
12c00 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63   this VFS to rec
12c10 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66  ord the state of
12c20 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72   an.** open shar
12c30 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63  ed memory connec
12c40 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
12c50 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
12c60 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
12c70 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63   when this objec
12c80 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
12c90 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  .** are read-onl
12ca0 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a  y thereafter:.**
12cb0 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 70 53  .**    winShm.pS
12cc0 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 77 69 6e  hmNode.**    win
12cd0 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c  Shm.id.**.** All
12ce0 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72   other fields ar
12cf0 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54  e read/write.  T
12d00 68 65 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f  he winShm.pShmNo
12d10 64 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62  de->mutex must b
12d20 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20  e held.** while 
12d30 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65  accessing any re
12d40 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e  ad/write fields.
12d50 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68  .*/.struct winSh
12d60 6d 20 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  m {.  winShmNode
12d70 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
12d80 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
12d90 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62  ng winShmNode ob
12da0 6a 65 63 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  ject */.  winShm
12db0 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
12dc0 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 77 69 6e       /* Next win
12dd0 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d  Shm with the sam
12de0 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  e winShmNode */.
12df0 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20    u8 hasMutex;  
12e00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12e10 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20  True if holding 
12e20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6d  the winShmNode m
12e30 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20 73 68  utex */.  u16 sh
12e40 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20  aredMask;       
12e50 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
12e60 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c  shared locks hel
12e70 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d  d */.  u16 exclM
12e80 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
12e90 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63    /* Mask of exc
12ea0 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c  lusive locks hel
12eb0 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d */.#ifdef SQLI
12ec0 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 69 64  TE_DEBUG.  u8 id
12ed0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12ee0 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74        /* Id of t
12ef0 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
12f00 69 74 68 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f  ith its winShmNo
12f10 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  de */.#endif.};.
12f20 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73  ./*.** Constants
12f30 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
12f40 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e  g.*/.#define WIN
12f50 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32  _SHM_BASE   ((22
12f60 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
12f70 4b 29 2a 34 29 20 20 20 20 20 20 20 20 2f 2a 20  K)*4)        /* 
12f80 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20  first lock byte 
12f90 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53  */.#define WIN_S
12fa0 48 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f 53  HM_DMS    (WIN_S
12fb0 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53  HM_BASE+SQLITE_S
12fc0 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65  HM_NLOCK)  /* de
12fd0 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a  adman switch */.
12fe0 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76  ./*.** Apply adv
12ff0 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20  isory locks for 
13000 61 6c 6c 20 6e 20 62 79 74 65 73 20 62 65 67 69  all n bytes begi
13010 6e 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a  nning at ofst..*
13020 2f 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 55  /.#define _SHM_U
13030 4e 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e 65 20  NLCK  1.#define 
13040 5f 53 48 4d 5f 52 44 4c 43 4b 20 20 32 0a 23 64  _SHM_RDLCK  2.#d
13050 65 66 69 6e 65 20 5f 53 48 4d 5f 57 52 4c 43 4b  efine _SHM_WRLCK
13060 20 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77    3.static int w
13070 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
13080 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
13090 46 69 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c  File,    /* Appl
130a0 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20  y locks to this 
130b0 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f  open shared-memo
130c0 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ry segment */.  
130d0 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20  int lockType,   
130e0 20 20 20 20 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e        /* _SHM_UN
130f0 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c  LCK, _SHM_RDLCK,
13100 20 6f 72 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a   or _SHM_WRLCK *
13110 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
13120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
13130 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79 74  set to first byt
13140 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f 75  e to be locked/u
13150 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74  nlocked */.  int
13160 20 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20   nByte          
13170 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13180 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72  bytes to lock or
13190 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20   unlock */.){.  
131a0 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20  int rc = 0;     
131b0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
131c0 63 6f 64 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55  code form Lock/U
131d0 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20 2a 2f  nlockFileEx() */
131e0 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f  ..  /* Access to
131f0 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20   the winShmNode 
13200 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c  object is serial
13210 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ized by the call
13220 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
13230 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
13240 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29  ld(pFile->mutex)
13250 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3d   || pFile->nRef=
13260 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65  =0 );..  /* Rele
13270 61 73 65 2f 41 63 71 75 69 72 65 20 74 68 65 20  ase/Acquire the 
13280 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63  system-level loc
13290 6b 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54  k */.  if( lockT
132a0 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20  ype==_SHM_UNLCK 
132b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 55  ){.    rc = winU
132c0 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d  nlockFile(pFile-
132d0 3e 68 46 69 6c 65 2e 68 2c 20 6f 66 73 74 2c 20  >hFile.h, ofst, 
132e0 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20  0, nByte, 0);.  
132f0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e  }else{.    /* In
13300 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63  itialize the loc
13310 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  king parameters 
13320 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 64 77 46  */.    DWORD dwF
13330 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f  lags = LOCKFILE_
13340 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
13350 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79  ;.    if( lockTy
13360 70 65 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b  pe == _SHM_WRLCK
13370 20 29 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c 4f   ) dwFlags |= LO
13380 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45  CKFILE_EXCLUSIVE
13390 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20  _LOCK;.    rc = 
133a0 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c  winLockFile(pFil
133b0 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 64 77 46 6c  e->hFile.h, dwFl
133c0 61 67 73 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42  ags, ofst, 0, nB
133d0 79 74 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 0a  yte, 0);.  }.  .
133e0 20 20 69 66 28 20 72 63 21 3d 20 30 20 29 7b 0a    if( rc!= 0 ){.
133f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13400 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
13410 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
13420 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73 74 45 72  o =  osGetLastEr
13430 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d 20  ror();.    rc = 
13440 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
13450 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ..  OSTRACE(("SH
13460 4d 2d 4c 4f 43 4b 20 25 64 20 25 73 20 25 73 20  M-LOCK %d %s %s 
13470 30 78 25 30 38 6c 78 5c 6e 22 2c 20 0a 20 20 20  0x%08lx\n", .   
13480 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
13490 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20  File.h,.        
134a0 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
134b0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
134c0 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c  d",.           l
134d0 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e  ockType==_SHM_UN
134e0 4c 43 4b 20 3f 20 22 55 6e 6c 6f 63 6b 46 69 6c  LCK ? "UnlockFil
134f0 65 45 78 22 20 3a 20 22 4c 6f 63 6b 46 69 6c 65  eEx" : "LockFile
13500 45 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Ex",.           
13510 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
13520 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  ));..  return rc
13530 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
13540 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46  references to VF
13550 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  S methods */.sta
13560 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28  tic int winOpen(
13570 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 63 6f 6e  sqlite3_vfs*,con
13580 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 33  st char*,sqlite3
13590 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29  _file*,int,int*)
135a0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
135b0 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f 76  Delete(sqlite3_v
135c0 66 73 20 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  fs *,const char*
135d0 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75  ,int);../*.** Pu
135e0 72 67 65 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f  rge the winShmNo
135f0 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61  deList list of a
13600 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68 20  ll entries with 
13610 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d  winShmNode.nRef=
13620 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  =0..**.** This i
13630 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72  s not a VFS shar
13640 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64  ed-memory method
13650 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c 69 74  ; it is a utilit
13660 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  y function calle
13670 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72  d.** by VFS shar
13680 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64  ed-memory method
13690 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
136a0 64 20 77 69 6e 53 68 6d 50 75 72 67 65 28 73 71  d winShmPurge(sq
136b0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
136c0 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 29   int deleteFlag)
136d0 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  {.  winShmNode *
136e0 2a 70 70 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  *pp;.  winShmNod
136f0 65 20 2a 70 3b 0a 20 20 42 4f 4f 4c 20 62 52 63  e *p;.  BOOL bRc
13700 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53  ;.  assert( winS
13710 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  hmMutexHeld() );
13720 0a 20 20 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e  .  pp = &winShmN
13730 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65  odeList;.  while
13740 28 20 28 70 20 3d 20 2a 70 70 29 21 3d 30 20 29  ( (p = *pp)!=0 )
13750 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65  {.    if( p->nRe
13760 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  f==0 ){.      in
13770 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t i;.      if( p
13780 2d 3e 6d 75 74 65 78 20 29 20 73 71 6c 69 74 65  ->mutex ) sqlite
13790 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e  3_mutex_free(p->
137a0 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 66 6f  mutex);.      fo
137b0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67  r(i=0; i<p->nReg
137c0 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ion; i++){.     
137d0 20 20 20 62 52 63 20 3d 20 6f 73 55 6e 6d 61 70     bRc = osUnmap
137e0 56 69 65 77 4f 66 46 69 6c 65 28 70 2d 3e 61 52  ViewOfFile(p->aR
137f0 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a  egion[i].pMap);.
13800 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
13810 28 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64 2d  ("SHM-PURGE pid-
13820 25 64 20 75 6e 6d 61 70 20 72 65 67 69 6f 6e 3d  %d unmap region=
13830 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
13840 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
13850 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
13860 65 73 73 49 64 28 29 2c 20 69 2c 0a 20 20 20 20  essId(), i,.    
13870 20 20 20 20 20 20 20 20 20 20 20 20 20 62 52 63               bRc
13880 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
13890 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 62 52  d"));.        bR
138a0 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  c = osCloseHandl
138b0 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e  e(p->aRegion[i].
138c0 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f  hMap);.        O
138d0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52  STRACE(("SHM-PUR
138e0 47 45 20 70 69 64 2d 25 64 20 63 6c 6f 73 65 20  GE pid-%d close 
138f0 72 65 67 69 6f 6e 3d 25 64 20 25 73 5c 6e 22 2c  region=%d %s\n",
13900 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13910 20 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72    (int)osGetCurr
13920 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
13930 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i,.             
13940 20 20 20 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a      bRc ? "ok" :
13950 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
13960 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
13970 2d 3e 68 46 69 6c 65 2e 68 20 21 3d 20 49 4e 56  ->hFile.h != INV
13980 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
13990 45 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d  E ){.        Sim
139a0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
139b0 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77  gn(1);.        w
139c0 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  inClose((sqlite3
139d0 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c  _file *)&p->hFil
139e0 65 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75  e);.        Simu
139f0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
13a00 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n(0);.      }.  
13a10 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c      if( deleteFl
13a20 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69  ag ){.        Si
13a30 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
13a40 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20  ign(1);.        
13a50 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
13a60 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
13a70 20 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56      winDelete(pV
13a80 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65  fs, p->zFilename
13a90 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
13aa0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
13ab0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
13ac0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
13ad0 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
13ae0 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d  }.      *pp = p-
13af0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
13b00 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52  lite3_free(p->aR
13b10 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71  egion);.      sq
13b20 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
13b30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13b40 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a  pp = &p->pNext;.
13b50 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
13b60 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72  ** Open the shar
13b70 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61  ed-memory area a
13b80 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64  ssociated with d
13b90 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62  atabase file pDb
13ba0 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f  Fd..**.** When o
13bb0 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61  pening a new sha
13bc0 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
13bd0 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73   if no other ins
13be0 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a  tances of that.*
13bf0 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65  * file are curre
13c00 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68  ntly open, in th
13c10 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e  is process or in
13c20 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
13c30 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69  , then.** the fi
13c40 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63  le must be trunc
13c50 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  ated to zero len
13c60 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20  gth or have its 
13c70 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a  header cleared..
13c80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
13c90 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  nOpenSharedMemor
13ca0 79 28 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64  y(winFile *pDbFd
13cb0 29 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53  ){.  struct winS
13cc0 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  hm *p;          
13cd0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
13ce0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
13cf0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  opened */.  stru
13d00 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  ct winShmNode *p
13d10 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f  ShmNode = 0;   /
13d20 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
13d30 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f   mmapped file */
13d40 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
13d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d60 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
13d70 63 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  code */.  struct
13d80 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65   winShmNode *pNe
13d90 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  w;           /* 
13da0 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  Newly allocated 
13db0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  winShmNode */.  
13dc0 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
13dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13de0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e     /* Size of zN
13df0 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ame in bytes */.
13e00 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64  .  assert( pDbFd
13e10 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20  ->pShm==0 );    
13e20 2f 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c  /* Not previousl
13e30 79 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f  y opened */..  /
13e40 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
13e50 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c   for the new sql
13e60 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e  ite3_shm object.
13e70 20 20 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69    Also speculati
13e80 76 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  vely.  ** alloca
13e90 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e  te space for a n
13ea0 65 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e  ew winShmNode an
13eb0 64 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f  d filename..  */
13ec0 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  p = sqlite3_m
13ed0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
13ee0 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ) );.  if( p==0 
13ef0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
13f00 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  IOERR_NOMEM;.  m
13f10 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
13f20 6f 66 28 2a 70 29 29 3b 0a 20 20 6e 4e 61 6d 65  of(*p));.  nName
13f30 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
13f40 33 30 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  30(pDbFd->zPath)
13f50 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
13f60 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
13f70 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e  f(*pShmNode) + n
13f80 4e 61 6d 65 20 2b 20 31 37 20 29 3b 0a 20 20 69  Name + 17 );.  i
13f90 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
13fa0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
13fb0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
13fc0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
13fd0 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
13fe0 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  New, 0, sizeof(*
13ff0 70 4e 65 77 29 20 2b 20 6e 4e 61 6d 65 20 2b 20  pNew) + nName + 
14000 31 37 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 46 69  17);.  pNew->zFi
14010 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
14020 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69  &pNew[1];.  sqli
14030 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61  te3_snprintf(nNa
14040 6d 65 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69  me+15, pNew->zFi
14050 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22  lename, "%s-shm"
14060 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
14070 0a 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75  .  sqlite3FileSu
14080 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61  ffix3(pDbFd->zPa
14090 74 68 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e  th, pNew->zFilen
140a0 61 6d 65 29 3b 20 0a 0a 20 20 2f 2a 20 4c 6f 6f  ame); ..  /* Loo
140b0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  k to see if ther
140c0 65 20 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67  e is an existing
140d0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74   winShmNode that
140e0 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20   can be used..  
140f0 2a 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e  ** If no matchin
14100 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72  g winShmNode cur
14110 72 65 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63  rently exists, c
14120 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e  reate a new one.
14130 0a 20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e  .  */.  winShmEn
14140 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f  terMutex();.  fo
14150 72 28 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e  r(pShmNode = win
14160 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68  ShmNodeList; pSh
14170 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d  mNode; pShmNode=
14180 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29  pShmNode->pNext)
14190 7b 0a 20 20 20 20 2f 2a 20 54 42 44 20 6e 65 65  {.    /* TBD nee
141a0 64 20 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74  d to come up wit
141b0 68 20 62 65 74 74 65 72 20 6d 61 74 63 68 20 68  h better match h
141c0 65 72 65 2e 20 20 50 65 72 68 61 70 73 0a 20 20  ere.  Perhaps.  
141d0 20 20 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49 44    ** use FILE_ID
141e0 5f 42 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53  _BOTH_DIR_INFO S
141f0 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  tructure..    */
14200 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14210 53 74 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65  StrICmp(pShmNode
14220 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65  ->zFilename, pNe
14230 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30  w->zFilename)==0
14240 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
14250 69 66 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a  if( pShmNode ){.
14260 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14270 28 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pNew);.  }else{
14280 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  .    pShmNode = 
14290 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d  pNew;.    pNew =
142a0 20 30 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c   0;.    ((winFil
142b0 65 2a 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  e*)(&pShmNode->h
142c0 46 69 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41  File))->h = INVA
142d0 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
142e0 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ;.    pShmNode->
142f0 70 4e 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f  pNext = winShmNo
14300 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53  deList;.    winS
14310 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68  hmNodeList = pSh
14320 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20 70 53 68 6d  mNode;..    pShm
14330 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71  Node->mutex = sq
14340 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
14350 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
14360 41 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53  AST);.    if( pS
14370 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30  hmNode->mutex==0
14380 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
14390 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
143a0 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
143b0 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
143c0 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f  }..    rc = winO
143d0 70 65 6e 28 70 44 62 46 64 2d 3e 70 56 66 73 2c  pen(pDbFd->pVfs,
143e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
143f0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c    pShmNode->zFil
14400 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  ename,          
14410 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
14420 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a  e file (UTF-8) *
14430 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
14440 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
14450 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  *)&pShmNode->hFi
14460 6c 65 2c 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e  le,  /* File han
14470 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 20 20  dle here */.    
14480 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
14490 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 20 53  ITE_OPEN_WAL | S
144a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
144b0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
144c0 45 4e 5f 43 52 45 41 54 45 2c 20 2f 2a 20 4d 6f  EN_CREATE, /* Mo
144d0 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 20 20  de flags */.    
144e0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b               0);
144f0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
14500 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20  OK!=rc ){.      
14510 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
14520 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  r;.    }..    /*
14530 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
14540 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
14550 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   is holding the 
14560 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e  dead-man switch.
14570 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20  .    ** If not, 
14580 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  truncate the fil
14590 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  e to zero length
145a0 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
145b0 28 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  ( winShmSystemLo
145c0 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
145d0 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d  M_WRLCK, WIN_SHM
145e0 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45  _DMS, 1)==SQLITE
145f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
14600 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73  = winTruncate((s
14610 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
14620 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
14630 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
14640 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14650 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c         rc = winL
14660 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
14670 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f 73  OERR_SHMOPEN, os
14680 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
14690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146a0 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70   "winOpenShm", p
146b0 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
146c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
146d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
146e0 4b 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 53 68  K ){.      winSh
146f0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
14700 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b  Node, _SHM_UNLCK
14710 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
14720 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  );.      rc = wi
14730 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
14740 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44  ShmNode, _SHM_RD
14750 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
14760 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
14770 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68  if( rc ) goto sh
14780 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a  m_open_err;.  }.
14790 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e  .  /* Make the n
147a0 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20  ew connection a 
147b0 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69 6e  child of the win
147c0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e  ShmNode */.  p->
147d0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e  pShmNode = pShmN
147e0 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ode;.#ifdef SQLI
147f0 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64  TE_DEBUG.  p->id
14800 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78   = pShmNode->nex
14810 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66  tShmId++;.#endif
14820 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
14830 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  f++;.  pDbFd->pS
14840 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d  hm = p;.  winShm
14850 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
14860 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63   /* The referenc
14870 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e  e count on pShmN
14880 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ode has already 
14890 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64  been incremented
148a0 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20   under.  ** the 
148b0 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77 69 6e  cover of the win
148c0 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 20  ShmEnterMutex() 
148d0 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f  mutex and the po
148e0 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20  inter from the. 
148f0 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20   ** new (struct 
14900 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20 74  winShm) object t
14910 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68  o the pShmNode h
14920 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c  as been set. All
14930 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65   that is.  ** le
14940 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c  ft to do is to l
14950 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65  ink the new obje
14960 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  ct into the link
14970 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
14980 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64  .  ** at pShmNod
14990 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20  e->pFirst. This 
149a0 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69  must be done whi
149b0 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70  le holding the p
149c0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a  ShmNode->mutex .
149d0 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f    ** mutex..  */
149e0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
149f0 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
14a00 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e  >mutex);.  p->pN
14a10 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ext = pShmNode->
14a20 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f  pFirst;.  pShmNo
14a30 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a  de->pFirst = p;.
14a40 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
14a50 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
14a60 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
14a70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
14a80 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61  * Jump here on a
14a90 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f  ny error */.shm_
14aa0 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53  open_err:.  winS
14ab0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
14ac0 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43  mNode, _SHM_UNLC
14ad0 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
14ae0 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72 67  1);.  winShmPurg
14af0 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 30  e(pDbFd->pVfs, 0
14b00 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  );      /* This 
14b10 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e  call frees pShmN
14b20 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20  ode if required 
14b30 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
14b40 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  e(p);.  sqlite3_
14b50 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77 69  free(pNew);.  wi
14b60 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
14b70 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14b80 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
14b90 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68  connection to sh
14ba0 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65  ared-memory.  De
14bb0 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lete the underly
14bc0 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20  ing .** storage 
14bd0 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73  if deleteFlag is
14be0 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
14bf0 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70   int winShmUnmap
14c00 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
14c10 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *fd,          /
14c20 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
14c30 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ng shared memory
14c40 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65   */.  int delete
14c50 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
14c60 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74 65 72   /* Delete after
14c70 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72 75 65   closing if true
14c80 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65   */.){.  winFile
14c90 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 2f   *pDbFd;       /
14ca0 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
14cb0 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ng shared-memory
14cc0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b   */.  winShm *p;
14cd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
14ce0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
14cf0 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20   be closed */.  
14d00 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
14d10 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64  Node; /* The und
14d20 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d  erlying shared-m
14d30 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
14d40 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20  winShm **pp;    
14d50 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
14d60 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e  ping over siblin
14d70 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  g connections */
14d80 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69 6e  ..  pDbFd = (win
14d90 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20  File*)fd;.  p = 
14da0 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69  pDbFd->pShm;.  i
14db0 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
14dc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53   SQLITE_OK;.  pS
14dd0 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
14de0 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f  Node;..  /* Remo
14df0 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  ve connection p 
14e00 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20  from the set of 
14e10 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f  connections asso
14e20 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68  ciated.  ** with
14e30 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73   pShmNode */.  s
14e40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
14e50 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
14e60 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70  ex);.  for(pp=&p
14e70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
14e80 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20   (*pp)!=p; pp = 
14e90 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d  &(*pp)->pNext){}
14ea0 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78  .  *pp = p->pNex
14eb0 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68  t;..  /* Free th
14ec0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a  e connection p *
14ed0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
14ee0 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  (p);.  pDbFd->pS
14ef0 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  hm = 0;.  sqlite
14f00 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
14f10 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
14f20 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64  .  /* If pShmNod
14f30 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63  e->nRef has reac
14f40 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73  hed 0, then clos
14f50 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
14f60 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d  .  ** shared-mem
14f70 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f  ory file, too */
14f80 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  .  winShmEnterMu
14f90 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
14fa0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e   pShmNode->nRef>
14fb0 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  0 );.  pShmNode-
14fc0 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
14fd0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30  ShmNode->nRef==0
14fe0 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50 75   ){.    winShmPu
14ff0 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c  rge(pDbFd->pVfs,
15000 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20   deleteFlag);.  
15010 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  }.  winShmLeaveM
15020 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72  utex();..  retur
15030 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
15040 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
15050 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20   lock state for 
15060 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  a shared-memory 
15070 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  segment..*/.stat
15080 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63  ic int winShmLoc
15090 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  k(.  sqlite3_fil
150a0 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
150b0 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
150c0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
150d0 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
150e0 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
150f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
15100 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75  rst lock to acqu
15110 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
15120 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
15130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15140 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b  * Number of lock
15150 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  s to acquire or 
15160 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
15170 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
15180 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
15190 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c  to do with the l
151a0 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  ock */.){.  winF
151b0 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69  ile *pDbFd = (wi
151c0 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20  nFile*)fd;      
151d0 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
151e0 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d  holding shared m
151f0 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68  emory */.  winSh
15200 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  m *p = pDbFd->pS
15210 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
15220 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d   /* The shared m
15230 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b  emory being lock
15240 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ed */.  winShm *
15250 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
15260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15270 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
15280 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a  r all siblings *
15290 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  /.  winShmNode *
152a0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
152b0 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63  hmNode;.  int rc
152c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152e0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
152f0 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20  /.  u16 mask;   
15300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
15320 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61  k of locks to ta
15330 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  ke or release */
15340 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74  ..  assert( ofst
15350 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53  >=0 && ofst+n<=S
15360 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20  QLITE_SHM_NLOCK 
15370 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d  );.  assert( n>=
15380 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  1 );.  assert( f
15390 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
153a0 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  M_LOCK | SQLITE_
153b0 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20  SHM_SHARED).    
153c0 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
153d0 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
153e0 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
153f0 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20  SIVE).       || 
15400 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
15410 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
15420 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
15430 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
15440 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  (SQLITE_SHM_UNLO
15450 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
15460 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20  EXCLUSIVE) );.  
15470 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20  assert( n==1 || 
15480 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
15490 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  SHM_EXCLUSIVE)!=
154a0 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28  0 );..  mask = (
154b0 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b  u16)((1U<<(ofst+
154c0 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29  n)) - (1U<<ofst)
154d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31  );.  assert( n>1
154e0 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66   || mask==(1<<of
154f0 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  st) );.  sqlite3
15500 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
15510 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
15520 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
15530 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29  ITE_SHM_UNLOCK )
15540 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73  {.    u16 allMas
15550 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f  k = 0; /* Mask o
15560 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
15570 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20  siblings */..   
15580 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73   /* See if any s
15590 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69  iblings hold thi
155a0 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20  s same lock */. 
155b0 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
155c0 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
155d0 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
155e0 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29       if( pX==p )
155f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
15600 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78   assert( (pX->ex
15610 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63  clMask & (p->exc
15620 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d  lMask|p->sharedM
15630 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ask))==0 );.    
15640 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d    allMask |= pX-
15650 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
15660 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63   }..    /* Unloc
15670 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76  k the system-lev
15680 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  el locks */.    
15690 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d  if( (mask & allM
156a0 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
156b0 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74   rc = winShmSyst
156c0 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
156d0 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73   _SHM_UNLCK, ofs
156e0 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20  t+WIN_SHM_BASE, 
156f0 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
15700 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15710 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  _OK;.    }..    
15720 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61  /* Undo the loca
15730 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
15740 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15750 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63   ){.      p->exc
15760 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
15770 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d        p->sharedM
15780 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
15790 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28    } .  }else if(
157a0 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
157b0 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  SHM_SHARED ){.  
157c0 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20    u16 allShared 
157d0 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f  = 0;  /* Union o
157e0 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
157f0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
15800 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20  r than "p" */.. 
15810 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77     /* Find out w
15820 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b  hich shared lock
15830 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65  s are already he
15840 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f  ld by sibling co
15850 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a  nnections..    *
15860 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67  * If any sibling
15870 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61   already holds a
15880 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
15890 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72  , go ahead and r
158a0 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c  eturn.    ** SQL
158b0 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f  ITE_BUSY..    */
158c0 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
158d0 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
158e0 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
158f0 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e  .      if( (pX->
15900 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29  exclMask & mask)
15910 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
15920 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
15930 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
15940 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c        }.      al
15950 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73  lShared |= pX->s
15960 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d  haredMask;.    }
15970 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61  ..    /* Get sha
15980 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  red locks at the
15990 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69   system level, i
159a0 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
159b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
159c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
159d0 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d  ( (allShared & m
159e0 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
159f0 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79     rc = winShmSy
15a00 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
15a10 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f  e, _SHM_RDLCK, o
15a20 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45  fst+WIN_SHM_BASE
15a30 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , n);.      }els
15a40 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
15a50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
15a60 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
15a70 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73   Get the local s
15a80 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20  hared locks */. 
15a90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15aa0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
15ab0 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d  >sharedMask |= m
15ac0 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
15ad0 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  se{.    /* Make 
15ae0 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20  sure no sibling 
15af0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64  connections hold
15b00 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c   locks that will
15b10 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20   block this.    
15b20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79  ** lock.  If any
15b30 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49   do, return SQLI
15b40 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61 77  TE_BUSY right aw
15b50 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ay..    */.    f
15b60 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
15b70 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
15b80 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
15b90 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61   if( (pX->exclMa
15ba0 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c  sk & mask)!=0 ||
15bb0 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b   (pX->sharedMask
15bc0 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20   & mask)!=0 ){. 
15bd0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
15be0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
15bf0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
15c00 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
15c10 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  Get the exclusiv
15c20 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  e locks at the s
15c30 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68  ystem level.  Th
15c40 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  en if successful
15c50 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72  .    ** also mar
15c60 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e  k the local conn
15c70 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20  ection as being 
15c80 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  locked..    */. 
15c90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15ca0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
15cb0 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c   = winShmSystemL
15cc0 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
15cd0 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 57  HM_WRLCK, ofst+W
15ce0 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IN_SHM_BASE, n);
15cf0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
15d00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15d10 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e      assert( (p->
15d20 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
15d30 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  k)==0 );.       
15d40 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20   p->exclMask |= 
15d50 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mask;.      }.  
15d60 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
15d70 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
15d80 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
15d90 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
15da0 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70  LOCK shmid-%d, p
15db0 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c 25  id-%d got %03x,%
15dc0 30 33 78 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  03x %s\n",.     
15dd0 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 28 69 6e        p->id, (in
15de0 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  t)osGetCurrentPr
15df0 6f 63 65 73 73 49 64 28 29 2c 20 70 2d 3e 73 68  ocessId(), p->sh
15e00 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63  aredMask, p->exc
15e10 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20  lMask,.         
15e20 20 20 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20    rc ? "failed" 
15e30 3a 20 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75  : "ok"));.  retu
15e40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15e50 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f  Implement a memo
15e60 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65  ry barrier or me
15e70 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68  mory fence on sh
15e80 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a  ared memory.  .*
15e90 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61  *.** All loads a
15ea0 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20  nd stores begun 
15eb0 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69  before the barri
15ec0 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65  er must complete
15ed0 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c   before.** any l
15ee0 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67  oad or store beg
15ef0 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72  un after the bar
15f00 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rier..*/.static 
15f10 76 6f 69 64 20 77 69 6e 53 68 6d 42 61 72 72 69  void winShmBarri
15f20 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  er(.  sqlite3_fi
15f30 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20  le *fd          
15f40 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
15f50 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
15f60 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e  emory */.){.  UN
15f70 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
15f80 64 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42  d);.  /* MemoryB
15f90 61 72 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65  arrier(); // doe
15fa0 73 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f  s not work -- do
15fb0 20 6e 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f   not know why no
15fc0 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74  t */.  winShmEnt
15fd0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 77 69 6e  erMutex();.  win
15fe0 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
15ff0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
16000 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
16010 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f  d to obtain a po
16020 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20  inter to region 
16030 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a  iRegion of the .
16040 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
16050 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
16060 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16070 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65  le fd. Shared-me
16080 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a  mory regions .**
16090 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74   are numbered st
160a0 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f  arting from zero
160b0 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65  . Each shared-me
160c0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73  mory region is s
160d0 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65  zRegion .** byte
160e0 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
160f0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
16100 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
16110 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
16120 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  nd *pp is set to
16130 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68   NULL..**.** Oth
16140 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 69  erwise, if the i
16150 73 57 72 69 74 65 20 70 61 72 61 6d 65 74 65 72  sWrite parameter
16160 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65   is 0 and the re
16170 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
16180 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20  emory.** region 
16190 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
161a0 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63  ocated (by any c
161b0 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67  lient, including
161c0 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20   one running in 
161d0 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72  a.** separate pr
161e0 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70  ocess), then *pp
161f0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
16200 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
16210 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 69  turned. If .** i
16220 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  sWrite is non-ze
16230 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65  ro and the reque
16240 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
16250 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ry region has no
16260 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61  t yet .** been a
16270 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20  llocated, it is 
16280 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
16290 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
162a0 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d  * If the shared-
162b0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
162c0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
162d0 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61  llocated or is a
162e0 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
162f0 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63  his call as desc
16300 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65  ribed above, the
16310 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69  n it is mapped i
16320 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
16330 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73  es .** address s
16340 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e  pace (if it is n
16350 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70  ot already), *pp
16360 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
16370 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a   to the mapped .
16380 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51  ** memory and SQ
16390 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
163a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
163b0 77 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c  winShmMap(.  sql
163c0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
163d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
163e0 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64  Handle open on d
163f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
16400 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20    int iRegion,  
16410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16420 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72    /* Region to r
16430 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74  etrieve */.  int
16440 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20   szRegion,      
16450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16460 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20  Size of regions 
16470 2a 2f 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65  */.  int isWrite
16480 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16490 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
164a0 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e  extend file if n
164b0 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f  ecessary */.  vo
164c0 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70  id volatile **pp
164d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
164e0 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d   OUT: Mapped mem
164f0 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  ory */.){.  winF
16500 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69  ile *pDbFd = (wi
16510 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e  nFile*)fd;.  win
16520 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e  Shm *p = pDbFd->
16530 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f  pShm;.  winShmNo
16540 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de *pShmNode;.  
16550 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16560 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 20 29 7b  OK;..  if( !p ){
16570 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65  .    rc = winOpe
16580 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44  nSharedMemory(pD
16590 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  bFd);.    if( rc
165a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
165b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 20 3d  turn rc;.    p =
165c0 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
165d0 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  }.  pShmNode = p
165e0 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73  ->pShmNode;..  s
165f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
16600 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
16610 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ex);.  assert( s
16620 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
16630 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
16640 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
16650 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  ==0 );..  if( pS
16660 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
16670 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  =iRegion ){.    
16680 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e  struct ShmRegion
16690 20 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20   *apNew;        
166a0 20 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f     /* New aRegio
166b0 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  n[] array */.   
166c0 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52   int nByte = (iR
166d0 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f  egion+1)*szRegio
166e0 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72  n;  /* Minimum r
166f0 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
16700 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
16710 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20  _int64 sz;      
16720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
16730 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77  urrent size of w
16740 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f  al-index file */
16750 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
16760 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67  szRegion = szReg
16770 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ion;..    /* The
16780 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
16790 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20  n is not mapped 
167a0 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
167b0 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
167c0 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20  e..    ** Check 
167d0 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73  to see if it has
167e0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
167f0 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c  (i.e. if the wal
16800 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20  -index file is. 
16810 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75     ** large enou
16820 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  gh to contain th
16830 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
16840 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  on)..    */.    
16850 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65  rc = winFileSize
16860 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
16870 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
16880 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28  e, &sz);.    if(
16890 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
168a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
168b0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
168c0 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f  IOERR_SHMSIZE, o
168d0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
168e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
168f0 22 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44  "winShmMap1", pD
16900 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  bFd->zPath);.   
16910 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
16920 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
16930 69 66 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a  if( sz<nByte ){.
16940 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71        /* The req
16950 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
16960 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78  gion does not ex
16970 69 73 74 2e 20 49 66 20 69 73 57 72 69 74 65 20  ist. If isWrite 
16980 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20  is set to.      
16990 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20 65 61  ** zero, exit ea
169a0 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65  rly. *pp will be
169b0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
169c0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
169d0 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ned..      **.  
169e0 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69      ** Alternati
169f0 76 65 6c 79 2c 20 69 66 20 69 73 57 72 69 74 65  vely, if isWrite
16a00 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73   is non-zero, us
16a10 65 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f  e ftruncate() to
16a20 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20   allocate.      
16a30 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
16a40 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a   memory region..
16a50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
16a60 66 28 20 21 69 73 57 72 69 74 65 20 29 20 67 6f  f( !isWrite ) go
16a70 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
16a80 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72        rc = winTr
16a90 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f  uncate((sqlite3_
16aa0 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65  file *)&pShmNode
16ab0 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b  ->hFile, nByte);
16ac0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
16ad0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16ae0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
16af0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
16b00 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74  R_SHMSIZE, osGet
16b10 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
16b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
16b30 69 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 46  inShmMap2", pDbF
16b40 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
16b50 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
16b60 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
16b70 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74   }..    /* Map t
16b80 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
16b90 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20  ory region into 
16ba0 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
16bb0 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f  ddress space. */
16bc0 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74  .    apNew = (st
16bd0 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a  ruct ShmRegion *
16be0 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
16bf0 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  (.        pShmNo
16c00 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52  de->aRegion, (iR
16c10 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28  egion+1)*sizeof(
16c20 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b  apNew[0]).    );
16c30 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20  .    if( !apNew 
16c40 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
16c50 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
16c60 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
16c70 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
16c80 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52      pShmNode->aR
16c90 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a  egion = apNew;..
16ca0 20 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e      while( pShmN
16cb0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52  ode->nRegion<=iR
16cc0 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48  egion ){.      H
16cd0 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20  ANDLE hMap;     
16ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69             /* fi
16cf0 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c  le-mapping handl
16d00 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20  e */.      void 
16d10 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20  *pMap = 0;      
16d20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 65 64         /* Mapped
16d30 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a   memory region *
16d40 2f 0a 20 20 20 20 20 0a 20 20 20 20 20 20 68 4d  /.     .      hM
16d50 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
16d60 65 4d 61 70 70 69 6e 67 28 70 53 68 6d 4e 6f 64  eMapping(pShmNod
16d70 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a 20 20 20  e->hFile.h, .   
16d80 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47         NULL, PAG
16d90 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20  E_READWRITE, 0, 
16da0 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20  nByte, NULL.    
16db0 20 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41    );.      OSTRA
16dc0 43 45 28 28 22 53 48 4d 2d 4d 41 50 20 70 69 64  CE(("SHM-MAP pid
16dd0 2d 25 64 20 63 72 65 61 74 65 20 72 65 67 69 6f  -%d create regio
16de0 6e 3d 25 64 20 6e 62 79 74 65 3d 25 64 20 25 73  n=%d nbyte=%d %s
16df0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
16e00 20 20 20 20 28 69 6e 74 29 6f 73 47 65 74 43 75      (int)osGetCu
16e10 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
16e20 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  , pShmNode->nReg
16e30 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20  ion, nByte,.    
16e40 20 20 20 20 20 20 20 20 20 20 20 68 4d 61 70 20             hMap 
16e50 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
16e60 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68  "));.      if( h
16e70 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Map ){.        i
16e80 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 70 53 68  nt iOffset = pSh
16e90 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73  mNode->nRegion*s
16ea0 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20  zRegion;.       
16eb0 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66   int iOffsetShif
16ec0 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69  t = iOffset % wi
16ed0 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63  nSysInfo.dwAlloc
16ee0 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79  ationGranularity
16ef0 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
16f00 57 49 4e 52 54 0a 20 20 20 20 20 20 20 20 70 4d  WINRT.        pM
16f10 61 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66  ap = osMapViewOf
16f20 46 69 6c 65 45 78 28 68 4d 61 70 2c 20 46 49 4c  FileEx(hMap, FIL
16f30 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49  E_MAP_WRITE | FI
16f40 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20  LE_MAP_READ,.   
16f50 20 20 20 20 20 20 20 20 20 30 2c 20 69 4f 66 66           0, iOff
16f60 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69  set - iOffsetShi
16f70 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69  ft, szRegion + i
16f80 4f 66 66 73 65 74 53 68 69 66 74 2c 20 4e 55 4c  OffsetShift, NUL
16f90 4c 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c  L.        );.#el
16fa0 73 65 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20  se.        pMap 
16fb0 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  = osMapViewOfFil
16fc0 65 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50  e(hMap, FILE_MAP
16fd0 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41  _WRITE | FILE_MA
16fe0 50 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20  P_READ,.        
16ff0 20 20 20 20 30 2c 20 69 4f 66 66 73 65 74 20 2d      0, iOffset -
17000 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73   iOffsetShift, s
17010 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65  zRegion + iOffse
17020 74 53 68 69 66 74 0a 20 20 20 20 20 20 20 20 29  tShift.        )
17030 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
17040 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d   OSTRACE(("SHM-M
17050 41 50 20 70 69 64 2d 25 64 20 6d 61 70 20 72 65  AP pid-%d map re
17060 67 69 6f 6e 3d 25 64 20 6f 66 66 73 65 74 3d 25  gion=%d offset=%
17070 64 20 73 69 7a 65 3d 25 64 20 25 73 5c 6e 22 2c  d size=%d %s\n",
17080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17090 20 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72    (int)osGetCurr
170a0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
170b0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
170c0 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20 20 20 20  n, iOffset,.    
170d0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 52               szR
170e0 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22 6f  egion, pMap ? "o
170f0 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
17100 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
17110 66 28 20 21 70 4d 61 70 20 29 7b 0a 20 20 20 20  f( !pMap ){.    
17120 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61      pShmNode->la
17130 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
17140 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
17150 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
17160 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
17170 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f  R_SHMMAP, pShmNo
17180 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  de->lastErrno,. 
17190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171a0 22 77 69 6e 53 68 6d 4d 61 70 33 22 2c 20 70 44  "winShmMap3", pD
171b0 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  bFd->zPath);.   
171c0 20 20 20 20 20 69 66 28 20 68 4d 61 70 20 29 20       if( hMap ) 
171d0 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 4d  osCloseHandle(hM
171e0 61 70 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ap);.        got
171f0 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
17200 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 53       }..      pS
17210 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b  hmNode->aRegion[
17220 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
17230 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d 61 70 3b 0a  n].pMap = pMap;.
17240 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
17250 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65  aRegion[pShmNode
17260 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d 61 70 20  ->nRegion].hMap 
17270 3d 20 68 4d 61 70 3b 0a 20 20 20 20 20 20 70 53  = hMap;.      pS
17280 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b  hmNode->nRegion+
17290 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68  +;.    }.  }..sh
172a0 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28  mpage_out:.  if(
172b0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
172c0 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20  on>iRegion ){.  
172d0 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20    int iOffset = 
172e0 69 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e  iRegion*szRegion
172f0 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65  ;.    int iOffse
17300 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74  tShift = iOffset
17310 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77   % winSysInfo.dw
17320 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c  AllocationGranul
17330 61 72 69 74 79 3b 0a 20 20 20 20 63 68 61 72 20  arity;.    char 
17340 2a 70 20 3d 20 28 63 68 61 72 20 2a 29 70 53 68  *p = (char *)pSh
17350 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 69  mNode->aRegion[i
17360 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a 20 20  Region].pMap;.  
17370 20 20 2a 70 70 20 3d 20 28 76 6f 69 64 20 2a 29    *pp = (void *)
17380 26 70 5b 69 4f 66 66 73 65 74 53 68 69 66 74 5d  &p[iOffsetShift]
17390 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
173a0 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  pp = 0;.  }.  sq
173b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
173c0 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
173d0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
173e0 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  .}..#else.# defi
173f0 6e 65 20 77 69 6e 53 68 6d 4d 61 70 20 20 20 20  ne winShmMap    
17400 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53   0.# define winS
17410 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65  hmLock    0.# de
17420 66 69 6e 65 20 77 69 6e 53 68 6d 42 61 72 72 69  fine winShmBarri
17430 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69  er 0.# define wi
17440 6e 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65  nShmUnmap   0.#e
17450 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
17460 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
17470 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65  */../*.** Here e
17480 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  nds the implemen
17490 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71  tation of all sq
174a0 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f  lite3_file metho
174b0 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds..**.*********
174c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
174d0 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d  d sqlite3_file M
174e0 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
174f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17500 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
17510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17550 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  *****/../*.** Th
17560 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65  is vector define
17570 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64  s all the method
17580 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61  s that can opera
17590 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69  te on an.** sqli
175a0 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e  te3_file for win
175b0 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  32..*/.static co
175c0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
175d0 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74 68  ethods winIoMeth
175e0 6f 64 20 3d 20 7b 0a 20 20 32 2c 20 20 20 20 20  od = {.  2,     
175f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17600 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
17610 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f  sion */.  winClo
17620 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
17630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
17640 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61 64  ose */.  winRead
17650 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17660 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61           /* xRea
17670 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65 2c  d */.  winWrite,
17680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17690 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65         /* xWrite
176a0 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61 74   */.  winTruncat
176b0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
176c0 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61        /* xTrunca
176d0 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63 2c  te */.  winSync,
176e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176f0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63          /* xSync
17700 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69 7a   */.  winFileSiz
17710 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
17720 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69        /* xFileSi
17730 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c  ze */.  winLock,
17740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17750 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
17760 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c   */.  winUnlock,
17770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17780 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
17790 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b 52 65   */.  winCheckRe
177a0 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20  servedLock,     
177b0 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
177c0 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20  eservedLock */. 
177d0 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c   winFileControl,
177e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177f0 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   /* xFileControl
17800 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72 53   */.  winSectorS
17810 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
17820 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72        /* xSector
17830 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65 76  Size */.  winDev
17840 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
17850 63 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 44 65  cs,       /* xDe
17860 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
17870 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d  ics */.  winShmM
17880 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ap,             
17890 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
178a0 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c  Map */.  winShmL
178b0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
178c0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
178d0 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  Lock */.  winShm
178e0 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20  Barrier,        
178f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
17900 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 77 69  mBarrier */.  wi
17910 6e 53 68 6d 55 6e 6d 61 70 20 20 20 20 20 20 20  nShmUnmap       
17920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17930 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 7d 3b   xShmUnmap */.};
17940 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
17950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
17990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c  ************ sql
179b0 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73  ite3_vfs methods
179c0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
179d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
179e0 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f  .** This divisio
179f0 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69  n contains the i
17a00 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
17a10 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a   methods on the.
17a20 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f  ** sqlite3_vfs o
17a30 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  bject..*/../*.**
17a40 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38   Convert a UTF-8
17a50 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 77   filename into w
17a60 68 61 74 65 76 65 72 20 66 6f 72 6d 20 74 68 65  hatever form the
17a70 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f   underlying.** o
17a80 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
17a90 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73 20  wants filenames 
17aa0 69 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  in.  Space to ho
17ab0 6c 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  ld the result.**
17ac0 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
17ad0 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73  m malloc and mus
17ae0 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
17af0 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
17b00 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
17b10 20 76 6f 69 64 20 2a 63 6f 6e 76 65 72 74 55 74   void *convertUt
17b20 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74  f8Filename(const
17b30 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
17b40 29 7b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  ){.  void *zConv
17b50 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28  erted = 0;.  if(
17b60 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a   isNT() ){.    z
17b70 43 6f 6e 76 65 72 74 65 64 20 3d 20 75 74 66 38  Converted = utf8
17b80 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
17b90 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  ame);.  }.#ifdef
17ba0 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
17bb0 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
17bc0 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
17bd0 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74  sqlite3_win32_ut
17be0 66 38 5f 74 6f 5f 6d 62 63 73 28 7a 46 69 6c 65  f8_to_mbcs(zFile
17bf0 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  name);.  }.#endi
17c00 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69  f.  /* caller wi
17c10 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ll handle out of
17c20 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74   memory */.  ret
17c30 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  urn zConverted;.
17c40 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
17c50 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
17c60 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20   name in zBuf.  
17c70 7a 42 75 66 20 6d 75 73 74 20 62 65 20 62 69 67  zBuf must be big
17c80 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 68 6f   enough to.** ho
17c90 6c 64 20 61 74 20 70 56 66 73 2d 3e 6d 78 50 61  ld at pVfs->mxPa
17ca0 74 68 6e 61 6d 65 20 63 68 61 72 61 63 74 65 72  thname character
17cb0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
17cc0 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74   getTempname(int
17cd0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
17ce0 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  f){.  static cha
17cf0 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20  r zChars[] =.   
17d00 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e   "abcdefghijklmn
17d10 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20  opqrstuvwxyz".  
17d20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d    "ABCDEFGHIJKLM
17d30 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20  NOPQRSTUVWXYZ". 
17d40 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b     "0123456789";
17d50 0a 20 20 73 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a  .  size_t i, j;.
17d60 20 20 63 68 61 72 20 7a 54 65 6d 70 50 61 74 68    char zTempPath
17d70 5b 4d 41 58 5f 50 41 54 48 2b 32 5d 3b 0a 0a 20  [MAX_PATH+2];.. 
17d80 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
17d90 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
17da0 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
17db0 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
17dc0 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
17dd0 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
17de0 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
17df0 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
17e00 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
17e10 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
17e20 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  . .  */.  Simula
17e30 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
17e40 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  n SQLITE_IOERR )
17e50 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 7a 54 65 6d  ;..  memset(zTem
17e60 70 50 61 74 68 2c 20 30 2c 20 4d 41 58 5f 50 41  pPath, 0, MAX_PA
17e70 54 48 2b 32 29 3b 0a 0a 20 20 69 66 28 20 73 71  TH+2);..  if( sq
17e80 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
17e90 74 6f 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  tory ){.    sqli
17ea0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58  te3_snprintf(MAX
17eb0 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50  _PATH-30, zTempP
17ec0 61 74 68 2c 20 22 25 73 22 2c 20 73 71 6c 69 74  ath, "%s", sqlit
17ed0 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
17ee0 79 29 3b 0a 20 20 7d 0a 23 69 66 20 21 53 51 4c  y);.  }.#if !SQL
17ef0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 65  ITE_OS_WINRT.  e
17f00 6c 73 65 20 69 66 28 20 69 73 4e 54 28 29 20 29  lse if( isNT() )
17f10 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75 6c  {.    char *zMul
17f20 74 69 3b 0a 20 20 20 20 57 43 48 41 52 20 7a 57  ti;.    WCHAR zW
17f30 69 64 65 50 61 74 68 5b 4d 41 58 5f 50 41 54 48  idePath[MAX_PATH
17f40 5d 3b 0a 20 20 20 20 6f 73 47 65 74 54 65 6d 70  ];.    osGetTemp
17f50 50 61 74 68 57 28 4d 41 58 5f 50 41 54 48 2d 33  PathW(MAX_PATH-3
17f60 30 2c 20 7a 57 69 64 65 50 61 74 68 29 3b 0a 20  0, zWidePath);. 
17f70 20 20 20 7a 4d 75 6c 74 69 20 3d 20 75 6e 69 63     zMulti = unic
17f80 6f 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65 50  odeToUtf8(zWideP
17f90 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d  ath);.    if( zM
17fa0 75 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73 71  ulti ){.      sq
17fb0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
17fc0 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d  AX_PATH-30, zTem
17fd0 70 50 61 74 68 2c 20 22 25 73 22 2c 20 7a 4d 75  pPath, "%s", zMu
17fe0 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lti);.      sqli
17ff0 74 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29  te3_free(zMulti)
18000 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18010 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18020 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
18030 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53    }.  }.#ifdef S
18040 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
18050 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
18060 20 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a 20 20   char *zUtf8;.  
18070 20 20 63 68 61 72 20 7a 4d 62 63 73 50 61 74 68    char zMbcsPath
18080 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20  [MAX_PATH];.    
18090 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41 28 4d  osGetTempPathA(M
180a0 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 4d 62 63  AX_PATH-30, zMbc
180b0 73 50 61 74 68 29 3b 0a 20 20 20 20 7a 55 74 66  sPath);.    zUtf
180c0 38 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  8 = sqlite3_win3
180d0 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a  2_mbcs_to_utf8(z
180e0 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20 69  MbcsPath);.    i
180f0 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20 20 20  f( zUtf8 ){.    
18100 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
18110 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20  tf(MAX_PATH-30, 
18120 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c  zTempPath, "%s",
18130 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73   zUtf8);.      s
18140 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66  qlite3_free(zUtf
18150 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  8);.    }else{. 
18160 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18170 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
18180 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
18190 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68  .#endif..  /* Ch
181a0 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74  eck that the out
181b0 70 75 74 20 62 75 66 66 65 72 20 69 73 20 6c 61  put buffer is la
181c0 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74  rge enough for t
181d0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
181e0 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66  e .  ** name. If
181f0 20 69 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75   it is not, retu
18200 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
18210 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 73 71 6c  .  */.  if( (sql
18220 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
18230 6d 70 50 61 74 68 29 20 2b 20 73 71 6c 69 74 65  mpPath) + sqlite
18240 33 53 74 72 6c 65 6e 33 30 28 53 51 4c 49 54 45  3Strlen30(SQLITE
18250 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
18260 58 29 20 2b 20 31 38 29 20 3e 3d 20 6e 42 75 66  X) + 18) >= nBuf
18270 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
18280 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
18290 0a 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ..  for(i=sqlite
182a0 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 50  3Strlen30(zTempP
182b0 61 74 68 29 3b 20 69 3e 30 20 26 26 20 7a 54 65  ath); i>0 && zTe
182c0 6d 70 50 61 74 68 5b 69 2d 31 5d 3d 3d 27 5c 5c  mpPath[i-1]=='\\
182d0 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a 54 65 6d  '; i--){}.  zTem
182e0 70 50 61 74 68 5b 69 5d 20 3d 20 30 3b 0a 0a 20  pPath[i] = 0;.. 
182f0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
18300 66 28 6e 42 75 66 2d 31 38 2c 20 7a 42 75 66 2c  f(nBuf-18, zBuf,
18310 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18320 20 20 20 20 22 25 73 5c 5c 22 53 51 4c 49 54 45      "%s\\"SQLITE
18330 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
18340 58 2c 20 7a 54 65 6d 70 50 61 74 68 29 3b 0a 20  X, zTempPath);. 
18350 20 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   j = sqlite3Strl
18360 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 73 71  en30(zBuf);.  sq
18370 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
18380 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a  (15, &zBuf[j]);.
18390 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b    for(i=0; i<15;
183a0 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20   i++, j++){.    
183b0 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29  zBuf[j] = (char)
183c0 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e  zChars[ ((unsign
183d0 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29  ed char)zBuf[j])
183e0 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29  %(sizeof(zChars)
183f0 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75  -1) ];.  }.  zBu
18400 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7a 42 75 66  f[j] = 0;.  zBuf
18410 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 0a 20 20 4f 53  [j+1] = 0;..  OS
18420 54 52 41 43 45 28 28 22 54 45 4d 50 20 46 49 4c  TRACE(("TEMP FIL
18430 45 4e 41 4d 45 3a 20 25 73 5c 6e 22 2c 20 7a 42  ENAME: %s\n", zB
18440 75 66 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  uf));.  return S
18450 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a  QLITE_OK; .}../*
18460 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e  .** Open a file.
18470 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
18480 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  inOpen(.  sqlite
18490 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
184a0 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20      /* Not used 
184b0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
184c0 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f  *zName,        /
184d0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
184e0 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20  le (UTF-8) */.  
184f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
18500 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ,         /* Wri
18510 74 65 20 74 68 65 20 53 51 4c 69 74 65 20 66 69  te the SQLite fi
18520 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a  le handle here *
18530 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
18540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18550 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73   Open mode flags
18560 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46   */.  int *pOutF
18570 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
18580 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75 72 6e  /* Status return
18590 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48   flags */.){.  H
185a0 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44  ANDLE h;.  DWORD
185b0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 44 57   lastErrno;.  DW
185c0 4f 52 44 20 64 77 44 65 73 69 72 65 64 41 63 63  ORD dwDesiredAcc
185d0 65 73 73 3b 0a 20 20 44 57 4f 52 44 20 64 77 53  ess;.  DWORD dwS
185e0 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44 57 4f 52  hareMode;.  DWOR
185f0 44 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70  D dwCreationDisp
18600 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57 4f 52 44  osition;.  DWORD
18610 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
18620 62 75 74 65 73 20 3d 20 30 3b 0a 23 69 66 20 53  butes = 0;.#if S
18630 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
18640 20 69 6e 74 20 69 73 54 65 6d 70 20 3d 20 30 3b   int isTemp = 0;
18650 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c  .#endif.  winFil
18660 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
18670 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20  ile*)id;.  void 
18680 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20 20 20 20  *zConverted;    
18690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
186a0 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65 6e 63 6f  ename in OS enco
186b0 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ding */.  const 
186c0 63 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20  char *zUtf8Name 
186d0 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c 65  = zName; /* File
186e0 6e 61 6d 65 20 69 6e 20 55 54 46 2d 38 20 65 6e  name in UTF-8 en
186f0 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  coding */.  int 
18700 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  cnt = 0;..  /* I
18710 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68  f argument zPath
18720 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
18730 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  er, this functio
18740 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  n is required to
18750 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d   open.  ** a tem
18760 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65  porary file. Use
18770 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20   this buffer to 
18780 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e  store the file n
18790 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63  ame in..  */.  c
187a0 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58  har zTmpname[MAX
187b0 5f 50 41 54 48 2b 32 5d 3b 20 20 20 20 20 2f 2a  _PATH+2];     /*
187c0 20 42 75 66 66 65 72 20 75 73 65 64 20 74 6f 20   Buffer used to 
187d0 63 72 65 61 74 65 20 74 65 6d 70 20 66 69 6c 65  create temp file
187e0 6e 61 6d 65 20 2a 2f 0a 0a 20 20 69 6e 74 20 72  name */..  int r
187f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
18800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
18810 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64  ction Return Cod
18820 65 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  e */.#if !define
18830 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 53 51 4c  d(NDEBUG) || SQL
18840 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69  ITE_OS_WINCE.  i
18850 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73  nt eType = flags
18860 26 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a  &0xFFFFFF00;  /*
18870 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f   Type of file to
18880 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a   open */.#endif.
18890 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69  .  int isExclusi
188a0 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  ve  = (flags & S
188b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
188c0 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44  SIVE);.  int isD
188d0 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61  elete     = (fla
188e0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
188f0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b  _DELETEONCLOSE);
18900 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20  .  int isCreate 
18910 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53      = (flags & S
18920 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
18930 45 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  E);.#ifndef NDEB
18940 55 47 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f  UG.  int isReado
18950 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26  nly   = (flags &
18960 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
18970 44 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 20  DONLY);.#endif. 
18980 20 69 6e 74 20 69 73 52 65 61 64 57 72 69 74 65   int isReadWrite
18990 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
189a0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
189b0 54 45 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44  TE);..#ifndef ND
189c0 45 42 55 47 0a 20 20 69 6e 74 20 69 73 4f 70 65  EBUG.  int isOpe
189d0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 69 73 43 72  nJournal = (isCr
189e0 65 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20  eate && (.      
189f0 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f    eType==SQLITE_
18a00 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
18a10 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79  NAL .     || eTy
18a20 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
18a30 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  MAIN_JOURNAL .  
18a40 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
18a50 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29  ITE_OPEN_WAL.  )
18a60 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
18a70 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77  Check the follow
18a80 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ing statements a
18a90 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20  re true: .  **. 
18aa0 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c   **   (a) Exactl
18ab0 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41  y one of the REA
18ac0 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f  DWRITE and READO
18ad0 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62  NLY flags must b
18ae0 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a  e set, and .  **
18af0 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45     (b) if CREATE
18b00 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45   is set, then RE
18b10 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73  ADWRITE must als
18b20 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20  o be set, and.  
18b30 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c  **   (c) if EXCL
18b40 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68  USIVE is set, th
18b50 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
18b60 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a  lso be set..  **
18b70 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45     (d) if DELETE
18b80 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20  ONCLOSE is set, 
18b90 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
18ba0 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
18bb0 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52  */.  assert((isR
18bc0 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73  eadonly==0 || is
18bd0 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26  ReadWrite==0) &&
18be0 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c   (isReadWrite ||
18bf0 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20   isReadonly));. 
18c00 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65   assert(isCreate
18c10 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
18c20 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
18c30 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20  Exclusive==0 || 
18c40 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73  isCreate);.  ass
18c50 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20  ert(isDelete==0 
18c60 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20  || isCreate);.. 
18c70 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c   /* The main DB,
18c80 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57   main journal, W
18c90 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74  AL file and mast
18ca0 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e  er journal are n
18cb0 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d  ever .  ** autom
18cc0 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
18cd0 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65  . Nor are they e
18ce0 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ver temporary fi
18cf0 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  les.  */.  asser
18d00 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
18d10 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
18d20 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
18d30 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  IN_DB );.  asser
18d40 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
18d50 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
18d60 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
18d70 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  IN_JOURNAL );.  
18d80 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
18d90 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
18da0 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
18db0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
18dc0 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  L );.  assert( (
18dd0 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
18de0 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
18df0 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b  LITE_OPEN_WAL );
18e00 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
18e10 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  at the upper lay
18e20 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f  er has set one o
18e30 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65  f the "file-type
18e40 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73  " flags. */.  as
18e50 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
18e60 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
18e70 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
18e80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
18e90 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  _DB .       || e
18ea0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
18eb0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c  N_MAIN_JOURNAL |
18ec0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
18ed0 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
18ee0 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  L .       || eTy
18ef0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
18f00 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20  SUBJOURNAL   || 
18f10 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
18f20 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
18f30 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  L .       || eTy
18f40 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
18f50 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20  TRANSIENT_DB || 
18f60 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
18f70 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 61  EN_WAL.  );..  a
18f80 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
18f90 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
18fa0 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 70 46 69  ER(pVfs);..  pFi
18fb0 6c 65 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f  le->h = INVALID_
18fc0 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 20  HANDLE_VALUE;.. 
18fd0 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e   /* If the secon
18fe0 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
18ff0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e  is function is N
19000 55 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ULL, generate a 
19010 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
19020 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65  file name to use
19030 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55   .  */.  if( !zU
19040 74 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61  tf8Name ){.    a
19050 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 20 26  ssert(isDelete &
19060 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c  & !isOpenJournal
19070 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 54  );.    rc = getT
19080 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48  empname(MAX_PATH
19090 2b 32 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  +2, zTmpname);. 
190a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
190b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
190c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
190d0 20 20 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a     zUtf8Name = z
190e0 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20  Tmpname;.  }..  
190f0 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
19100 6e 61 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65  names are double
19110 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64  -zero terminated
19120 20 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74   if they are not
19130 0a 20 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20  .  ** URIs with 
19140 70 61 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e  parameters.  Hen
19150 63 65 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77  ce, they can alw
19160 61 79 73 20 62 65 20 70 61 73 73 65 64 20 69 6e  ays be passed in
19170 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  to.  ** sqlite3_
19180 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e  uri_parameter().
19190 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
191a0 28 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f  (eType!=SQLITE_O
191b0 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 7c 20  PEN_MAIN_DB) || 
191c0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
191d0 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 0a 20 20 20  OPEN_URI) ||.   
191e0 20 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 5b 73       zUtf8Name[s
191f0 74 72 6c 65 6e 28 7a 55 74 66 38 4e 61 6d 65 29  trlen(zUtf8Name)
19200 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  +1]==0 );..  /* 
19210 43 6f 6e 76 65 72 74 20 74 68 65 20 66 69 6c 65  Convert the file
19220 6e 61 6d 65 20 74 6f 20 74 68 65 20 73 79 73 74  name to the syst
19230 65 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a  em encoding. */.
19240 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63    zConverted = c
19250 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61  onvertUtf8Filena
19260 6d 65 28 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20  me(zUtf8Name);. 
19270 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
19280 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
19290 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
192a0 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  MEM;.  }..  if( 
192b0 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20  isReadWrite ){. 
192c0 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
192d0 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41  ss = GENERIC_REA
192e0 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54  D | GENERIC_WRIT
192f0 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
19300 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20  dwDesiredAccess 
19310 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a  = GENERIC_READ;.
19320 20 20 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49 54 45    }..  /* SQLITE
19330 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
19340 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20  is used to make 
19350 73 75 72 65 20 74 68 61 74 20 61 20 6e 65 77 20  sure that a new 
19360 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 63 72  file is .  ** cr
19370 65 61 74 65 64 2e 20 53 51 4c 69 74 65 20 64 6f  eated. SQLite do
19380 65 73 6e 27 74 20 75 73 65 20 69 74 20 74 6f 20  esn't use it to 
19390 69 6e 64 69 63 61 74 65 20 22 65 78 63 6c 75 73  indicate "exclus
193a0 69 76 65 20 61 63 63 65 73 73 22 20 0a 20 20 2a  ive access" .  *
193b0 2a 20 61 73 20 69 74 20 69 73 20 75 73 75 61 6c  * as it is usual
193c0 6c 79 20 75 6e 64 65 72 73 74 6f 6f 64 2e 0a 20  ly understood.. 
193d0 20 2a 2f 0a 20 20 69 66 28 20 69 73 45 78 63 6c   */.  if( isExcl
193e0 75 73 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20  usive ){.    /* 
193f0 43 72 65 61 74 65 73 20 61 20 6e 65 77 20 66 69  Creates a new fi
19400 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 64  le, only if it d
19410 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
19420 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a  exist. */.    /*
19430 20 49 66 20 74 68 65 20 66 69 6c 65 20 65 78 69   If the file exi
19440 73 74 73 2c 20 69 74 20 66 61 69 6c 73 2e 20 2a  sts, it fails. *
19450 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e  /.    dwCreation
19460 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 43 52  Disposition = CR
19470 45 41 54 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73  EATE_NEW;.  }els
19480 65 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29  e if( isCreate )
19490 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 65 78  {.    /* Open ex
194a0 69 73 74 69 6e 67 20 66 69 6c 65 2c 20 6f 72 20  isting file, or 
194b0 63 72 65 61 74 65 20 69 66 20 69 74 20 64 6f 65  create if it doe
194c0 73 6e 27 74 20 65 78 69 73 74 20 2a 2f 0a 20 20  sn't exist */.  
194d0 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
194e0 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41  osition = OPEN_A
194f0 4c 57 41 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a  LWAYS;.  }else{.
19500 20 20 20 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66      /* Opens a f
19510 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20  ile, only if it 
19520 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20 64  exists. */.    d
19530 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
19540 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53  tion = OPEN_EXIS
19550 54 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20 64 77 53  TING;.  }..  dwS
19560 68 61 72 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f  hareMode = FILE_
19570 53 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c  SHARE_READ | FIL
19580 45 5f 53 48 41 52 45 5f 57 52 49 54 45 3b 0a 0a  E_SHARE_WRITE;..
19590 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29    if( isDelete )
195a0 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
195b0 57 49 4e 43 45 0a 20 20 20 20 64 77 46 6c 61 67  WINCE.    dwFlag
195c0 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
195d0 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
195e0 48 49 44 44 45 4e 3b 0a 20 20 20 20 69 73 54 65  HIDDEN;.    isTe
195f0 6d 70 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20  mp = 1;.#else.  
19600 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
19610 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54  ibutes = FILE_AT
19620 54 52 49 42 55 54 45 5f 54 45 4d 50 4f 52 41 52  TRIBUTE_TEMPORAR
19630 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y.              
19640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19650 20 7c 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   | FILE_ATTRIBUT
19660 45 5f 48 49 44 44 45 4e 0a 20 20 20 20 20 20 20  E_HIDDEN.       
19670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19680 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 46          | FILE_F
19690 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c  LAG_DELETE_ON_CL
196a0 4f 53 45 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  OSE;.#endif.  }e
196b0 6c 73 65 7b 0a 20 20 20 20 64 77 46 6c 61 67 73  lse{.    dwFlags
196c0 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20  AndAttributes = 
196d0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e  FILE_ATTRIBUTE_N
196e0 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20  ORMAL;.  }.  /* 
196f0 52 65 70 6f 72 74 73 20 66 72 6f 6d 20 74 68 65  Reports from the
19700 20 69 6e 74 65 72 6e 65 74 20 61 72 65 20 74 68   internet are th
19710 61 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69  at performance i
19720 73 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65  s always.  ** be
19730 74 74 65 72 20 69 66 20 46 49 4c 45 5f 46 4c 41  tter if FILE_FLA
19740 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20  G_RANDOM_ACCESS 
19750 69 73 20 75 73 65 64 2e 20 20 54 69 63 6b 65 74  is used.  Ticket
19760 20 23 32 36 39 39 2e 20 2a 2f 0a 23 69 66 20 53   #2699. */.#if S
19770 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
19780 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
19790 62 75 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c  butes |= FILE_FL
197a0 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53  AG_RANDOM_ACCESS
197b0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
197c0 69 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  isNT() ){.#if SQ
197d0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
197e0 20 30 20 2f 2a 20 44 49 53 41 42 4c 45 44 3a 20   0 /* DISABLED: 
197f0 43 61 6e 20 62 65 20 63 6f 6d 70 69 6c 65 64 20  Can be compiled 
19800 77 69 74 68 20 57 69 6e 52 54 20 6f 6e 6c 79 2e  with WinRT only.
19810 20 2a 2f 0a 20 20 20 20 43 52 45 41 54 45 46 49   */.    CREATEFI
19820 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52  LE2_EXTENDED_PAR
19830 41 4d 45 54 45 52 53 20 65 78 74 65 6e 64 65 64  AMETERS extended
19840 50 61 72 61 6d 65 74 65 72 73 3b 0a 20 20 20 20  Parameters;.    
19850 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
19860 72 73 2e 64 77 53 69 7a 65 20 3d 20 73 69 7a 65  rs.dwSize = size
19870 6f 66 28 43 52 45 41 54 45 46 49 4c 45 32 5f 45  of(CREATEFILE2_E
19880 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45  XTENDED_PARAMETE
19890 52 53 29 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  RS);.    extende
198a0 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46 69  dParameters.dwFi
198b0 6c 65 41 74 74 72 69 62 75 74 65 73 20 3d 0a 20  leAttributes =. 
198c0 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61             dwFla
198d0 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
198e0 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  & FILE_ATTRIBUTE
198f0 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e  _MASK;.    exten
19900 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77  dedParameters.dw
19910 46 69 6c 65 46 6c 61 67 73 20 3d 20 64 77 46 6c  FileFlags = dwFl
19920 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
19930 20 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53   & FILE_FLAG_MAS
19940 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50  K;.    extendedP
19950 61 72 61 6d 65 74 65 72 73 2e 64 77 53 65 63 75  arameters.dwSecu
19960 72 69 74 79 51 6f 73 46 6c 61 67 73 20 3d 20 53  rityQosFlags = S
19970 45 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d 4f 55  ECURITY_ANONYMOU
19980 53 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50  S;.    extendedP
19990 61 72 61 6d 65 74 65 72 73 2e 6c 70 53 65 63 75  arameters.lpSecu
199a0 72 69 74 79 41 74 74 72 69 62 75 74 65 73 20 3d  rityAttributes =
199b0 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74 65 6e   NULL;.    exten
199c0 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 68 54  dedParameters.hT
199d0 65 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20 4e 55  emplateFile = NU
199e0 4c 4c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  LL;.    while( (
199f0 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  h = osCreateFile
19a00 32 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  2((LPCWSTR)zConv
19a10 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
19a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a30 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63       dwDesiredAc
19a40 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cess,.          
19a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a60 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c      dwShareMode,
19a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
19a90 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
19aa0 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  tion,.          
19ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ac0 20 20 20 20 26 65 78 74 65 6e 64 65 64 50 61 72      &extendedPar
19ad0 61 6d 65 74 65 72 73 29 29 3d 3d 49 4e 56 41 4c  ameters))==INVAL
19ae0 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
19af0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
19b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b10 20 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74   retryIoerr(&cnt
19b20 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
19b30 7d 0a 23 65 6c 73 65 0a 20 20 20 20 77 68 69 6c  }.#else.    whil
19b40 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65  e( (h = osCreate
19b50 46 69 6c 65 57 28 28 4c 50 43 57 53 54 52 29 7a  FileW((LPCWSTR)z
19b60 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
19b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b80 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72           dwDesir
19b90 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20  edAccess,.      
19ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bb0 20 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d          dwShareM
19bc0 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20  ode, NULL,.     
19bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19be0 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74           dwCreat
19bf0 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a  ionDisposition,.
19c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
19c20 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
19c30 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  es,.            
19c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c50 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49    NULL))==INVALI
19c60 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26  D_HANDLE_VALUE &
19c70 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
19c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c90 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  retryIoerr(&cnt,
19ca0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d   &lastErrno) ){}
19cb0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64  .#endif.  }.#ifd
19cc0 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
19cd0 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
19ce0 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d  .    while( (h =
19cf0 20 6f 73 43 72 65 61 74 65 46 69 6c 65 41 28 28   osCreateFileA((
19d00 4c 50 43 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  LPCSTR)zConverte
19d10 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
19d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d30 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
19d40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d60 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c  dwShareMode, NUL
19d70 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
19d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d90 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
19da0 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  sition,.        
19db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19dc0 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64        dwFlagsAnd
19dd0 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20  Attributes,.    
19de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19df0 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 29            NULL))
19e00 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
19e10 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20  _VALUE &&.      
19e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e30 20 20 20 20 20 20 20 20 72 65 74 72 79 49 6f 65          retryIoe
19e40 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
19e50 72 6e 6f 29 20 29 7b 7d 0a 20 20 7d 0a 23 65 6e  rno) ){}.  }.#en
19e60 64 69 66 0a 20 20 6c 6f 67 49 6f 65 72 72 28 63  dif.  logIoerr(c
19e70 6e 74 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  nt);..  OSTRACE(
19e80 28 22 4f 50 45 4e 20 25 64 20 25 73 20 30 78 25  ("OPEN %d %s 0x%
19e90 6c 78 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20  lx %s\n", .     
19ea0 20 20 20 20 20 20 68 2c 20 7a 4e 61 6d 65 2c 20        h, zName, 
19eb0 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c  dwDesiredAccess,
19ec0 20 0a 20 20 20 20 20 20 20 20 20 20 20 68 3d 3d   .           h==
19ed0 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
19ee0 41 4c 55 45 20 3f 20 22 66 61 69 6c 65 64 22 20  ALUE ? "failed" 
19ef0 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20 20 69 66 28  : "ok"));..  if(
19f00 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44   h==INVALID_HAND
19f10 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20  LE_VALUE ){.    
19f20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
19f30 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
19f40 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
19f50 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 70  LITE_CANTOPEN, p
19f60 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
19f70 20 22 77 69 6e 4f 70 65 6e 22 2c 20 7a 55 74 66   "winOpen", zUtf
19f80 38 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  8Name);.    sqli
19f90 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
19fa0 74 65 64 29 3b 0a 20 20 20 20 69 66 28 20 69 73  ted);.    if( is
19fb0 52 65 61 64 57 72 69 74 65 20 26 26 20 21 69 73  ReadWrite && !is
19fc0 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20  Exclusive ){.   
19fd0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4f 70 65     return winOpe
19fe0 6e 28 70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 69  n(pVfs, zName, i
19ff0 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d, .            
1a000 20 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f   ((flags|SQLITE_
1a010 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 26 7e  OPEN_READONLY)&~
1a020 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  (SQLITE_OPEN_CRE
1a030 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ATE|SQLITE_OPEN_
1a040 52 45 41 44 57 52 49 54 45 29 29 2c 20 70 4f 75  READWRITE)), pOu
1a050 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c  tFlags);.    }el
1a060 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
1a070 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
1a080 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
1a090 0a 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67  ..  if( pOutFlag
1a0a0 73 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 52  s ){.    if( isR
1a0b0 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20  eadWrite ){.    
1a0c0 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53    *pOutFlags = S
1a0d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1a0e0 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RITE;.    }else{
1a0f0 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  .      *pOutFlag
1a100 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
1a110 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  READONLY;.    }.
1a120 20 20 7d 0a 0a 20 20 6d 65 6d 73 65 74 28 70 46    }..  memset(pF
1a130 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ile, 0, sizeof(*
1a140 70 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65  pFile));.  pFile
1a150 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 77 69 6e  ->pMethod = &win
1a160 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c  IoMethod;.  pFil
1a170 65 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 46 69 6c  e->h = h;.  pFil
1a180 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e  e->lastErrno = N
1a190 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65  O_ERROR;.  pFile
1a1a0 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
1a1b0 20 70 46 69 6c 65 2d 3e 70 53 68 6d 20 3d 20 30   pFile->pShm = 0
1a1c0 3b 0a 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  ;.  pFile->zPath
1a1d0 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20   = zName;.  if( 
1a1e0 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
1a1f0 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 70 73 6f 77  ean(zName, "psow
1a200 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53  ", SQLITE_POWERS
1a210 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29  AFE_OVERWRITE) )
1a220 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
1a230 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c  lFlags |= WINFIL
1a240 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 0a 23 69 66  E_PSOW;.  }..#if
1a250 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
1a260 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69  .  if( isReadWri
1a270 74 65 20 26 26 20 65 54 79 70 65 3d 3d 53 51 4c  te && eType==SQL
1a280 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
1a290 0a 20 20 20 20 20 20 20 26 26 20 21 77 69 6e 63  .       && !winc
1a2a0 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d  eCreateLock(zNam
1a2b0 65 2c 20 70 46 69 6c 65 29 0a 20 20 29 7b 0a 20  e, pFile).  ){. 
1a2c0 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
1a2d0 28 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (h);.    sqlite3
1a2e0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
1a2f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1a300 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
1a310 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  PT;.  }.  if( is
1a320 54 65 6d 70 20 29 7b 0a 20 20 20 20 70 46 69 6c  Temp ){.    pFil
1a330 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
1a340 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  e = zConverted;.
1a350 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
1a360 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   {.    sqlite3_f
1a370 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
1a380 0a 20 20 7d 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e  .  }..  OpenCoun
1a390 74 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72  ter(+1);.  retur
1a3a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
1a3b0 65 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20  elete the named 
1a3c0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  file..**.** Note
1a3d0 20 74 68 61 74 20 57 69 6e 64 6f 77 73 20 64 6f   that Windows do
1a3e0 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66  es not allow a f
1a3f0 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65  ile to be delete
1a400 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a  d if some other.
1a410 2a 2a 20 70 72 6f 63 65 73 73 20 68 61 73 20 69  ** process has i
1a420 74 20 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d  t open.  Sometim
1a430 65 73 20 61 20 76 69 72 75 73 20 73 63 61 6e 6e  es a virus scann
1a440 65 72 20 6f 72 20 69 6e 64 65 78 69 6e 67 20 70  er or indexing p
1a450 72 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f  rogram.** will o
1a460 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  pen a journal fi
1a470 6c 65 20 73 68 6f 72 74 6c 79 20 61 66 74 65 72  le shortly after
1a480 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 69   it is created i
1a490 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a  n order to do.**
1a4a0 20 77 68 61 74 65 76 65 72 20 69 74 20 64 6f 65   whatever it doe
1a4b0 73 2e 20 20 57 68 69 6c 65 20 74 68 69 73 20 6f  s.  While this o
1a4c0 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
1a4d0 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  holding the.** f
1a4e0 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c  ile open, we wil
1a4f0 6c 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 64  l be unable to d
1a500 65 6c 65 74 65 20 69 74 2e 20 20 54 6f 20 77 6f  elete it.  To wo
1a510 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a  rk around this.*
1a520 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65  * problem, we de
1a530 6c 61 79 20 31 30 30 20 6d 69 6c 6c 69 73 65 63  lay 100 millisec
1a540 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 74 6f 20  onds and try to 
1a550 64 65 6c 65 74 65 20 61 67 61 69 6e 2e 20 20 55  delete again.  U
1a560 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54  p.** to MX_DELET
1a570 49 4f 4e 5f 41 54 54 45 4d 50 54 73 20 64 65 6c  ION_ATTEMPTs del
1a580 65 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 61  etion attempts a
1a590 72 65 20 72 75 6e 20 62 65 66 6f 72 65 20 67 69  re run before gi
1a5a0 76 69 6e 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72  ving.** up and r
1a5b0 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
1a5c0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1a5d0 20 77 69 6e 44 65 6c 65 74 65 28 0a 20 20 73 71   winDelete(.  sq
1a5e0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
1a5f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74            /* Not
1a600 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a   used on win32 *
1a610 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1a620 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20  zFilename,      
1a630 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
1a640 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69  to delete */.  i
1a650 6e 74 20 73 79 6e 63 44 69 72 20 20 20 20 20 20  nt syncDir      
1a660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
1a670 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20  t used on win32 
1a680 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20  */.){.  int cnt 
1a690 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
1a6a0 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
1a6b0 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
1a6c0 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rted;.  UNUSED_P
1a6d0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
1a6e0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1a6f0 45 52 28 73 79 6e 63 44 69 72 29 3b 0a 0a 20 20  ER(syncDir);..  
1a700 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1a710 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1a720 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 7a  ERR_DELETE);.  z
1a730 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
1a740 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
1a750 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
1a760 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
1a770 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1a780 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1a790 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 31 3b 0a  ;.  }.  rc = 1;.
1a7a0 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
1a7b0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1a7c0 4e 52 54 0a 20 20 20 20 57 49 4e 33 32 5f 46 49  NRT.    WIN32_FI
1a7d0 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54  LE_ATTRIBUTE_DAT
1a7e0 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20  A sAttrData;.   
1a7f0 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61   memset(&sAttrDa
1a800 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41  ta, 0, sizeof(sA
1a810 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77  ttrData));.    w
1a820 68 69 6c 65 28 20 6f 73 47 65 74 46 69 6c 65 41  hile( osGetFileA
1a830 74 74 72 69 62 75 74 65 73 45 78 57 28 7a 43 6f  ttributesExW(zCo
1a840 6e 76 65 72 74 65 64 2c 20 47 65 74 46 69 6c 65  nverted, GetFile
1a850 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a  ExInfoStandard,.
1a860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a880 20 20 26 73 41 74 74 72 44 61 74 61 29 20 26 26    &sAttrData) &&
1a890 0a 23 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65  .#else.    while
1a8a0 28 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  ( osGetFileAttri
1a8b0 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74 65  butesW(zConverte
1a8c0 64 29 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  d)!=INVALID_FILE
1a8d0 5f 41 54 54 52 49 42 55 54 45 53 20 26 26 0a 23  _ATTRIBUTES &&.#
1a8e0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 28  endif.         (
1a8f0 72 63 20 3d 20 6f 73 44 65 6c 65 74 65 46 69 6c  rc = osDeleteFil
1a900 65 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 29 3d  eW(zConverted))=
1a910 3d 30 20 26 26 20 72 65 74 72 79 49 6f 65 72 72  =0 && retryIoerr
1a920 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
1a930 6f 29 20 29 7b 7d 0a 20 20 20 20 72 63 20 3d 20  o) ){}.    rc = 
1a940 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  rc ? SQLITE_OK :
1a950 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1a960 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
1a970 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
1a980 20 20 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c    else{.    whil
1a990 65 28 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72  e( osGetFileAttr
1a9a0 69 62 75 74 65 73 41 28 7a 43 6f 6e 76 65 72 74  ibutesA(zConvert
1a9b0 65 64 29 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ed)!=INVALID_FIL
1a9c0 45 5f 41 54 54 52 49 42 55 54 45 53 20 26 26 0a  E_ATTRIBUTES &&.
1a9d0 20 20 20 20 20 20 20 20 20 28 72 63 20 3d 20 6f           (rc = o
1a9e0 73 44 65 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f  sDeleteFileA(zCo
1a9f0 6e 76 65 72 74 65 64 29 29 3d 3d 30 20 26 26 20  nverted))==0 && 
1aa00 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  retryIoerr(&cnt,
1aa10 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d   &lastErrno) ){}
1aa20 0a 20 20 20 20 72 63 20 3d 20 72 63 20 3f 20 53  .    rc = rc ? S
1aa30 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54  QLITE_OK : SQLIT
1aa40 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6e  E_ERROR;.  }.#en
1aa50 64 69 66 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  dif.  if( rc ){.
1aa60 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
1aa70 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1aa80 52 5f 44 45 4c 45 54 45 2c 20 6c 61 73 74 45 72  R_DELETE, lastEr
1aa90 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
1aaa0 20 20 22 77 69 6e 44 65 6c 65 74 65 22 2c 20 7a    "winDelete", z
1aab0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c  Filename);.  }el
1aac0 73 65 7b 0a 20 20 20 20 6c 6f 67 49 6f 65 72 72  se{.    logIoerr
1aad0 28 63 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  (cnt);.  }.  sql
1aae0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
1aaf0 72 74 65 64 29 3b 0a 20 20 4f 53 54 52 41 43 45  rted);.  OSTRACE
1ab00 28 28 22 44 45 4c 45 54 45 20 5c 22 25 73 5c 22  (("DELETE \"%s\"
1ab10 20 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d   %s\n", zFilenam
1ab20 65 2c 20 28 72 63 20 3f 20 22 66 61 69 6c 65 64  e, (rc ? "failed
1ab30 22 20 3a 20 22 6f 6b 22 20 29 29 29 3b 0a 20 20  " : "ok" )));.  
1ab40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ab50 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 65 78  .** Check the ex
1ab60 69 73 74 61 6e 63 65 20 61 6e 64 20 73 74 61 74  istance and stat
1ab70 75 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f  us of a file..*/
1ab80 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 41  .static int winA
1ab90 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33  ccess(.  sqlite3
1aba0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
1abb0 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20      /* Not used 
1abc0 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f  on win32 */.  co
1abd0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1abe0 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame,     /* Name
1abf0 20 6f 66 20 66 69 6c 65 20 74 6f 20 63 68 65 63   of file to chec
1ac00 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  k */.  int flags
1ac10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ac20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 73    /* Type of tes
1ac30 74 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69  t to make on thi
1ac40 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
1ac50 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20  *pResOut        
1ac60 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
1ac70 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57  esult */.){.  DW
1ac80 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20  ORD attr;.  int 
1ac90 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20  rc = 0;.  DWORD 
1aca0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 76 6f 69  lastErrno;.  voi
1acb0 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
1acc0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1acd0 52 28 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75  R(pVfs);..  Simu
1ace0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
1acf0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1ad00 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 7a 43  _ACCESS; );.  zC
1ad10 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65  onverted = conve
1ad20 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  rtUtf8Filename(z
1ad30 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
1ad40 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
1ad50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1ad60 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
1ad70 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28  .  }.  if( isNT(
1ad80 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74  ) ){.    int cnt
1ad90 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f   = 0;.    WIN32_
1ada0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
1adb0 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20  ATA sAttrData;. 
1adc0 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72     memset(&sAttr
1add0 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Data, 0, sizeof(
1ade0 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20  sAttrData));.   
1adf0 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f   while( !(rc = o
1ae00 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
1ae10 65 73 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a  esExW((LPCWSTR)z
1ae20 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
1ae30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae40 20 20 20 20 20 20 20 20 47 65 74 46 69 6c 65 45          GetFileE
1ae50 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 20 0a  xInfoStandard, .
1ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae70 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41               &sA
1ae80 74 74 72 44 61 74 61 29 29 20 26 26 20 72 65 74  ttrData)) && ret
1ae90 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
1aea0 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20  astErrno) ){}.  
1aeb0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1aec0 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49    /* For an SQLI
1aed0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
1aee0 20 71 75 65 72 79 2c 20 74 72 65 61 74 20 61 20   query, treat a 
1aef0 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65  zero-length file
1af00 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20  .      ** as if 
1af10 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
1af20 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
1af30 20 20 69 66 28 20 20 20 20 66 6c 61 67 73 3d 3d    if(    flags==
1af40 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
1af50 49 53 54 53 0a 20 20 20 20 20 20 20 20 20 20 26  ISTS.          &
1af60 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c  & sAttrData.nFil
1af70 65 53 69 7a 65 48 69 67 68 3d 3d 30 20 0a 20 20  eSizeHigh==0 .  
1af80 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72          && sAttr
1af90 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f  Data.nFileSizeLo
1afa0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
1afb0 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46  attr = INVALID_F
1afc0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a  ILE_ATTRIBUTES;.
1afd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1afe0 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74       attr = sAtt
1aff0 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72  rData.dwFileAttr
1b000 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a  ibutes;.      }.
1b010 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b020 20 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a   logIoerr(cnt);.
1b030 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72        if( lastEr
1b040 72 6e 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f  rno!=ERROR_FILE_
1b050 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20  NOT_FOUND ){.   
1b060 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72       winLogError
1b070 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43  (SQLITE_IOERR_AC
1b080 43 45 53 53 2c 20 6c 61 73 74 45 72 72 6e 6f 2c  CESS, lastErrno,
1b090 20 22 77 69 6e 41 63 63 65 73 73 22 2c 20 7a 46   "winAccess", zF
1b0a0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
1b0b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1b0c0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
1b0d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b0e0 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a  E_IOERR_ACCESS;.
1b0f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b100 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41       attr = INVA
1b110 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
1b120 54 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  TES;.      }.   
1b130 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51   }.  }.#ifdef SQ
1b140 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
1b150 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
1b160 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65  attr = osGetFile
1b170 41 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61  AttributesA((cha
1b180 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  r*)zConverted);.
1b190 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
1b1a0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
1b1b0 72 74 65 64 29 3b 0a 20 20 73 77 69 74 63 68 28  rted);.  switch(
1b1c0 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61   flags ){.    ca
1b1d0 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
1b1e0 5f 52 45 41 44 3a 0a 20 20 20 20 63 61 73 65 20  _READ:.    case 
1b1f0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
1b200 49 53 54 53 3a 0a 20 20 20 20 20 20 72 63 20 3d  ISTS:.      rc =
1b210 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46   attr!=INVALID_F
1b220 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a  ILE_ATTRIBUTES;.
1b230 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b240 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
1b250 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20  ESS_READWRITE:. 
1b260 20 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d       rc = attr!=
1b270 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
1b280 52 49 42 55 54 45 53 20 26 26 0a 20 20 20 20 20  RIBUTES &&.     
1b290 20 20 20 20 20 20 20 20 28 61 74 74 72 20 26 20          (attr & 
1b2a0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52  FILE_ATTRIBUTE_R
1b2b0 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20  EADONLY)==0;.   
1b2c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
1b2d0 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73  fault:.      ass
1b2e0 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c  ert(!"Invalid fl
1b2f0 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a  ags argument");.
1b300 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d    }.  *pResOut =
1b310 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 53 51   rc;.  return SQ
1b320 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
1b330 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69  ** Turn a relati
1b340 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f  ve pathname into
1b350 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65   a full pathname
1b360 2e 20 20 57 72 69 74 65 20 74 68 65 20 66 75 6c  .  Write the ful
1b370 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e  l.** pathname in
1b380 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74  to zOut[].  zOut
1b390 5b 5d 20 77 69 6c 6c 20 62 65 20 61 74 20 6c 65  [] will be at le
1b3a0 61 73 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ast pVfs->mxPath
1b3b0 6e 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e  name.** bytes in
1b3c0 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
1b3d0 20 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61 74 68   int winFullPath
1b3e0 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  name(.  sqlite3_
1b3f0 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
1b400 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1b410 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a   to vfs object *
1b420 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1b430 7a 52 65 6c 61 74 69 76 65 2c 20 20 20 20 20 20  zRelative,      
1b440 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65    /* Possibly re
1b450 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74  lative input pat
1b460 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c  h */.  int nFull
1b470 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b480 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1b490 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e  output buffer in
1b4a0 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72   bytes */.  char
1b4b0 20 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20 20 20   *zFull         
1b4c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
1b4d0 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b  put buffer */.){
1b4e0 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .  .#if defined(
1b4f0 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69  __CYGWIN__).  Si
1b500 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
1b510 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1b520 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  OR );.  UNUSED_P
1b530 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b  ARAMETER(nFull);
1b540 0a 20 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 74  .  cygwin_conv_t
1b550 6f 5f 66 75 6c 6c 5f 77 69 6e 33 32 5f 70 61 74  o_full_win32_pat
1b560 68 28 7a 52 65 6c 61 74 69 76 65 2c 20 7a 46 75  h(zRelative, zFu
1b570 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ll);.  return SQ
1b580 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
1b590 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1b5a0 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  INCE || SQLITE_O
1b5b0 53 5f 57 49 4e 52 54 0a 20 20 53 69 6d 75 6c 61  S_WINRT.  Simula
1b5c0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
1b5d0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
1b5e0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1b5f0 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 2f  ETER(nFull);.  /
1b600 2a 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20 63  * WinCE has no c
1b610 6f 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c 61  oncept of a rela
1b620 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f  tive pathname, o
1b630 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20  r so I am told. 
1b640 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  */.  sqlite3_snp
1b650 72 69 6e 74 66 28 70 56 66 73 2d 3e 6d 78 50 61  rintf(pVfs->mxPa
1b660 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 2c 20 22  thname, zFull, "
1b670 25 73 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  %s", zRelative);
1b680 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1b690 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  _OK;.#endif..#if
1b6a0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
1b6b0 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
1b6c0 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65  WINRT && !define
1b6d0 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
1b6e0 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 76 6f 69  int nByte;.  voi
1b6f0 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
1b700 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a 20 20   char *zOut;..  
1b710 2f 2a 20 49 66 20 74 68 69 73 20 70 61 74 68 20  /* If this path 
1b720 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68  name begins with
1b730 20 22 2f 58 3a 22 2c 20 77 68 65 72 65 20 22 58   "/X:", where "X
1b740 22 20 69 73 20 61 6e 79 20 61 6c 70 68 61 62 65  " is any alphabe
1b750 74 69 63 0a 20 20 2a 2a 20 63 68 61 72 61 63 74  tic.  ** charact
1b760 65 72 2c 20 64 69 73 63 61 72 64 20 74 68 65 20  er, discard the 
1b770 69 6e 69 74 69 61 6c 20 22 2f 22 20 66 72 6f 6d  initial "/" from
1b780 20 74 68 65 20 70 61 74 68 6e 61 6d 65 2e 0a 20   the pathname.. 
1b790 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6c 61 74   */.  if( zRelat
1b7a0 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 73  ive[0]=='/' && s
1b7b0 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a 52  qlite3Isalpha(zR
1b7c0 65 6c 61 74 69 76 65 5b 31 5d 29 20 26 26 20 7a  elative[1]) && z
1b7d0 52 65 6c 61 74 69 76 65 5b 32 5d 3d 3d 27 3a 27  Relative[2]==':'
1b7e0 20 29 7b 0a 20 20 20 20 7a 52 65 6c 61 74 69 76   ){.    zRelativ
1b7f0 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  e++;.  }..  /* I
1b800 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
1b810 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
1b820 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
1b830 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
1b840 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
1b850 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
1b860 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
1b870 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
1b880 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
1b890 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69  ion failing. Thi
1b8a0 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64  s function could
1b8b0 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78   fail if, for ex
1b8c0 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20  ample, the.  ** 
1b8d0 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20  current working 
1b8e0 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
1b8f0 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a  en unlinked..  *
1b900 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
1b910 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
1b920 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e  TE_ERROR );.  UN
1b930 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
1b940 46 75 6c 6c 29 3b 0a 20 20 7a 43 6f 6e 76 65 72  Full);.  zConver
1b950 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66  ted = convertUtf
1b960 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74  8Filename(zRelat
1b970 69 76 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ive);.  if( zCon
1b980 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
1b990 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1b9a0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
1b9b0 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
1b9c0 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70      LPWSTR zTemp
1b9d0 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73  ;.    nByte = os
1b9e0 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
1b9f0 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
1ba00 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 20 2b  rted, 0, 0, 0) +
1ba10 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20   3;.    zTemp = 
1ba20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
1ba30 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65  nByte*sizeof(zTe
1ba40 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  mp[0]) );.    if
1ba50 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  ( zTemp==0 ){.  
1ba60 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1ba70 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
1ba80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ba90 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
1baa0 20 20 20 7d 0a 20 20 20 20 6f 73 47 65 74 46 75     }.    osGetFu
1bab0 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43  llPathNameW((LPC
1bac0 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
1bad0 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30   nByte, zTemp, 0
1bae0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1baf0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
1bb00 0a 20 20 20 20 7a 4f 75 74 20 3d 20 75 6e 69 63  .    zOut = unic
1bb10 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 29  odeToUtf8(zTemp)
1bb20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1bb30 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23  ee(zTemp);.  }.#
1bb40 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
1bb50 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
1bb60 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  se{.    char *zT
1bb70 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  emp;.    nByte =
1bb80 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
1bb90 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  meA((char*)zConv
1bba0 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 20  erted, 0, 0, 0) 
1bbb0 2b 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d  + 3;.    zTemp =
1bbc0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
1bbd0 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54   nByte*sizeof(zT
1bbe0 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  emp[0]) );.    i
1bbf0 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20  f( zTemp==0 ){. 
1bc00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1bc10 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
1bc20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1bc30 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
1bc40 20 20 20 20 7d 0a 20 20 20 20 6f 73 47 65 74 46      }.    osGetF
1bc50 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68  ullPathNameA((ch
1bc60 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  ar*)zConverted, 
1bc70 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29  nByte, zTemp, 0)
1bc80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1bc90 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
1bca0 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74      zOut = sqlit
1bcb0 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
1bcc0 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20  _utf8(zTemp);.  
1bcd0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1bce0 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Temp);.  }.#endi
1bcf0 66 0a 20 20 69 66 28 20 7a 4f 75 74 20 29 7b 0a  f.  if( zOut ){.
1bd00 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1bd10 69 6e 74 66 28 70 56 66 73 2d 3e 6d 78 50 61 74  intf(pVfs->mxPat
1bd20 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 2c 20 22 25  hname, zFull, "%
1bd30 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73  s", zOut);.    s
1bd40 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74  qlite3_free(zOut
1bd50 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1bd60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
1bd70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1bd80 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
1bd90 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23  .  }.#endif.}..#
1bda0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1bdb0 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
1bdc0 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  N./*.** Interfac
1bdd0 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61  es for opening a
1bde0 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
1bdf0 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70   finding entry p
1be00 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20  oints.** within 
1be10 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
1be20 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20  ry, and closing 
1be30 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
1be40 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74  ry..*/./*.** Int
1be50 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e  erfaces for open
1be60 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62  ing a shared lib
1be70 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e  rary, finding en
1be80 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69  try points.** wi
1be90 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  thin the shared 
1bea0 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f  library, and clo
1beb0 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  sing the shared 
1bec0 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  library..*/.stat
1bed0 69 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70  ic void *winDlOp
1bee0 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  en(sqlite3_vfs *
1bef0 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72  pVfs, const char
1bf00 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
1bf10 48 41 4e 44 4c 45 20 68 3b 0a 20 20 76 6f 69 64  HANDLE h;.  void
1bf20 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63   *zConverted = c
1bf30 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61  onvertUtf8Filena
1bf40 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
1bf50 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1bf60 52 28 70 56 66 73 29 3b 0a 20 20 69 66 28 20 7a  R(pVfs);.  if( z
1bf70 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
1bf80 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1bf90 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  }.  if( isNT() )
1bfa0 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
1bfb0 57 49 4e 52 54 20 26 26 20 30 20 2f 2a 20 44 49  WINRT && 0 /* DI
1bfc0 53 41 42 4c 45 44 3a 20 43 61 6e 20 62 65 20 63  SABLED: Can be c
1bfd0 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 57 69 6e  ompiled with Win
1bfe0 52 54 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  RT only. */.    
1bff0 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67  h = osLoadPackag
1c000 65 64 4c 69 62 72 61 72 79 28 28 4c 50 43 57 53  edLibrary((LPCWS
1c010 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30  TR)zConverted, 0
1c020 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68 20 3d  );.#else.    h =
1c030 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 28   osLoadLibraryW(
1c040 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
1c050 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  ted);.#endif.  }
1c060 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
1c070 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
1c080 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20 6f 73  else{.    h = os
1c090 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28 63 68  LoadLibraryA((ch
1c0a0 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ar*)zConverted);
1c0b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
1c0c0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
1c0d0 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  erted);.  return
1c0e0 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74 61   (void*)h;.}.sta
1c0f0 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 45 72  tic void winDlEr
1c100 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
1c110 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
1c120 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b   char *zBufOut){
1c130 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1c140 54 45 52 28 70 56 66 73 29 3b 0a 20 20 67 65 74  TER(pVfs);.  get
1c150 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47  LastErrorMsg(osG
1c160 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e  etLastError(), n
1c170 42 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d  Buf, zBufOut);.}
1c180 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 77  .static void (*w
1c190 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f  inDlSym(sqlite3_
1c1a0 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20  vfs *pVfs, void 
1c1b0 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e 73 74 20  *pHandle, const 
1c1c0 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c 29 29 28  char *zSymbol))(
1c1d0 76 6f 69 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  void){.  UNUSED_
1c1e0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
1c1f0 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 28  .  return (void(
1c200 2a 29 28 76 6f 69 64 29 29 6f 73 47 65 74 50 72  *)(void))osGetPr
1c210 6f 63 41 64 64 72 65 73 73 41 28 28 48 41 4e 44  ocAddressA((HAND
1c220 4c 45 29 70 48 61 6e 64 6c 65 2c 20 7a 53 79 6d  LE)pHandle, zSym
1c230 62 6f 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  bol);.}.static v
1c240 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28 73  oid winDlClose(s
1c250 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1c260 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29  , void *pHandle)
1c270 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
1c280 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 6f 73  ETER(pVfs);.  os
1c290 46 72 65 65 4c 69 62 72 61 72 79 28 28 48 41 4e  FreeLibrary((HAN
1c2a0 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a  DLE)pHandle);.}.
1c2b0 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49  #else /* if SQLI
1c2c0 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
1c2d0 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65  ENSION is define
1c2e0 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  d: */.  #define 
1c2f0 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23  winDlOpen  0.  #
1c300 64 65 66 69 6e 65 20 77 69 6e 44 6c 45 72 72 6f  define winDlErro
1c310 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69  r 0.  #define wi
1c320 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65  nDlSym   0.  #de
1c330 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f 73 65 20  fine winDlClose 
1c340 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
1c350 20 57 72 69 74 65 20 75 70 20 74 6f 20 6e 42 75   Write up to nBu
1c360 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f  f bytes of rando
1c370 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e  mness into zBuf.
1c380 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1c390 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c  inRandomness(sql
1c3a0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
1c3b0 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
1c3c0 7a 42 75 66 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  zBuf){.  int n =
1c3d0 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   0;.  UNUSED_PAR
1c3e0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23 69  AMETER(pVfs);.#i
1c3f0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1c400 5f 54 45 53 54 29 0a 20 20 6e 20 3d 20 6e 42 75  _TEST).  n = nBu
1c410 66 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66  f;.  memset(zBuf
1c420 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 65 6c 73  , 0, nBuf);.#els
1c430 65 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 53  e.  if( sizeof(S
1c440 59 53 54 45 4d 54 49 4d 45 29 3c 3d 6e 42 75 66  YSTEMTIME)<=nBuf
1c450 2d 6e 20 29 7b 0a 20 20 20 20 53 59 53 54 45 4d  -n ){.    SYSTEM
1c460 54 49 4d 45 20 78 3b 0a 20 20 20 20 6f 73 47 65  TIME x;.    osGe
1c470 74 53 79 73 74 65 6d 54 69 6d 65 28 26 78 29 3b  tSystemTime(&x);
1c480 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
1c490 66 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a 65 6f 66  f[n], &x, sizeof
1c4a0 28 78 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  (x));.    n += s
1c4b0 69 7a 65 6f 66 28 78 29 3b 0a 20 20 7d 0a 20 20  izeof(x);.  }.  
1c4c0 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44  if( sizeof(DWORD
1c4d0 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
1c4e0 20 44 57 4f 52 44 20 70 69 64 20 3d 20 6f 73 47   DWORD pid = osG
1c4f0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1c500 49 64 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Id();.    memcpy
1c510 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 70 69 64 2c  (&zBuf[n], &pid,
1c520 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20   sizeof(pid));. 
1c530 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 70     n += sizeof(p
1c540 69 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  id);.  }.  if( s
1c550 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42  izeof(DWORD)<=nB
1c560 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52  uf-n ){.    DWOR
1c570 44 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63  D cnt = osGetTic
1c580 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20 6d 65  kCount();.    me
1c590 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26  mcpy(&zBuf[n], &
1c5a0 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29  cnt, sizeof(cnt)
1c5b0 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65  );.    n += size
1c5c0 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 20 20 69  of(cnt);.  }.  i
1c5d0 66 28 20 73 69 7a 65 6f 66 28 4c 41 52 47 45 5f  f( sizeof(LARGE_
1c5e0 49 4e 54 45 47 45 52 29 3c 3d 6e 42 75 66 2d 6e  INTEGER)<=nBuf-n
1c5f0 20 29 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e   ){.    LARGE_IN
1c600 54 45 47 45 52 20 69 3b 0a 20 20 20 20 6f 73 51  TEGER i;.    osQ
1c610 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43  ueryPerformanceC
1c620 6f 75 6e 74 65 72 28 26 69 29 3b 0a 20 20 20 20  ounter(&i);.    
1c630 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
1c640 20 26 69 2c 20 73 69 7a 65 6f 66 28 69 29 29 3b   &i, sizeof(i));
1c650 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66  .    n += sizeof
1c660 28 69 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  (i);.  }.#endif.
1c670 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a    return n;.}...
1c680 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
1c690 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
1c6a0 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
1c6b0 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
1c6c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c6d0 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 74 65 33  winSleep(sqlite3
1c6e0 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
1c6f0 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 70 6f 72  microsec){.  por
1c700 74 61 62 6c 65 53 6c 65 65 70 28 28 6d 69 63 72  tableSleep((micr
1c710 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29 3b  osec+999)/1000);
1c720 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1c730 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74  TER(pVfs);.  ret
1c740 75 72 6e 20 28 28 6d 69 63 72 6f 73 65 63 2b 39  urn ((microsec+9
1c750 39 39 29 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a  99)/1000)*1000;.
1c760 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
1c770 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c  lowing variable,
1c780 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e   if set to a non
1c790 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20  -zero value, is 
1c7a0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a  interpreted as.*
1c7b0 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
1c7c0 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
1c7d0 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20 74  70 and is used t
1c7e0 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74  o set the result
1c7f0 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73   of.** sqlite3Os
1c800 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75  CurrentTime() du
1c810 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f  ring testing..*/
1c820 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1c830 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
1c840 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30  current_time = 0
1c850 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65  ;  /* Fake syste
1c860 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64  m time in second
1c870 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f  s since 1970. */
1c880 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
1c890 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
1c8a0 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
1c8b0 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
1c8c0 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74  ime).  Write int
1c8d0 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20  o *piNow.** the 
1c8e0 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64  current time and
1c8f0 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61   date as a Julia
1c900 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d  n Day number tim
1c910 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20  es 86_400_000.  
1c920 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64  In.** other word
1c930 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70  s, write into *p
1c940 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20  iNow the number 
1c950 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
1c960 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e  since the Julian
1c970 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f  .** epoch of noo
1c980 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f  n in Greenwich o
1c990 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34  n November 24, 4
1c9a0 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e  714 B.C accordin
1c9b0 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c  g to the.** prol
1c9c0 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20  eptic Gregorian 
1c9d0 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20  calendar..**.** 
1c9e0 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 75  On success, retu
1c9f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52  rn SQLITE_OK.  R
1ca00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1ca10 4f 52 20 69 66 20 74 68 65 20 74 69 6d 65 20 61  OR if the time a
1ca20 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e  nd date .** cann
1ca30 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
1ca40 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75  static int winCu
1ca50 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73  rrentTimeInt64(s
1ca60 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1ca70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
1ca80 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46 49  *piNow){.  /* FI
1ca90 4c 45 54 49 4d 45 20 73 74 72 75 63 74 75 72 65  LETIME structure
1caa0 20 69 73 20 61 20 36 34 2d 62 69 74 20 76 61 6c   is a 64-bit val
1cab0 75 65 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  ue representing 
1cac0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20  the number of . 
1cad0 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65 63 6f      100-nanoseco
1cae0 6e 64 20 69 6e 74 65 72 76 61 6c 73 20 73 69 6e  nd intervals sin
1caf0 63 65 20 4a 61 6e 75 61 72 79 20 31 2c 20 31 36  ce January 1, 16
1cb00 30 31 20 28 3d 20 4a 44 20 32 33 30 35 38 31 33  01 (= JD 2305813
1cb10 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20 20 46 49 4c  .5). .  */.  FIL
1cb20 45 54 49 4d 45 20 66 74 3b 0a 20 20 73 74 61 74  ETIME ft;.  stat
1cb30 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
1cb40 5f 69 6e 74 36 34 20 77 69 6e 46 69 6c 65 74 69  _int64 winFileti
1cb50 6d 65 45 70 6f 63 68 20 3d 20 32 33 30 35 38 31  meEpoch = 230581
1cb60 33 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  35*(sqlite3_int6
1cb70 34 29 38 36 34 30 30 30 30 3b 0a 23 69 66 64 65  4)8640000;.#ifde
1cb80 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
1cb90 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
1cba0 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45  ite3_int64 unixE
1cbb0 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a  poch = 24405875*
1cbc0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38  (sqlite3_int64)8
1cbd0 36 34 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 20  640000;.#endif. 
1cbe0 20 2f 2a 20 32 5e 33 32 20 2d 20 74 6f 20 61 76   /* 2^32 - to av
1cbf0 6f 69 64 20 75 73 65 20 6f 66 20 4c 4c 20 61 6e  oid use of LL an
1cc00 64 20 77 61 72 6e 69 6e 67 73 20 69 6e 20 67 63  d warnings in gc
1cc10 63 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  c */.  static co
1cc20 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  nst sqlite3_int6
1cc30 34 20 6d 61 78 33 32 42 69 74 56 61 6c 75 65 20  4 max32BitValue 
1cc40 3d 20 0a 20 20 20 20 20 20 28 73 71 6c 69 74 65  = .      (sqlite
1cc50 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 30  3_int64)20000000
1cc60 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e  00 + (sqlite3_in
1cc70 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20 2b  t64)2000000000 +
1cc80 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
1cc90 32 39 34 39 36 37 32 39 36 3b 0a 0a 23 69 66 20  294967296;..#if 
1cca0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
1ccb0 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69 6d    SYSTEMTIME tim
1ccc0 65 3b 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d  e;.  osGetSystem
1ccd0 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f  Time(&time);.  /
1cce0 2a 20 69 66 20 53 79 73 74 65 6d 54 69 6d 65 54  * if SystemTimeT
1ccf0 6f 46 69 6c 65 54 69 6d 65 28 29 20 66 61 69 6c  oFileTime() fail
1cd00 73 2c 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  s, it returns ze
1cd10 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21 6f 73  ro. */.  if (!os
1cd20 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
1cd30 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74 29 29  Time(&time,&ft))
1cd40 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1cd50 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23  ITE_ERROR;.  }.#
1cd60 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74  else.  osGetSyst
1cd70 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
1cd80 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a  ( &ft );.#endif.
1cd90 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46  .  *piNow = winF
1cda0 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20  iletimeEpoch +. 
1cdb0 20 20 20 20 20 20 20 20 20 20 20 28 28 28 28 73             ((((s
1cdc0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e  qlite3_int64)ft.
1cdd0 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 29 2a  dwHighDateTime)*
1cde0 6d 61 78 33 32 42 69 74 56 61 6c 75 65 29 20 2b  max32BitValue) +
1cdf0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1ce00 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
1ce10 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65  ft.dwLowDateTime
1ce20 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  )/(sqlite3_int64
1ce30 29 31 30 30 30 30 3b 0a 0a 23 69 66 64 65 66 20  )10000;..#ifdef 
1ce40 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
1ce50 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  ( sqlite3_curren
1ce60 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70  t_time ){.    *p
1ce70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c  iNow = 1000*(sql
1ce80 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74  ite3_int64)sqlit
1ce90 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
1cea0 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d  + unixEpoch;.  }
1ceb0 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44  .#endif.  UNUSED
1cec0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
1ced0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1cee0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  E_OK;.}../*.** F
1cef0 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
1cf00 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
1cf10 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
1cf20 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65  ime).  Write the
1cf30 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65  .** current time
1cf40 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
1cf50 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
1cf60 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64   into *prNow and
1cf70 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52  .** return 0.  R
1cf80 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
1cf90 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
1cfa0 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
1cfb0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43  .static int winC
1cfc0 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74  urrentTime(sqlit
1cfd0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f  e3_vfs *pVfs, do
1cfe0 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20  uble *prNow){.  
1cff0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
1d000 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72 63 20  3_int64 i;.  rc 
1d010 3d 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65  = winCurrentTime
1d020 49 6e 74 36 34 28 70 56 66 73 2c 20 26 69 29 3b  Int64(pVfs, &i);
1d030 0a 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20  .  if( !rc ){.  
1d040 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34    *prNow = i/864
1d050 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 72  00000.0;.  }.  r
1d060 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1d070 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74  ** The idea is t
1d080 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hat this functio
1d090 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20 63  n works like a c
1d0a0 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a  ombination of.**
1d0b0 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20   GetLastError() 
1d0c0 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73 61 67  and FormatMessag
1d0d0 65 28 29 20 6f 6e 20 57 69 6e 64 6f 77 73 20 28  e() on Windows (
1d0e0 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20  or errno and.** 
1d0f0 73 74 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20  strerror_r() on 
1d100 55 6e 69 78 29 2e 20 41 66 74 65 72 20 61 6e 20  Unix). After an 
1d110 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
1d120 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 75  d by an OS.** fu
1d130 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63  nction, SQLite c
1d140 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69  alls this functi
1d150 6f 6e 20 77 69 74 68 20 7a 42 75 66 20 70 6f 69  on with zBuf poi
1d160 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 75  nting to.** a bu
1d170 66 66 65 72 20 6f 66 20 6e 42 75 66 20 62 79 74  ffer of nBuf byt
1d180 65 73 2e 20 54 68 65 20 4f 53 20 6c 61 79 65 72  es. The OS layer
1d190 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65   should populate
1d1a0 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 20 77   the.** buffer w
1d1b0 69 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e  ith a nul-termin
1d1c0 61 74 65 64 20 55 54 46 2d 38 20 65 6e 63 6f 64  ated UTF-8 encod
1d1d0 65 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ed error message
1d1e0 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 74  .** describing t
1d1f0 68 65 20 6c 61 73 74 20 49 4f 20 65 72 72 6f 72  he last IO error
1d200 20 74 6f 20 68 61 76 65 20 6f 63 63 75 72 72 65   to have occurre
1d210 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c  d within the cal
1d220 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e 0a  ling.** thread..
1d230 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72 72  **.** If the err
1d240 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 74 6f  or message is to
1d250 6f 20 6c 61 72 67 65 20 66 6f 72 20 74 68 65 20  o large for the 
1d260 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 2c  supplied buffer,
1d270 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20 62 65  .** it should be
1d280 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65 20   truncated. The 
1d290 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
1d2a0 78 47 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a 2a  xGetLastError.**
1d2b0 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20   is zero if the 
1d2c0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69  error message fi
1d2d0 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  ts in the buffer
1d2e0 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a  , or non-zero.**
1d2f0 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74   otherwise (if t
1d300 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74  he message was t
1d310 72 75 6e 63 61 74 65 64 29 2e 20 49 66 20 6e 6f  runcated). If no
1d320 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  n-zero is return
1d330 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69  ed,.** then it i
1d340 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
1d350 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  to include the n
1d360 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63 68  ul-terminator ch
1d370 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68  aracter.** in th
1d380 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e  e output buffer.
1d390 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 6c  .**.** Not suppl
1d3a0 79 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65  ying an error me
1d3b0 73 73 61 67 65 20 77 69 6c 6c 20 68 61 76 65 20  ssage will have 
1d3c0 6e 6f 20 61 64 76 65 72 73 65 20 65 66 66 65 63  no adverse effec
1d3d0 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e 20  t.** on SQLite. 
1d3e0 49 74 20 69 73 20 66 69 6e 65 20 74 6f 20 68 61  It is fine to ha
1d3f0 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ve an implementa
1d400 74 69 6f 6e 20 74 68 61 74 20 6e 65 76 65 72 0a  tion that never.
1d410 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  ** returns an er
1d420 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a  ror message:.**.
1d430 2a 2a 20 20 20 69 6e 74 20 78 47 65 74 4c 61 73  **   int xGetLas
1d440 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
1d450 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
1d460 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
1d470 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 7a  .**     assert(z
1d480 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a  Buf[0]=='\0');.*
1d490 2a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  *     return 0;.
1d4a0 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77  **   }.**.** How
1d4b0 65 76 65 72 20 69 66 20 61 6e 20 65 72 72 6f 72  ever if an error
1d4c0 20 6d 65 73 73 61 67 65 20 69 73 20 73 75 70 70   message is supp
1d4d0 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65  lied, it will be
1d4e0 20 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a 2a   incorporated.**
1d4f0 20 62 79 20 73 71 6c 69 74 65 20 69 6e 74 6f 20   by sqlite into 
1d500 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
1d510 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  e available to t
1d520 68 65 20 75 73 65 72 20 75 73 69 6e 67 0a 2a 2a  he user using.**
1d530 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
1d540 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b 69  ), possibly maki
1d550 6e 67 20 49 4f 20 65 72 72 6f 72 73 20 65 61 73  ng IO errors eas
1d560 69 65 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a 2f  ier to debug..*/
1d570 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47  .static int winG
1d580 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
1d590 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
1d5a0 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
1d5b0 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  Buf){.  UNUSED_P
1d5c0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
1d5d0 20 20 72 65 74 75 72 6e 20 67 65 74 4c 61 73 74    return getLast
1d5e0 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61  ErrorMsg(osGetLa
1d5f0 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c  stError(), nBuf,
1d600 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zBuf);.}../*.**
1d610 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20   Initialize and 
1d620 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  deinitialize the
1d630 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
1d640 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  m interface..*/.
1d650 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69  int sqlite3_os_i
1d660 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  nit(void){.  sta
1d670 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20  tic sqlite3_vfs 
1d680 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20 33  winVfs = {.    3
1d690 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d6a0 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
1d6b0 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69  */.    sizeof(wi
1d6c0 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73  nFile),     /* s
1d6d0 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 4d  zOsFile */.    M
1d6e0 41 58 5f 50 41 54 48 2c 20 20 20 20 20 20 20 20  AX_PATH,        
1d6f0 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d      /* mxPathnam
1d700 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
1d710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d720 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77   pNext */.    "w
1d730 69 6e 33 32 22 2c 20 20 20 20 20 20 20 20 20 20  in32",          
1d740 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20     /* zName */. 
1d750 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
1d760 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44          /* pAppD
1d770 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70  ata */.    winOp
1d780 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
1d790 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20  /* xOpen */.    
1d7a0 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20  winDelete,      
1d7b0 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20       /* xDelete 
1d7c0 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73  */.    winAccess
1d7d0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
1d7e0 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  Access */.    wi
1d7f0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  nFullPathname,  
1d800 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e     /* xFullPathn
1d810 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ame */.    winDl
1d820 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
1d830 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20  /* xDlOpen */.  
1d840 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20    winDlError,   
1d850 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72         /* xDlErr
1d860 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53  or */.    winDlS
1d870 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ym,            /
1d880 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20  * xDlSym */.    
1d890 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20  winDlClose,     
1d8a0 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65       /* xDlClose
1d8b0 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f   */.    winRando
1d8c0 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20  mness,       /* 
1d8d0 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20  xRandomness */. 
1d8e0 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20     winSleep,    
1d8f0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65          /* xSlee
1d900 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72  p */.    winCurr
1d910 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a  entTime,      /*
1d920 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f   xCurrentTime */
1d930 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45  .    winGetLastE
1d940 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 65  rror,     /* xGe
1d950 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20  tLastError */.  
1d960 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65    winCurrentTime
1d970 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65  Int64, /* xCurre
1d980 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20  ntTimeInt64 */. 
1d990 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43     winSetSystemC
1d9a0 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74 53  all,    /* xSetS
1d9b0 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20  ystemCall */.   
1d9c0 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c   winGetSystemCal
1d9d0 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73  l,    /* xGetSys
1d9e0 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77  temCall */.    w
1d9f0 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c  inNextSystemCall
1da00 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74  ,   /* xNextSyst
1da10 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 0a  emCall */.  };..
1da20 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63 68 65 63    /* Double-chec
1da30 6b 20 74 68 61 74 20 74 68 65 20 61 53 79 73 63  k that the aSysc
1da40 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68 61 73 20  all[] array has 
1da50 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64  been constructed
1da60 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e  .  ** correctly.
1da70 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b 62 62    See ticket [bb
1da80 33 61 38 36 65 38 39 30 63 38 65 39 36 61 62 5d  3a86e890c8e96ab]
1da90 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 41 72   */.  assert( Ar
1daa0 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
1dab0 29 3d 3d 36 38 20 29 3b 0a 0a 23 69 66 20 53 51  )==68 );..#if SQ
1dac0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
1dad0 73 6c 65 65 70 4f 62 6a 20 3d 20 6f 73 43 72 65  sleepObj = osCre
1dae0 61 74 65 45 76 65 6e 74 45 78 28 4e 55 4c 4c 2c  ateEventEx(NULL,
1daf0 20 4e 55 4c 4c 2c 20 43 52 45 41 54 45 5f 45 56   NULL, CREATE_EV
1db00 45 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45 53 45 54  ENT_MANUAL_RESET
1db10 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1db20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db30 53 59 4e 43 48 52 4f 4e 49 5a 45 29 3b 0a 23 65  SYNCHRONIZE);.#e
1db40 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
1db50 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
1db60 2f 2a 20 67 65 74 20 6d 65 6d 6f 72 79 20 6d 61  /* get memory ma
1db70 70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 67 72 61  p allocation gra
1db80 6e 75 6c 61 72 69 74 79 20 2a 2f 0a 20 20 6d 65  nularity */.  me
1db90 6d 73 65 74 28 26 77 69 6e 53 79 73 49 6e 66 6f  mset(&winSysInfo
1dba0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 59 53 54  , 0, sizeof(SYST
1dbb0 45 4d 5f 49 4e 46 4f 29 29 3b 0a 20 20 6f 73 47  EM_INFO));.  osG
1dbc0 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69  etSystemInfo(&wi
1dbd0 6e 53 79 73 49 6e 66 6f 29 3b 0a 20 20 61 73 73  nSysInfo);.  ass
1dbe0 65 72 74 28 77 69 6e 53 79 73 49 6e 66 6f 2e 64  ert(winSysInfo.d
1dbf0 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75  wAllocationGranu
1dc00 6c 61 72 69 74 79 20 3e 20 30 29 3b 0a 23 65 6e  larity > 0);.#en
1dc10 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76  dif..  sqlite3_v
1dc20 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e  fs_register(&win
1dc30 56 66 73 2c 20 31 29 3b 0a 20 20 72 65 74 75 72  Vfs, 1);.  retur
1dc40 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a  n SQLITE_OK; .}.
1dc50 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
1dc60 65 6e 64 28 76 6f 69 64 29 7b 20 0a 23 69 66 20  end(void){ .#if 
1dc70 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
1dc80 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
1dc90 73 6c 65 65 70 4f 62 6a 29 3b 0a 20 20 73 6c 65  sleepObj);.  sle
1dca0 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 23 65  epObj = NULL;.#e
1dcb0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
1dcc0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64  LITE_OK;.}..#end
1dcd0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f  if /* SQLITE_OS_
1dce0 57 49 4e 20 2a 2f 0a                             WIN */.