/ Hex Artifact Content
Login

Artifact b8fc659987a678c7924796585f5ae293ba5c896d:


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 4d  mmon.h"../*.** M
02a0: 61 63 72 6f 20 74 6f 20 66 69 6e 64 20 74 68 65  acro to find the
02b0: 20 6d 69 6e 69 6d 75 6d 20 6f 66 20 74 77 6f 20   minimum of two 
02c0: 6e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 2e 0a  numeric values..
02d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4d 49 4e 0a 23  */.#ifndef MIN.#
02e0: 20 64 65 66 69 6e 65 20 4d 49 4e 28 78 2c 79 29   define MIN(x,y)
02f0: 20 28 28 78 29 3c 28 79 29 3f 28 78 29 3a 28 79   ((x)<(y)?(x):(y
0300: 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  )).#endif../*.**
0310: 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20   Some Microsoft 
0320: 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74  compilers lack t
0330: 68 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a  his definition..
0340: 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c  */.#ifndef INVAL
0350: 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
0360: 45 53 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41  ES.# define INVA
0370: 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
0380: 54 45 53 20 28 28 44 57 4f 52 44 29 2d 31 29 20  TES ((DWORD)-1) 
0390: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
03a0: 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 0a   FILE_FLAG_MASK.
03b0: 23 20 64 65 66 69 6e 65 20 46 49 4c 45 5f 46 4c  # define FILE_FL
03c0: 41 47 5f 4d 41 53 4b 20 20 20 20 20 20 20 20 20  AG_MASK         
03d0: 20 28 30 78 46 46 33 43 30 30 30 30 29 0a 23 65   (0xFF3C0000).#e
03e0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 46 49  ndif..#ifndef FI
03f0: 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41 53  LE_ATTRIBUTE_MAS
0400: 4b 0a 23 20 64 65 66 69 6e 65 20 46 49 4c 45 5f  K.# define FILE_
0410: 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 20 20  ATTRIBUTE_MASK  
0420: 20 20 20 28 30 78 30 30 30 33 46 46 46 37 29 0a     (0x0003FFF7).
0430: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
0440: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
0450: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
0460: 65 6e 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66  ences */.typedef
0470: 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 77   struct winShm w
0480: 69 6e 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  inShm;          
0490: 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e   /* A connection
04a0: 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   to shared-memor
04b0: 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  y */.typedef str
04c0: 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 77  uct winShmNode w
04d0: 69 6e 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20  inShmNode;   /* 
04e0: 41 20 72 65 67 69 6f 6e 20 6f 66 20 73 68 61 72  A region of shar
04f0: 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 23 65 6e  ed-memory */.#en
0500: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 43 45  dif../*.** WinCE
0510: 20 6c 61 63 6b 73 20 6e 61 74 69 76 65 20 73 75   lacks native su
0520: 70 70 6f 72 74 20 66 6f 72 20 66 69 6c 65 20 6c  pport for file l
0530: 6f 63 6b 69 6e 67 20 73 6f 20 77 65 20 68 61 76  ocking so we hav
0540: 65 20 74 6f 20 66 61 6b 65 20 69 74 0a 2a 2a 20  e to fake it.** 
0550: 77 69 74 68 20 73 6f 6d 65 20 63 6f 64 65 20 6f  with some code o
0560: 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a 23 69  f our own..*/.#i
0570: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
0580: 45 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  E.typedef struct
0590: 20 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20 20 69   winceLock {.  i
05a0: 6e 74 20 6e 52 65 61 64 65 72 73 3b 20 20 20 20  nt nReaders;    
05b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
05c0: 72 65 61 64 65 72 20 6c 6f 63 6b 73 20 6f 62 74  reader locks obt
05d0: 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ained */.  BOOL 
05e0: 62 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 2f  bPending;      /
05f0: 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20 70 65  * Indicates a pe
0600: 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62  nding lock has b
0610: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a  een obtained */.
0620: 20 20 42 4f 4f 4c 20 62 52 65 73 65 72 76 65 64    BOOL bReserved
0630: 3b 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74  ;     /* Indicat
0640: 65 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  es a reserved lo
0650: 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61  ck has been obta
0660: 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  ined */.  BOOL b
0670: 45 78 63 6c 75 73 69 76 65 3b 20 20 20 20 2f 2a  Exclusive;    /*
0680: 20 49 6e 64 69 63 61 74 65 73 20 61 6e 20 65 78   Indicates an ex
0690: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 68 61 73  clusive lock has
06a0: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a   been obtained *
06b0: 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b 0a 23  /.} winceLock;.#
06c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
06d0: 20 77 69 6e 46 69 6c 65 20 73 74 72 75 63 74 75   winFile structu
06e0: 72 65 20 69 73 20 61 20 73 75 62 63 6c 61 73 73  re is a subclass
06f0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   of sqlite3_file
0700: 2a 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68  * specific to th
0710: 65 20 77 69 6e 33 32 0a 2a 2a 20 70 6f 72 74 61  e win32.** porta
0720: 62 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a 2f  bility layer..*/
0730: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0740: 77 69 6e 46 69 6c 65 20 77 69 6e 46 69 6c 65 3b  winFile winFile;
0750: 0a 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20  .struct winFile 
0760: 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  {.  const sqlite
0770: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d  3_io_methods *pM
0780: 65 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75 73 74  ethod; /*** Must
0790: 20 62 65 20 66 69 72 73 74 20 2a 2a 2a 2f 0a 20   be first ***/. 
07a0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
07b0: 66 73 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  fs;      /* The 
07c0: 56 46 53 20 75 73 65 64 20 74 6f 20 6f 70 65 6e  VFS used to open
07d0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
07e0: 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20 20  HANDLE h;       
07f0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
0800: 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20  e for accessing 
0810: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  the file */.  u8
0820: 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20   locktype;      
0830: 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
0840: 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79 20   lock currently 
0850: 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 69 6c  held on this fil
0860: 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73 68 61  e */.  short sha
0870: 72 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20 20 2f  redLockByte;   /
0880: 2a 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f 73 65  * Randomly chose
0890: 6e 20 62 79 74 65 20 75 73 65 64 20 61 73 20 61  n byte used as a
08a0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a   shared lock */.
08b0: 20 20 75 38 20 63 74 72 6c 46 6c 61 67 73 3b 20    u8 ctrlFlags; 
08c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
08d0: 67 73 2e 20 20 53 65 65 20 57 49 4e 46 49 4c 45  gs.  See WINFILE
08e0: 5f 2a 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 44 57  _* below */.  DW
08f0: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  ORD lastErrno;  
0900: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e        /* The Win
0910: 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20  dows errno from 
0920: 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72  the last I/O err
0930: 6f 72 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  or */.#ifndef SQ
0940: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
0950: 77 69 6e 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20  winShm *pShm;   
0960: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 61          /* Insta
0970: 6e 63 65 20 6f 66 20 73 68 61 72 65 64 20 6d 65  nce of shared me
0980: 6d 6f 72 79 20 6f 6e 20 74 68 69 73 20 66 69 6c  mory on this fil
0990: 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 6f  e */.#endif.  co
09a0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b  nst char *zPath;
09b0: 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61        /* Full pa
09c0: 74 68 6e 61 6d 65 20 6f 66 20 74 68 69 73 20 66  thname of this f
09d0: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 43  ile */.  int szC
09e0: 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20  hunk;           
09f0: 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65 20 63   /* Chunk size c
0a00: 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46 43 4e  onfigured by FCN
0a10: 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f  TL_CHUNK_SIZE */
0a20: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
0a30: 49 4e 43 45 0a 20 20 4c 50 57 53 54 52 20 7a 44  INCE.  LPWSTR zD
0a40: 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20 20 2f  eleteOnClose;  /
0a50: 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
0a60: 6f 20 64 65 6c 65 74 65 20 77 68 65 6e 20 63 6c  o delete when cl
0a70: 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e 44 4c  osing */.  HANDL
0a80: 45 20 68 4d 75 74 65 78 3b 20 20 20 20 20 20 20  E hMutex;       
0a90: 20 20 20 2f 2a 20 4d 75 74 65 78 20 75 73 65 64     /* Mutex used
0aa0: 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65   to control acce
0ab0: 73 73 20 74 6f 20 73 68 61 72 65 64 20 6c 6f 63  ss to shared loc
0ac0: 6b 20 2a 2f 20 20 0a 20 20 48 41 4e 44 4c 45 20  k */  .  HANDLE 
0ad0: 68 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20  hShared;        
0ae0: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
0af0: 79 20 73 65 67 6d 65 6e 74 20 75 73 65 64 20 66  y segment used f
0b00: 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  or locking */.  
0b10: 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c 3b  winceLock local;
0b20: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 73          /* Locks
0b30: 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68 69   obtained by thi
0b40: 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 77 69  s instance of wi
0b50: 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 63 65  nFile */.  wince
0b60: 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20 20 20  Lock *shared;   
0b70: 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 68 61     /* Global sha
0b80: 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79 20  red lock memory 
0b90: 66 6f 72 20 74 68 65 20 66 69 6c 65 20 20 2a 2f  for the file  */
0ba0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
0bb0: 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  * Allowed values
0bc0: 20 66 6f 72 20 77 69 6e 46 69 6c 65 2e 63 74 72   for winFile.ctr
0bd0: 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  lFlags.*/.#defin
0be0: 65 20 57 49 4e 46 49 4c 45 5f 50 45 52 53 49 53  e WINFILE_PERSIS
0bf0: 54 5f 57 41 4c 20 20 20 20 20 30 78 30 34 20 20  T_WAL     0x04  
0c00: 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74 20 57   /* Persistent W
0c10: 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 64 65 66 69  AL mode */.#defi
0c20: 6e 65 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 20  ne WINFILE_PSOW 
0c30: 20 20 20 20 20 20 20 20 20 20 20 30 78 31 30 20             0x10 
0c40: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41    /* SQLITE_IOCA
0c50: 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
0c60: 57 52 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20  WRITE */../*. * 
0c70: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
0c80: 62 75 66 66 65 72 20 75 73 65 64 20 62 79 20 73  buffer used by s
0c90: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69  qlite3_win32_wri
0ca0: 74 65 5f 64 65 62 75 67 28 29 2e 0a 20 2a 2f 0a  te_debug().. */.
0cb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
0cc0: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
0cd0: 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  E.#  define SQLI
0ce0: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
0cf0: 5f 53 49 5a 45 20 20 20 28 28 69 6e 74 29 28 34  _SIZE   ((int)(4
0d00: 30 39 36 2d 73 69 7a 65 6f 66 28 44 57 4f 52 44  096-sizeof(DWORD
0d10: 29 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20  ))).#endif../*. 
0d20: 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77 69  * If compiled wi
0d30: 74 68 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  th SQLITE_WIN32_
0d40: 4d 41 4c 4c 4f 43 20 6f 6e 20 57 69 6e 64 6f 77  MALLOC on Window
0d50: 73 2c 20 77 65 20 77 69 6c 6c 20 75 73 65 20 74  s, we will use t
0d60: 68 65 0a 20 2a 20 76 61 72 69 6f 75 73 20 57 69  he. * various Wi
0d70: 6e 33 32 20 41 50 49 20 68 65 61 70 20 66 75 6e  n32 API heap fun
0d80: 63 74 69 6f 6e 73 20 69 6e 73 74 65 61 64 20 6f  ctions instead o
0d90: 66 20 6f 75 72 20 6f 77 6e 2e 0a 20 2a 2f 0a 23  f our own.. */.#
0da0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
0db0: 33 32 5f 4d 41 4c 4c 4f 43 0a 0a 2f 2a 0a 20 2a  32_MALLOC../*. *
0dc0: 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 6e 2d   If this is non-
0dd0: 7a 65 72 6f 2c 20 61 6e 20 69 73 6f 6c 61 74 65  zero, an isolate
0de0: 64 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20 63  d heap will be c
0df0: 72 65 61 74 65 64 20 62 79 20 74 68 65 20 6e 61  reated by the na
0e00: 74 69 76 65 20 57 69 6e 33 32 0a 20 2a 20 61 6c  tive Win32. * al
0e10: 6c 6f 63 61 74 6f 72 20 73 75 62 73 79 73 74 65  locator subsyste
0e20: 6d 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 74 68  m; otherwise, th
0e30: 65 20 64 65 66 61 75 6c 74 20 70 72 6f 63 65 73  e default proces
0e40: 73 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20 75  s heap will be u
0e50: 73 65 64 2e 20 20 54 68 69 73 0a 20 2a 20 73 65  sed.  This. * se
0e60: 74 74 69 6e 67 20 68 61 73 20 6e 6f 20 65 66 66  tting has no eff
0e70: 65 63 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69  ect when compili
0e80: 6e 67 20 66 6f 72 20 57 69 6e 52 54 2e 20 20 42  ng for WinRT.  B
0e90: 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20  y default, this 
0ea0: 69 73 20 65 6e 61 62 6c 65 64 0a 20 2a 20 61 6e  is enabled. * an
0eb0: 64 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 68 65  d an isolated he
0ec0: 61 70 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74  ap will be creat
0ed0: 65 64 20 74 6f 20 73 74 6f 72 65 20 61 6c 6c 20  ed to store all 
0ee0: 61 6c 6c 6f 63 61 74 65 64 20 64 61 74 61 2e 0a  allocated data..
0ef0: 20 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   *. ************
0f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0f20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0f40: 2a 2a 0a 20 2a 20 57 41 52 4e 49 4e 47 3a 20 49  **. * WARNING: I
0f50: 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
0f60: 6f 20 6e 6f 74 65 20 74 68 61 74 20 77 68 65 6e  o note that when
0f70: 20 74 68 69 73 20 73 65 74 74 69 6e 67 20 69 73   this setting is
0f80: 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
0f90: 65 0a 20 2a 20 20 20 20 20 20 20 20 20 20 77 69  e. *          wi
0fa0: 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 20 66 75 6e  nMemShutdown fun
0fb0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
0fc0: 28 65 2e 67 2e 20 62 79 20 74 68 65 20 73 71 6c  (e.g. by the sql
0fd0: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a 20 2a  ite3_shutdown. *
0fe0: 20 20 20 20 20 20 20 20 20 20 66 75 6e 63 74 69            functi
0ff0: 6f 6e 29 2c 20 61 6c 6c 20 64 61 74 61 20 74 68  on), all data th
1000: 61 74 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64  at was allocated
1010: 20 75 73 69 6e 67 20 74 68 65 20 69 73 6f 6c 61   using the isola
1020: 74 65 64 20 68 65 61 70 20 77 69 6c 6c 0a 20 2a  ted heap will. *
1030: 20 20 20 20 20 20 20 20 20 20 62 65 20 66 72 65            be fre
1040: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ed immediately a
1050: 6e 64 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74  nd any attempt t
1060: 6f 20 61 63 63 65 73 73 20 61 6e 79 20 6f 66 20  o access any of 
1070: 74 68 61 74 20 66 72 65 65 64 0a 20 2a 20 20 20  that freed. *   
1080: 20 20 20 20 20 20 20 64 61 74 61 20 77 69 6c 6c         data will
1090: 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c   almost certainl
10a0: 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  y result in an i
10b0: 6d 6d 65 64 69 61 74 65 20 61 63 63 65 73 73 20  mmediate access 
10c0: 76 69 6f 6c 61 74 69 6f 6e 2e 0a 20 2a 2a 2a 2a  violation.. ****
10d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 2f 0a 23  **********. */.#
1120: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
1130: 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45 0a  N32_HEAP_CREATE.
1140: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
1150: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41  _WIN32_HEAP_CREA
1160: 54 45 20 20 20 20 28 54 52 55 45 29 0a 23 65 6e  TE    (TRUE).#en
1170: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 69  dif../*. * The i
1180: 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20 74  nitial size of t
1190: 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69  he Win32-specifi
11a0: 63 20 68 65 61 70 2e 20 20 54 68 69 73 20 76 61  c heap.  This va
11b0: 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e  lue may be zero.
11c0: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
11d0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49  ITE_WIN32_HEAP_I
11e0: 4e 49 54 5f 53 49 5a 45 0a 23 20 20 64 65 66 69  NIT_SIZE.#  defi
11f0: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
1200: 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 20 28  HEAP_INIT_SIZE (
1210: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
1220: 43 41 43 48 45 5f 53 49 5a 45 29 20 2a 20 5c 0a  CACHE_SIZE) * \.
1230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1250: 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 44         (SQLITE_D
1260: 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
1270: 29 20 2b 20 34 31 39 34 33 30 34 29 0a 23 65 6e  ) + 4194304).#en
1280: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 6d  dif../*. * The m
1290: 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74  aximum size of t
12a0: 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69  he Win32-specifi
12b0: 63 20 68 65 61 70 2e 20 20 54 68 69 73 20 76 61  c heap.  This va
12c0: 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e  lue may be zero.
12d0: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
12e0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d  ITE_WIN32_HEAP_M
12f0: 41 58 5f 53 49 5a 45 0a 23 20 20 64 65 66 69 6e  AX_SIZE.#  defin
1300: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e SQLITE_WIN32_H
1310: 45 41 50 5f 4d 41 58 5f 53 49 5a 45 20 20 28 30  EAP_MAX_SIZE  (0
1320: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  ).#endif../*. * 
1330: 54 68 65 20 65 78 74 72 61 20 66 6c 61 67 73 20  The extra flags 
1340: 74 6f 20 75 73 65 20 69 6e 20 63 61 6c 6c 73 20  to use in calls 
1350: 74 6f 20 74 68 65 20 57 69 6e 33 32 20 68 65 61  to the Win32 hea
1360: 70 20 41 50 49 73 2e 20 20 54 68 69 73 20 76 61  p APIs.  This va
1370: 6c 75 65 20 6d 61 79 20 62 65 0a 20 2a 20 7a 65  lue may be. * ze
1380: 72 6f 20 66 6f 72 20 74 68 65 20 64 65 66 61 75  ro for the defau
1390: 6c 74 20 62 65 68 61 76 69 6f 72 2e 0a 20 2a 2f  lt behavior.. */
13a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13b0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
13c0: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
13d0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
13e0: 47 53 20 20 20 20 20 28 30 29 0a 23 65 6e 64 69  GS     (0).#endi
13f0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e  f../*.** The win
1400: 4d 65 6d 44 61 74 61 20 73 74 72 75 63 74 75 72  MemData structur
1410: 65 20 73 74 6f 72 65 73 20 69 6e 66 6f 72 6d 61  e stores informa
1420: 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79  tion required by
1430: 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69   the Win32-speci
1440: 66 69 63 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  fic.** sqlite3_m
1450: 65 6d 5f 6d 65 74 68 6f 64 73 20 69 6d 70 6c 65  em_methods imple
1460: 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79  mentation..*/.ty
1470: 70 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e  pedef struct win
1480: 4d 65 6d 44 61 74 61 20 77 69 6e 4d 65 6d 44 61  MemData winMemDa
1490: 74 61 3b 0a 73 74 72 75 63 74 20 77 69 6e 4d 65  ta;.struct winMe
14a0: 6d 44 61 74 61 20 7b 0a 23 69 66 6e 64 65 66 20  mData {.#ifndef 
14b0: 4e 44 45 42 55 47 0a 20 20 75 33 32 20 6d 61 67  NDEBUG.  u32 mag
14c0: 69 63 3b 20 20 20 20 2f 2a 20 4d 61 67 69 63 20  ic;    /* Magic 
14d0: 6e 75 6d 62 65 72 20 74 6f 20 64 65 74 65 63 74  number to detect
14e0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75   structure corru
14f0: 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66  ption. */.#endif
1500: 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b  .  HANDLE hHeap;
1510: 20 2f 2a 20 54 68 65 20 68 61 6e 64 6c 65 20 74   /* The handle t
1520: 6f 20 6f 75 72 20 68 65 61 70 2e 20 2a 2f 0a 20  o our heap. */. 
1530: 20 42 4f 4f 4c 20 62 4f 77 6e 65 64 3b 20 20 2f   BOOL bOwned;  /
1540: 2a 20 44 6f 20 77 65 20 6f 77 6e 20 74 68 65 20  * Do we own the 
1550: 68 65 61 70 20 28 69 2e 65 2e 20 64 65 73 74 72  heap (i.e. destr
1560: 6f 79 20 69 74 20 6f 6e 20 73 68 75 74 64 6f 77  oy it on shutdow
1570: 6e 29 3f 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e 64  n)? */.};..#ifnd
1580: 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66 69 6e  ef NDEBUG.#defin
1590: 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 20  e WINMEM_MAGIC  
15a0: 20 20 20 30 78 34 32 62 32 38 33 30 62 0a 23 65     0x42b2830b.#e
15b0: 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 73 74 72  ndif..static str
15c0: 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 77  uct winMemData w
15d0: 69 6e 5f 6d 65 6d 5f 64 61 74 61 20 3d 20 7b 0a  in_mem_data = {.
15e0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
15f0: 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 2c 0a 23   WINMEM_MAGIC,.#
1600: 65 6e 64 69 66 0a 20 20 4e 55 4c 4c 2c 20 46 41  endif.  NULL, FA
1610: 4c 53 45 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20  LSE.};..#ifndef 
1620: 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20 77  NDEBUG.#define w
1630: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
1640: 28 29 20 61 73 73 65 72 74 28 20 77 69 6e 5f 6d  () assert( win_m
1650: 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63 3d 3d 57  em_data.magic==W
1660: 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 29 0a 23 65  INMEM_MAGIC ).#e
1670: 6c 73 65 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d  lse.#define winM
1680: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 0a  emAssertMagic().
1690: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
16a0: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 20  winMemGetHeap() 
16b0: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 68 48 65  win_mem_data.hHe
16c0: 61 70 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ap..static void 
16d0: 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e  *winMemMalloc(in
16e0: 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69  t nBytes);.stati
16f0: 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65  c void winMemFre
1700: 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 3b  e(void *pPrior);
1710: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
1720: 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64  nMemRealloc(void
1730: 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42   *pPrior, int nB
1740: 79 74 65 73 29 3b 0a 73 74 61 74 69 63 20 69 6e  ytes);.static in
1750: 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69  t winMemSize(voi
1760: 64 20 2a 70 29 3b 0a 73 74 61 74 69 63 20 69 6e  d *p);.static in
1770: 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28  t winMemRoundup(
1780: 69 6e 74 20 6e 29 3b 0a 73 74 61 74 69 63 20 69  int n);.static i
1790: 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f  nt winMemInit(vo
17a0: 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 73  id *pAppData);.s
17b0: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65  tatic void winMe
17c0: 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a  mShutdown(void *
17d0: 70 41 70 70 44 61 74 61 29 3b 0a 0a 63 6f 6e 73  pAppData);..cons
17e0: 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  t sqlite3_mem_me
17f0: 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65  thods *sqlite3Me
1800: 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64 29 3b  mGetWin32(void);
1810: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1820: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a  E_WIN32_MALLOC *
1830: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  /../*.** The fol
1840: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20  lowing variable 
1850: 69 73 20 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65  is (normally) se
1860: 74 20 6f 6e 63 65 20 61 6e 64 20 6e 65 76 65 72  t once and never
1870: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72   changes.** ther
1880: 65 61 66 74 65 72 2e 20 20 49 74 20 72 65 63 6f  eafter.  It reco
1890: 72 64 73 20 77 68 65 74 68 65 72 20 74 68 65 20  rds whether the 
18a0: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
18b0: 20 69 73 20 57 69 6e 39 78 0a 2a 2a 20 6f 72 20   is Win9x.** or 
18c0: 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20  WinNT..**.** 0: 
18d0: 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74    Operating syst
18e0: 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31  em unknown..** 1
18f0: 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79  :   Operating sy
1900: 73 74 65 6d 20 69 73 20 57 69 6e 39 78 2e 0a 2a  stem is Win9x..*
1910: 2a 20 32 3a 20 20 20 4f 70 65 72 61 74 69 6e 67  * 2:   Operating
1920: 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 4e 54   system is WinNT
1930: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72  ..**.** In order
1940: 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74   to facilitate t
1950: 65 73 74 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e  esting on a WinN
1960: 54 20 73 79 73 74 65 6d 2c 20 74 68 65 20 74 65  T system, the te
1970: 73 74 20 66 69 78 74 75 72 65 0a 2a 2a 20 63 61  st fixture.** ca
1980: 6e 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20 74  n manually set t
1990: 68 69 73 20 76 61 6c 75 65 20 74 6f 20 31 20 74  his value to 1 t
19a0: 6f 20 65 6d 75 6c 61 74 65 20 57 69 6e 39 38 20  o emulate Win98 
19b0: 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66  behavior..*/.#if
19c0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
19d0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74  int sqlite3_os_t
19e0: 79 70 65 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73  ype = 0;.#else.s
19f0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
1a00: 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23  3_os_type = 0;.#
1a10: 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49  endif..#if !SQLI
1a20: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
1a30: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
1a40: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
1a50: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
1a60: 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
1a70: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53  TE_OS_WINCE || S
1a80: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e 54 20 7c  QLITE_OS_WINNT |
1a90: 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  | SQLITE_OS_WINR
1aa0: 54 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  T.#  define SQLI
1ab0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
1ac0: 45 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  E.#endif..#ifnde
1ad0: 66 20 53 59 53 43 41 4c 4c 0a 23 20 20 64 65 66  f SYSCALL.#  def
1ae0: 69 6e 65 20 53 59 53 43 41 4c 4c 20 73 71 6c 69  ine SYSCALL sqli
1af0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 0a  te3_syscall_ptr.
1b00: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1b10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
1b20: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ot available on 
1b30: 57 69 6e 64 6f 77 73 20 43 45 20 6f 72 20 57 69  Windows CE or Wi
1b40: 6e 52 54 2e 0a 20 2a 2f 0a 0a 23 69 66 20 53 51  nRT.. */..#if SQ
1b50: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c  LITE_OS_WINCE ||
1b60: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
1b70: 0a 23 20 20 64 65 66 69 6e 65 20 6f 73 41 72 65  .#  define osAre
1b80: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 20  FileApisANSI()  
1b90: 20 20 20 20 20 31 0a 23 65 6e 64 69 66 0a 0a 2f       1.#endif../
1ba0: 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d  *.** Many system
1bb0: 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73   calls are acces
1bc0: 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e  sed through poin
1bd0: 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73  ter-to-functions
1be0: 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79   so that.** they
1bf0: 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64   may be overridd
1c00: 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f  en at runtime to
1c10: 20 66 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c   facilitate faul
1c20: 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69  t injection duri
1c30: 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  ng.** testing an
1c40: 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54  d sandboxing.  T
1c50: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72  he following arr
1c60: 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  ay holds the nam
1c70: 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a  es and pointers.
1c80: 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69  ** to all overri
1c90: 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61  deable system ca
1ca0: 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  lls..*/.static s
1cb0: 74 72 75 63 74 20 77 69 6e 5f 73 79 73 63 61 6c  truct win_syscal
1cc0: 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  l {.  const char
1cd0: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
1ce0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1cf0: 68 65 20 73 79 74 65 6d 20 63 61 6c 6c 20 2a 2f  he sytem call */
1d00: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
1d10: 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b  ll_ptr pCurrent;
1d20: 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75   /* Current valu
1d30: 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20  e of the system 
1d40: 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65  call */.  sqlite
1d50: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44  3_syscall_ptr pD
1d60: 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75  efault; /* Defau
1d70: 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53  lt value */.} aS
1d80: 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 23 69 66  yscall[] = {.#if
1d90: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
1da0: 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
1db0: 57 49 4e 52 54 0a 20 20 7b 20 22 41 72 65 46 69  WINRT.  { "AreFi
1dc0: 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20  leApisANSI",    
1dd0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 41 72       (SYSCALL)Ar
1de0: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 2c 20 20  eFileApisANSI,  
1df0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
1e00: 65 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41 70  e.  { "AreFileAp
1e10: 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20 20  isANSI",        
1e20: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
1e50: 23 69 66 6e 64 65 66 20 6f 73 41 72 65 46 69 6c  #ifndef osAreFil
1e60: 65 41 70 69 73 41 4e 53 49 0a 23 64 65 66 69 6e  eApisANSI.#defin
1e70: 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41  e osAreFileApisA
1e80: 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  NSI ((BOOL(WINAP
1e90: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61  I*)(VOID))aSysca
1ea0: 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[0].pCurrent).
1eb0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
1ec0: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64  TE_OS_WINCE && d
1ed0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
1ee0: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
1ef0: 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20  { "CharLowerW", 
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
1f10: 53 43 41 4c 4c 29 43 68 61 72 4c 6f 77 65 72 57  SCALL)CharLowerW
1f20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
1f30: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
1f40: 68 61 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20  harLowerW",     
1f50: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
1f60: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
1f70: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
1f80: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
1f90: 6f 73 43 68 61 72 4c 6f 77 65 72 57 20 28 28 4c  osCharLowerW ((L
1fa0: 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c  PWSTR(WINAPI*)(L
1fb0: 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PWSTR))aSyscall[
1fc0: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
1fd0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
1fe0: 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  E && defined(SQL
1ff0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
2000: 44 45 29 0a 20 20 7b 20 22 43 68 61 72 55 70 70  DE).  { "CharUpp
2010: 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  erW",           
2020: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72     (SYSCALL)Char
2030: 55 70 70 65 72 57 2c 20 20 20 20 20 20 20 20 20  UpperW,         
2040: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
2050: 20 20 7b 20 22 43 68 61 72 55 70 70 65 72 57 22    { "CharUpperW"
2060: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
2070: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
20a0: 65 66 69 6e 65 20 6f 73 43 68 61 72 55 70 70 65  efine osCharUppe
20b0: 72 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e 41  rW ((LPWSTR(WINA
20c0: 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53 79  PI*)(LPWSTR))aSy
20d0: 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e  scall[2].pCurren
20e0: 74 29 0a 0a 20 20 7b 20 22 43 6c 6f 73 65 48 61  t)..  { "CloseHa
20f0: 6e 64 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  ndle",          
2100: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 6c 6f 73     (SYSCALL)Clos
2110: 65 48 61 6e 64 6c 65 2c 20 20 20 20 20 20 20 20  eHandle,        
2120: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
2130: 6e 65 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65  ne osCloseHandle
2140: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
2150: 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c  (HANDLE))aSyscal
2160: 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[3].pCurrent)..
2170: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
2180: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
2190: 49 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  I).  { "CreateFi
21a0: 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  leA",           
21b0: 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74    (SYSCALL)Creat
21c0: 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20  eFileA,         
21d0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
21e0: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 41 22   { "CreateFileA"
21f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
2200: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2220: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
2230: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c  fine osCreateFil
2240: 65 41 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  eA ((HANDLE(WINA
2250: 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52  PI*)(LPCSTR,DWOR
2260: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
2270: 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54     LPSECURITY_AT
2280: 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44  TRIBUTES,DWORD,D
2290: 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79  WORD,HANDLE))aSy
22a0: 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e  scall[4].pCurren
22b0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
22c0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
22d0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
22e0: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
22f0: 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20  CreateFileW",   
2300: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
2310: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 57 2c 20  LL)CreateFileW, 
2320: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
2330: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
2340: 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20  teFileW",       
2350: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
2360: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2370: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
2380: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
2390: 72 65 61 74 65 46 69 6c 65 57 20 28 28 48 41 4e  reateFileW ((HAN
23a0: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  DLE(WINAPI*)(LPC
23b0: 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WSTR,DWORD,DWORD
23c0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45  , \.        LPSE
23d0: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
23e0: 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41  S,DWORD,DWORD,HA
23f0: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35  NDLE))aSyscall[5
2400: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
2410: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
2420: 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f   || (!SQLITE_OS_
2430: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
2440: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
2450: 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20 20 20  S_WIDE) && \.   
2460: 20 20 20 20 20 21 64 65 66 69 6e 65 64 28 53 51       !defined(SQ
2470: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a  LITE_OMIT_WAL)).
2480: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d    { "CreateFileM
2490: 61 70 70 69 6e 67 57 22 2c 20 20 20 20 20 20 28  appingW",      (
24a0: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69  SYSCALL)CreateFi
24b0: 6c 65 4d 61 70 70 69 6e 67 57 2c 20 20 20 20 20  leMappingW,     
24c0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
24d0: 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  "CreateFileMappi
24e0: 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngW",      (SYSC
24f0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
2510: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
2520: 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  e osCreateFileMa
2530: 70 70 69 6e 67 57 20 28 28 48 41 4e 44 4c 45 28  ppingW ((HANDLE(
2540: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
2550: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
2560: 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20  BUTES, \.       
2570: 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f   DWORD,DWORD,DWO
2580: 52 44 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73  RD,LPCWSTR))aSys
2590: 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74  call[6].pCurrent
25a0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
25b0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
25c0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
25d0: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43  HAS_WIDE).  { "C
25e0: 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20 20 20  reateMutexW",   
25f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
2600: 4c 29 43 72 65 61 74 65 4d 75 74 65 78 57 2c 20  L)CreateMutexW, 
2610: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2620: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74  #else.  { "Creat
2630: 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20 20  eMutexW",       
2640: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
2670: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72  if..#define osCr
2680: 65 61 74 65 4d 75 74 65 78 57 20 28 28 48 41 4e  eateMutexW ((HAN
2690: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53  DLE(WINAPI*)(LPS
26a0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
26b0: 45 53 2c 42 4f 4f 4c 2c 20 5c 0a 20 20 20 20 20  ES,BOOL, \.     
26c0: 20 20 20 4c 50 43 57 53 54 52 29 29 61 53 79 73     LPCWSTR))aSys
26d0: 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74  call[7].pCurrent
26e0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
26f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2700: 41 4e 53 49 29 0a 20 20 7b 20 22 44 65 6c 65 74  ANSI).  { "Delet
2710: 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20  eFileA",        
2720: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65       (SYSCALL)De
2730: 6c 65 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20  leteFileA,      
2740: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
2750: 65 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c  e.  { "DeleteFil
2760: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eA",            
2770: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
2780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2790: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
27a0: 23 64 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65  #define osDelete
27b0: 46 69 6c 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e  FileA ((BOOL(WIN
27c0: 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53  API*)(LPCSTR))aS
27d0: 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65  yscall[8].pCurre
27e0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
27f0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
2800: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 44 65 6c  S_WIDE).  { "Del
2810: 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20  eteFileW",      
2820: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
2830: 44 65 6c 65 74 65 46 69 6c 65 57 2c 20 20 20 20  DeleteFileW,    
2840: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
2850: 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65 74 65 46  lse.  { "DeleteF
2860: 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ileW",          
2870: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
2880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2890: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
28a0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44 65 6c 65  ..#define osDele
28b0: 74 65 46 69 6c 65 57 20 28 28 42 4f 4f 4c 28 57  teFileW ((BOOL(W
28c0: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29  INAPI*)(LPCWSTR)
28d0: 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75  )aSyscall[9].pCu
28e0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
28f0: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20  TE_OS_WINCE.  { 
2900: 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c  "FileTimeToLocal
2910: 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43  FileTime", (SYSC
2920: 41 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f 4c 6f  ALL)FileTimeToLo
2930: 63 61 6c 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d  calFileTime, 0 }
2940: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c  ,.#else.  { "Fil
2950: 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65  eTimeToLocalFile
2960: 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29  Time", (SYSCALL)
2970: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2980: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
2990: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
29a0: 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46  FileTimeToLocalF
29b0: 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57  ileTime ((BOOL(W
29c0: 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 46 49  INAPI*)(CONST FI
29d0: 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20  LETIME*, \.     
29e0: 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61     LPFILETIME))a
29f0: 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72  Syscall[10].pCur
2a00: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
2a10: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22  E_OS_WINCE.  { "
2a20: 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d  FileTimeToSystem
2a30: 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41  Time",    (SYSCA
2a40: 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f 53 79 73  LL)FileTimeToSys
2a50: 74 65 6d 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c  temTime,    0 },
2a60: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65  .#else.  { "File
2a70: 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65  TimeToSystemTime
2a80: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30  ",    (SYSCALL)0
2a90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2aa0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
2ab0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46  dif..#define osF
2ac0: 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54  ileTimeToSystemT
2ad0: 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ime ((BOOL(WINAP
2ae0: 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49  I*)(CONST FILETI
2af0: 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ME*, \.        L
2b00: 50 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79  PSYSTEMTIME))aSy
2b10: 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65  scall[11].pCurre
2b20: 6e 74 29 0a 0a 20 20 7b 20 22 46 6c 75 73 68 46  nt)..  { "FlushF
2b30: 69 6c 65 42 75 66 66 65 72 73 22 2c 20 20 20 20  ileBuffers",    
2b40: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6c 75      (SYSCALL)Flu
2b50: 73 68 46 69 6c 65 42 75 66 66 65 72 73 2c 20 20  shFileBuffers,  
2b60: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
2b70: 69 6e 65 20 6f 73 46 6c 75 73 68 46 69 6c 65 42  ine osFlushFileB
2b80: 75 66 66 65 72 73 20 28 28 42 4f 4f 4c 28 57 49  uffers ((BOOL(WI
2b90: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61  NAPI*)(HANDLE))a
2ba0: 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72  Syscall[12].pCur
2bb0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
2bc0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
2bd0: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 46  HAS_ANSI).  { "F
2be0: 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22 2c 20  ormatMessageA", 
2bf0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
2c00: 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41  L)FormatMessageA
2c10: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
2c20: 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61  #else.  { "Forma
2c30: 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20 20  tMessageA",     
2c40: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c60: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
2c70: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f  if..#define osFo
2c80: 72 6d 61 74 4d 65 73 73 61 67 65 41 20 28 28 44  rmatMessageA ((D
2c90: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57  WORD(WINAPI*)(DW
2ca0: 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52  ORD,LPCVOID,DWOR
2cb0: 44 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c  D,DWORD,LPSTR, \
2cc0: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 76  .        DWORD,v
2cd0: 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63 61 6c  a_list*))aSyscal
2ce0: 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[13].pCurrent).
2cf0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
2d00: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
2d10: 44 45 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d  DE).  { "FormatM
2d20: 65 73 73 61 67 65 57 22 2c 20 20 20 20 20 20 20  essageW",       
2d30: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d     (SYSCALL)Form
2d40: 61 74 4d 65 73 73 61 67 65 57 2c 20 20 20 20 20  atMessageW,     
2d50: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
2d60: 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61    { "FormatMessa
2d70: 67 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 28  geW",          (
2d80: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
2db0: 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65  efine osFormatMe
2dc0: 73 73 61 67 65 57 20 28 28 44 57 4f 52 44 28 57  ssageW ((DWORD(W
2dd0: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50  INAPI*)(DWORD,LP
2de0: 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52  CVOID,DWORD,DWOR
2df0: 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20  D,LPWSTR, \.    
2e00: 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73      DWORD,va_lis
2e10: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d  t*))aSyscall[14]
2e20: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
2e30: 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20 20  "FreeLibrary",  
2e40: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
2e50: 41 4c 4c 29 46 72 65 65 4c 69 62 72 61 72 79 2c  ALL)FreeLibrary,
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
2e70: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 72 65  ,..#define osFre
2e80: 65 4c 69 62 72 61 72 79 20 28 28 42 4f 4f 4c 28  eLibrary ((BOOL(
2e90: 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c 45  WINAPI*)(HMODULE
2ea0: 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70  ))aSyscall[15].p
2eb0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47  Current)..  { "G
2ec0: 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
2ed0: 49 64 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  Id",     (SYSCAL
2ee0: 4c 29 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  L)GetCurrentProc
2ef0: 65 73 73 49 64 2c 20 20 20 20 20 30 20 7d 2c 0a  essId,     0 },.
2f00: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 43 75  .#define osGetCu
2f10: 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 20 28  rrentProcessId (
2f20: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
2f30: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 31  VOID))aSyscall[1
2f40: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
2f50: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
2f60: 43 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  CE && defined(SQ
2f70: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
2f80: 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 44 69 73  NSI).  { "GetDis
2f90: 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20 20 20  kFreeSpaceA",   
2fa0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
2fb0: 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 2c 20  DiskFreeSpaceA, 
2fc0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
2fd0: 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65  .  { "GetDiskFre
2fe0: 65 53 70 61 63 65 41 22 2c 20 20 20 20 20 20 20  eSpaceA",       
2ff0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3010: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3020: 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b  define osGetDisk
3030: 46 72 65 65 53 70 61 63 65 41 20 28 28 42 4f 4f  FreeSpaceA ((BOO
3040: 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  L(WINAPI*)(LPCST
3050: 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52  R,LPDWORD,LPDWOR
3060: 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20  D,LPDWORD, \.   
3070: 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61 53       LPDWORD))aS
3080: 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72  yscall[17].pCurr
3090: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
30a0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
30b0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
30c0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
30d0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
30e0: 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65  .  { "GetDiskFre
30f0: 65 53 70 61 63 65 57 22 2c 20 20 20 20 20 20 20  eSpaceW",       
3100: 28 53 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b  (SYSCALL)GetDisk
3110: 46 72 65 65 53 70 61 63 65 57 2c 20 20 20 20 20  FreeSpaceW,     
3120: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3130: 20 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61   "GetDiskFreeSpa
3140: 63 65 57 22 2c 20 20 20 20 20 20 20 28 53 59 53  ceW",       (SYS
3150: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
3160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3170: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
3180: 6e 65 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65  ne osGetDiskFree
3190: 53 70 61 63 65 57 20 28 28 42 4f 4f 4c 28 57 49  SpaceW ((BOOL(WI
31a0: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 4c  NAPI*)(LPCWSTR,L
31b0: 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 4c  PDWORD,LPDWORD,L
31c0: 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  PDWORD, \.      
31d0: 20 20 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63    LPDWORD))aSysc
31e0: 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74  all[18].pCurrent
31f0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
3200: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
3210: 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 46 69  ANSI).  { "GetFi
3220: 6c 65 41 74 74 72 69 62 75 74 65 73 41 22 2c 20  leAttributesA", 
3230: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
3240: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
3250: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  ,      0 },.#els
3260: 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74  e.  { "GetFileAt
3270: 74 72 69 62 75 74 65 73 41 22 2c 20 20 20 20 20  tributesA",     
3280: 20 28 53 59 53 43 41 4c 4c 29 30 2c 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 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
32b0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c  #define osGetFil
32c0: 65 41 74 74 72 69 62 75 74 65 73 41 20 28 28 44  eAttributesA ((D
32d0: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  WORD(WINAPI*)(LP
32e0: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 31  CSTR))aSyscall[1
32f0: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
3300: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
3310: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
3320: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
3330: 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c  IDE).  { "GetFil
3340: 65 41 74 74 72 69 62 75 74 65 73 57 22 2c 20 20  eAttributesW",  
3350: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
3360: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 2c  FileAttributesW,
3370: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3380: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74  .  { "GetFileAtt
3390: 72 69 62 75 74 65 73 57 22 2c 20 20 20 20 20 20  ributesW",      
33a0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
33b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
33d0: 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65  define osGetFile
33e0: 41 74 74 72 69 62 75 74 65 73 57 20 28 28 44 57  AttributesW ((DW
33f0: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  ORD(WINAPI*)(LPC
3400: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32  WSTR))aSyscall[2
3410: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
3420: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
3430: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
3440: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74  .  { "GetFileAtt
3450: 72 69 62 75 74 65 73 45 78 57 22 2c 20 20 20 20  ributesExW",    
3460: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65  (SYSCALL)GetFile
3470: 41 74 74 72 69 62 75 74 65 73 45 78 57 2c 20 20  AttributesExW,  
3480: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3490: 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75   "GetFileAttribu
34a0: 74 65 73 45 78 57 22 2c 20 20 20 20 28 53 59 53  tesExW",    (SYS
34b0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
34d0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
34e0: 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72  ne osGetFileAttr
34f0: 69 62 75 74 65 73 45 78 57 20 28 28 42 4f 4f 4c  ibutesExW ((BOOL
3500: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
3510: 52 2c 47 45 54 5f 46 49 4c 45 45 58 5f 49 4e 46  R,GET_FILEEX_INF
3520: 4f 5f 4c 45 56 45 4c 53 2c 20 5c 0a 20 20 20 20  O_LEVELS, \.    
3530: 20 20 20 20 4c 50 56 4f 49 44 29 29 61 53 79 73      LPVOID))aSys
3540: 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e  call[21].pCurren
3550: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
3560: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65  OS_WINRT.  { "Ge
3570: 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20  tFileSize",     
3580: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3590: 29 47 65 74 46 69 6c 65 53 69 7a 65 2c 20 20 20  )GetFileSize,   
35a0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
35b0: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c  else.  { "GetFil
35c0: 65 53 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20  eSize",         
35d0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3600: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
3610: 46 69 6c 65 53 69 7a 65 20 28 28 44 57 4f 52 44  FileSize ((DWORD
3620: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
3630: 2c 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63 61  ,LPDWORD))aSysca
3640: 6c 6c 5b 32 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[22].pCurrent)
3650: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
3660: 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65  _WINCE && define
3670: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3680: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65  AS_ANSI).  { "Ge
3690: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22 2c  tFullPathNameA",
36a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
36b0: 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  )GetFullPathName
36c0: 41 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  A,        0 },.#
36d0: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 75 6c  else.  { "GetFul
36e0: 6c 50 61 74 68 4e 61 6d 65 41 22 2c 20 20 20 20  lPathNameA",    
36f0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3710: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3720: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
3730: 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 20 28 28  FullPathNameA ((
3740: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c  DWORD(WINAPI*)(L
3750: 50 43 53 54 52 2c 44 57 4f 52 44 2c 4c 50 53 54  PCSTR,DWORD,LPST
3760: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  R, \.        LPS
3770: 54 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b 32 33  TR*))aSyscall[23
3780: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3790: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
37a0: 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
37b0: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
37c0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
37d0: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74  S_WIDE).  { "Get
37e0: 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20  FullPathNameW", 
37f0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3800: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
3810: 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  ,        0 },.#e
3820: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c  lse.  { "GetFull
3830: 50 61 74 68 4e 61 6d 65 57 22 2c 20 20 20 20 20  PathNameW",     
3840: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3860: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3870: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46  ..#define osGetF
3880: 75 6c 6c 50 61 74 68 4e 61 6d 65 57 20 28 28 44  ullPathNameW ((D
3890: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  WORD(WINAPI*)(LP
38a0: 43 57 53 54 52 2c 44 57 4f 52 44 2c 4c 50 57 53  CWSTR,DWORD,LPWS
38b0: 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  TR, \.        LP
38c0: 57 53 54 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b  WSTR*))aSyscall[
38d0: 32 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  24].pCurrent).. 
38e0: 20 7b 20 22 47 65 74 4c 61 73 74 45 72 72 6f 72   { "GetLastError
38f0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
3900: 59 53 43 41 4c 4c 29 47 65 74 4c 61 73 74 45 72  YSCALL)GetLastEr
3910: 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ror,            
3920: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
3930: 47 65 74 4c 61 73 74 45 72 72 6f 72 20 28 28 44  GetLastError ((D
3940: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f  WORD(WINAPI*)(VO
3950: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 35 5d  ID))aSyscall[25]
3960: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3970: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
3980: 20 20 2f 2a 20 54 68 65 20 47 65 74 50 72 6f 63    /* The GetProc
3990: 41 64 64 72 65 73 73 41 28 29 20 72 6f 75 74 69  AddressA() routi
39a0: 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c  ne is only avail
39b0: 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20  able on Windows 
39c0: 43 45 2e 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50  CE. */.  { "GetP
39d0: 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20 20 20  rocAddressA",   
39e0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
39f0: 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 2c 20  etProcAddressA, 
3a00: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
3a10: 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65  se.  /* All othe
3a20: 72 20 57 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f  r Windows platfo
3a30: 72 6d 73 20 65 78 70 65 63 74 20 47 65 74 50 72  rms expect GetPr
3a40: 6f 63 41 64 64 72 65 73 73 28 29 20 74 6f 20 74  ocAddress() to t
3a50: 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 4e 53 49  ake.  ** an ANSI
3a60: 20 73 74 72 69 6e 67 20 72 65 67 61 72 64 6c 65   string regardle
3a70: 73 73 20 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f  ss of the _UNICO
3a80: 44 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20  DE setting */.  
3a90: 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65 73  { "GetProcAddres
3aa0: 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53 59  sA",         (SY
3ab0: 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41 64 64  SCALL)GetProcAdd
3ac0: 72 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 30  ress,          0
3ad0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
3ae0: 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 41 64 64  ine osGetProcAdd
3af0: 72 65 73 73 41 20 28 28 46 41 52 50 52 4f 43 28  ressA ((FARPROC(
3b00: 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c 45  WINAPI*)(HMODULE
3b10: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53  , \.        LPCS
3b20: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 36 5d  TR))aSyscall[26]
3b30: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3b40: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
3b50: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49  .  { "GetSystemI
3b60: 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20  nfo",           
3b70: 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74  (SYSCALL)GetSyst
3b80: 65 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  emInfo,         
3b90: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3ba0: 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 22   "GetSystemInfo"
3bb0: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
3bc0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
3bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3be0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
3bf0: 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e  ne osGetSystemIn
3c00: 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  fo ((VOID(WINAPI
3c10: 2a 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f  *)(LPSYSTEM_INFO
3c20: 29 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d 2e 70  ))aSyscall[27].p
3c30: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47  Current)..  { "G
3c40: 65 74 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20  etSystemTime",  
3c50: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3c60: 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 2c  L)GetSystemTime,
3c70: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3c80: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79  .#define osGetSy
3c90: 73 74 65 6d 54 69 6d 65 20 28 28 56 4f 49 44 28  stemTime ((VOID(
3ca0: 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45  WINAPI*)(LPSYSTE
3cb0: 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b  MTIME))aSyscall[
3cc0: 32 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  28].pCurrent)..#
3cd0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
3ce0: 4e 43 45 0a 20 20 7b 20 22 47 65 74 53 79 73 74  NCE.  { "GetSyst
3cf0: 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
3d00: 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53  ", (SYSCALL)GetS
3d10: 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
3d20: 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ime, 0 },.#else.
3d30: 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69    { "GetSystemTi
3d40: 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28  meAsFileTime", (
3d50: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d70: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3d80: 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65  efine osGetSyste
3d90: 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 20  mTimeAsFileTime 
3da0: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
3db0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c   \.        LPFIL
3dc0: 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b  ETIME))aSyscall[
3dd0: 32 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  29].pCurrent)..#
3de0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
3df0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
3e00: 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61  ).  { "GetTempPa
3e10: 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  thA",           
3e20: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d   (SYSCALL)GetTem
3e30: 70 50 61 74 68 41 2c 20 20 20 20 20 20 20 20 20  pPathA,         
3e40: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3e50: 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 41 22  { "GetTempPathA"
3e60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
3e70: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3e90: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
3ea0: 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74  ine osGetTempPat
3eb0: 68 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  hA ((DWORD(WINAP
3ec0: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54 52 29  I*)(DWORD,LPSTR)
3ed0: 29 61 53 79 73 63 61 6c 6c 5b 33 30 5d 2e 70 43  )aSyscall[30].pC
3ee0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
3ef0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
3f00: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3f10: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
3f20: 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68    { "GetTempPath
3f30: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
3f40: 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50  SYSCALL)GetTempP
3f50: 61 74 68 57 2c 20 20 20 20 20 20 20 20 20 20 20  athW,           
3f60: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3f70: 22 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20  "GetTempPathW", 
3f80: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
3f90: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
3fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3fb0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
3fc0: 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57  e osGetTempPathW
3fd0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
3fe0: 29 28 44 57 4f 52 44 2c 4c 50 57 53 54 52 29 29  )(DWORD,LPWSTR))
3ff0: 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70 43 75  aSyscall[31].pCu
4000: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
4010: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
4020: 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c   "GetTickCount",
4030: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4040: 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e  CALL)GetTickCoun
4050: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  t,            0 
4060: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
4070: 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20  tTickCount",    
4080: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4090: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
40a0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
40b0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
40c0: 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 20 28 28  sGetTickCount ((
40d0: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56  DWORD(WINAPI*)(V
40e0: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 32  OID))aSyscall[32
40f0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4100: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4110: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
4120: 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45    { "GetVersionE
4130: 78 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  xA",           (
4140: 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72 73 69  SYSCALL)GetVersi
4150: 6f 6e 45 78 41 2c 20 20 20 20 20 20 20 20 20 20  onExA,          
4160: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4170: 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c  "GetVersionExA",
4180: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4190: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
41a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
41b0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
41c0: 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78  e osGetVersionEx
41d0: 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  A ((BOOL(WINAPI*
41e0: 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f  )( \.        LPO
41f0: 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29 61  SVERSIONINFOA))a
4200: 53 79 73 63 61 6c 6c 5b 33 33 5d 2e 70 43 75 72  Syscall[33].pCur
4210: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70  rent)..  { "Heap
4220: 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20  Alloc",         
4230: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
4240: 65 61 70 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20  eapAlloc,       
4250: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
4260: 65 66 69 6e 65 20 6f 73 48 65 61 70 41 6c 6c 6f  efine osHeapAllo
4270: 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50  c ((LPVOID(WINAP
4280: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
4290: 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45  , \.        SIZE
42a0: 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 34 5d  _T))aSyscall[34]
42b0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
42c0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
42d0: 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61 74 65  .  { "HeapCreate
42e0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
42f0: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43 72 65  (SYSCALL)HeapCre
4300: 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
4310: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4320: 20 22 48 65 61 70 43 72 65 61 74 65 22 2c 20 20   "HeapCreate",  
4330: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4340: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4360: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4370: 6e 65 20 6f 73 48 65 61 70 43 72 65 61 74 65 20  ne osHeapCreate 
4380: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
4390: 29 28 44 57 4f 52 44 2c 53 49 5a 45 5f 54 2c 20  )(DWORD,SIZE_T, 
43a0: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
43b0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 35 5d 2e 70  ))aSyscall[35].p
43c0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
43d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
43e0: 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f 79 22   { "HeapDestroy"
43f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
4400: 59 53 43 41 4c 4c 29 48 65 61 70 44 65 73 74 72  YSCALL)HeapDestr
4410: 6f 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  oy,             
4420: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4430: 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20 20  HeapDestroy",   
4440: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4450: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4460: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4470: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4480: 20 6f 73 48 65 61 70 44 65 73 74 72 6f 79 20 28   osHeapDestroy (
4490: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
44a0: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
44b0: 33 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  36].pCurrent).. 
44c0: 20 7b 20 22 48 65 61 70 46 72 65 65 22 2c 20 20   { "HeapFree",  
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
44e0: 59 53 43 41 4c 4c 29 48 65 61 70 46 72 65 65 2c  YSCALL)HeapFree,
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4500: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
4510: 48 65 61 70 46 72 65 65 20 28 28 42 4f 4f 4c 28  HeapFree ((BOOL(
4520: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
4530: 44 57 4f 52 44 2c 4c 50 56 4f 49 44 29 29 61 53  DWORD,LPVOID))aS
4540: 79 73 63 61 6c 6c 5b 33 37 5d 2e 70 43 75 72 72  yscall[37].pCurr
4550: 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 52  ent)..  { "HeapR
4560: 65 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20  eAlloc",        
4570: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
4580: 61 70 52 65 41 6c 6c 6f 63 2c 20 20 20 20 20 20  apReAlloc,      
4590: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
45a0: 66 69 6e 65 20 6f 73 48 65 61 70 52 65 41 6c 6c  fine osHeapReAll
45b0: 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41  oc ((LPVOID(WINA
45c0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
45d0: 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a 20 20 20 20  D,LPVOID, \.    
45e0: 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73      SIZE_T))aSys
45f0: 63 61 6c 6c 5b 33 38 5d 2e 70 43 75 72 72 65 6e  call[38].pCurren
4600: 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 53 69 7a  t)..  { "HeapSiz
4610: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
4620: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
4630: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
4640: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
4650: 6e 65 20 6f 73 48 65 61 70 53 69 7a 65 20 28 28  ne osHeapSize ((
4660: 53 49 5a 45 5f 54 28 57 49 4e 41 50 49 2a 29 28  SIZE_T(WINAPI*)(
4670: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a  HANDLE,DWORD, \.
4680: 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29          LPCVOID)
4690: 29 61 53 79 73 63 61 6c 6c 5b 33 39 5d 2e 70 43  )aSyscall[39].pC
46a0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
46b0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
46c0: 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74 65 22  { "HeapValidate"
46d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
46e0: 53 43 41 4c 4c 29 48 65 61 70 56 61 6c 69 64 61  SCALL)HeapValida
46f0: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  te,            0
4700: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48   },.#else.  { "H
4710: 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20 20  eapValidate",   
4720: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4730: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4740: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4750: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4760: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 20 28  osHeapValidate (
4770: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
4780: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20  ANDLE,DWORD, \. 
4790: 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29         LPCVOID))
47a0: 61 53 79 73 63 61 6c 6c 5b 34 30 5d 2e 70 43 75  aSyscall[40].pCu
47b0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
47c0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
47d0: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
47e0: 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20  LoadLibraryA",  
47f0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4800: 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 41 2c  LL)LoadLibraryA,
4810: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4820: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64  .#else.  { "Load
4830: 4c 69 62 72 61 72 79 41 22 2c 20 20 20 20 20 20  LibraryA",      
4840: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4850: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4860: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4870: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c  dif..#define osL
4880: 6f 61 64 4c 69 62 72 61 72 79 41 20 28 28 48 4d  oadLibraryA ((HM
4890: 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ODULE(WINAPI*)(L
48a0: 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PCSTR))aSyscall[
48b0: 34 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  41].pCurrent)..#
48c0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
48d0: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
48e0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
48f0: 57 49 44 45 29 0a 20 20 7b 20 22 4c 6f 61 64 4c  WIDE).  { "LoadL
4900: 69 62 72 61 72 79 57 22 2c 20 20 20 20 20 20 20  ibraryW",       
4910: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f       (SYSCALL)Lo
4920: 61 64 4c 69 62 72 61 72 79 57 2c 20 20 20 20 20  adLibraryW,     
4930: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4940: 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61  e.  { "LoadLibra
4950: 72 79 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  ryW",           
4960: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4980: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4990: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69  #define osLoadLi
49a0: 62 72 61 72 79 57 20 28 28 48 4d 4f 44 55 4c 45  braryW ((HMODULE
49b0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
49c0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 32 5d 2e  R))aSyscall[42].
49d0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
49e0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
49f0: 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c    { "LocalFree",
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
4a10: 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46 72 65  SYSCALL)LocalFre
4a20: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
4a30: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4a40: 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 20  "LocalFree",    
4a50: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4a60: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4a80: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4a90: 65 20 6f 73 4c 6f 63 61 6c 46 72 65 65 20 28 28  e osLocalFree ((
4aa0: 48 4c 4f 43 41 4c 28 57 49 4e 41 50 49 2a 29 28  HLOCAL(WINAPI*)(
4ab0: 48 4c 4f 43 41 4c 29 29 61 53 79 73 63 61 6c 6c  HLOCAL))aSyscall
4ac0: 5b 34 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [43].pCurrent)..
4ad0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
4ae0: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
4af0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c 6f  OS_WINRT.  { "Lo
4b00: 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  ckFile",        
4b10: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4b20: 29 4c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20  )LockFile,      
4b30: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4b40: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69  else.  { "LockFi
4b50: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
4b60: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b80: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4b90: 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63  f..#ifndef osLoc
4ba0: 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73  kFile.#define os
4bb0: 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28  LockFile ((BOOL(
4bc0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
4bd0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
4be0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  D, \.        DWO
4bf0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 34 5d  RD))aSyscall[44]
4c00: 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69  .pCurrent).#endi
4c10: 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  f..#if !SQLITE_O
4c20: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c 6f 63  S_WINCE.  { "Loc
4c30: 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20  kFileEx",       
4c40: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4c50: 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20 20  LockFileEx,     
4c60: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4c70: 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c  lse.  { "LockFil
4c80: 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20  eEx",           
4c90: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cb0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4cc0: 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63 6b  ..#ifndef osLock
4cd0: 46 69 6c 65 45 78 0a 23 64 65 66 69 6e 65 20 6f  FileEx.#define o
4ce0: 73 4c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f  sLockFileEx ((BO
4cf0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
4d00: 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  LE,DWORD,DWORD,D
4d10: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
4d20: 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50        LPOVERLAPP
4d30: 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 35 5d  ED))aSyscall[45]
4d40: 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69  .pCurrent).#endi
4d50: 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  f..#if SQLITE_OS
4d60: 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51 4c 49  _WINCE || (!SQLI
4d70: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21  TE_OS_WINRT && !
4d80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
4d90: 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22 4d  MIT_WAL)).  { "M
4da0: 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20  apViewOfFile",  
4db0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4dc0: 4c 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c  L)MapViewOfFile,
4dd0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4de0: 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69  #else.  { "MapVi
4df0: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
4e00: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e20: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4e30: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61  if..#define osMa
4e40: 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 4c 50  pViewOfFile ((LP
4e50: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41  VOID(WINAPI*)(HA
4e60: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
4e70: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
4e80: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61    SIZE_T))aSysca
4e90: 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[46].pCurrent)
4ea0: 0a 0a 20 20 7b 20 22 4d 75 6c 74 69 42 79 74 65  ..  { "MultiByte
4eb0: 54 6f 57 69 64 65 43 68 61 72 22 2c 20 20 20 20  ToWideChar",    
4ec0: 20 28 53 59 53 43 41 4c 4c 29 4d 75 6c 74 69 42   (SYSCALL)MultiB
4ed0: 79 74 65 54 6f 57 69 64 65 43 68 61 72 2c 20 20  yteToWideChar,  
4ee0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
4ef0: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
4f00: 64 65 43 68 61 72 20 28 28 69 6e 74 28 57 49 4e  deChar ((int(WIN
4f10: 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52 44  API*)(UINT,DWORD
4f20: 2c 4c 50 43 53 54 52 2c 69 6e 74 2c 4c 50 57 53  ,LPCSTR,int,LPWS
4f30: 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 69 6e  TR, \.        in
4f40: 74 29 29 61 53 79 73 63 61 6c 6c 5b 34 37 5d 2e  t))aSyscall[47].
4f50: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
4f60: 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65  QueryPerformance
4f70: 43 6f 75 6e 74 65 72 22 2c 20 28 53 59 53 43 41  Counter", (SYSCA
4f80: 4c 4c 29 51 75 65 72 79 50 65 72 66 6f 72 6d 61  LL)QueryPerforma
4f90: 6e 63 65 43 6f 75 6e 74 65 72 2c 20 30 20 7d 2c  nceCounter, 0 },
4fa0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 51 75 65 72  ..#define osQuer
4fb0: 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e  yPerformanceCoun
4fc0: 74 65 72 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ter ((BOOL(WINAP
4fd0: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
4fe0: 41 52 47 45 5f 49 4e 54 45 47 45 52 2a 29 29 61  ARGE_INTEGER*))a
4ff0: 53 79 73 63 61 6c 6c 5b 34 38 5d 2e 70 43 75 72  Syscall[48].pCur
5000: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 52 65 61 64  rent)..  { "Read
5010: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
5020: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 52        (SYSCALL)R
5030: 65 61 64 46 69 6c 65 2c 20 20 20 20 20 20 20 20  eadFile,        
5040: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
5050: 65 66 69 6e 65 20 6f 73 52 65 61 64 46 69 6c 65  efine osReadFile
5060: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
5070: 28 48 41 4e 44 4c 45 2c 4c 50 56 4f 49 44 2c 44  (HANDLE,LPVOID,D
5080: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a  WORD,LPDWORD, \.
5090: 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41          LPOVERLA
50a0: 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  PPED))aSyscall[4
50b0: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  9].pCurrent)..  
50c0: 7b 20 22 53 65 74 45 6e 64 4f 66 46 69 6c 65 22  { "SetEndOfFile"
50d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
50e0: 53 43 41 4c 4c 29 53 65 74 45 6e 64 4f 66 46 69  SCALL)SetEndOfFi
50f0: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  le,            0
5100: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53   },..#define osS
5110: 65 74 45 6e 64 4f 66 46 69 6c 65 20 28 28 42 4f  etEndOfFile ((BO
5120: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
5130: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 30 5d  LE))aSyscall[50]
5140: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
5150: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
5160: 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69  .  { "SetFilePoi
5170: 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20  nter",          
5180: 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c 65  (SYSCALL)SetFile
5190: 50 6f 69 6e 74 65 72 2c 20 20 20 20 20 20 20 20  Pointer,        
51a0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
51b0: 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72   "SetFilePointer
51c0: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
51d0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
51f0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5200: 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e  ne osSetFilePoin
5210: 74 65 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41  ter ((DWORD(WINA
5220: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f 4e 47  PI*)(HANDLE,LONG
5230: 2c 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20 20 20  ,PLONG, \.      
5240: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
5250: 6c 5b 35 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[51].pCurrent).
5260: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
5270: 57 49 4e 52 54 0a 20 20 7b 20 22 53 6c 65 65 70  WINRT.  { "Sleep
5280: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
5290: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 6c       (SYSCALL)Sl
52a0: 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eep,            
52b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
52c0: 65 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20  e.  { "Sleep",  
52d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52e0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
52f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5300: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5310: 23 64 65 66 69 6e 65 20 6f 73 53 6c 65 65 70 20  #define osSleep 
5320: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
5330: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
5340: 35 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  52].pCurrent).. 
5350: 20 7b 20 22 53 79 73 74 65 6d 54 69 6d 65 54 6f   { "SystemTimeTo
5360: 46 69 6c 65 54 69 6d 65 22 2c 20 20 20 20 28 53  FileTime",    (S
5370: 59 53 43 41 4c 4c 29 53 79 73 74 65 6d 54 69 6d  YSCALL)SystemTim
5380: 65 54 6f 46 69 6c 65 54 69 6d 65 2c 20 20 20 20  eToFileTime,    
5390: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
53a0: 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
53b0: 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  Time ((BOOL(WINA
53c0: 50 49 2a 29 28 43 4f 4e 53 54 20 53 59 53 54 45  PI*)(CONST SYSTE
53d0: 4d 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20  MTIME*, \.      
53e0: 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53    LPFILETIME))aS
53f0: 79 73 63 61 6c 6c 5b 35 33 5d 2e 70 43 75 72 72  yscall[53].pCurr
5400: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5410: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
5420: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
5430: 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c   { "UnlockFile",
5440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
5450: 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c  YSCALL)UnlockFil
5460: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
5470: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5480: 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20  UnlockFile",    
5490: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
54a0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
54c0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
54d0: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 0a 23 64   osUnlockFile.#d
54e0: 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69  efine osUnlockFi
54f0: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
5500: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
5510: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
5520: 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53         DWORD))aS
5530: 79 73 63 61 6c 6c 5b 35 34 5d 2e 70 43 75 72 72  yscall[54].pCurr
5540: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ent).#endif..#if
5550: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
5560: 45 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c  E.  { "UnlockFil
5570: 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20  eEx",           
5580: 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b   (SYSCALL)Unlock
5590: 46 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20  FileEx,         
55a0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
55b0: 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22  { "UnlockFileEx"
55c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
55d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
55f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5600: 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65  ine osUnlockFile
5610: 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  Ex ((BOOL(WINAPI
5620: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
5630: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
5640: 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50         LPOVERLAP
5650: 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 35  PED))aSyscall[55
5660: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5670: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
5680: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
5690: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20 20  ITE_OMIT_WAL).  
56a0: 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f 66 46 69  { "UnmapViewOfFi
56b0: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28 53 59  le",         (SY
56c0: 53 43 41 4c 4c 29 55 6e 6d 61 70 56 69 65 77 4f  SCALL)UnmapViewO
56d0: 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 30  fFile,         0
56e0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55   },.#else.  { "U
56f0: 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c  nmapViewOfFile",
5700: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5710: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5720: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5730: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5740: 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
5750: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
5760: 29 28 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63  )(LPCVOID))aSysc
5770: 61 6c 6c 5b 35 36 5d 2e 70 43 75 72 72 65 6e 74  all[56].pCurrent
5780: 29 0a 0a 20 20 7b 20 22 57 69 64 65 43 68 61 72  )..  { "WideChar
5790: 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20 20 20  ToMultiByte",   
57a0: 20 20 28 53 59 53 43 41 4c 4c 29 57 69 64 65 43    (SYSCALL)WideC
57b0: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 2c 20  harToMultiByte, 
57c0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
57d0: 65 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  e osWideCharToMu
57e0: 6c 74 69 42 79 74 65 20 28 28 69 6e 74 28 57 49  ltiByte ((int(WI
57f0: 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52  NAPI*)(UINT,DWOR
5800: 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c 4c 50  D,LPCWSTR,int,LP
5810: 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20 20 20  STR,int, \.     
5820: 20 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f 4f 4c     LPCSTR,LPBOOL
5830: 29 29 61 53 79 73 63 61 6c 6c 5b 35 37 5d 2e 70  ))aSyscall[57].p
5840: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57  Current)..  { "W
5850: 72 69 74 65 46 69 6c 65 22 2c 20 20 20 20 20 20  riteFile",      
5860: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5870: 4c 29 57 72 69 74 65 46 69 6c 65 2c 20 20 20 20  L)WriteFile,    
5880: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5890: 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65  .#define osWrite
58a0: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
58b0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 43 56  PI*)(HANDLE,LPCV
58c0: 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52  OID,DWORD,LPDWOR
58d0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f  D, \.        LPO
58e0: 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63  VERLAPPED))aSysc
58f0: 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e 74  all[58].pCurrent
5900: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
5910: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61  _WINRT.  { "Crea
5920: 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20 20 20  teEventExW",    
5930: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
5940: 72 65 61 74 65 45 76 65 6e 74 45 78 57 2c 20 20  reateEventExW,  
5950: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5960: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76  se.  { "CreateEv
5970: 65 6e 74 45 78 57 22 2c 20 20 20 20 20 20 20 20  entExW",        
5980: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59a0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
59b0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
59c0: 65 45 76 65 6e 74 45 78 57 20 28 28 48 41 4e 44  eEventExW ((HAND
59d0: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 45  LE(WINAPI*)(LPSE
59e0: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
59f0: 53 2c 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20 20  S,LPCWSTR, \.   
5a00: 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44       DWORD,DWORD
5a10: 29 29 61 53 79 73 63 61 6c 6c 5b 35 39 5d 2e 70  ))aSyscall[59].p
5a20: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
5a30: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
5a40: 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c   { "WaitForSingl
5a50: 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53  eObject",     (S
5a60: 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69  YSCALL)WaitForSi
5a70: 6e 67 6c 65 4f 62 6a 65 63 74 2c 20 20 20 20 20  ngleObject,     
5a80: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5a90: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
5aa0: 65 63 74 22 2c 20 20 20 20 20 28 53 59 53 43 41  ect",     (SYSCA
5ab0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5ac0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5ad0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5ae0: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
5af0: 4f 62 6a 65 63 74 20 28 28 44 57 4f 52 44 28 57  Object ((DWORD(W
5b00: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20  INAPI*)(HANDLE, 
5b10: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29  \.        DWORD)
5b20: 29 61 53 79 73 63 61 6c 6c 5b 36 30 5d 2e 70 43  )aSyscall[60].pC
5b30: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
5b40: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
5b50: 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f   "WaitForSingleO
5b60: 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59 53  bjectEx",   (SYS
5b70: 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e 67  CALL)WaitForSing
5b80: 6c 65 4f 62 6a 65 63 74 45 78 2c 20 20 20 30 20  leObjectEx,   0 
5b90: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 57 61  },.#else.  { "Wa
5ba0: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
5bb0: 74 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c  tEx",   (SYSCALL
5bc0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
5bd0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5be0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
5bf0: 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  sWaitForSingleOb
5c00: 6a 65 63 74 45 78 20 28 28 44 57 4f 52 44 28 57  jectEx ((DWORD(W
5c10: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
5c20: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
5c30: 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36  BOOL))aSyscall[6
5c40: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
5c50: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
5c60: 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f  T.  { "SetFilePo
5c70: 69 6e 74 65 72 45 78 22 2c 20 20 20 20 20 20 20  interEx",       
5c80: 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c   (SYSCALL)SetFil
5c90: 65 50 6f 69 6e 74 65 72 45 78 2c 20 20 20 20 20  ePointerEx,     
5ca0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5cb0: 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  { "SetFilePointe
5cc0: 72 45 78 22 2c 20 20 20 20 20 20 20 20 28 53 59  rEx",        (SY
5cd0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5cf0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5d00: 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69  ine osSetFilePoi
5d10: 6e 74 65 72 45 78 20 28 28 42 4f 4f 4c 28 57 49  nterEx ((BOOL(WI
5d20: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 41  NAPI*)(HANDLE,LA
5d30: 52 47 45 5f 49 4e 54 45 47 45 52 2c 20 5c 0a 20  RGE_INTEGER, \. 
5d40: 20 20 20 20 20 20 20 50 4c 41 52 47 45 5f 49 4e         PLARGE_IN
5d50: 54 45 47 45 52 2c 44 57 4f 52 44 29 29 61 53 79  TEGER,DWORD))aSy
5d60: 73 63 61 6c 6c 5b 36 32 5d 2e 70 43 75 72 72 65  scall[62].pCurre
5d70: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
5d80: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65  OS_WINRT.  { "Ge
5d90: 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  tFileInformation
5da0: 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53 59  ByHandleEx", (SY
5db0: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 49 6e 66  SCALL)GetFileInf
5dc0: 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65  ormationByHandle
5dd0: 45 78 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  Ex, 0 },.#else. 
5de0: 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f 72   { "GetFileInfor
5df0: 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78  mationByHandleEx
5e00: 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20  ", (SYSCALL)0,  
5e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e20: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
5e30: 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 49 6e  fine osGetFileIn
5e40: 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c  formationByHandl
5e50: 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  eEx ((BOOL(WINAP
5e60: 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20  I*)(HANDLE, \.  
5e70: 20 20 20 20 20 20 46 49 4c 45 5f 49 4e 46 4f 5f        FILE_INFO_
5e80: 42 59 5f 48 41 4e 44 4c 45 5f 43 4c 41 53 53 2c  BY_HANDLE_CLASS,
5e90: 4c 50 56 4f 49 44 2c 44 57 4f 52 44 29 29 61 53  LPVOID,DWORD))aS
5ea0: 79 73 63 61 6c 6c 5b 36 33 5d 2e 70 43 75 72 72  yscall[63].pCurr
5eb0: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
5ec0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65  _OS_WINRT && !de
5ed0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
5ee0: 54 5f 57 41 4c 29 0a 20 20 7b 20 22 4d 61 70 56  T_WAL).  { "MapV
5ef0: 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70  iewOfFileFromApp
5f00: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d  ",    (SYSCALL)M
5f10: 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d  apViewOfFileFrom
5f20: 41 70 70 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c  App,    0 },.#el
5f30: 73 65 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f  se.  { "MapViewO
5f40: 66 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20  fFileFromApp",  
5f50: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f70: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5f80: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69  .#define osMapVi
5f90: 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 20  ewOfFileFromApp 
5fa0: 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a  ((LPVOID(WINAPI*
5fb0: 29 28 48 41 4e 44 4c 45 2c 55 4c 4f 4e 47 2c 55  )(HANDLE,ULONG,U
5fc0: 4c 4f 4e 47 36 34 2c 20 5c 0a 20 20 20 20 20 20  LONG64, \.      
5fd0: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61    SIZE_T))aSysca
5fe0: 6c 6c 5b 36 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[64].pCurrent)
5ff0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
6000: 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61 74  WINRT.  { "Creat
6010: 65 46 69 6c 65 32 22 2c 20 20 20 20 20 20 20 20  eFile2",        
6020: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
6030: 65 61 74 65 46 69 6c 65 32 2c 20 20 20 20 20 20  eateFile2,      
6040: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
6050: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
6060: 65 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  e2",            
6070: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6090: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
60a0: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
60b0: 46 69 6c 65 32 20 28 28 48 41 4e 44 4c 45 28 57  File2 ((HANDLE(W
60c0: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c  INAPI*)(LPCWSTR,
60d0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
60e0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  D, \.        LPC
60f0: 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e  REATEFILE2_EXTEN
6100: 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29 29  DED_PARAMETERS))
6110: 61 53 79 73 63 61 6c 6c 5b 36 35 5d 2e 70 43 75  aSyscall[65].pCu
6120: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
6130: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
6140: 22 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62  "LoadPackagedLib
6150: 72 61 72 79 22 2c 20 20 20 20 20 28 53 59 53 43  rary",     (SYSC
6160: 41 4c 4c 29 4c 6f 61 64 50 61 63 6b 61 67 65 64  ALL)LoadPackaged
6170: 4c 69 62 72 61 72 79 2c 20 20 20 20 20 30 20 7d  Library,     0 }
6180: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61  ,.#else.  { "Loa
6190: 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79  dPackagedLibrary
61a0: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
61b0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
61c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
61d0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
61e0: 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72  LoadPackagedLibr
61f0: 61 72 79 20 28 28 48 4d 4f 44 55 4c 45 28 57 49  ary ((HMODULE(WI
6200: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 20  NAPI*)(LPCWSTR, 
6210: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29  \.        DWORD)
6220: 29 61 53 79 73 63 61 6c 6c 5b 36 36 5d 2e 70 43  )aSyscall[66].pC
6230: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
6240: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
6250: 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34   "GetTickCount64
6260: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
6270: 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e  CALL)GetTickCoun
6280: 74 36 34 2c 20 20 20 20 20 20 20 20 20 20 30 20  t64,          0 
6290: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
62a0: 74 54 69 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20  tTickCount64",  
62b0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
62c0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
62d0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
62e0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
62f0: 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 20  sGetTickCount64 
6300: 28 28 55 4c 4f 4e 47 4c 4f 4e 47 28 57 49 4e 41  ((ULONGLONG(WINA
6310: 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63  PI*)(VOID))aSysc
6320: 61 6c 6c 5b 36 37 5d 2e 70 43 75 72 72 65 6e 74  all[67].pCurrent
6330: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
6340: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 4e  _WINRT.  { "GetN
6350: 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22  ativeSystemInfo"
6360: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47  ,     (SYSCALL)G
6370: 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e  etNativeSystemIn
6380: 66 6f 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  fo,     0 },.#el
6390: 73 65 0a 20 20 7b 20 22 47 65 74 4e 61 74 69 76  se.  { "GetNativ
63a0: 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20  eSystemInfo",   
63b0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63d0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
63e0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 4e 61  .#define osGetNa
63f0: 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 20 28  tiveSystemInfo (
6400: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20  (VOID(WINAPI*)( 
6410: 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59 53 54  \.        LPSYST
6420: 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c  EM_INFO))aSyscal
6430: 6c 5b 36 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[68].pCurrent).
6440: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
6450: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
6460: 53 49 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44  SI).  { "OutputD
6470: 65 62 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20  ebugStringA",   
6480: 20 20 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70     (SYSCALL)Outp
6490: 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 2c 20  utDebugStringA, 
64a0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
64b0: 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67    { "OutputDebug
64c0: 53 74 72 69 6e 67 41 22 2c 20 20 20 20 20 20 28  StringA",      (
64d0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
64e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64f0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
6500: 65 66 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65  efine osOutputDe
6510: 62 75 67 53 74 72 69 6e 67 41 20 28 28 56 4f 49  bugStringA ((VOI
6520: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  D(WINAPI*)(LPCST
6530: 52 29 29 61 53 79 73 63 61 6c 6c 5b 36 39 5d 2e  R))aSyscall[69].
6540: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
6550: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
6560: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
6570: 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74  { "OutputDebugSt
6580: 72 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59  ringW",      (SY
6590: 53 43 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75  SCALL)OutputDebu
65a0: 67 53 74 72 69 6e 67 57 2c 20 20 20 20 20 20 30  gStringW,      0
65b0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f   },.#else.  { "O
65c0: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
65d0: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
65e0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
65f0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6600: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
6610: 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72  osOutputDebugStr
6620: 69 6e 67 57 20 28 28 56 4f 49 44 28 57 49 4e 41  ingW ((VOID(WINA
6630: 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53  PI*)(LPCWSTR))aS
6640: 79 73 63 61 6c 6c 5b 37 30 5d 2e 70 43 75 72 72  yscall[70].pCurr
6650: 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 50 72  ent)..  { "GetPr
6660: 6f 63 65 73 73 48 65 61 70 22 2c 20 20 20 20 20  ocessHeap",     
6670: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
6680: 74 50 72 6f 63 65 73 73 48 65 61 70 2c 20 20 20  tProcessHeap,   
6690: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
66a0: 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 65 73  fine osGetProces
66b0: 73 48 65 61 70 20 28 28 48 41 4e 44 4c 45 28 57  sHeap ((HANDLE(W
66c0: 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53  INAPI*)(VOID))aS
66d0: 79 73 63 61 6c 6c 5b 37 31 5d 2e 70 43 75 72 72  yscall[71].pCurr
66e0: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
66f0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65  _OS_WINRT && !de
6700: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6710: 54 5f 57 41 4c 29 0a 20 20 7b 20 22 43 72 65 61  T_WAL).  { "Crea
6720: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f  teFileMappingFro
6730: 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c 29  mApp", (SYSCALL)
6740: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
6750: 67 46 72 6f 6d 41 70 70 2c 20 30 20 7d 2c 0a 23  gFromApp, 0 },.#
6760: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
6770: 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41  FileMappingFromA
6780: 70 70 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c  pp", (SYSCALL)0,
6790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67a0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
67b0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
67c0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
67d0: 6f 6d 41 70 70 20 28 28 48 41 4e 44 4c 45 28 57  omApp ((HANDLE(W
67e0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20  INAPI*)(HANDLE, 
67f0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43 55  \.        LPSECU
6800: 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c  RITY_ATTRIBUTES,
6810: 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 4c 50  ULONG,ULONG64,LP
6820: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
6830: 37 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d  72].pCurrent)..}
6840: 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  ; /* End of the 
6850: 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73  overrideable sys
6860: 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a  tem calls */../*
6870: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
6880: 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29  xSetSystemCall()
6890: 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74   method of sqlit
68a0: 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f  e3_vfs for all o
68b0: 66 20 74 68 65 0a 2a 2a 20 22 77 69 6e 33 32 22  f the.** "win32"
68c0: 20 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20   VFSes.  Return 
68d0: 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73  SQLITE_OK opon s
68e0: 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61  uccessfully upda
68f0: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74  ting the.** syst
6900: 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c  em call pointer,
6910: 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   or SQLITE_NOTFO
6920: 55 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20  UND if there is 
6930: 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a  no configurable.
6940: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ** system call n
6950: 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73  amed zName..*/.s
6960: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 74  tatic int winSet
6970: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
6980: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
6990: 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  sed,        /* T
69a0: 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20  he VFS pointer. 
69b0: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63   Not used */.  c
69c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
69d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
69e0: 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63  Name of system c
69f0: 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20  all to override 
6a00: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
6a10: 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e  call_ptr pNewFun
6a20: 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  c  /* Pointer to
6a30: 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c   new system call
6a40: 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75   value */.){.  u
6a50: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
6a60: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
6a70: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e  _NOTFOUND;..  UN
6a80: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
6a90: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
6aa0: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
6ab0: 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69  /* If no zName i
6ac0: 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65  s given, restore
6ad0: 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c   all system call
6ae0: 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75  s to their defau
6af0: 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e  lt.    ** settin
6b00: 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  gs and return NU
6b10: 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  LL.    */.    rc
6b20: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
6b30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
6b40: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
6b50: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
6b60: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
6b70: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
6b80: 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
6b90: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
6ba0: 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61  Current = aSysca
6bb0: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
6bc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6bd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
6be0: 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66   zName is specif
6bf0: 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20  ied, operate on 
6c00: 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73  only the one sys
6c10: 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  tem call.    ** 
6c20: 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a  specified..    *
6c30: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
6c40: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
6c50: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
6c60: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
6c70: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
6c80: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
6c90: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
6ca0: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
6cb0: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d  ll[i].pDefault==
6cc0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
6cd0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
6ce0: 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  ult = aSyscall[i
6cf0: 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20  ].pCurrent;.    
6d00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
6d10: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
6d20: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75        if( pNewFu
6d30: 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63  nc==0 ) pNewFunc
6d40: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
6d50: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20  Default;.       
6d60: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
6d70: 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63  rrent = pNewFunc
6d80: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
6d90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6da0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
6db0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
6dc0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
6dd0: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74  ystem call.  Ret
6de0: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d  urn NULL if zNam
6df0: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65  e is not a.** re
6e00: 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20  cognized system 
6e10: 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c  call name.  NULL
6e20: 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
6e30: 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20  d if the system 
6e40: 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65  call.** is curre
6e50: 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ntly undefined..
6e60: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
6e70: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 77 69  3_syscall_ptr wi
6e80: 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a  nGetSystemCall(.
6e90: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
6ea0: 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74  NotUsed,.  const
6eb0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a   char *zName.){.
6ec0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
6ed0: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
6ee0: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
6ef0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
6f00: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
6f10: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
6f20: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
6f30: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
6f40: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
6f50: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61  e)==0 ) return a
6f60: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
6f70: 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ent;.  }.  retur
6f80: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
6f90: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
6fa0: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
6fb0: 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61  m call after zNa
6fc0: 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e  me.  If zName==N
6fd0: 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  ULL.** then retu
6fe0: 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
6ff0: 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20  he first system 
7000: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
7010: 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69  LL if zName.** i
7020: 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65  s the last syste
7030: 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61  m call or if zNa
7040: 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61  me is not the na
7050: 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a  me of a valid.**
7060: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f   system call..*/
7070: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
7080: 61 72 20 2a 77 69 6e 4e 65 78 74 53 79 73 74 65  ar *winNextSyste
7090: 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66  mCall(sqlite3_vf
70a0: 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  s *p, const char
70b0: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
70c0: 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45  i = -1;..  UNUSE
70d0: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
70e0: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
70f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
7100: 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
7110: 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  )-1; i++){.     
7120: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
7130: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
7140: 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
7150: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
7160: 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69  r(i++; i<ArraySi
7170: 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b  ze(aSyscall); i+
7180: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73  +){.    if( aSys
7190: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
71a0: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79  !=0 ) return aSy
71b0: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  scall[i].zName;.
71c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
71d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
71e0: 6e 63 74 69 6f 6e 20 6f 75 74 70 75 74 73 20 74  nction outputs t
71f0: 68 65 20 73 70 65 63 69 66 69 65 64 20 28 41 4e  he specified (AN
7200: 53 49 29 20 73 74 72 69 6e 67 20 74 6f 20 74 68  SI) string to th
7210: 65 20 57 69 6e 33 32 20 64 65 62 75 67 67 65 72  e Win32 debugger
7220: 0a 2a 2a 20 28 69 66 20 61 76 61 69 6c 61 62 6c  .** (if availabl
7230: 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73 71 6c  e)..*/..void sql
7240: 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65  ite3_win32_write
7250: 5f 64 65 62 75 67 28 63 68 61 72 20 2a 7a 42 75  _debug(char *zBu
7260: 66 2c 20 69 6e 74 20 6e 42 75 66 29 7b 0a 20 20  f, int nBuf){.  
7270: 63 68 61 72 20 7a 44 62 67 42 75 66 5b 53 51 4c  char zDbgBuf[SQL
7280: 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55  ITE_WIN32_DBG_BU
7290: 46 5f 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 6e  F_SIZE];.  int n
72a0: 4d 69 6e 20 3d 20 4d 49 4e 28 6e 42 75 66 2c 20  Min = MIN(nBuf, 
72b0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42  (SQLITE_WIN32_DB
72c0: 47 5f 42 55 46 5f 53 49 5a 45 20 2d 20 31 29 29  G_BUF_SIZE - 1))
72d0: 3b 20 2f 2a 20 6d 61 79 20 62 65 20 6e 65 67 61  ; /* may be nega
72e0: 74 69 76 65 2e 20 2a 2f 0a 20 20 69 66 28 20 6e  tive. */.  if( n
72f0: 4d 69 6e 3c 2d 31 20 29 20 6e 4d 69 6e 20 3d 20  Min<-1 ) nMin = 
7300: 2d 31 3b 20 2f 2a 20 61 6c 6c 20 6e 65 67 61 74  -1; /* all negat
7310: 69 76 65 20 76 61 6c 75 65 73 20 62 65 63 6f 6d  ive values becom
7320: 65 20 2d 31 2e 20 2a 2f 0a 20 20 61 73 73 65 72  e -1. */.  asser
7330: 74 28 20 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c 20 6e  t( nMin==-1 || n
7340: 4d 69 6e 3d 3d 30 20 7c 7c 20 6e 4d 69 6e 3c 53  Min==0 || nMin<S
7350: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
7360: 42 55 46 5f 53 49 5a 45 20 29 3b 0a 23 69 66 20  BUF_SIZE );.#if 
7370: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
7380: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
7390: 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20   if( nMin>0 ){. 
73a0: 20 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75     memset(zDbgBu
73b0: 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e  f, 0, SQLITE_WIN
73c0: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29  32_DBG_BUF_SIZE)
73d0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62  ;.    memcpy(zDb
73e0: 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e  gBuf, zBuf, nMin
73f0: 29 3b 0a 20 20 20 20 6f 73 4f 75 74 70 75 74 44  );.    osOutputD
7400: 65 62 75 67 53 74 72 69 6e 67 41 28 7a 44 62 67  ebugStringA(zDbg
7410: 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Buf);.  }else{. 
7420: 20 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67     osOutputDebug
7430: 53 74 72 69 6e 67 41 28 7a 42 75 66 29 3b 0a 20  StringA(zBuf);. 
7440: 20 7d 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64   }.#elif defined
7450: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
7460: 53 5f 57 49 44 45 29 0a 20 20 6d 65 6d 73 65 74  S_WIDE).  memset
7470: 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c  (zDbgBuf, 0, SQL
7480: 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55  ITE_WIN32_DBG_BU
7490: 46 5f 53 49 5a 45 29 3b 0a 20 20 69 66 20 28 20  F_SIZE);.  if ( 
74a0: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  osMultiByteToWid
74b0: 65 43 68 61 72 28 0a 20 20 20 20 20 20 20 20 20  eChar(.         
74c0: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
74d0: 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20  SI() ? CP_ACP : 
74e0: 43 50 5f 4f 45 4d 43 50 2c 20 30 2c 20 7a 42 75  CP_OEMCP, 0, zBu
74f0: 66 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4d 69  f,.          nMi
7500: 6e 2c 20 28 4c 50 57 53 54 52 29 7a 44 62 67 42  n, (LPWSTR)zDbgB
7510: 75 66 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  uf, SQLITE_WIN32
7520: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 2f 73 69  _DBG_BUF_SIZE/si
7530: 7a 65 6f 66 28 57 43 48 41 52 29 29 3c 3d 30 20  zeof(WCHAR))<=0 
7540: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
7550: 20 7d 0a 20 20 6f 73 4f 75 74 70 75 74 44 65 62   }.  osOutputDeb
7560: 75 67 53 74 72 69 6e 67 57 28 28 4c 50 43 57 53  ugStringW((LPCWS
7570: 54 52 29 7a 44 62 67 42 75 66 29 3b 0a 23 65 6c  TR)zDbgBuf);.#el
7580: 73 65 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20  se.  if( nMin>0 
7590: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 44  ){.    memset(zD
75a0: 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45  bgBuf, 0, SQLITE
75b0: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
75c0: 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  IZE);.    memcpy
75d0: 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66 2c 20  (zDbgBuf, zBuf, 
75e0: 6e 4d 69 6e 29 3b 0a 20 20 20 20 66 70 72 69 6e  nMin);.    fprin
75f0: 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 22 2c  tf(stderr, "%s",
7600: 20 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c   zDbgBuf);.  }el
7610: 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  se{.    fprintf(
7620: 73 74 64 65 72 72 2c 20 22 25 73 22 2c 20 7a 42  stderr, "%s", zB
7630: 75 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  uf);.  }.#endif.
7640: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
7650: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 73  lowing routine s
7660: 75 73 70 65 6e 64 73 20 74 68 65 20 63 75 72 72  uspends the curr
7670: 65 6e 74 20 74 68 72 65 61 64 20 66 6f 72 20 61  ent thread for a
7680: 74 20 6c 65 61 73 74 20 6d 73 0a 2a 2a 20 6d 69  t least ms.** mi
7690: 6c 6c 69 73 65 63 6f 6e 64 73 2e 20 20 54 68 69  lliseconds.  Thi
76a0: 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  s is equivalent 
76b0: 74 6f 20 74 68 65 20 57 69 6e 33 32 20 53 6c 65  to the Win32 Sle
76c0: 65 70 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a  ep() interface..
76d0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
76e0: 5f 57 49 4e 52 54 0a 73 74 61 74 69 63 20 48 41  _WINRT.static HA
76f0: 4e 44 4c 45 20 73 6c 65 65 70 4f 62 6a 20 3d 20  NDLE sleepObj = 
7700: 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 76 6f  NULL;.#endif..vo
7710: 69 64 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  id sqlite3_win32
7720: 5f 73 6c 65 65 70 28 44 57 4f 52 44 20 6d 69 6c  _sleep(DWORD mil
7730: 6c 69 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20  liseconds){.#if 
7740: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
7750: 20 20 69 66 20 28 20 73 6c 65 65 70 4f 62 6a 3d    if ( sleepObj=
7760: 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 73 6c 65  =NULL ){.    sle
7770: 65 70 4f 62 6a 20 3d 20 6f 73 43 72 65 61 74 65  epObj = osCreate
7780: 45 76 65 6e 74 45 78 57 28 4e 55 4c 4c 2c 20 4e  EventExW(NULL, N
7790: 55 4c 4c 2c 20 43 52 45 41 54 45 5f 45 56 45 4e  ULL, CREATE_EVEN
77a0: 54 5f 4d 41 4e 55 41 4c 5f 52 45 53 45 54 2c 0a  T_MANUAL_RESET,.
77b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77d0: 53 59 4e 43 48 52 4f 4e 49 5a 45 29 3b 0a 20 20  SYNCHRONIZE);.  
77e0: 7d 0a 20 20 61 73 73 65 72 74 28 20 73 6c 65 65  }.  assert( slee
77f0: 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20  pObj!=NULL );.  
7800: 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  osWaitForSingleO
7810: 62 6a 65 63 74 45 78 28 73 6c 65 65 70 4f 62 6a  bjectEx(sleepObj
7820: 2c 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20  , milliseconds, 
7830: 46 41 4c 53 45 29 3b 0a 23 65 6c 73 65 0a 20 20  FALSE);.#else.  
7840: 6f 73 53 6c 65 65 70 28 6d 69 6c 6c 69 73 65 63  osSleep(millisec
7850: 6f 6e 64 73 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  onds);.#endif.}.
7860: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
7870: 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66  ue (non-zero) if
7880: 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20   we are running 
7890: 75 6e 64 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e  under WinNT, Win
78a0: 32 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f 72  2K, WinXP,.** or
78b0: 20 57 69 6e 43 45 2e 20 20 52 65 74 75 72 6e 20   WinCE.  Return 
78c0: 66 61 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f 72  false (zero) for
78d0: 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f   Win95, Win98, o
78e0: 72 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48  r WinME..**.** H
78f0: 65 72 65 20 69 73 20 61 6e 20 69 6e 74 65 72 65  ere is an intere
7900: 73 74 69 6e 67 20 6f 62 73 65 72 76 61 74 69 6f  sting observatio
7910: 6e 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e 39 38  n:  Win95, Win98
7920: 2c 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b  , and WinME lack
7930: 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  .** the LockFile
7940: 45 78 28 29 20 41 50 49 2e 20 20 42 75 74 20 77  Ex() API.  But w
7950: 65 20 63 61 6e 20 73 74 69 6c 6c 20 73 74 61 74  e can still stat
7960: 69 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69  ically link agai
7970: 6e 73 74 20 74 68 61 74 0a 2a 2a 20 41 50 49 20  nst that.** API 
7980: 61 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f  as long as we do
7990: 6e 27 74 20 63 61 6c 6c 20 69 74 20 77 68 65 6e  n't call it when
79a0: 20 72 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39   running Win95/9
79b0: 38 2f 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f  8/ME.  A call to
79c0: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
79d0: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65   is used to dete
79e0: 72 6d 69 6e 65 20 69 66 20 74 68 65 20 68 6f 73  rmine if the hos
79f0: 74 20 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45  t is Win95/98/ME
7a00: 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f   or.** WinNT/2K/
7a10: 58 50 20 73 6f 20 74 68 61 74 20 77 65 20 77 69  XP so that we wi
7a20: 6c 6c 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20  ll know whether 
7a30: 6f 72 20 6e 6f 74 20 77 65 20 63 61 6e 20 73 61  or not we can sa
7a40: 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65  fely call.** the
7a50: 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50   LockFileEx() AP
7a60: 49 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  I..*/.#if SQLITE
7a70: 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c  _OS_WINCE || SQL
7a80: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 23 20 64  ITE_OS_WINRT.# d
7a90: 65 66 69 6e 65 20 69 73 4e 54 28 29 20 20 28 31  efine isNT()  (1
7aa0: 29 0a 23 65 6c 73 65 0a 20 20 73 74 61 74 69 63  ).#else.  static
7ab0: 20 69 6e 74 20 69 73 4e 54 28 76 6f 69 64 29 7b   int isNT(void){
7ac0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
7ad0: 5f 6f 73 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20  _os_type==0 ){. 
7ae0: 20 20 20 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e       OSVERSIONIN
7af0: 46 4f 41 20 73 49 6e 66 6f 3b 0a 20 20 20 20 20  FOA sInfo;.     
7b00: 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69   sInfo.dwOSVersi
7b10: 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a  onInfoSize = siz
7b20: 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20  eof(sInfo);.    
7b30: 20 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78    osGetVersionEx
7b40: 41 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 20  A(&sInfo);.     
7b50: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
7b60: 20 3d 20 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66   = sInfo.dwPlatf
7b70: 6f 72 6d 49 64 3d 3d 56 45 52 5f 50 4c 41 54 46  ormId==VER_PLATF
7b80: 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f 20 32  ORM_WIN32_NT ? 2
7b90: 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   : 1;.    }.    
7ba0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6f  return sqlite3_o
7bb0: 73 5f 74 79 70 65 3d 3d 32 3b 0a 20 20 7d 0a 23  s_type==2;.  }.#
7bc0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7bd0: 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 23 69 66  OS_WINCE */..#if
7be0: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
7bf0: 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41 6c  _MALLOC./*.** Al
7c00: 6c 6f 63 61 74 65 20 6e 42 79 74 65 73 20 6f 66  locate nBytes of
7c10: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
7c20: 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d  ic void *winMemM
7c30: 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73  alloc(int nBytes
7c40: 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  ){.  HANDLE hHea
7c50: 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20  p;.  void *p;.. 
7c60: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
7c70: 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20  ic();.  hHeap = 
7c80: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b  winMemGetHeap();
7c90: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
7ca0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
7cb0: 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f   hHeap!=INVALID_
7cc0: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
7cd0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
7ce0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
7cf0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
7d00: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
7d10: 61 73 73 65 72 74 20 28 20 6f 73 48 65 61 70 56  assert ( osHeapV
7d20: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
7d30: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
7d40: 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b  _FLAGS, NULL) );
7d50: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
7d60: 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20  ( nBytes>=0 );. 
7d70: 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63   p = osHeapAlloc
7d80: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
7d90: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
7da0: 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29   (SIZE_T)nBytes)
7db0: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
7dc0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
7dd0: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
7de0: 6c 65 64 20 74 6f 20 48 65 61 70 41 6c 6c 6f 63  led to HeapAlloc
7df0: 20 25 75 20 62 79 74 65 73 20 28 25 64 29 2c 20   %u bytes (%d), 
7e00: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
7e10: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 73            nBytes
7e20: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
7e30: 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70  (), (void*)hHeap
7e40: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
7e50: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  p;.}../*.** Free
7e60: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
7e70: 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72  ic void winMemFr
7e80: 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 29  ee(void *pPrior)
7e90: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  {.  HANDLE hHeap
7ea0: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
7eb0: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
7ec0: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
7ed0: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
7ee0: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
7ef0: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
7f00: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
7f10: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   );.#if !SQLITE_
7f20: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
7f30: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
7f40: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
7f50: 29 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73 48  ).  assert ( osH
7f60: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
7f70: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
7f80: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69  HEAP_FLAGS, pPri
7f90: 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  or) );.#endif.  
7fa0: 69 66 28 20 21 70 50 72 69 6f 72 20 29 20 72 65  if( !pPrior ) re
7fb0: 74 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69 6e 67  turn; /* Passing
7fc0: 20 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46 72 65   NULL to HeapFre
7fd0: 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20  e is undefined. 
7fe0: 2a 2f 0a 20 20 69 66 28 20 21 6f 73 48 65 61 70  */.  if( !osHeap
7ff0: 46 72 65 65 28 68 48 65 61 70 2c 20 53 51 4c 49  Free(hHeap, SQLI
8000: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
8010: 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 7b 0a  AGS, pPrior) ){.
8020: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
8030: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
8040: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 46 72 65  ailed to HeapFre
8050: 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 64 29 2c  e block %p (%d),
8060: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
8070: 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69 6f             pPrio
8080: 72 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  r, osGetLastErro
8090: 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61  r(), (void*)hHea
80a0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
80b0: 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65   Change the size
80c0: 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   of an existing 
80d0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
80e0: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
80f0: 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28   *winMemRealloc(
8100: 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e  void *pPrior, in
8110: 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41 4e  t nBytes){.  HAN
8120: 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f 69  DLE hHeap;.  voi
8130: 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41  d *p;..  winMemA
8140: 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20  ssertMagic();.  
8150: 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65  hHeap = winMemGe
8160: 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72  tHeap();.  asser
8170: 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20  t( hHeap!=0 );. 
8180: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
8190: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
81a0: 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c  ALUE );.#if !SQL
81b0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
81c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
81d0: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49  IN32_MALLOC_VALI
81e0: 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 20 28  DATE).  assert (
81f0: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
8200: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
8210: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
8220: 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69  pPrior) );.#endi
8230: 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  f.  assert( nByt
8240: 65 73 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  es>=0 );.  if( !
8250: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 20  pPrior ){.    p 
8260: 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48  = osHeapAlloc(hH
8270: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
8280: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53  2_HEAP_FLAGS, (S
8290: 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20  IZE_T)nBytes);. 
82a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
82b0: 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 28 68 48  osHeapReAlloc(hH
82c0: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
82d0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50  2_HEAP_FLAGS, pP
82e0: 72 69 6f 72 2c 20 28 53 49 5a 45 5f 54 29 6e 42  rior, (SIZE_T)nB
82f0: 79 74 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ytes);.  }.  if(
8300: 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   !p ){.    sqlit
8310: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
8320: 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  MEM, "failed to 
8330: 25 73 20 25 75 20 62 79 74 65 73 20 28 25 64 29  %s %u bytes (%d)
8340: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
8350: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69              pPri
8360: 6f 72 20 3f 20 22 48 65 61 70 52 65 41 6c 6c 6f  or ? "HeapReAllo
8370: 63 22 20 3a 20 22 48 65 61 70 41 6c 6c 6f 63 22  c" : "HeapAlloc"
8380: 2c 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74 4c  , nBytes, osGetL
8390: 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
83b0: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20  d*)hHeap);.  }. 
83c0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
83d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
83e0: 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74 73 74 61  ize of an outsta
83f0: 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e  nding allocation
8400: 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  , in bytes..*/.s
8410: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
8420: 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20  Size(void *p){. 
8430: 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20   HANDLE hHeap;. 
8440: 20 53 49 5a 45 5f 54 20 6e 3b 0a 0a 20 20 77 69   SIZE_T n;..  wi
8450: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
8460: 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e  );.  hHeap = win
8470: 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20  MemGetHeap();.  
8480: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30  assert( hHeap!=0
8490: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48   );.  assert( hH
84a0: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
84b0: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
84c0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
84d0: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
84e0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
84f0: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73  _VALIDATE).  ass
8500: 65 72 74 20 28 20 6f 73 48 65 61 70 56 61 6c 69  ert ( osHeapVali
8510: 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49  date(hHeap, SQLI
8520: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
8530: 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65  AGS, NULL) );.#e
8540: 6e 64 69 66 0a 20 20 69 66 28 20 21 70 20 29 20  ndif.  if( !p ) 
8550: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20  return 0;.  n = 
8560: 6f 73 48 65 61 70 53 69 7a 65 28 68 48 65 61 70  osHeapSize(hHeap
8570: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
8580: 45 41 50 5f 46 4c 41 47 53 2c 20 70 29 3b 0a 20  EAP_FLAGS, p);. 
8590: 20 69 66 28 20 6e 3d 3d 28 53 49 5a 45 5f 54 29   if( n==(SIZE_T)
85a0: 2d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  -1 ){.    sqlite
85b0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
85c0: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48  EM, "failed to H
85d0: 65 61 70 53 69 7a 65 20 62 6c 6f 63 6b 20 25 70  eapSize block %p
85e0: 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c   (%d), heap=%p",
85f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8600: 20 70 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72   p, osGetLastErr
8610: 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65  or(), (void*)hHe
8620: 61 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ap);.    return 
8630: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
8640: 28 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (int)n;.}../*.**
8650: 20 52 6f 75 6e 64 20 75 70 20 61 20 72 65 71 75   Round up a requ
8660: 65 73 74 20 73 69 7a 65 20 74 6f 20 74 68 65 20  est size to the 
8670: 6e 65 78 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63  next valid alloc
8680: 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73  ation size..*/.s
8690: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
86a0: 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a  Roundup(int n){.
86b0: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
86c0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
86d0: 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a  this module..*/.
86e0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
86f0: 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70  mInit(void *pApp
8700: 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44  Data){.  winMemD
8710: 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61  ata *pWinMemData
8720: 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a   = (winMemData *
8730: 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66  )pAppData;..  if
8740: 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29  ( !pWinMemData )
8750: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
8760: 52 52 4f 52 3b 0a 20 20 61 73 73 65 72 74 28 20  RROR;.  assert( 
8770: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67  pWinMemData->mag
8780: 69 63 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  ic==WINMEM_MAGIC
8790: 20 29 3b 0a 0a 23 69 66 20 21 53 51 4c 49 54 45   );..#if !SQLITE
87a0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c  _OS_WINRT && SQL
87b0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43  ITE_WIN32_HEAP_C
87c0: 52 45 41 54 45 0a 20 20 69 66 28 20 21 70 57 69  REATE.  if( !pWi
87d0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20  nMemData->hHeap 
87e0: 29 7b 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61  ){.    pWinMemDa
87f0: 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 48 65  ta->hHeap = osHe
8800: 61 70 43 72 65 61 74 65 28 53 51 4c 49 54 45 5f  apCreate(SQLITE_
8810: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
8820: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8840: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57          SQLITE_W
8850: 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53  IN32_HEAP_INIT_S
8860: 49 5a 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  IZE,.           
8870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8880: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
8890: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58  E_WIN32_HEAP_MAX
88a0: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 69 66 28 20  _SIZE);.    if( 
88b0: 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  !pWinMemData->hH
88c0: 65 61 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  eap ){.      sql
88d0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
88e0: 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 20  NOMEM,.         
88f0: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
8900: 43 72 65 61 74 65 20 28 25 64 29 2c 20 66 6c 61  Create (%d), fla
8910: 67 73 3d 25 75 2c 20 69 6e 69 74 53 69 7a 65 3d  gs=%u, initSize=
8920: 25 75 2c 20 6d 61 78 53 69 7a 65 3d 25 75 22 2c  %u, maxSize=%u",
8930: 0a 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74  .          osGet
8940: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 53 51 4c  LastError(), SQL
8950: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
8960: 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20  LAGS,.          
8970: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
8980: 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 20 53 51 4c  P_INIT_SIZE, SQL
8990: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d  ITE_WIN32_HEAP_M
89a0: 41 58 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  AX_SIZE);.      
89b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
89c0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
89d0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e  WinMemData->bOwn
89e0: 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 61  ed = TRUE;.    a
89f0: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
8a00: 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a 20 20  ta->bOwned );.  
8a10: 7d 0a 23 65 6c 73 65 0a 20 20 70 57 69 6e 4d 65  }.#else.  pWinMe
8a20: 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f  mData->hHeap = o
8a30: 73 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 28  sGetProcessHeap(
8a40: 29 3b 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65  );.  if( !pWinMe
8a50: 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a  mData->hHeap ){.
8a60: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
8a70: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20  SQLITE_NOMEM,.  
8a80: 20 20 20 20 20 20 22 66 61 69 6c 65 64 20 74 6f        "failed to
8a90: 20 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 20   GetProcessHeap 
8aa0: 28 25 64 29 22 2c 20 6f 73 47 65 74 4c 61 73 74  (%d)", osGetLast
8ab0: 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 72 65  Error());.    re
8ac0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
8ad0: 4d 3b 0a 20 20 7d 0a 20 20 70 57 69 6e 4d 65 6d  M;.  }.  pWinMem
8ae0: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46  Data->bOwned = F
8af0: 41 4c 53 45 3b 0a 20 20 61 73 73 65 72 74 28 20  ALSE;.  assert( 
8b00: 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f  !pWinMemData->bO
8b10: 77 6e 65 64 20 29 3b 0a 23 65 6e 64 69 66 0a 20  wned );.#endif. 
8b20: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
8b30: 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 30 20 29  Data->hHeap!=0 )
8b40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  ;.  assert( pWin
8b50: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d  MemData->hHeap!=
8b60: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
8b70: 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c  ALUE );.#if !SQL
8b80: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
8b90: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
8ba0: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49  IN32_MALLOC_VALI
8bb0: 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20  DATE).  assert( 
8bc0: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 70  osHeapValidate(p
8bd0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
8be0: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
8bf0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c  HEAP_FLAGS, NULL
8c00: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  ) );.#endif.  re
8c10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8c20: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74 69  }../*.** Deiniti
8c30: 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c  alize this modul
8c40: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
8c50: 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e  d winMemShutdown
8c60: 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29  (void *pAppData)
8c70: 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a  {.  winMemData *
8c80: 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77  pWinMemData = (w
8c90: 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70  inMemData *)pApp
8ca0: 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57  Data;..  if( !pW
8cb0: 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75  inMemData ) retu
8cc0: 72 6e 3b 0a 20 20 69 66 28 20 70 57 69 6e 4d 65  rn;.  if( pWinMe
8cd0: 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a  mData->hHeap ){.
8ce0: 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e      assert( pWin
8cf0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d  MemData->hHeap!=
8d00: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
8d10: 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c  ALUE );.#if !SQL
8d20: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
8d30: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
8d40: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49  IN32_MALLOC_VALI
8d50: 44 41 54 45 29 0a 20 20 20 20 61 73 73 65 72 74  DATE).    assert
8d60: 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65  ( osHeapValidate
8d70: 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  (pWinMemData->hH
8d80: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
8d90: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55  2_HEAP_FLAGS, NU
8da0: 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  LL) );.#endif.  
8db0: 20 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74    if( pWinMemDat
8dc0: 61 2d 3e 62 4f 77 6e 65 64 20 29 7b 0a 20 20 20  a->bOwned ){.   
8dd0: 20 20 20 69 66 28 20 21 6f 73 48 65 61 70 44 65     if( !osHeapDe
8de0: 73 74 72 6f 79 28 70 57 69 6e 4d 65 6d 44 61 74  stroy(pWinMemDat
8df0: 61 2d 3e 68 48 65 61 70 29 20 29 7b 0a 20 20 20  a->hHeap) ){.   
8e00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
8e10: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22  (SQLITE_NOMEM, "
8e20: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 44 65  failed to HeapDe
8e30: 73 74 72 6f 79 20 28 25 64 29 2c 20 68 65 61 70  stroy (%d), heap
8e40: 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%p",.          
8e50: 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c            osGetL
8e60: 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69  astError(), (voi
8e70: 64 2a 29 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  d*)pWinMemData->
8e80: 68 48 65 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a  hHeap);.      }.
8e90: 20 20 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74        pWinMemDat
8ea0: 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53  a->bOwned = FALS
8eb0: 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69  E;.    }.    pWi
8ec0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20  nMemData->hHeap 
8ed0: 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = NULL;.  }.}../
8ee0: 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68  *.** Populate th
8ef0: 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f  e low-level memo
8f00: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 75  ry allocation fu
8f10: 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20  nction pointers 
8f20: 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f  in.** sqlite3Glo
8f30: 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 77 69 74 68  balConfig.m with
8f40: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65   pointers to the
8f50: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
8f60: 73 20 66 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 61  s file. The.** a
8f70: 72 67 75 6d 65 6e 74 73 20 73 70 65 63 69 66 79  rguments specify
8f80: 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65   the block of me
8f90: 6d 6f 72 79 20 74 6f 20 6d 61 6e 61 67 65 2e 0a  mory to manage..
8fa0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8fb0: 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
8fc0: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63 6f 6e  d by sqlite3_con
8fd0: 66 69 67 28 29 2c 20 61 6e 64 20 74 68 65 72 65  fig(), and there
8fe0: 66 6f 72 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 72  fore.** is not r
8ff0: 65 71 75 69 72 65 64 20 74 6f 20 62 65 20 74 68  equired to be th
9000: 72 65 61 64 73 61 66 65 20 28 69 74 20 69 73 20  readsafe (it is 
9010: 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73  not)..*/.const s
9020: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
9030: 64 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65  ds *sqlite3MemGe
9040: 74 57 69 6e 33 32 28 76 6f 69 64 29 7b 0a 20 20  tWin32(void){.  
9050: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
9060: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
9070: 20 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 20 3d   winMemMethods =
9080: 20 7b 0a 20 20 20 20 77 69 6e 4d 65 6d 4d 61 6c   {.    winMemMal
9090: 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 46  loc,.    winMemF
90a0: 72 65 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52  ree,.    winMemR
90b0: 65 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d  ealloc,.    winM
90c0: 65 6d 53 69 7a 65 2c 0a 20 20 20 20 77 69 6e 4d  emSize,.    winM
90d0: 65 6d 52 6f 75 6e 64 75 70 2c 0a 20 20 20 20 77  emRoundup,.    w
90e0: 69 6e 4d 65 6d 49 6e 69 74 2c 0a 20 20 20 20 77  inMemInit,.    w
90f0: 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 2c 0a 20  inMemShutdown,. 
9100: 20 20 20 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61     &win_mem_data
9110: 0a 20 20 7d 3b 0a 20 20 72 65 74 75 72 6e 20 26  .  };.  return &
9120: 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d  winMemMethods;.}
9130: 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65  ..void sqlite3Me
9140: 6d 53 65 74 44 65 66 61 75 6c 74 28 76 6f 69 64  mSetDefault(void
9150: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  ){.  sqlite3_con
9160: 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
9170: 47 5f 4d 41 4c 4c 4f 43 2c 20 73 71 6c 69 74 65  G_MALLOC, sqlite
9180: 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 29 29 3b  3MemGetWin32());
9190: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
91a0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
91b0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65   */../*.** Conve
91c0: 72 74 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e  rt a UTF-8 strin
91d0: 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55  g to Microsoft U
91e0: 6e 69 63 6f 64 65 20 28 55 54 46 2d 31 36 3f 29  nicode (UTF-16?)
91f0: 2e 20 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  . .**.** Space t
9200: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
9210: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
9220: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
9230: 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50  oc..*/.static LP
9240: 57 53 54 52 20 75 74 66 38 54 6f 55 6e 69 63 6f  WSTR utf8ToUnico
9250: 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  de(const char *z
9260: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74  Filename){.  int
9270: 20 6e 43 68 61 72 3b 0a 20 20 4c 50 57 53 54 52   nChar;.  LPWSTR
9280: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a   zWideFilename;.
9290: 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c  .  nChar = osMul
92a0: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
92b0: 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69  (CP_UTF8, 0, zFi
92c0: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c  lename, -1, NULL
92d0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 43 68 61  , 0);.  if( nCha
92e0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  r==0 ){.    retu
92f0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 57 69 64  rn 0;.  }.  zWid
9300: 65 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69  eFilename = sqli
9310: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 43 68 61  te3_malloc( nCha
9320: 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69  r*sizeof(zWideFi
9330: 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20  lename[0]) );.  
9340: 69 66 28 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  if( zWideFilenam
9350: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
9360: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68 61  rn 0;.  }.  nCha
9370: 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54  r = osMultiByteT
9380: 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46  oWideChar(CP_UTF
9390: 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  8, 0, zFilename,
93a0: 20 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61   -1, zWideFilena
93b0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
93c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93d0: 20 20 20 20 6e 43 68 61 72 29 3b 0a 20 20 69 66      nChar);.  if
93e0: 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20  ( nChar==0 ){.  
93f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
9400: 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  WideFilename);. 
9410: 20 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65     zWideFilename
9420: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
9430: 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  rn zWideFilename
9440: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
9450: 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69  rt Microsoft Uni
9460: 63 6f 64 65 20 74 6f 20 55 54 46 2d 38 2e 20 20  code to UTF-8.  
9470: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
9480: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
9490: 67 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64  g is.** obtained
94a0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
94b0: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lloc()..*/.stati
94c0: 63 20 63 68 61 72 20 2a 75 6e 69 63 6f 64 65 54  c char *unicodeT
94d0: 6f 55 74 66 38 28 4c 50 43 57 53 54 52 20 7a 57  oUtf8(LPCWSTR zW
94e0: 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20  ideFilename){.  
94f0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61  int nByte;.  cha
9500: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20  r *zFilename;.. 
9510: 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43   nByte = osWideC
9520: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43  harToMultiByte(C
9530: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65  P_UTF8, 0, zWide
9540: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c  Filename, -1, 0,
9550: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28   0, 0, 0);.  if(
9560: 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20   nByte == 0 ){. 
9570: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
9580: 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73  .  zFilename = s
9590: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e  qlite3_malloc( n
95a0: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46  Byte );.  if( zF
95b0: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
95c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
95d0: 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65    nByte = osWide
95e0: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28  CharToMultiByte(
95f0: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64  CP_UTF8, 0, zWid
9600: 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a  eFilename, -1, z
9610: 46 69 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c  Filename, nByte,
9620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9640: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42   0, 0);.  if( nB
9650: 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  yte == 0 ){.    
9660: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69  sqlite3_free(zFi
9670: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69  lename);.    zFi
9680: 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  lename = 0;.  }.
9690: 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61    return zFilena
96a0: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
96b0: 76 65 72 74 20 61 6e 20 41 4e 53 49 20 73 74 72  vert an ANSI str
96c0: 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74  ing to Microsoft
96d0: 20 55 6e 69 63 6f 64 65 2c 20 62 61 73 65 64 20   Unicode, based 
96e0: 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  on the.** curren
96f0: 74 20 63 6f 64 65 70 61 67 65 20 73 65 74 74 69  t codepage setti
9700: 6e 67 73 20 66 6f 72 20 66 69 6c 65 20 61 70 69  ngs for file api
9710: 73 2e 0a 2a 2a 20 0a 2a 2a 20 53 70 61 63 65 20  s..** .** Space 
9720: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
9730: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
9740: 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20  btained.** from 
9750: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 0a  sqlite3_malloc..
9760: 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52  */.static LPWSTR
9770: 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 63   mbcsToUnicode(c
9780: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
9790: 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79  name){.  int nBy
97a0: 74 65 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4d 62  te;.  LPWSTR zMb
97b0: 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e  csFilename;.  in
97c0: 74 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73 41  t codepage = osA
97d0: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
97e0: 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f   ? CP_ACP : CP_O
97f0: 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d  EMCP;..  nByte =
9800: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
9810: 64 65 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c  deChar(codepage,
9820: 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d   0, zFilename, -
9830: 31 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  1, NULL,.       
9840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9850: 20 20 20 20 20 20 20 20 20 30 29 2a 73 69 7a 65           0)*size
9860: 6f 66 28 57 43 48 41 52 29 3b 0a 20 20 69 66 28  of(WCHAR);.  if(
9870: 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
9880: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
9890: 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d   zMbcsFilename =
98a0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
98b0: 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 4d   nByte*sizeof(zM
98c0: 62 63 73 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20  bcsFilename[0]) 
98d0: 29 3b 0a 20 20 69 66 28 20 7a 4d 62 63 73 46 69  );.  if( zMbcsFi
98e0: 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  lename==0 ){.   
98f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
9900: 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69   nByte = osMulti
9910: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 63  ByteToWideChar(c
9920: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c  odepage, 0, zFil
9930: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 4d 62 63 73  ename, -1, zMbcs
9940: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
9950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9960: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 29            nByte)
9970: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30  ;.  if( nByte==0
9980: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
9990: 66 72 65 65 28 7a 4d 62 63 73 46 69 6c 65 6e 61  free(zMbcsFilena
99a0: 6d 65 29 3b 0a 20 20 20 20 7a 4d 62 63 73 46 69  me);.    zMbcsFi
99b0: 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  lename = 0;.  }.
99c0: 20 20 72 65 74 75 72 6e 20 7a 4d 62 63 73 46 69    return zMbcsFi
99d0: 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
99e0: 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f   Convert Microso
99f0: 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 6d 75  ft Unicode to mu
9a00: 6c 74 69 2d 62 79 74 65 20 63 68 61 72 61 63 74  lti-byte charact
9a10: 65 72 20 73 74 72 69 6e 67 2c 20 62 61 73 65 64  er string, based
9a20: 20 6f 6e 20 74 68 65 0a 2a 2a 20 75 73 65 72 27   on the.** user'
9a30: 73 20 41 4e 53 49 20 63 6f 64 65 70 61 67 65 2e  s ANSI codepage.
9a40: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
9a50: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
9a60: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
9a70: 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
9a80: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
9a90: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75  /.static char *u
9aa0: 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 4c 50 43  nicodeToMbcs(LPC
9ab0: 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61  WSTR zWideFilena
9ac0: 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  me){.  int nByte
9ad0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  ;.  char *zFilen
9ae0: 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70  ame;.  int codep
9af0: 61 67 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41  age = osAreFileA
9b00: 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41  pisANSI() ? CP_A
9b10: 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a  CP : CP_OEMCP;..
9b20: 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65    nByte = osWide
9b30: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28  CharToMultiByte(
9b40: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69  codepage, 0, zWi
9b50: 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20  deFilename, -1, 
9b60: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69  0, 0, 0, 0);.  i
9b70: 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b  f( nByte == 0 ){
9b80: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
9b90: 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d   }.  zFilename =
9ba0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
9bb0: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
9bc0: 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a  zFilename==0 ){.
9bd0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
9be0: 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69  }.  nByte = osWi
9bf0: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
9c00: 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a  e(codepage, 0, z
9c10: 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  WideFilename, -1
9c20: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
9c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79               nBy
9c50: 74 65 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  te, 0, 0);.  if(
9c60: 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20   nByte == 0 ){. 
9c70: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
9c80: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
9c90: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  zFilename = 0;. 
9ca0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c   }.  return zFil
9cb0: 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
9cc0: 43 6f 6e 76 65 72 74 20 6d 75 6c 74 69 62 79 74  Convert multibyt
9cd0: 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69  e character stri
9ce0: 6e 67 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70  ng to UTF-8.  Sp
9cf0: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ace to hold the.
9d00: 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  ** returned stri
9d10: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
9d20: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
9d30: 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  oc()..*/.char *s
9d40: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63  qlite3_win32_mbc
9d50: 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73 74 20  s_to_utf8(const 
9d60: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
9d70: 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  {.  char *zFilen
9d80: 61 6d 65 55 74 66 38 3b 0a 20 20 4c 50 57 53 54  ameUtf8;.  LPWST
9d90: 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a  R zTmpWide;..  z
9da0: 54 6d 70 57 69 64 65 20 3d 20 6d 62 63 73 54 6f  TmpWide = mbcsTo
9db0: 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d  Unicode(zFilenam
9dc0: 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69  e);.  if( zTmpWi
9dd0: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  de==0 ){.    ret
9de0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69  urn 0;.  }.  zFi
9df0: 6c 65 6e 61 6d 65 55 74 66 38 20 3d 20 75 6e 69  lenameUtf8 = uni
9e00: 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 6d 70 57  codeToUtf8(zTmpW
9e10: 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ide);.  sqlite3_
9e20: 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a  free(zTmpWide);.
9e30: 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61    return zFilena
9e40: 6d 65 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  meUtf8;.}../*.**
9e50: 20 43 6f 6e 76 65 72 74 20 55 54 46 2d 38 20 74   Convert UTF-8 t
9e60: 6f 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72  o multibyte char
9e70: 61 63 74 65 72 20 73 74 72 69 6e 67 2e 20 20 53  acter string.  S
9e80: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
9e90: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74   .** returned st
9ea0: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
9eb0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
9ec0: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20  lloc()..*/.char 
9ed0: 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75  *sqlite3_win32_u
9ee0: 74 66 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e 73  tf8_to_mbcs(cons
9ef0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
9f00: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  e){.  char *zFil
9f10: 65 6e 61 6d 65 4d 62 63 73 3b 0a 20 20 4c 50 57  enameMbcs;.  LPW
9f20: 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20  STR zTmpWide;.. 
9f30: 20 7a 54 6d 70 57 69 64 65 20 3d 20 75 74 66 38   zTmpWide = utf8
9f40: 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
9f50: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70  ame);.  if( zTmp
9f60: 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Wide==0 ){.    r
9f70: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
9f80: 46 69 6c 65 6e 61 6d 65 4d 62 63 73 20 3d 20 75  FilenameMbcs = u
9f90: 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54 6d  nicodeToMbcs(zTm
9fa0: 70 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65  pWide);.  sqlite
9fb0: 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29  3_free(zTmpWide)
9fc0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65  ;.  return zFile
9fd0: 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 0a 2f 2a  nameMbcs;.}.../*
9fe0: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
9ff0: 61 6c 75 65 20 6f 66 20 67 65 74 4c 61 73 74 45  alue of getLastE
a000: 72 72 6f 72 4d 73 67 0a 2a 2a 20 69 73 20 7a 65  rrorMsg.** is ze
a010: 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20  ro if the error 
a020: 6d 65 73 73 61 67 65 20 66 69 74 73 20 69 6e 20  message fits in 
a030: 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e  the buffer, or n
a040: 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72  on-zero.** other
a050: 77 69 73 65 20 28 69 66 20 74 68 65 20 6d 65 73  wise (if the mes
a060: 73 61 67 65 20 77 61 73 20 74 72 75 6e 63 61 74  sage was truncat
a070: 65 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ed)..*/.static i
a080: 6e 74 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d  nt getLastErrorM
a090: 73 67 28 44 57 4f 52 44 20 6c 61 73 74 45 72 72  sg(DWORD lastErr
a0a0: 6e 6f 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  no, int nBuf, ch
a0b0: 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20  ar *zBuf){.  /* 
a0c0: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 72 65  FormatMessage re
a0d0: 74 75 72 6e 73 20 30 20 6f 6e 20 66 61 69 6c 75  turns 0 on failu
a0e0: 72 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 69  re.  Otherwise i
a0f0: 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 74  t.  ** returns t
a100: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 54 43 48  he number of TCH
a110: 41 52 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ARs written to t
a120: 68 65 20 6f 75 74 70 75 74 0a 20 20 2a 2a 20 62  he output.  ** b
a130: 75 66 66 65 72 2c 20 65 78 63 6c 75 64 69 6e 67  uffer, excluding
a140: 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6e 67   the terminating
a150: 20 6e 75 6c 6c 20 63 68 61 72 2e 0a 20 20 2a 2f   null char..  */
a160: 0a 20 20 44 57 4f 52 44 20 64 77 4c 65 6e 20 3d  .  DWORD dwLen =
a170: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74   0;.  char *zOut
a180: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69 73 4e   = 0;..  if( isN
a190: 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  T() ){.#if SQLIT
a1a0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 57  E_OS_WINRT.    W
a1b0: 43 48 41 52 20 7a 54 65 6d 70 57 69 64 65 5b 4d  CHAR zTempWide[M
a1c0: 41 58 5f 50 41 54 48 2b 31 5d 3b 20 2f 2a 20 4e  AX_PATH+1]; /* N
a1d0: 4f 54 45 3a 20 53 6f 6d 65 77 68 61 74 20 61 72  OTE: Somewhat ar
a1e0: 62 69 74 72 61 72 79 2e 20 2a 2f 0a 20 20 20 20  bitrary. */.    
a1f0: 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74  dwLen = osFormat
a200: 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f  MessageW(FORMAT_
a210: 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53  MESSAGE_FROM_SYS
a220: 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEM |.          
a230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a240: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
a250: 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53  E_IGNORE_INSERTS
a260: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
a280: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
a290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2a0: 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20    lastErrno,.   
a2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2c0: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
a2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2e0: 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 57            zTempW
a2f0: 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ide,.           
a300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a310: 20 20 4d 41 58 5f 50 41 54 48 2c 0a 20 20 20 20    MAX_PATH,.    
a320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a330: 20 20 20 20 20 20 20 20 20 30 29 3b 0a 23 65 6c           0);.#el
a340: 73 65 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54  se.    LPWSTR zT
a350: 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a  empWide = NULL;.
a360: 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f      dwLen = osFo
a370: 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52  rmatMessageW(FOR
a380: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f  MAT_MESSAGE_ALLO
a390: 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20  CATE_BUFFER |.  
a3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3b0: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
a3c0: 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53  T_MESSAGE_FROM_S
a3d0: 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20  YSTEM |.        
a3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3f0: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
a400: 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52  AGE_IGNORE_INSER
a410: 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TS,.            
a420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a430: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
a440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a450: 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20      lastErrno,. 
a460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a470: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
a480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a490: 20 20 20 20 20 20 20 20 20 20 20 20 28 4c 50 57              (LPW
a4a0: 53 54 52 29 20 26 7a 54 65 6d 70 57 69 64 65 2c  STR) &zTempWide,
a4b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
a4d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
a4f0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
a500: 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20   dwLen > 0 ){.  
a510: 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20      /* allocate 
a520: 61 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e  a buffer and con
a530: 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a  vert to UTF8 */.
a540: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
a550: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
a560: 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 75  ;.      zOut = u
a570: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65  nicodeToUtf8(zTe
a580: 6d 70 57 69 64 65 29 3b 0a 20 20 20 20 20 20 73  mpWide);.      s
a590: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
a5a0: 61 6c 6c 6f 63 28 29 3b 0a 23 69 66 20 21 53 51  alloc();.#if !SQ
a5b0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
a5c0: 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20      /* free the 
a5d0: 73 79 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c  system buffer al
a5e0: 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61  located by Forma
a5f0: 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20  tMessage */.    
a600: 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54    osLocalFree(zT
a610: 65 6d 70 57 69 64 65 29 3b 0a 23 65 6e 64 69 66  empWide);.#endif
a620: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65  .    }.  }.#ifde
a630: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
a640: 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
a650: 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 20      char *zTemp 
a660: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65  = NULL;.    dwLe
a670: 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73  n = osFormatMess
a680: 61 67 65 41 28 46 4f 52 4d 41 54 5f 4d 45 53 53  ageA(FORMAT_MESS
a690: 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46  AGE_ALLOCATE_BUF
a6a0: 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20  FER |.          
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6c0: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
a6d0: 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a  E_FROM_SYSTEM |.
a6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
a700: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f  MAT_MESSAGE_IGNO
a710: 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20  RE_INSERTS,.    
a720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a730: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20           NULL,. 
a740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a750: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 74              last
a760: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a780: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
a790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7a0: 20 20 20 20 28 4c 50 53 54 52 29 20 26 7a 54 65      (LPSTR) &zTe
a7b0: 6d 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  mp,.            
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7d0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7f0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 77 4c   0);.    if( dwL
a800: 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20  en > 0 ){.      
a810: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75  /* allocate a bu
a820: 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74  ffer and convert
a830: 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20   to UTF8 */.    
a840: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
a850: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
a860: 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74      zOut = sqlit
a870: 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
a880: 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20  _utf8(zTemp);.  
a890: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
a8a0: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
a8b0: 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20      /* free the 
a8c0: 73 79 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c  system buffer al
a8d0: 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61  located by Forma
a8e0: 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20  tMessage */.    
a8f0: 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54    osLocalFree(zT
a900: 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  emp);.    }.  }.
a910: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 30 20 3d  #endif.  if( 0 =
a920: 3d 20 64 77 4c 65 6e 20 29 7b 0a 20 20 20 20 73  = dwLen ){.    s
a930: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
a940: 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 4f 73 45  nBuf, zBuf, "OsE
a950: 72 72 6f 72 20 30 78 25 78 20 28 25 75 29 22 2c  rror 0x%x (%u)",
a960: 20 6c 61 73 74 45 72 72 6e 6f 2c 20 6c 61 73 74   lastErrno, last
a970: 45 72 72 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  Errno);.  }else{
a980: 0a 20 20 20 20 2f 2a 20 63 6f 70 79 20 61 20 6d  .    /* copy a m
a990: 61 78 69 6d 75 6d 20 6f 66 20 6e 42 75 66 20 63  aximum of nBuf c
a9a0: 68 61 72 73 20 74 6f 20 6f 75 74 70 75 74 20 62  hars to output b
a9b0: 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c  uffer */.    sql
a9c0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
a9d0: 75 66 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20  uf, zBuf, "%s", 
a9e0: 7a 4f 75 74 29 3b 0a 20 20 20 20 2f 2a 20 66 72  zOut);.    /* fr
a9f0: 65 65 20 74 68 65 20 55 54 46 38 20 62 75 66 66  ee the UTF8 buff
aa00: 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  er */.    sqlite
aa10: 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20  3_free(zOut);.  
aa20: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
aa30: 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ./*.**.** This f
aa40: 75 6e 63 74 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67  unction - winLog
aa50: 45 72 72 6f 72 41 74 4c 69 6e 65 28 29 20 2d 20  ErrorAtLine() - 
aa60: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c  is only ever cal
aa70: 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61 63 72  led via the macr
aa80: 6f 0a 2a 2a 20 77 69 6e 4c 6f 67 45 72 72 6f 72  o.** winLogError
aa90: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ()..**.** This r
aaa0: 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
aab0: 64 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72  d after an error
aac0: 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53   occurs in an OS
aad0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74   function..** It
aae0: 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20   logs a message 
aaf0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f  using sqlite3_lo
ab00: 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  g() containing t
ab10: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
ab20: 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   of.** error cod
ab30: 65 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62  e and, if possib
ab40: 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65  le, the human-re
ab50: 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e  adable equivalen
ab60: 74 20 66 72 6f 6d 20 0a 2a 2a 20 46 6f 72 6d 61  t from .** Forma
ab70: 74 4d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  tMessage..**.** 
ab80: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
ab90: 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  nt passed to the
aba0: 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65   macro should be
abb0: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
abc0: 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  that.** will be 
abd0: 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69  returned to SQLi
abe0: 74 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f  te (e.g. SQLITE_
abf0: 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51  IOERR_DELETE, SQ
ac00: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20  LITE_CANTOPEN). 
ac10: 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73  .** The two subs
ac20: 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73  equent arguments
ac30: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e   should be the n
ac40: 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75  ame of the OS fu
ac50: 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66  nction that.** f
ac60: 61 69 6c 65 64 20 61 6e 64 20 74 68 65 20 74 68  ailed and the th
ac70: 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c  e associated fil
ac80: 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 20 69  e-system path, i
ac90: 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e  f any..*/.#defin
aca0: 65 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 61 2c  e winLogError(a,
acb0: 62 2c 63 2c 64 29 20 20 20 77 69 6e 4c 6f 67 45  b,c,d)   winLogE
acc0: 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63  rrorAtLine(a,b,c
acd0: 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61  ,d,__LINE__).sta
ace0: 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 67 45 72  tic int winLogEr
acf0: 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74  rorAtLine(.  int
ad00: 20 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20   errcode,       
ad10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ad20: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
ad30: 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73  e */.  DWORD las
ad40: 74 45 72 72 6e 6f 2c 20 20 20 20 20 20 20 20 20  tErrno,         
ad50: 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 33 32 20         /* Win32 
ad60: 6c 61 73 74 20 65 72 72 6f 72 20 2a 2f 0a 20 20  last error */.  
ad70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
ad80: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
ad90: 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75  /* Name of OS fu
ada0: 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c  nction that fail
adb0: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
adc0: 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
add0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
ade0: 70 61 74 68 20 61 73 73 6f 63 69 61 74 65 64 20  path associated 
adf0: 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20  with error */.  
ae00: 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20  int iLine       
ae10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae20: 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e  /* Source line n
ae30: 75 6d 62 65 72 20 77 68 65 72 65 20 65 72 72 6f  umber where erro
ae40: 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b  r occurred */.){
ae50: 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b 35 30 30  .  char zMsg[500
ae60: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
ae70: 20 20 20 2f 2a 20 48 75 6d 61 6e 20 72 65 61 64     /* Human read
ae80: 61 62 6c 65 20 65 72 72 6f 72 20 74 65 78 74 20  able error text 
ae90: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
aea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aeb0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
aec0: 6e 74 65 72 20 2a 2f 0a 0a 20 20 7a 4d 73 67 5b  nter */..  zMsg[
aed0: 30 5d 20 3d 20 30 3b 0a 20 20 67 65 74 4c 61 73  0] = 0;.  getLas
aee0: 74 45 72 72 6f 72 4d 73 67 28 6c 61 73 74 45 72  tErrorMsg(lastEr
aef0: 72 6e 6f 2c 20 73 69 7a 65 6f 66 28 7a 4d 73 67  rno, sizeof(zMsg
af00: 29 2c 20 7a 4d 73 67 29 3b 0a 20 20 61 73 73 65  ), zMsg);.  asse
af10: 72 74 28 20 65 72 72 63 6f 64 65 21 3d 53 51 4c  rt( errcode!=SQL
af20: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
af30: 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68  zPath==0 ) zPath
af40: 20 3d 20 22 22 3b 0a 20 20 66 6f 72 28 69 3d 30   = "";.  for(i=0
af50: 3b 20 7a 4d 73 67 5b 69 5d 20 26 26 20 7a 4d 73  ; zMsg[i] && zMs
af60: 67 5b 69 5d 21 3d 27 5c 72 27 20 26 26 20 7a 4d  g[i]!='\r' && zM
af70: 73 67 5b 69 5d 21 3d 27 5c 6e 27 3b 20 69 2b 2b  sg[i]!='\n'; i++
af80: 29 7b 7d 0a 20 20 7a 4d 73 67 5b 69 5d 20 3d 20  ){}.  zMsg[i] = 
af90: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  0;.  sqlite3_log
afa0: 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20  (errcode,.      
afb0: 22 6f 73 5f 77 69 6e 2e 63 3a 25 64 3a 20 28 25  "os_win.c:%d: (%
afc0: 64 29 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c  d) %s(%s) - %s",
afd0: 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20 6c 61  .      iLine, la
afe0: 73 74 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20  stErrno, zFunc, 
aff0: 7a 50 61 74 68 2c 20 7a 4d 73 67 0a 20 20 29 3b  zPath, zMsg.  );
b000: 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f  ..  return errco
b010: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  de;.}../*.** The
b020: 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   number of times
b030: 20 74 68 61 74 20 61 20 52 65 61 64 46 69 6c 65   that a ReadFile
b040: 28 29 2c 20 57 72 69 74 65 46 69 6c 65 28 29 2c  (), WriteFile(),
b050: 20 61 6e 64 20 44 65 6c 65 74 65 46 69 6c 65 28   and DeleteFile(
b060: 29 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74  ).** will be ret
b070: 72 69 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  ried following a
b080: 20 6c 6f 63 6b 69 6e 67 20 65 72 72 6f 72 20 2d   locking error -
b090: 20 70 72 6f 62 61 62 6c 79 20 63 61 75 73 65 64   probably caused
b0a0: 20 62 79 20 0a 2a 2a 20 61 6e 74 69 76 69 72 75   by .** antiviru
b0b0: 73 20 73 6f 66 74 77 61 72 65 2e 20 20 41 6c 73  s software.  Als
b0c0: 6f 20 74 68 65 20 69 6e 69 74 69 61 6c 20 64 65  o the initial de
b0d0: 6c 61 79 20 62 65 66 6f 72 65 20 74 68 65 20 66  lay before the f
b0e0: 69 72 73 74 20 72 65 74 72 79 2e 0a 2a 2a 20 54  irst retry..** T
b0f0: 68 65 20 64 65 6c 61 79 20 69 6e 63 72 65 61 73  he delay increas
b100: 65 73 20 6c 69 6e 65 61 72 6c 79 20 77 69 74 68  es linearly with
b110: 20 65 61 63 68 20 72 65 74 72 79 2e 0a 2a 2f 0a   each retry..*/.
b120: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
b130: 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59  IN32_IOERR_RETRY
b140: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
b150: 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54  _WIN32_IOERR_RET
b160: 52 59 20 31 30 0a 23 65 6e 64 69 66 0a 23 69 66  RY 10.#endif.#if
b170: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
b180: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45  2_IOERR_RETRY_DE
b190: 4c 41 59 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  LAY.# define SQL
b1a0: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
b1b0: 52 45 54 52 59 5f 44 45 4c 41 59 20 32 35 0a 23  RETRY_DELAY 25.#
b1c0: 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74  endif.static int
b1d0: 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79   win32IoerrRetry
b1e0: 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f   = SQLITE_WIN32_
b1f0: 49 4f 45 52 52 5f 52 45 54 52 59 3b 0a 73 74 61  IOERR_RETRY;.sta
b200: 74 69 63 20 69 6e 74 20 77 69 6e 33 32 49 6f 65  tic int win32Ioe
b210: 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d 20 53  rrRetryDelay = S
b220: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
b230: 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 3b 0a 0a  R_RETRY_DELAY;..
b240: 2f 2a 0a 2a 2a 20 49 66 20 61 20 52 65 61 64 46  /*.** If a ReadF
b250: 69 6c 65 28 29 20 6f 72 20 57 72 69 74 65 46 69  ile() or WriteFi
b260: 6c 65 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72  le() error occur
b270: 73 2c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72  s, invoke this r
b280: 6f 75 74 69 6e 65 0a 2a 2a 20 74 6f 20 73 65 65  outine.** to see
b290: 20 69 66 20 69 74 20 73 68 6f 75 6c 64 20 62 65   if it should be
b2a0: 20 72 65 74 72 69 65 64 2e 20 20 52 65 74 75 72   retried.  Retur
b2b0: 6e 20 54 52 55 45 20 74 6f 20 72 65 74 72 79 2e  n TRUE to retry.
b2c0: 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
b2d0: 2a 20 74 6f 20 67 69 76 65 20 75 70 20 77 69 74  * to give up wit
b2e0: 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73  h an error..*/.s
b2f0: 74 61 74 69 63 20 69 6e 74 20 72 65 74 72 79 49  tatic int retryI
b300: 6f 65 72 72 28 69 6e 74 20 2a 70 6e 52 65 74 72  oerr(int *pnRetr
b310: 79 2c 20 44 57 4f 52 44 20 2a 70 45 72 72 6f 72  y, DWORD *pError
b320: 29 7b 0a 20 20 44 57 4f 52 44 20 65 20 3d 20 6f  ){.  DWORD e = o
b330: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
b340: 0a 20 20 69 66 28 20 2a 70 6e 52 65 74 72 79 3e  .  if( *pnRetry>
b350: 3d 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79  =win32IoerrRetry
b360: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 72 72   ){.    if( pErr
b370: 6f 72 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 72  or ){.      *pEr
b380: 72 6f 72 20 3d 20 65 3b 0a 20 20 20 20 7d 0a 20  ror = e;.    }. 
b390: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
b3a0: 0a 20 20 69 66 28 20 65 3d 3d 45 52 52 4f 52 5f  .  if( e==ERROR_
b3b0: 41 43 43 45 53 53 5f 44 45 4e 49 45 44 20 7c 7c  ACCESS_DENIED ||
b3c0: 0a 20 20 20 20 20 20 65 3d 3d 45 52 52 4f 52 5f  .      e==ERROR_
b3d0: 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f 4e 20 7c  LOCK_VIOLATION |
b3e0: 7c 0a 20 20 20 20 20 20 65 3d 3d 45 52 52 4f 52  |.      e==ERROR
b3f0: 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49  _SHARING_VIOLATI
b400: 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ON ){.    sqlite
b410: 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 77 69  3_win32_sleep(wi
b420: 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c  n32IoerrRetryDel
b430: 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29 29  ay*(1+*pnRetry))
b440: 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79  ;.    ++*pnRetry
b450: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
b460: 20 20 7d 0a 20 20 69 66 28 20 70 45 72 72 6f 72    }.  if( pError
b470: 20 29 7b 0a 20 20 20 20 2a 70 45 72 72 6f 72 20   ){.    *pError 
b480: 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = e;.  }.  retur
b490: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  n 0;.}../*.** Lo
b4a0: 67 20 61 20 49 2f 4f 20 65 72 72 6f 72 20 72 65  g a I/O error re
b4b0: 74 72 79 20 65 70 69 73 6f 64 65 2e 0a 2a 2f 0a  try episode..*/.
b4c0: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 67 49  static void logI
b4d0: 6f 65 72 72 28 69 6e 74 20 6e 52 65 74 72 79 29  oerr(int nRetry)
b4e0: 7b 0a 20 20 69 66 28 20 6e 52 65 74 72 79 20 29  {.  if( nRetry )
b4f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
b500: 67 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  g(SQLITE_IOERR, 
b510: 0a 20 20 20 20 20 20 22 64 65 6c 61 79 65 64 20  .      "delayed 
b520: 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b 2f 73 68  %dms for lock/sh
b530: 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63 74 22 2c  aring conflict",
b540: 0a 20 20 20 20 20 20 77 69 6e 33 32 49 6f 65 72  .      win32Ioer
b550: 72 52 65 74 72 79 44 65 6c 61 79 2a 6e 52 65 74  rRetryDelay*nRet
b560: 72 79 2a 28 6e 52 65 74 72 79 2b 31 29 2f 32 0a  ry*(nRetry+1)/2.
b570: 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69      );.  }.}..#i
b580: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
b590: 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  E./*************
b5a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b5b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b5c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b5d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
b5e0: 54 68 69 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e  This section con
b5f0: 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 57  tains code for W
b600: 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 2f 2a  inCE only..*/./*
b610: 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 43 45 20 64  .** Windows CE d
b620: 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 6c  oes not have a l
b630: 6f 63 61 6c 74 69 6d 65 28 29 20 66 75 6e 63 74  ocaltime() funct
b640: 69 6f 6e 2e 20 20 53 6f 20 63 72 65 61 74 65 20  ion.  So create 
b650: 61 0a 2a 2a 20 73 75 62 73 74 69 74 75 74 65 2e  a.** substitute.
b660: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69  .*/.#include <ti
b670: 6d 65 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d 20  me.h>.struct tm 
b680: 2a 5f 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69  *__cdecl localti
b690: 6d 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20  me(const time_t 
b6a0: 2a 74 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 73  *t).{.  static s
b6b0: 74 72 75 63 74 20 74 6d 20 79 3b 0a 20 20 46 49  truct tm y;.  FI
b6c0: 4c 45 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b  LETIME uTm, lTm;
b6d0: 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20 70 54  .  SYSTEMTIME pT
b6e0: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  m;.  sqlite3_int
b6f0: 36 34 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20  64 t64;.  t64 = 
b700: 2a 74 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34  *t;.  t64 = (t64
b710: 20 2b 20 31 31 36 34 34 34 37 33 36 30 30 29 2a   + 11644473600)*
b720: 31 30 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e  10000000;.  uTm.
b730: 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20  dwLowDateTime = 
b740: 28 44 57 4f 52 44 29 28 74 36 34 20 26 20 30 78  (DWORD)(t64 & 0x
b750: 46 46 46 46 46 46 46 46 29 3b 0a 20 20 75 54 6d  FFFFFFFF);.  uTm
b760: 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 3d  .dwHighDateTime=
b770: 20 28 44 57 4f 52 44 29 28 74 36 34 20 3e 3e 20   (DWORD)(t64 >> 
b780: 33 32 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d  32);.  osFileTim
b790: 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65  eToLocalFileTime
b7a0: 28 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 6f  (&uTm,&lTm);.  o
b7b0: 73 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65  sFileTimeToSyste
b7c0: 6d 54 69 6d 65 28 26 6c 54 6d 2c 26 70 54 6d 29  mTime(&lTm,&pTm)
b7d0: 3b 0a 20 20 79 2e 74 6d 5f 79 65 61 72 20 3d 20  ;.  y.tm_year = 
b7e0: 70 54 6d 2e 77 59 65 61 72 20 2d 20 31 39 30 30  pTm.wYear - 1900
b7f0: 3b 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70  ;.  y.tm_mon = p
b800: 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20  Tm.wMonth - 1;. 
b810: 20 79 2e 74 6d 5f 77 64 61 79 20 3d 20 70 54 6d   y.tm_wday = pTm
b820: 2e 77 44 61 79 4f 66 57 65 65 6b 3b 0a 20 20 79  .wDayOfWeek;.  y
b830: 2e 74 6d 5f 6d 64 61 79 20 3d 20 70 54 6d 2e 77  .tm_mday = pTm.w
b840: 44 61 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75 72  Day;.  y.tm_hour
b850: 20 3d 20 70 54 6d 2e 77 48 6f 75 72 3b 0a 20 20   = pTm.wHour;.  
b860: 79 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77  y.tm_min = pTm.w
b870: 4d 69 6e 75 74 65 3b 0a 20 20 79 2e 74 6d 5f 73  Minute;.  y.tm_s
b880: 65 63 20 3d 20 70 54 6d 2e 77 53 65 63 6f 6e 64  ec = pTm.wSecond
b890: 3b 0a 20 20 72 65 74 75 72 6e 20 26 79 3b 0a 7d  ;.  return &y;.}
b8a0: 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45  ..#define HANDLE
b8b0: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28  _TO_WINFILE(a) (
b8c0: 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72  winFile*)&((char
b8d0: 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65  *)a)[-(int)offse
b8e0: 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a  tof(winFile,h)].
b8f0: 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
b900: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e   lock on the han
b910: 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20  dle h.*/.static 
b920: 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41  void winceMutexA
b930: 63 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29  cquire(HANDLE h)
b940: 7b 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72 72  {.   DWORD dwErr
b950: 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64  ;.   do {.     d
b960: 77 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72  wErr = osWaitFor
b970: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20  SingleObject(h, 
b980: 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20  INFINITE);.   } 
b990: 77 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20  while (dwErr != 
b9a0: 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26  WAIT_OBJECT_0 &&
b9b0: 20 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41   dwErr != WAIT_A
b9c0: 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a  BANDONED);.}./*.
b9d0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63  ** Release a loc
b9e0: 6b 20 61 63 71 75 69 72 65 64 20 62 79 20 77 69  k acquired by wi
b9f0: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
ba00: 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e  ).*/.#define win
ba10: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68  ceMutexRelease(h
ba20: 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68  ) ReleaseMutex(h
ba30: 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  )../*.** Create 
ba40: 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68  the mutex and sh
ba50: 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64  ared memory used
ba60: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20   for locking in 
ba70: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  the file.** desc
ba80: 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a  riptor pFile.*/.
ba90: 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63  static BOOL winc
baa0: 65 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73  eCreateLock(cons
bab0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
bac0: 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  e, winFile *pFil
bad0: 65 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f  e){.  LPWSTR zTo
bae0: 6b 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d  k;.  LPWSTR zNam
baf0: 65 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74 20  e;.  BOOL bInit 
bb00: 3d 20 54 52 55 45 3b 0a 0a 20 20 7a 4e 61 6d 65  = TRUE;..  zName
bb10: 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65   = utf8ToUnicode
bb20: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
bb30: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  f( zName==0 ){. 
bb40: 20 20 20 2f 2a 20 6f 75 74 20 6f 66 20 6d 65 6d     /* out of mem
bb50: 6f 72 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ory */.    retur
bb60: 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20  n FALSE;.  }..  
bb70: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
bb80: 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74 61  e local lockdata
bb90: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 46   */.  memset(&pF
bba0: 69 6c 65 2d 3e 6c 6f 63 61 6c 2c 20 30 2c 20 73  ile->local, 0, s
bbb0: 69 7a 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f 63  izeof(pFile->loc
bbc0: 61 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c  al));..  /* Repl
bbd0: 61 63 65 20 74 68 65 20 62 61 63 6b 73 6c 61 73  ace the backslas
bbe0: 68 65 73 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  hes from the fil
bbf0: 65 6e 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72 63  ename and lowerc
bc00: 61 73 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20 64  ase it.  ** to d
bc10: 65 72 69 76 65 20 61 20 6d 75 74 65 78 20 6e 61  erive a mutex na
bc20: 6d 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20  me. */.  zTok = 
bc30: 6f 73 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61  osCharLowerW(zNa
bc40: 6d 65 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54  me);.  for (;*zT
bc50: 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20  ok;zTok++){.    
bc60: 69 66 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c  if (*zTok == '\\
bc70: 27 29 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a  ') *zTok = '_';.
bc80: 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65    }..  /* Create
bc90: 2f 6f 70 65 6e 20 74 68 65 20 6e 61 6d 65 64 20  /open the named 
bca0: 6d 75 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65  mutex */.  pFile
bcb0: 2d 3e 68 4d 75 74 65 78 20 3d 20 6f 73 43 72 65  ->hMutex = osCre
bcc0: 61 74 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c 20  ateMutexW(NULL, 
bcd0: 46 41 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20  FALSE, zName);. 
bce0: 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75   if (!pFile->hMu
bcf0: 74 65 78 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  tex){.    pFile-
bd00: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
bd10: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
bd20: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
bd30: 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 70 46 69  QLITE_ERROR, pFi
bd40: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 22  le->lastErrno, "
bd50: 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 31  winceCreateLock1
bd60: 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
bd70: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
bd80: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
bd90: 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20  rn FALSE;.  }.. 
bda0: 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65 20   /* Acquire the 
bdb0: 6d 75 74 65 78 20 62 65 66 6f 72 65 20 63 6f 6e  mutex before con
bdc0: 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77 69 6e  tinuing */.  win
bdd0: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
bde0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
bdf0: 20 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65   .  /* Since the
be00: 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64 20   names of named 
be10: 6d 75 74 65 78 65 73 2c 20 73 65 6d 61 70 68 6f  mutexes, semapho
be20: 72 65 73 2c 20 66 69 6c 65 20 6d 61 70 70 69 6e  res, file mappin
be30: 67 73 20 65 74 63 20 61 72 65 20 0a 20 20 2a 2a  gs etc are .  **
be40: 20 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65 2c   case-sensitive,
be50: 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20   take advantage 
be60: 6f 66 20 74 68 61 74 20 62 79 20 75 70 70 65 72  of that by upper
be70: 63 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78  casing the mutex
be80: 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 75   name.  ** and u
be90: 73 69 6e 67 20 74 68 61 74 20 61 73 20 74 68 65  sing that as the
bea0: 20 73 68 61 72 65 64 20 66 69 6c 65 6d 61 70 70   shared filemapp
beb0: 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  ing name..  */. 
bec0: 20 6f 73 43 68 61 72 55 70 70 65 72 57 28 7a 4e   osCharUpperW(zN
bed0: 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68  ame);.  pFile->h
bee0: 53 68 61 72 65 64 20 3d 20 6f 73 43 72 65 61 74  Shared = osCreat
bef0: 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 49 4e  eFileMappingW(IN
bf00: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
bf10: 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20  UE, NULL,.      
bf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf40: 20 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45    PAGE_READWRITE
bf50: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63  , 0, sizeof(winc
bf60: 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20  eLock),.        
bf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf90: 7a 4e 61 6d 65 29 3b 20 20 0a 0a 20 20 2f 2a 20  zName);  ..  /* 
bfa0: 53 65 74 20 61 20 66 6c 61 67 20 74 68 61 74 20  Set a flag that 
bfb0: 69 6e 64 69 63 61 74 65 73 20 77 65 27 72 65 20  indicates we're 
bfc0: 74 68 65 20 66 69 72 73 74 20 74 6f 20 63 72 65  the first to cre
bfd0: 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73  ate the memory s
bfe0: 6f 20 69 74 20 0a 20 20 2a 2a 20 6d 75 73 74 20  o it .  ** must 
bff0: 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69  be zero-initiali
c000: 7a 65 64 20 2a 2f 0a 20 20 69 66 20 28 6f 73 47  zed */.  if (osG
c010: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 3d 3d  etLastError() ==
c020: 20 45 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45   ERROR_ALREADY_E
c030: 58 49 53 54 53 29 7b 0a 20 20 20 20 62 49 6e 69  XISTS){.    bIni
c040: 74 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a  t = FALSE;.  }..
c050: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
c060: 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Name);..  /* If 
c070: 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20  we succeeded in 
c080: 6d 61 6b 69 6e 67 20 74 68 65 20 73 68 61 72 65  making the share
c090: 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c  d memory handle,
c0a0: 20 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66   map it. */.  if
c0b0: 20 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64   (pFile->hShared
c0c0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  ){.    pFile->sh
c0d0: 61 72 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f 63  ared = (winceLoc
c0e0: 6b 2a 29 6f 73 4d 61 70 56 69 65 77 4f 66 46 69  k*)osMapViewOfFi
c0f0: 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  le(pFile->hShare
c100: 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d, .            
c110: 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c 46   FILE_MAP_READ|F
c120: 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20 30  ILE_MAP_WRITE, 0
c130: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63  , 0, sizeof(winc
c140: 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a 20  eLock));.    /* 
c150: 49 66 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65  If mapping faile
c160: 64 2c 20 63 6c 6f 73 65 20 74 68 65 20 73 68 61  d, close the sha
c170: 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c  red memory handl
c180: 65 20 61 6e 64 20 65 72 61 73 65 20 69 74 20 2a  e and erase it *
c190: 2f 0a 20 20 20 20 69 66 20 28 21 70 46 69 6c 65  /.    if (!pFile
c1a0: 2d 3e 73 68 61 72 65 64 29 7b 0a 20 20 20 20 20  ->shared){.     
c1b0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
c1c0: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
c1d0: 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e 4c  or();.      winL
c1e0: 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45  ogError(SQLITE_E
c1f0: 52 52 4f 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  RROR, pFile->las
c200: 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
c210: 20 20 20 20 20 20 20 22 77 69 6e 63 65 43 72 65         "winceCre
c220: 61 74 65 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c 65  ateLock2", zFile
c230: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6f 73 43  name);.      osC
c240: 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65  loseHandle(pFile
c250: 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20 20 20 20  ->hShared);.    
c260: 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64    pFile->hShared
c270: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
c280: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61 72   }..  /* If shar
c290: 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20  ed memory could 
c2a0: 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64 2c 20  not be created, 
c2b0: 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d  then close the m
c2c0: 75 74 65 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f  utex and fail */
c2d0: 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 53  .  if (pFile->hS
c2e0: 68 61 72 65 64 20 3d 3d 20 4e 55 4c 4c 29 7b 0a  hared == NULL){.
c2f0: 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65      winceMutexRe
c300: 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75  lease(pFile->hMu
c310: 74 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73  tex);.    osClos
c320: 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
c330: 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c  Mutex);.    pFil
c340: 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c  e->hMutex = NULL
c350: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41 4c  ;.    return FAL
c360: 53 45 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  SE;.  }.  .  /* 
c370: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  Initialize the s
c380: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66 20  hared memory if 
c390: 77 65 27 72 65 20 73 75 70 70 6f 73 65 64 20 74  we're supposed t
c3a0: 6f 20 2a 2f 0a 20 20 69 66 20 28 62 49 6e 69 74  o */.  if (bInit
c3b0: 29 20 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  ) {.    memset(p
c3c0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30 2c  File->shared, 0,
c3d0: 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63   sizeof(winceLoc
c3e0: 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63  k));.  }..  winc
c3f0: 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46  eMutexRelease(pF
c400: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
c410: 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 7d 0a 0a  return TRUE;.}..
c420: 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74 68  /*.** Destroy th
c430: 65 20 70 61 72 74 20 6f 66 20 77 69 6e 46 69 6c  e part of winFil
c440: 65 20 74 68 61 74 20 64 65 61 6c 73 20 77 69 74  e that deals wit
c450: 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f  h wince locks.*/
c460: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
c470: 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69  ceDestroyLock(wi
c480: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
c490: 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74   if (pFile->hMut
c4a0: 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75  ex){.    /* Acqu
c4b0: 69 72 65 20 74 68 65 20 6d 75 74 65 78 20 2a 2f  ire the mutex */
c4c0: 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 41  .    winceMutexA
c4d0: 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d  cquire(pFile->hM
c4e0: 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  utex);..    /* T
c4f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
c500: 63 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f 62 61  cks should proba
c510: 62 6c 79 20 61 73 73 65 72 74 20 69 6e 20 64 65  bly assert in de
c520: 62 75 67 20 6d 6f 64 65 2c 20 62 75 74 20 74 68  bug mode, but th
c530: 65 79 0a 20 20 20 20 20 20 20 61 72 65 20 74 6f  ey.       are to
c540: 20 63 6c 65 61 6e 75 70 20 69 6e 20 63 61 73 65   cleanup in case
c550: 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69   any locks remai
c560: 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20  ned open */.    
c570: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
c580: 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20  .nReaders){.    
c590: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
c5a0: 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20  >nReaders --;.  
c5b0: 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c    }.    if (pFil
c5c0: 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
c5d0: 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ed){.      pFile
c5e0: 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72  ->shared->bReser
c5f0: 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ved = FALSE;.   
c600: 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65   }.    if (pFile
c610: 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67  ->local.bPending
c620: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
c630: 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
c640: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a   = FALSE;.    }.
c650: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
c660: 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29  ocal.bExclusive)
c670: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
c680: 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
c690: 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d  e = FALSE;.    }
c6a0: 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65 66 65  ..    /* De-refe
c6b0: 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65 20  rence and close 
c6c0: 6f 75 72 20 63 6f 70 79 20 6f 66 20 74 68 65 20  our copy of the 
c6d0: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61  shared memory ha
c6e0: 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 6f 73 55 6e  ndle */.    osUn
c6f0: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46  mapViewOfFile(pF
c700: 69 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20  ile->shared);.  
c710: 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
c720: 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b  pFile->hShared);
c730: 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69  ..    /* Done wi
c740: 74 68 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a  th the mutex */.
c750: 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65      winceMutexRe
c760: 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75  lease(pFile->hMu
c770: 74 65 78 29 3b 20 20 20 20 0a 20 20 20 20 6f 73  tex);    .    os
c780: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
c790: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20  e->hMutex);.    
c7a0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20  pFile->hMutex = 
c7b0: 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  NULL;.  }.}../* 
c7c0: 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74  .** An implement
c7d0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63  ation of the Loc
c7e0: 6b 46 69 6c 65 28 29 20 41 50 49 20 6f 66 20 57  kFile() API of W
c7f0: 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f  indows for CE.*/
c800: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
c810: 63 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50  ceLockFile(.  LP
c820: 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20  HANDLE phFile,. 
c830: 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66   DWORD dwFileOff
c840: 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
c850: 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
c860: 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
c870: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
c880: 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62  w,.  DWORD nNumb
c890: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48  erOfBytesToLockH
c8a0: 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65  igh.){.  winFile
c8b0: 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45   *pFile = HANDLE
c8c0: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69  _TO_WINFILE(phFi
c8d0: 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74  le);.  BOOL bRet
c8e0: 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20  urn = FALSE;..  
c8f0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
c900: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67  (dwFileOffsetHig
c910: 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  h);.  UNUSED_PAR
c920: 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66  AMETER(nNumberOf
c930: 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29  BytesToLockHigh)
c940: 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d  ;..  if (!pFile-
c950: 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20  >hMutex) return 
c960: 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74  TRUE;.  winceMut
c970: 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
c980: 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  >hMutex);..  /* 
c990: 57 61 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75  Wanting an exclu
c9a0: 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  sive lock? */.  
c9b0: 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
c9c0: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
c9d0: 41 52 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20  ARED_FIRST.     
c9e0: 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79    && nNumberOfBy
c9f0: 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
ca00: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49  (DWORD)SHARED_SI
ca10: 5a 45 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69  ZE){.    if (pFi
ca20: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61  le->shared->nRea
ca30: 64 65 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69  ders == 0 && pFi
ca40: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63  le->shared->bExc
ca50: 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20  lusive == 0){.  
ca60: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
ca70: 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
ca80: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46   TRUE;.       pF
ca90: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
caa0: 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20  usive = TRUE;.  
cab0: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
cac0: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
cad0: 20 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64    /* Want a read
cae0: 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  -only lock? */. 
caf0: 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
cb00: 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
cb10: 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54  ORD)SHARED_FIRST
cb20: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e   &&.           n
cb30: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
cb40: 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
cb50: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61    if (pFile->sha
cb60: 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
cb70: 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69  == 0){.      pFi
cb80: 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
cb90: 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20  rs ++;.      if 
cba0: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
cbb0: 65 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20  eaders == 1){.  
cbc0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
cbd0: 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b  red->nReaders ++
cbe0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
cbf0: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
cc00: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
cc10: 57 61 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c  Want a pending l
cc20: 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69  ock? */.  else i
cc30: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
cc40: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e  ow == (DWORD)PEN
cc50: 44 49 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e 75  DING_BYTE && nNu
cc60: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
cc70: 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
cc80: 2f 2a 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67  /* If no pending
cc90: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61   lock has been a
cca0: 63 71 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63  cquired, then ac
ccb0: 71 75 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20  quire it */.    
ccc0: 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
ccd0: 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30  d->bPending == 0
cce0: 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
ccf0: 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
cd00: 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  g = TRUE;.      
cd10: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
cd20: 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20  nding = TRUE;.  
cd30: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
cd40: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
cd50: 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72   /* Want a reser
cd60: 76 65 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65  ved lock? */.  e
cd70: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
cd80: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
cd90: 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 20  D)RESERVED_BYTE 
cda0: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
cdb0: 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  sToLockLow == 1)
cdc0: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
cdd0: 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
cde0: 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20  ed == 0) {.     
cdf0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
ce00: 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45  bReserved = TRUE
ce10: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
ce20: 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d  ocal.bReserved =
ce30: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65   TRUE;.      bRe
ce40: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
ce50: 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d   }.  }..  winceM
ce60: 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
ce70: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65  e->hMutex);.  re
ce80: 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a  turn bReturn;.}.
ce90: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  ./*.** An implem
cea0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
ceb0: 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f  UnlockFile API o
cec0: 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45  f Windows for CE
ced0: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
cee0: 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28  winceUnlockFile(
cef0: 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69  .  LPHANDLE phFi
cf00: 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69  le,.  DWORD dwFi
cf10: 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  leOffsetLow,.  D
cf20: 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
cf30: 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e  tHigh,.  DWORD n
cf40: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
cf50: 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52  nlockLow,.  DWOR
cf60: 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
cf70: 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a  ToUnlockHigh.){.
cf80: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
cf90: 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e   = HANDLE_TO_WIN
cfa0: 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20  FILE(phFile);.  
cfb0: 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46  BOOL bReturn = F
cfc0: 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  ALSE;..  UNUSED_
cfd0: 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65  PARAMETER(dwFile
cfe0: 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55  OffsetHigh);.  U
cff0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
d000: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
d010: 55 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20  UnlockHigh);..  
d020: 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74  if (!pFile->hMut
d030: 65 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b  ex) return TRUE;
d040: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
d050: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
d060: 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  ex);..  /* Relea
d070: 73 69 6e 67 20 61 20 72 65 61 64 65 72 20 6c 6f  sing a reader lo
d080: 63 6b 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  ck or an exclusi
d090: 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20  ve lock */.  if 
d0a0: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
d0b0: 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
d0c0: 44 5f 46 49 52 53 54 29 7b 0a 20 20 20 20 2f 2a  D_FIRST){.    /*
d0d0: 20 44 69 64 20 77 65 20 68 61 76 65 20 61 6e 20   Did we have an 
d0e0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20  exclusive lock? 
d0f0: 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  */.    if (pFile
d100: 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
d110: 76 65 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ve){.      asser
d120: 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  t(nNumberOfBytes
d130: 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  ToUnlockLow == (
d140: 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
d150: 45 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  E);.      pFile-
d160: 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
d170: 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  e = FALSE;.     
d180: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
d190: 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c  bExclusive = FAL
d1a0: 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  SE;.      bRetur
d1b0: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
d1c0: 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 6a  .    /* Did we j
d1d0: 75 73 74 20 68 61 76 65 20 61 20 72 65 61 64 65  ust have a reade
d1e0: 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65  r lock? */.    e
d1f0: 6c 73 65 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c  lse if (pFile->l
d200: 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a  ocal.nReaders){.
d210: 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75        assert(nNu
d220: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
d230: 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  ockLow == (DWORD
d240: 29 53 48 41 52 45 44 5f 53 49 5a 45 20 7c 7c 20  )SHARED_SIZE || 
d250: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
d260: 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b  UnlockLow == 1);
d270: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
d280: 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b  cal.nReaders --;
d290: 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65  .      if (pFile
d2a0: 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
d2b0: 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 20   == 0).      {. 
d2c0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68         pFile->sh
d2d0: 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d  ared->nReaders -
d2e0: 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
d2f0: 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
d300: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
d310: 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70 65 6e   Releasing a pen
d320: 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65  ding lock */.  e
d330: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
d340: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
d350: 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 26  D)PENDING_BYTE &
d360: 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
d370: 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  ToUnlockLow == 1
d380: 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
d390: 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67  ->local.bPending
d3a0: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
d3b0: 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d  local.bPending =
d3c0: 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46   FALSE;.      pF
d3d0: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65  ile->shared->bPe
d3e0: 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20  nding = FALSE;. 
d3f0: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
d400: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  RUE;.    }.  }. 
d410: 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20   /* Releasing a 
d420: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f  reserved lock */
d430: 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69  .  else if (dwFi
d440: 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28  leOffsetLow == (
d450: 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f 42  DWORD)RESERVED_B
d460: 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66  YTE && nNumberOf
d470: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
d480: 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28   == 1){.    if (
d490: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
d4a0: 73 65 72 76 65 64 29 20 7b 0a 20 20 20 20 20 20  served) {.      
d4b0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
d4c0: 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a  served = FALSE;.
d4d0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
d4e0: 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
d4f0: 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52   FALSE;.      bR
d500: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
d510: 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65    }.  }..  wince
d520: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
d530: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72  le->hMutex);.  r
d540: 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d  eturn bReturn;.}
d550: 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ./*.** End of th
d560: 65 20 73 70 65 63 69 61 6c 20 63 6f 64 65 20 66  e special code f
d570: 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a  or wince.*******
d580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d5a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d5b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d5c0: 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f  ******/.#endif /
d5d0: 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  * SQLITE_OS_WINC
d5e0: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  E */../*.** Lock
d5f0: 20 61 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a   a file region..
d600: 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
d610: 69 6e 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50  inLockFile(.  LP
d620: 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20  HANDLE phFile,. 
d630: 20 44 57 4f 52 44 20 66 6c 61 67 73 2c 0a 20 20   DWORD flags,.  
d640: 44 57 4f 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c  DWORD offsetLow,
d650: 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74 48  .  DWORD offsetH
d660: 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d  igh,.  DWORD num
d670: 42 79 74 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52  BytesLow,.  DWOR
d680: 44 20 6e 75 6d 42 79 74 65 73 48 69 67 68 0a 29  D numBytesHigh.)
d690: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
d6a0: 57 49 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20  WINCE.  /*.  ** 
d6b0: 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45  NOTE: Windows CE
d6c0: 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66   is handled diff
d6d0: 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65  erently here due
d6e0: 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65   its lack of the
d6f0: 20 57 69 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20   Win32.  **     
d700: 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65 2e 0a    API LockFile..
d710: 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 77 69    */.  return wi
d720: 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70 68 46 69  nceLockFile(phFi
d730: 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f  le, offsetLow, o
d740: 66 66 73 65 74 48 69 67 68 2c 0a 20 20 20 20 20  ffsetHigh,.     
d750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d760: 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e    numBytesLow, n
d770: 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65  umBytesHigh);.#e
d780: 6c 73 65 0a 20 20 69 66 28 20 69 73 4e 54 28 29  lse.  if( isNT()
d790: 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50   ){.    OVERLAPP
d7a0: 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d  ED ovlp;.    mem
d7b0: 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69  set(&ovlp, 0, si
d7c0: 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29  zeof(OVERLAPPED)
d7d0: 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73  );.    ovlp.Offs
d7e0: 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a  et = offsetLow;.
d7f0: 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48      ovlp.OffsetH
d800: 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68  igh = offsetHigh
d810: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c  ;.    return osL
d820: 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68 46 69 6c  ockFileEx(*phFil
d830: 65 2c 20 66 6c 61 67 73 2c 20 30 2c 20 6e 75 6d  e, flags, 0, num
d840: 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74  BytesLow, numByt
d850: 65 73 48 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a  esHigh, &ovlp);.
d860: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
d870: 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 2a  urn osLockFile(*
d880: 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f  phFile, offsetLo
d890: 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e  w, offsetHigh, n
d8a0: 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20  umBytesLow,.    
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8c0: 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b    numBytesHigh);
d8d0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
d8e0: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 20 66 69  *.** Unlock a fi
d8f0: 6c 65 20 72 65 67 69 6f 6e 2e 0a 20 2a 2f 0a 73  le region.. */.s
d900: 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 55 6e  tatic BOOL winUn
d910: 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41  lockFile(.  LPHA
d920: 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44  NDLE phFile,.  D
d930: 57 4f 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a  WORD offsetLow,.
d940: 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74 48 69    DWORD offsetHi
d950: 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42  gh,.  DWORD numB
d960: 79 74 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  ytesLow,.  DWORD
d970: 20 6e 75 6d 42 79 74 65 73 48 69 67 68 0a 29 7b   numBytesHigh.){
d980: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
d990: 49 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e  INCE.  /*.  ** N
d9a0: 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20  OTE: Windows CE 
d9b0: 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65  is handled diffe
d9c0: 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20  rently here due 
d9d0: 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20  its lack of the 
d9e0: 57 69 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20 20  Win32.  **      
d9f0: 20 41 50 49 20 55 6e 6c 6f 63 6b 46 69 6c 65 2e   API UnlockFile.
da00: 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 77  .  */.  return w
da10: 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 70  inceUnlockFile(p
da20: 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77  hFile, offsetLow
da30: 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20  , offsetHigh,.  
da40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da50: 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73 4c         numBytesL
da60: 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ow, numBytesHigh
da70: 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 69  );.#else.  if( i
da80: 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45  sNT() ){.    OVE
da90: 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20  RLAPPED ovlp;.  
daa0: 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20    memset(&ovlp, 
dab0: 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41  0, sizeof(OVERLA
dac0: 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70  PPED));.    ovlp
dad0: 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74  .Offset = offset
dae0: 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66  Low;.    ovlp.Of
daf0: 66 73 65 74 48 69 67 68 20 3d 20 6f 66 66 73 65  fsetHigh = offse
db00: 74 48 69 67 68 3b 0a 20 20 20 20 72 65 74 75 72  tHigh;.    retur
db10: 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78  n osUnlockFileEx
db20: 28 2a 70 68 46 69 6c 65 2c 20 30 2c 20 6e 75 6d  (*phFile, 0, num
db30: 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74  BytesLow, numByt
db40: 65 73 48 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a  esHigh, &ovlp);.
db50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
db60: 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65  urn osUnlockFile
db70: 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74  (*phFile, offset
db80: 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c  Low, offsetHigh,
db90: 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20   numBytesLow,.  
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbb0: 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73 48 69        numBytesHi
dbc0: 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  gh);.  }.#endif.
dbd0: 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
dbe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dbf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dc00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dc10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dc20: 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 72  *.** The next gr
dc30: 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  oup of routines 
dc40: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f  implement the I/
dc50: 4f 20 6d 65 74 68 6f 64 73 20 73 70 65 63 69 66  O methods specif
dc60: 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 71  ied.** by the sq
dc70: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
dc80: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a   object..*******
dc90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dcb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dcc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dcd0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
dce0: 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20 63  Some Microsoft c
dcf0: 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68  ompilers lack th
dd00: 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a  is definition..*
dd10: 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49  /.#ifndef INVALI
dd20: 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
dd30: 45 52 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41  ER.# define INVA
dd40: 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
dd50: 4e 54 45 52 20 28 28 44 57 4f 52 44 29 2d 31 29  NTER ((DWORD)-1)
dd60: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
dd70: 6f 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ove the current 
dd80: 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  position of the 
dd90: 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 61 73 73  file handle pass
dda0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
ddb0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  .** argument to 
ddc0: 6f 66 66 73 65 74 20 69 4f 66 66 73 65 74 20 77  offset iOffset w
ddd0: 69 74 68 69 6e 20 74 68 65 20 66 69 6c 65 2e 20  ithin the file. 
dde0: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  If successful, r
ddf0: 65 74 75 72 6e 20 30 2e 20 0a 2a 2a 20 4f 74 68  eturn 0. .** Oth
de00: 65 72 77 69 73 65 2c 20 73 65 74 20 70 46 69 6c  erwise, set pFil
de10: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 61 6e 64  e->lastErrno and
de20: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
de30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
de40: 73 65 65 6b 57 69 6e 46 69 6c 65 28 77 69 6e 46  seekWinFile(winF
de50: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69  ile *pFile, sqli
de60: 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 66 73 65  te3_int64 iOffse
de70: 74 29 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t){.#if !SQLITE_
de80: 4f 53 5f 57 49 4e 52 54 0a 20 20 4c 4f 4e 47 20  OS_WINRT.  LONG 
de90: 75 70 70 65 72 42 69 74 73 3b 20 20 20 20 20 20  upperBits;      
dea0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f             /* Mo
deb0: 73 74 20 73 69 67 2e 20 33 32 20 62 69 74 73 20  st sig. 32 bits 
dec0: 6f 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f  of new offset */
ded0: 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74  .  LONG lowerBit
dee0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
def0: 20 20 20 2f 2a 20 4c 65 61 73 74 20 73 69 67 2e     /* Least sig.
df00: 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20   32 bits of new 
df10: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 44 57 4f 52  offset */.  DWOR
df20: 44 20 64 77 52 65 74 3b 20 20 20 20 20 20 20 20  D dwRet;        
df30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
df40: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
df50: 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28   SetFilePointer(
df60: 29 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73  ) */.  DWORD las
df70: 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20  tErrno;         
df80: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
df90: 72 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c  returned by GetL
dfa0: 61 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20  astError() */.. 
dfb0: 20 75 70 70 65 72 42 69 74 73 20 3d 20 28 4c 4f   upperBits = (LO
dfc0: 4e 47 29 28 28 69 4f 66 66 73 65 74 3e 3e 33 32  NG)((iOffset>>32
dfd0: 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) & 0x7fffffff);
dfe0: 0a 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 28  .  lowerBits = (
dff0: 4c 4f 4e 47 29 28 69 4f 66 66 73 65 74 20 26 20  LONG)(iOffset & 
e000: 30 78 66 66 66 66 66 66 66 66 29 3b 0a 0a 20 20  0xffffffff);..  
e010: 2f 2a 20 41 50 49 20 6f 64 64 69 74 79 3a 20 49  /* API oddity: I
e020: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 65  f successful, Se
e030: 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 72  tFilePointer() r
e040: 65 74 75 72 6e 73 20 61 20 64 77 6f 72 64 20 0a  eturns a dword .
e050: 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20    ** containing 
e060: 74 68 65 20 6c 6f 77 65 72 20 33 32 2d 62 69 74  the lower 32-bit
e070: 73 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c  s of the new fil
e080: 65 2d 6f 66 66 73 65 74 2e 20 4f 72 2c 20 69 66  e-offset. Or, if
e090: 20 69 74 20 66 61 69 6c 73 2c 0a 20 20 2a 2a 20   it fails,.  ** 
e0a0: 69 74 20 72 65 74 75 72 6e 73 20 49 4e 56 41 4c  it returns INVAL
e0b0: 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e  ID_SET_FILE_POIN
e0c0: 54 45 52 2e 20 48 6f 77 65 76 65 72 20 61 63 63  TER. However acc
e0d0: 6f 72 64 69 6e 67 20 74 6f 20 4d 53 44 4e 2c 20  ording to MSDN, 
e0e0: 0a 20 20 2a 2a 20 49 4e 56 41 4c 49 44 5f 53 45  .  ** INVALID_SE
e0f0: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 6d  T_FILE_POINTER m
e100: 61 79 20 61 6c 73 6f 20 62 65 20 61 20 76 61 6c  ay also be a val
e110: 69 64 20 6e 65 77 20 6f 66 66 73 65 74 2e 20 53  id new offset. S
e120: 6f 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a  o to determine .
e130: 20 20 2a 2a 20 77 68 65 74 68 65 72 20 61 6e 20    ** whether an 
e140: 65 72 72 6f 72 20 68 61 73 20 61 63 74 75 61 6c  error has actual
e150: 6c 79 20 6f 63 63 75 72 65 64 2c 20 69 74 20 69  ly occured, it i
e160: 73 20 61 6c 73 6f 20 6e 65 63 65 73 73 61 72 79  s also necessary
e170: 20 74 6f 20 63 61 6c 6c 20 0a 20 20 2a 2a 20 47   to call .  ** G
e180: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2e 0a 20  etLastError().. 
e190: 20 2a 2f 0a 20 20 64 77 52 65 74 20 3d 20 6f 73   */.  dwRet = os
e1a0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 70  SetFilePointer(p
e1b0: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69  File->h, lowerBi
e1c0: 74 73 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20  ts, &upperBits, 
e1d0: 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20  FILE_BEGIN);..  
e1e0: 69 66 28 20 28 64 77 52 65 74 3d 3d 49 4e 56 41  if( (dwRet==INVA
e1f0: 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
e200: 4e 54 45 52 0a 20 20 20 20 20 20 26 26 20 28 28  NTER.      && ((
e210: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
e220: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e  tLastError())!=N
e230: 4f 5f 45 52 52 4f 52 29 29 20 29 7b 0a 20 20 20  O_ERROR)) ){.   
e240: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
e250: 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
e260: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
e270: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b  QLITE_IOERR_SEEK
e280: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
e290: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
e2a0: 20 22 73 65 65 6b 57 69 6e 46 69 6c 65 22 2c 20   "seekWinFile", 
e2b0: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
e2c0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
e2d0: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ..  return 0;.#e
e2e0: 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 61  lse.  /*.  ** Sa
e2f0: 6d 65 20 61 73 20 61 62 6f 76 65 2c 20 65 78 63  me as above, exc
e300: 65 70 74 20 74 68 61 74 20 74 68 69 73 20 69 6d  ept that this im
e310: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 6f 72  plementation wor
e320: 6b 73 20 66 6f 72 20 57 69 6e 52 54 2e 0a 20 20  ks for WinRT..  
e330: 2a 2f 0a 0a 20 20 4c 41 52 47 45 5f 49 4e 54 45  */..  LARGE_INTE
e340: 47 45 52 20 78 3b 20 20 20 20 20 20 20 20 20 20  GER x;          
e350: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
e360: 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 42 4f 4f   offset */.  BOO
e370: 4c 20 62 52 65 74 3b 20 20 20 20 20 20 20 20 20  L bRet;         
e380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e390: 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
e3a0: 79 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  y SetFilePointer
e3b0: 45 78 28 29 20 2a 2f 0a 0a 20 20 78 2e 51 75 61  Ex() */..  x.Qua
e3c0: 64 50 61 72 74 20 3d 20 69 4f 66 66 73 65 74 3b  dPart = iOffset;
e3d0: 0a 20 20 62 52 65 74 20 3d 20 6f 73 53 65 74 46  .  bRet = osSetF
e3e0: 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 70 46 69  ilePointerEx(pFi
e3f0: 6c 65 2d 3e 68 2c 20 78 2c 20 30 2c 20 46 49 4c  le->h, x, 0, FIL
e400: 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28  E_BEGIN);..  if(
e410: 21 62 52 65 74 29 7b 0a 20 20 20 20 70 46 69 6c  !bRet){.    pFil
e420: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
e430: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
e440: 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  .    winLogError
e450: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45  (SQLITE_IOERR_SE
e460: 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  EK, pFile->lastE
e470: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
e480: 20 20 20 22 73 65 65 6b 57 69 6e 46 69 6c 65 22     "seekWinFile"
e490: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
e4a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
e4b0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   }..  return 0;.
e4c0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
e4d0: 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a  Close a file..**
e4e0: 0a 2a 2a 20 49 74 20 69 73 20 72 65 70 6f 72 74  .** It is report
e4f0: 65 64 20 74 68 61 74 20 61 6e 20 61 74 74 65 6d  ed that an attem
e500: 70 74 20 74 6f 20 63 6c 6f 73 65 20 61 20 68 61  pt to close a ha
e510: 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65 74  ndle might somet
e520: 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54  imes.** fail.  T
e530: 68 69 73 20 69 73 20 61 20 76 65 72 79 20 75 6e  his is a very un
e540: 72 65 61 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c  reasonable resul
e550: 74 2c 20 62 75 74 20 57 69 6e 64 6f 77 73 20 69  t, but Windows i
e560: 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66  s notorious.** f
e570: 6f 72 20 62 65 69 6e 67 20 75 6e 72 65 61 73 6f  or being unreaso
e580: 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f  nable so I do no
e590: 74 20 64 6f 75 62 74 20 74 68 61 74 20 69 74 20  t doubt that it 
e5a0: 6d 69 67 68 74 20 68 61 70 70 65 6e 2e 20 20 49  might happen.  I
e5b0: 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20 66  f.** the close f
e5c0: 61 69 6c 73 2c 20 77 65 20 70 61 75 73 65 20 66  ails, we pause f
e5d0: 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f  or 100 milliseco
e5e0: 6e 64 73 20 61 6e 64 20 74 72 79 20 61 67 61 69  nds and try agai
e5f0: 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61  n.  As.** many a
e600: 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  s MX_CLOSE_ATTEM
e610: 50 54 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63  PT attempts to c
e620: 6c 6f 73 65 20 74 68 65 20 68 61 6e 64 6c 65 20  lose the handle 
e630: 61 72 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a  are made before.
e640: 2a 2a 20 67 69 76 69 6e 67 20 75 70 20 61 6e 64  ** giving up and
e650: 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   returning an er
e660: 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ror..*/.#define 
e670: 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54  MX_CLOSE_ATTEMPT
e680: 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69   3.static int wi
e690: 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  nClose(sqlite3_f
e6a0: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20  ile *id){.  int 
e6b0: 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77  rc, cnt = 0;.  w
e6c0: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
e6d0: 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  (winFile*)id;.. 
e6e0: 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
e6f0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
e700: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73 65  _OMIT_WAL.  asse
e710: 72 74 28 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d  rt( pFile->pShm=
e720: 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 4f  =0 );.#endif.  O
e730: 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  STRACE(("CLOSE %
e740: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  d\n", pFile->h))
e750: 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d  ;.  do{.    rc =
e760: 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
e770: 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a  File->h);.    /*
e780: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
e790: 28 20 72 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43  ( rc=0; cnt=MX_C
e7a0: 4c 4f 53 45 5f 41 54 54 45 4d 50 54 3b 20 29 3b  LOSE_ATTEMPT; );
e7b0: 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 72 63   */.  }while( rc
e7c0: 3d 3d 30 20 26 26 20 2b 2b 63 6e 74 20 3c 20 4d  ==0 && ++cnt < M
e7d0: 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
e7e0: 26 26 20 28 73 71 6c 69 74 65 33 5f 77 69 6e 33  && (sqlite3_win3
e7f0: 32 5f 73 6c 65 65 70 28 31 30 30 29 2c 20 31 29  2_sleep(100), 1)
e800: 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   );.#if SQLITE_O
e810: 53 5f 57 49 4e 43 45 0a 23 64 65 66 69 6e 65 20  S_WINCE.#define 
e820: 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41  WINCE_DELETION_A
e830: 54 54 45 4d 50 54 53 20 33 0a 20 20 77 69 6e 63  TTEMPTS 3.  winc
e840: 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46 69  eDestroyLock(pFi
e850: 6c 65 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  le);.  if( pFile
e860: 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
e870: 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20   ){.    int cnt 
e880: 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 0a  = 0;.    while(.
e890: 20 20 20 20 20 20 20 20 20 20 20 6f 73 44 65 6c             osDel
e8a0: 65 74 65 46 69 6c 65 57 28 70 46 69 6c 65 2d 3e  eteFileW(pFile->
e8b0: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3d  zDeleteOnClose)=
e8c0: 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 6f 73  =0.        && os
e8d0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
e8e0: 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74  sW(pFile->zDelet
e8f0: 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78 66 66 66  eOnClose)!=0xfff
e900: 66 66 66 66 66 20 0a 20 20 20 20 20 20 20 20 26  fffff .        &
e910: 26 20 63 6e 74 2b 2b 20 3c 20 57 49 4e 43 45 5f  & cnt++ < WINCE_
e920: 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54  DELETION_ATTEMPT
e930: 53 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20  S.    ){.       
e940: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
e950: 65 65 70 28 31 30 30 29 3b 20 20 2f 2a 20 57 61  eep(100);  /* Wa
e960: 69 74 20 61 20 6c 69 74 74 6c 65 20 62 65 66 6f  it a little befo
e970: 72 65 20 74 72 79 69 6e 67 20 61 67 61 69 6e 20  re trying again 
e980: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  */.    }.    sql
e990: 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
e9a0: 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29  >zDeleteOnClose)
e9b0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f  ;.  }.#endif.  O
e9c0: 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  STRACE(("CLOSE %
e9d0: 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d %s\n", pFile->
e9e0: 68 2c 20 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22  h, rc ? "ok" : "
e9f0: 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 69 66 28  failed"));.  if(
ea00: 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65   rc ){.    pFile
ea10: 2d 3e 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  ->h = NULL;.  }.
ea20: 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31    OpenCounter(-1
ea30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f  );.  return rc ?
ea40: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20   SQLITE_OK.     
ea50: 20 20 20 20 20 20 20 3a 20 77 69 6e 4c 6f 67 45         : winLogE
ea60: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
ea70: 52 5f 43 4c 4f 53 45 2c 20 6f 73 47 65 74 4c 61  R_CLOSE, osGetLa
ea80: 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
ea90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eaa0: 20 20 20 20 20 22 77 69 6e 43 6c 6f 73 65 22 2c       "winClose",
eab0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
eac0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61  }../*.** Read da
ead0: 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69  ta from a file i
eae0: 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52  nto a buffer.  R
eaf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
eb00: 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20  if all.** bytes 
eb10: 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73  were read succes
eb20: 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54  sfully and SQLIT
eb30: 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68  E_IOERR if anyth
eb40: 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
eb50: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
eb60: 20 77 69 6e 52 65 61 64 28 0a 20 20 73 71 6c 69   winRead(.  sqli
eb70: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20  te3_file *id,   
eb80: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74         /* File t
eb90: 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
eba0: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
ebb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
ebc0: 72 69 74 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74  rite content int
ebd0: 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
ebe0: 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20  .  int amt,     
ebf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ec00: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
ec10: 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73 71   to read */.  sq
ec20: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
ec30: 65 74 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69  et       /* Begi
ec40: 6e 20 72 65 61 64 69 6e 67 20 61 74 20 74 68 69  n reading at thi
ec50: 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 23  s offset */.){.#
ec60: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
ec70: 4e 43 45 0a 20 20 4f 56 45 52 4c 41 50 50 45 44  NCE.  OVERLAPPED
ec80: 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20   overlapped;    
ec90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66        /* The off
eca0: 73 65 74 20 66 6f 72 20 52 65 61 64 46 69 6c 65  set for ReadFile
ecb0: 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 77 69  . */.#endif.  wi
ecc0: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
ecd0: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a  winFile*)id;  /*
ece0: 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a   file handle */.
ecf0: 20 20 44 57 4f 52 44 20 6e 52 65 61 64 3b 20 20    DWORD nRead;  
ed00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed10: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
ed20: 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
ed30: 61 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a  ad from file */.
ed40: 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30    int nRetry = 0
ed50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ed60: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
ed70: 65 74 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65  etrys */..  asse
ed80: 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53  rt( id!=0 );.  S
ed90: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
eda0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
edb0: 52 52 5f 52 45 41 44 29 3b 0a 20 20 4f 53 54 52  RR_READ);.  OSTR
edc0: 41 43 45 28 28 22 52 45 41 44 20 25 64 20 6c 6f  ACE(("READ %d lo
edd0: 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  ck=%d\n", pFile-
ede0: 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  >h, pFile->lockt
edf0: 79 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49  ype));..#if SQLI
ee00: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66  TE_OS_WINCE.  if
ee10: 28 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46  ( seekWinFile(pF
ee20: 69 6c 65 2c 20 6f 66 66 73 65 74 29 20 29 7b 0a  ile, offset) ){.
ee30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ee40: 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68  E_FULL;.  }.  wh
ee50: 69 6c 65 28 20 21 6f 73 52 65 61 64 46 69 6c 65  ile( !osReadFile
ee60: 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c  (pFile->h, pBuf,
ee70: 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20 30 29   amt, &nRead, 0)
ee80: 20 29 7b 0a 23 65 6c 73 65 0a 20 20 6d 65 6d 73   ){.#else.  mems
ee90: 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c 20  et(&overlapped, 
eea0: 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41  0, sizeof(OVERLA
eeb0: 50 50 45 44 29 29 3b 0a 20 20 6f 76 65 72 6c 61  PPED));.  overla
eec0: 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c  pped.Offset = (L
eed0: 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30 78  ONG)(offset & 0x
eee0: 66 66 66 66 66 66 66 66 29 3b 0a 20 20 6f 76 65  ffffffff);.  ove
eef0: 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69  rlapped.OffsetHi
ef00: 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66  gh = (LONG)((off
ef10: 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66  set>>32) & 0x7ff
ef20: 66 66 66 66 66 29 3b 0a 20 20 77 68 69 6c 65 28  fffff);.  while(
ef30: 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69   !osReadFile(pFi
ef40: 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74  le->h, pBuf, amt
ef50: 2c 20 26 6e 52 65 61 64 2c 20 26 6f 76 65 72 6c  , &nRead, &overl
ef60: 61 70 70 65 64 29 20 26 26 0a 20 20 20 20 20 20  apped) &&.      
ef70: 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f     osGetLastErro
ef80: 72 28 29 21 3d 45 52 52 4f 52 5f 48 41 4e 44 4c  r()!=ERROR_HANDL
ef90: 45 5f 45 4f 46 20 29 7b 0a 23 65 6e 64 69 66 0a  E_EOF ){.#endif.
efa0: 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72      DWORD lastEr
efb0: 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 72 65 74  rno;.    if( ret
efc0: 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c  ryIoerr(&nRetry,
efd0: 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63   &lastErrno) ) c
efe0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 46 69  ontinue;.    pFi
eff0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
f000: 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72  lastErrno;.    r
f010: 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
f020: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  r(SQLITE_IOERR_R
f030: 45 41 44 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  EAD, pFile->last
f040: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
f050: 20 20 20 20 22 77 69 6e 52 65 61 64 22 2c 20 70      "winRead", p
f060: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
f070: 7d 0a 20 20 6c 6f 67 49 6f 65 72 72 28 6e 52 65  }.  logIoerr(nRe
f080: 74 72 79 29 3b 0a 20 20 69 66 28 20 6e 52 65 61  try);.  if( nRea
f090: 64 3c 28 44 57 4f 52 44 29 61 6d 74 20 29 7b 0a  d<(DWORD)amt ){.
f0a0: 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61      /* Unread pa
f0b0: 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65  rts of the buffe
f0c0: 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66  r must be zero-f
f0d0: 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d  illed */.    mem
f0e0: 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75  set(&((char*)pBu
f0f0: 66 29 5b 6e 52 65 61 64 5d 2c 20 30 2c 20 61 6d  f)[nRead], 0, am
f100: 74 2d 6e 52 65 61 64 29 3b 0a 20 20 20 20 72 65  t-nRead);.    re
f110: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
f120: 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20  R_SHORT_READ;.  
f130: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
f140: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
f150: 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20  Write data from 
f160: 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20  a buffer into a 
f170: 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  file.  Return SQ
f180: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
f190: 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  ss.** or some ot
f1a0: 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  her error code o
f1b0: 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74  n failure..*/.st
f1c0: 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69 74  atic int winWrit
f1d0: 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  e(.  sqlite3_fil
f1e0: 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20  e *id,          
f1f0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20       /* File to 
f200: 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20 20  write into */.  
f210: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
f220: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f230: 2f 2a 20 54 68 65 20 62 79 74 65 73 20 74 6f 20  /* The bytes to 
f240: 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  be written */.  
f250: 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20  int amt,        
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f270: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
f280: 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  es to write */. 
f290: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
f2a0: 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20  ffset           
f2b0: 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
f2c0: 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67 69  the file to begi
f2d0: 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a  n writing at */.
f2e0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
f2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f300: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
f310: 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65  error has occure
f320: 64 2c 20 65 6c 73 65 20 66 61 6c 73 65 20 2a 2f  d, else false */
f330: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
f340: 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
f350: 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c  ;  /* File handl
f360: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72  e */.  int nRetr
f370: 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  y = 0;          
f380: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
f390: 20 6f 66 20 72 65 74 72 69 65 73 20 2a 2f 0a 0a   of retries */..
f3a0: 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
f3b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  );.  assert( pFi
f3c0: 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  le );.  Simulate
f3d0: 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
f3e0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
f3f0: 45 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69  E);.  SimulateDi
f400: 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65 74 75  skfullError(retu
f410: 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b  rn SQLITE_FULL);
f420: 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52  ..  OSTRACE(("WR
f430: 49 54 45 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e  ITE %d lock=%d\n
f440: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69  ", pFile->h, pFi
f450: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  le->locktype));.
f460: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
f470: 49 4e 43 45 0a 20 20 72 63 20 3d 20 73 65 65 6b  INCE.  rc = seek
f480: 57 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f  WinFile(pFile, o
f490: 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63  ffset);.  if( rc
f4a0: 3d 3d 30 20 29 7b 0a 23 65 6c 73 65 0a 20 20 7b  ==0 ){.#else.  {
f4b0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 53 51 4c  .#endif.#if !SQL
f4c0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20  ITE_OS_WINCE.   
f4d0: 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72   OVERLAPPED over
f4e0: 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20 20 2f  lapped;        /
f4f0: 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f 72  * The offset for
f500: 20 57 72 69 74 65 46 69 6c 65 2e 20 2a 2f 0a 23   WriteFile. */.#
f510: 65 6e 64 69 66 0a 20 20 20 20 75 38 20 2a 61 52  endif.    u8 *aR
f520: 65 6d 20 3d 20 28 75 38 20 2a 29 70 42 75 66 3b  em = (u8 *)pBuf;
f530: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
f540: 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65  yet to be writte
f550: 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65  n */.    int nRe
f560: 6d 20 3d 20 61 6d 74 3b 20 20 20 20 20 20 20 20  m = amt;        
f570: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
f580: 20 6f 66 20 62 79 74 65 73 20 79 65 74 20 74 6f   of bytes yet to
f590: 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20   be written */. 
f5a0: 20 20 20 44 57 4f 52 44 20 6e 57 72 69 74 65 3b     DWORD nWrite;
f5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5c0: 20 2f 2a 20 42 79 74 65 73 20 77 72 69 74 74 65   /* Bytes writte
f5d0: 6e 20 62 79 20 65 61 63 68 20 57 72 69 74 65 46  n by each WriteF
f5e0: 69 6c 65 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20  ile() call */.  
f5f0: 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
f600: 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 20 20 20  o = NO_ERROR;   
f610: 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
f620: 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f  d by GetLastErro
f630: 72 28 29 20 2a 2f 0a 0a 23 69 66 20 21 53 51 4c  r() */..#if !SQL
f640: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20  ITE_OS_WINCE.   
f650: 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70   memset(&overlap
f660: 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f  ped, 0, sizeof(O
f670: 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20  VERLAPPED));.   
f680: 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73   overlapped.Offs
f690: 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73  et = (LONG)(offs
f6a0: 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29  et & 0xffffffff)
f6b0: 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64  ;.    overlapped
f6c0: 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c  .OffsetHigh = (L
f6d0: 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32  ONG)((offset>>32
f6e0: 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) & 0x7fffffff);
f6f0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 77 68 69  .#endif..    whi
f700: 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 23 69  le( nRem>0 ){.#i
f710: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
f720: 45 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 57  E.      if( !osW
f730: 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e  riteFile(pFile->
f740: 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26  h, aRem, nRem, &
f750: 6e 57 72 69 74 65 2c 20 30 29 20 29 7b 0a 23 65  nWrite, 0) ){.#e
f760: 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 21 6f  lse.      if( !o
f770: 73 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65  sWriteFile(pFile
f780: 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c  ->h, aRem, nRem,
f790: 20 26 6e 57 72 69 74 65 2c 20 26 6f 76 65 72 6c   &nWrite, &overl
f7a0: 61 70 70 65 64 29 20 29 7b 0a 23 65 6e 64 69 66  apped) ){.#endif
f7b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 74  .        if( ret
f7c0: 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c  ryIoerr(&nRetry,
f7d0: 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63   &lastErrno) ) c
f7e0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
f7f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
f800: 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74 65        if( nWrite
f810: 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  <=0 ){.        l
f820: 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
f830: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
f840: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f850: 20 20 7d 0a 23 69 66 20 21 53 51 4c 49 54 45 5f    }.#if !SQLITE_
f860: 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 20 20 6f  OS_WINCE.      o
f870: 66 66 73 65 74 20 2b 3d 20 6e 57 72 69 74 65 3b  ffset += nWrite;
f880: 0a 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65  .      overlappe
f890: 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47  d.Offset = (LONG
f8a0: 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66  )(offset & 0xfff
f8b0: 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20 6f 76  fffff);.      ov
f8c0: 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48  erlapped.OffsetH
f8d0: 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66  igh = (LONG)((of
f8e0: 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66  fset>>32) & 0x7f
f8f0: 66 66 66 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a  ffffff);.#endif.
f900: 20 20 20 20 20 20 61 52 65 6d 20 2b 3d 20 6e 57        aRem += nW
f910: 72 69 74 65 3b 0a 20 20 20 20 20 20 6e 52 65 6d  rite;.      nRem
f920: 20 2d 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20   -= nWrite;.    
f930: 7d 0a 20 20 20 20 69 66 28 20 6e 52 65 6d 3e 30  }.    if( nRem>0
f940: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
f950: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
f960: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63  tErrno;.      rc
f970: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
f980: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
f990: 20 69 66 28 20 20 20 28 20 70 46 69 6c 65 2d 3e   if(   ( pFile->
f9a0: 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
f9b0: 5f 48 41 4e 44 4c 45 5f 44 49 53 4b 5f 46 55 4c  _HANDLE_DISK_FUL
f9c0: 4c 20 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 20  L ).       || ( 
f9d0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
f9e0: 3d 3d 45 52 52 4f 52 5f 44 49 53 4b 5f 46 55 4c  ==ERROR_DISK_FUL
f9f0: 4c 20 29 29 7b 0a 20 20 20 20 20 20 72 65 74 75  L )){.      retu
fa00: 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
fa10: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
fa20: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
fa30: 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 2c  ITE_IOERR_WRITE,
fa40: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
fa50: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
fa60: 22 77 69 6e 57 72 69 74 65 22 2c 20 70 46 69 6c  "winWrite", pFil
fa70: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  e->zPath);.  }el
fa80: 73 65 7b 0a 20 20 20 20 6c 6f 67 49 6f 65 72 72  se{.    logIoerr
fa90: 28 6e 52 65 74 72 79 29 3b 0a 20 20 7d 0a 20 20  (nRetry);.  }.  
faa0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
fab0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
fac0: 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65  ate an open file
fad0: 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20   to a specified 
fae0: 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  size.*/.static i
faf0: 6e 74 20 77 69 6e 54 72 75 6e 63 61 74 65 28 73  nt winTruncate(s
fb00: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
fb10: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
fb20: 42 79 74 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65  Byte){.  winFile
fb30: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
fb40: 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65  le*)id;  /* File
fb50: 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 20 2a   handle object *
fb60: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
fb70: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
fb80: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
fb90: 64 65 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63  de for this func
fba0: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tion */..  asser
fbb0: 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 4f  t( pFile );..  O
fbc0: 53 54 52 41 43 45 28 28 22 54 52 55 4e 43 41 54  STRACE(("TRUNCAT
fbd0: 45 20 25 64 20 25 6c 6c 64 5c 6e 22 2c 20 70 46  E %d %lld\n", pF
fbe0: 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 29 3b  ile->h, nByte));
fbf0: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
fc00: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
fc10: 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 29  _IOERR_TRUNCATE)
fc20: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75  ;..  /* If the u
fc30: 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72  ser has configur
fc40: 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20  ed a chunk-size 
fc50: 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74  for this file, t
fc60: 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a  runcate the.  **
fc70: 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74   file so that it
fc80: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20   consists of an 
fc90: 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f  integer number o
fca0: 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74  f chunks (i.e. t
fcb0: 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66  he.  ** actual f
fcc0: 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20 74  ile size after t
fcd0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79  he operation may
fce0: 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
fcf0: 74 68 65 20 72 65 71 75 65 73 74 65 64 0a 20 20  the requested.  
fd00: 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20  ** size)..  */. 
fd10: 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68   if( pFile->szCh
fd20: 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79  unk>0 ){.    nBy
fd30: 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70  te = ((nByte + p
fd40: 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20  File->szChunk - 
fd50: 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  1)/pFile->szChun
fd60: 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68  k) * pFile->szCh
fd70: 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  unk;.  }..  /* S
fd80: 65 74 45 6e 64 4f 66 46 69 6c 65 28 29 20 72 65  etEndOfFile() re
fd90: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77  turns non-zero w
fda0: 68 65 6e 20 73 75 63 63 65 73 73 66 75 6c 2c 20  hen successful, 
fdb0: 6f 72 20 7a 65 72 6f 20 77 68 65 6e 20 69 74 20  or zero when it 
fdc0: 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 69 66 28 20  fails. */.  if( 
fdd0: 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c  seekWinFile(pFil
fde0: 65 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20  e, nByte) ){.   
fdf0: 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
fe00: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  r(SQLITE_IOERR_T
fe10: 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e  RUNCATE, pFile->
fe20: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
fe30: 20 20 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e          "winTrun
fe40: 63 61 74 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a  cate1", pFile->z
fe50: 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 20 69  Path);.  }else i
fe60: 66 28 20 30 3d 3d 6f 73 53 65 74 45 6e 64 4f 66  f( 0==osSetEndOf
fe70: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29 20 29  File(pFile->h) )
fe80: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
fe90: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
fea0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72  stError();.    r
feb0: 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
fec0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
fed0: 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61  NCATE, pFile->la
fee0: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
fef0: 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61        "winTrunca
ff00: 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  te2", pFile->zPa
ff10: 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  th);.  }..  OSTR
ff20: 41 43 45 28 28 22 54 52 55 4e 43 41 54 45 20 25  ACE(("TRUNCATE %
ff30: 64 20 25 6c 6c 64 20 25 73 5c 6e 22 2c 20 70 46  d %lld %s\n", pF
ff40: 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 72  ile->h, nByte, r
ff50: 63 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22  c ? "failed" : "
ff60: 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ok"));.  return 
ff70: 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
ff80: 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
ff90: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
ffa0: 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e   of fullsyncs an
ffb0: 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20  d normal syncs. 
ffc0: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
ffd0: 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79   test.** that sy
ffe0: 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63  ncs and fullsync
fff0: 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20 61  s are occuring a
10000 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65  t the right time
10010 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
10020 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  3_sync_count = 0
10030 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75  ;.int sqlite3_fu
10040 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  llsync_count = 0
10050 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
10060 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
10070 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
10080 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
10090 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
100a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
100b0 69 6e 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66  inSync(sqlite3_f
100c0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61  ile *id, int fla
100d0 67 73 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  gs){.#ifndef SQL
100e0 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f 2a  ITE_NO_SYNC.  /*
100f0 0a 20 20 2a 2a 20 55 73 65 64 20 6f 6e 6c 79 20  .  ** Used only 
10100 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  when SQLITE_NO_S
10110 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  YNC is not defin
10120 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f 4c  ed..   */.  BOOL
10130 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20   rc;.#endif.#if 
10140 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
10150 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
10160 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20  ITE_NO_SYNC) || 
10170 5c 0a 20 20 20 20 28 64 65 66 69 6e 65 64 28 53  \.    (defined(S
10180 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64  QLITE_TEST) && d
10190 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
101a0 42 55 47 29 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  BUG)).  /*.  ** 
101b0 55 73 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45  Used when SQLITE
101c0 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20  _NO_SYNC is not 
101d0 64 65 66 69 6e 65 64 20 61 6e 64 20 62 79 20 74  defined and by t
101e0 68 65 20 61 73 73 65 72 74 28 29 20 61 6e 64 2f  he assert() and/
101f0 6f 72 0a 20 20 2a 2a 20 4f 53 54 52 41 43 45 28  or.  ** OSTRACE(
10200 29 20 6d 61 63 72 6f 73 2e 0a 20 20 20 2a 2f 0a  ) macros..   */.
10210 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
10220 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
10230 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
10240 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 23  PARAMETER(id);.#
10250 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
10260 20 70 46 69 6c 65 20 29 3b 0a 20 20 2f 2a 20 43   pFile );.  /* C
10270 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66  heck that one of
10280 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
10290 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20  MAL or FULL was 
102a0 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65  passed */.  asse
102b0 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d  rt((flags&0x0F)=
102c0 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  =SQLITE_SYNC_NOR
102d0 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c  MAL.      || (fl
102e0 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
102f0 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b  E_SYNC_FULL.  );
10300 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59  ..  OSTRACE(("SY
10310 4e 43 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22  NC %d lock=%d\n"
10320 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c  , pFile->h, pFil
10330 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a  e->locktype));..
10340 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74    /* Unix cannot
10350 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65  , but some syste
10360 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ms may return SQ
10370 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68  LITE_FULL from h
10380 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c  ere. This.  ** l
10390 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20 74  ine is to test t
103a0 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65  hat doing so doe
103b0 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20  s not cause any 
103c0 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20  problems..  */. 
103d0 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
103e0 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  lError( return S
103f0 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 23  QLITE_FULL );..#
10400 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54 45  ifndef SQLITE_TE
10410 53 54 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ST.  UNUSED_PARA
10420 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 23 65  METER(flags);.#e
10430 6c 73 65 0a 20 20 69 66 28 20 28 66 6c 61 67 73  lse.  if( (flags
10440 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
10450 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  YNC_FULL ){.    
10460 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
10470 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20  _count++;.  }.  
10480 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
10490 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nt++;.#endif..  
104a0 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65  /* If we compile
104b0 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  d with the SQLIT
104c0 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20  E_NO_SYNC flag, 
104d0 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20  then syncing is 
104e0 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a  a.  ** no-op.  *
104f0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
10500 4e 4f 5f 53 59 4e 43 0a 20 20 72 65 74 75 72 6e  NO_SYNC.  return
10510 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73   SQLITE_OK;.#els
10520 65 0a 20 20 72 63 20 3d 20 6f 73 46 6c 75 73 68  e.  rc = osFlush
10530 46 69 6c 65 42 75 66 66 65 72 73 28 70 46 69 6c  FileBuffers(pFil
10540 65 2d 3e 68 29 3b 0a 20 20 53 69 6d 75 6c 61 74  e->h);.  Simulat
10550 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 46 41 4c  eIOError( rc=FAL
10560 53 45 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29  SE );.  if( rc )
10570 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
10580 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
10590 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
105a0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
105b0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 65  tError();.    re
105c0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
105d0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
105e0 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  YNC, pFile->last
105f0 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
10600 20 20 20 20 22 77 69 6e 53 79 6e 63 22 2c 20 70      "winSync", p
10610 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
10620 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
10630 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
10640 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
10650 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a  a file in bytes.
10660 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
10670 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  nFileSize(sqlite
10680 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69  3_file *id, sqli
10690 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65  te3_int64 *pSize
106a0 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  ){.  winFile *pF
106b0 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
106c0 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  id;.  int rc = S
106d0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
106e0 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
106f0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
10700 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
10710 45 52 52 5f 46 53 54 41 54 29 3b 0a 23 69 66 20  ERR_FSTAT);.#if 
10720 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
10730 20 20 7b 0a 20 20 20 20 46 49 4c 45 5f 53 54 41    {.    FILE_STA
10740 4e 44 41 52 44 5f 49 4e 46 4f 20 69 6e 66 6f 3b  NDARD_INFO info;
10750 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 46 69  .    if( osGetFi
10760 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48  leInformationByH
10770 61 6e 64 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68  andleEx(pFile->h
10780 2c 20 46 69 6c 65 53 74 61 6e 64 61 72 64 49 6e  , FileStandardIn
10790 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo,.            
107a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107b0 20 20 20 20 20 20 20 20 20 26 69 6e 66 6f 2c 20           &info, 
107c0 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 20 29 7b  sizeof(info)) ){
107d0 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  .      *pSize = 
107e0 69 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c 65 2e 51  info.EndOfFile.Q
107f0 75 61 64 50 61 72 74 3b 0a 20 20 20 20 7d 65 6c  uadPart;.    }el
10800 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
10810 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
10820 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
10830 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
10840 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
10850 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d  RR_FSTAT, pFile-
10860 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
10870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10880 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22     "winFileSize"
10890 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
108a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
108b0 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52 44 20 75  .  {.    DWORD u
108c0 70 70 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57  pperBits;.    DW
108d0 4f 52 44 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20  ORD lowerBits;. 
108e0 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72     DWORD lastErr
108f0 6e 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65 72 42 69  no;..    lowerBi
10900 74 73 20 3d 20 6f 73 47 65 74 46 69 6c 65 53 69  ts = osGetFileSi
10910 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26 75 70  ze(pFile->h, &up
10920 70 65 72 42 69 74 73 29 3b 0a 20 20 20 20 2a 70  perBits);.    *p
10930 53 69 7a 65 20 3d 20 28 28 28 73 71 6c 69 74 65  Size = (((sqlite
10940 33 5f 69 6e 74 36 34 29 75 70 70 65 72 42 69 74  3_int64)upperBit
10950 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42  s)<<32) + lowerB
10960 69 74 73 3b 0a 20 20 20 20 69 66 28 20 20 20 28  its;.    if(   (
10970 6c 6f 77 65 72 42 69 74 73 20 3d 3d 20 49 4e 56  lowerBits == INV
10980 41 4c 49 44 5f 46 49 4c 45 5f 53 49 5a 45 29 0a  ALID_FILE_SIZE).
10990 20 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74         && ((last
109a0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
109b0 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52  tError())!=NO_ER
109c0 52 4f 52 29 20 29 7b 0a 20 20 20 20 20 20 70 46  ROR) ){.      pF
109d0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
109e0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
109f0 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
10a00 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
10a10 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61  FSTAT, pFile->la
10a20 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
10a30 20 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69        "winFileSi
10a40 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ze", pFile->zPat
10a50 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  h);.    }.  }.#e
10a60 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63  ndif.  return rc
10a70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46  ;.}../*.** LOCKF
10a80 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
10a90 54 45 4c 59 20 69 73 20 75 6e 64 65 66 69 6e 65  TELY is undefine
10aa0 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e 64 6f 77  d on some Window
10ab0 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69  s systems..*/.#i
10ac0 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 46  fndef LOCKFILE_F
10ad0 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 0a  AIL_IMMEDIATELY.
10ae0 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c  # define LOCKFIL
10af0 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
10b00 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66  LY 1.#endif..#if
10b10 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 45 58  ndef LOCKFILE_EX
10b20 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 23 20 64  CLUSIVE_LOCK.# d
10b30 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 45  efine LOCKFILE_E
10b40 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 32 0a  XCLUSIVE_LOCK 2.
10b50 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 69  #endif../*.** Hi
10b60 73 74 6f 72 69 63 61 6c 6c 79 2c 20 53 51 4c 69  storically, SQLi
10b70 74 65 20 68 61 73 20 75 73 65 64 20 62 6f 74 68  te has used both
10b80 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 61 6e   the LockFile an
10b90 64 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e  d LockFileEx fun
10ba0 63 74 69 6f 6e 73 2e 0a 2a 2a 20 57 68 65 6e 20  ctions..** When 
10bb0 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 66 75 6e  the LockFile fun
10bc0 63 74 69 6f 6e 20 77 61 73 20 75 73 65 64 2c 20  ction was used, 
10bd0 69 74 20 77 61 73 20 61 6c 77 61 79 73 20 65 78  it was always ex
10be0 70 65 63 74 65 64 20 74 6f 20 66 61 69 6c 0a 2a  pected to fail.*
10bf0 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 66  * immediately if
10c00 20 74 68 65 20 6c 6f 63 6b 20 63 6f 75 6c 64 20   the lock could 
10c10 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e  not be obtained.
10c20 20 20 41 6c 73 6f 2c 20 69 74 20 61 6c 77 61 79    Also, it alway
10c30 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a 2a 2a  s expected to.**
10c40 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75   obtain an exclu
10c50 73 69 76 65 20 6c 6f 63 6b 2e 20 20 54 68 65 73  sive lock.  Thes
10c60 65 20 66 6c 61 67 73 20 61 72 65 20 75 73 65 64  e flags are used
10c70 20 77 69 74 68 20 74 68 65 20 4c 6f 63 6b 46 69   with the LockFi
10c80 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  leEx function.**
10c90 20 61 6e 64 20 72 65 66 6c 65 63 74 20 74 68 6f   and reflect tho
10ca0 73 65 20 65 78 70 65 63 74 61 74 69 6f 6e 73 3b  se expectations;
10cb0 20 74 68 65 72 65 66 6f 72 65 2c 20 74 68 65 79   therefore, they
10cc0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63   should not be c
10cd0 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64  hanged..*/.#ifnd
10ce0 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  ef SQLITE_LOCKFI
10cf0 4c 45 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e  LE_FLAGS.# defin
10d00 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  e SQLITE_LOCKFIL
10d10 45 5f 46 4c 41 47 53 20 20 20 28 4c 4f 43 4b 46  E_FLAGS   (LOCKF
10d20 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
10d30 54 45 4c 59 20 7c 20 5c 0a 20 20 20 20 20 20 20  TELY | \.       
10d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d50 20 20 20 20 20 20 20 20 20 20 20 4c 4f 43 4b 46             LOCKF
10d60 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ILE_EXCLUSIVE_LO
10d70 43 4b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  CK).#endif../*.*
10d80 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 53 51 4c  * Currently, SQL
10d90 69 74 65 20 6e 65 76 65 72 20 63 61 6c 6c 73 20  ite never calls 
10da0 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66  the LockFileEx f
10db0 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75 74 20  unction without 
10dc0 77 61 6e 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63  wanting the.** c
10dd0 61 6c 6c 20 74 6f 20 66 61 69 6c 20 69 6d 6d 65  all to fail imme
10de0 64 69 61 74 65 6c 79 20 69 66 20 74 68 65 20 6c  diately if the l
10df0 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62  ock cannot be ob
10e00 74 61 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64  tained..*/.#ifnd
10e10 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  ef SQLITE_LOCKFI
10e20 4c 45 45 58 5f 46 4c 41 47 53 0a 23 20 64 65 66  LEEX_FLAGS.# def
10e30 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  ine SQLITE_LOCKF
10e40 49 4c 45 45 58 5f 46 4c 41 47 53 20 28 4c 4f 43  ILEEX_FLAGS (LOC
10e50 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
10e60 49 41 54 45 4c 59 29 0a 23 65 6e 64 69 66 0a 0a  IATELY).#endif..
10e70 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
10e80 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20  reader lock..** 
10e90 44 69 66 66 65 72 65 6e 74 20 41 50 49 20 72 6f  Different API ro
10ea0 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c 6c 65  utines are calle
10eb0 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  d depending on w
10ec0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
10ed0 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39 78 20 6f  is.** is Win9x o
10ee0 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74  r WinNT..*/.stat
10ef0 69 63 20 69 6e 74 20 67 65 74 52 65 61 64 4c 6f  ic int getReadLo
10f00 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  ck(winFile *pFil
10f10 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  e){.  int res;. 
10f20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 23   if( isNT() ){.#
10f30 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
10f40 43 45 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  CE.    /*.    **
10f50 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43   NOTE: Windows C
10f60 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66  E is handled dif
10f70 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75  ferently here du
10f80 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68  e its lack of th
10f90 65 20 57 69 6e 33 32 0a 20 20 20 20 2a 2a 20 20  e Win32.    **  
10fa0 20 20 20 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c       API LockFil
10fb0 65 45 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eEx..    */.    
10fc0 72 65 73 20 3d 20 77 69 6e 63 65 4c 6f 63 6b 46  res = winceLockF
10fd0 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
10fe0 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20  HARED_FIRST, 0, 
10ff0 31 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20  1, 0);.#else.   
11000 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69   res = winLockFi
11010 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51  le(&pFile->h, SQ
11020 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f  LITE_LOCKFILEEX_
11030 46 4c 41 47 53 2c 20 53 48 41 52 45 44 5f 46 49  FLAGS, SHARED_FI
11040 52 53 54 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  RST, 0,.        
11050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
11060 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 23  ARED_SIZE, 0);.#
11070 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66  endif.  }.#ifdef
11080 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
11090 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
110a0 20 20 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73     int lk;.    s
110b0 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
110c0 73 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c  s(sizeof(lk), &l
110d0 6b 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73  k);.    pFile->s
110e0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20  haredLockByte = 
110f0 28 73 68 6f 72 74 29 28 28 6c 6b 20 26 20 30 78  (short)((lk & 0x
11100 37 66 66 66 66 66 66 66 29 25 28 53 48 41 52 45  7fffffff)%(SHARE
11110 44 5f 53 49 5a 45 20 2d 20 31 29 29 3b 0a 20 20  D_SIZE - 1));.  
11120 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46    res = winLockF
11130 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
11140 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46  QLITE_LOCKFILE_F
11150 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20  LAGS,.          
11160 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
11170 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e  ED_FIRST+pFile->
11180 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
11190 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, 1, 0);.  }.#e
111a0 6e 64 69 66 0a 20 20 69 66 28 20 72 65 73 20 3d  ndif.  if( res =
111b0 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  = 0 ){.    pFile
111c0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
111d0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
111e0 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74      /* No need t
111f0 6f 20 6c 6f 67 20 61 20 66 61 69 6c 75 72 65 20  o log a failure 
11200 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20  to lock */.  }. 
11210 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
11220 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 72 65 61  /*.** Undo a rea
11230 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20  dlock.*/.static 
11240 69 6e 74 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f  int unlockReadLo
11250 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  ck(winFile *pFil
11260 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  e){.  int res;. 
11270 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
11280 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  ;.  if( isNT() )
11290 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55  {.    res = winU
112a0 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
112b0 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
112c0 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a  T, 0, SHARED_SIZ
112d0 45 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66 64 65  E, 0);.  }.#ifde
112e0 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
112f0 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
11300 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c      res = winUnl
11310 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
11320 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b  h, SHARED_FIRST+
11330 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
11340 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b  kByte, 0, 1, 0);
11350 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
11360 28 20 72 65 73 3d 3d 30 20 26 26 20 28 28 6c 61  ( res==0 && ((la
11370 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
11380 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52  astError())!=ERR
11390 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29 20 29  OR_NOT_LOCKED) )
113a0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
113b0 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
113c0 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  no;.    winLogEr
113d0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
113e0 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65 2d 3e  _UNLOCK, pFile->
113f0 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
11400 20 20 20 20 20 20 20 20 22 75 6e 6c 6f 63 6b 52          "unlockR
11410 65 61 64 4c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d  eadLock", pFile-
11420 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72  >zPath);.  }.  r
11430 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
11440 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
11450 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
11460 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
11470 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20  ameter locktype 
11480 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
11490 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
114a0 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
114b0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
114c0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
114d0 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
114e0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
114f0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
11500 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
11510 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
11520 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
11530 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
11540 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
11550 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
11560 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
11570 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
11580 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
11590 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
115a0 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
115b0 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
115c0 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
115d0 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
115e0 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
115f0 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
11600 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
11610 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
11620 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
11630 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
11640 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
11650 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
11660 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
11670 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
11680 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
11690 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
116a0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
116b0 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
116c0 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
116d0 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
116e0 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
116f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
11700 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
11710 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54  rease a lock.  T
11720 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72  he winUnlock() r
11730 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73  outine.** erases
11740 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e   all locks at on
11750 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 75  ce and returns u
11760 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  s immediately to
11770 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30   locking level 0
11780 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70  ..** It is not p
11790 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72  ossible to lower
117a0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
117b0 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20 61  el one step at a
117c0 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d   time.  You.** m
117d0 75 73 74 20 67 6f 20 73 74 72 61 69 67 68 74 20  ust go straight 
117e0 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  to locking level
117f0 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
11800 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74 65  t winLock(sqlite
11810 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
11820 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
11830 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11840 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
11850 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69  de from subrouti
11860 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  nes */.  int res
11870 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
11880 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 20 57  /* Result of a W
11890 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c  indows lock call
118a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63   */.  int newLoc
118b0 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20  ktype;       /* 
118c0 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  Set pFile->lockt
118d0 79 70 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ype to this valu
118e0 65 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  e before exiting
118f0 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e   */.  int gotPen
11900 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20  dingLock = 0;/* 
11910 54 72 75 65 20 69 66 20 77 65 20 61 63 71 75 69  True if we acqui
11920 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  red a PENDING lo
11930 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a  ck this time */.
11940 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
11950 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
11960 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
11970 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a  no = NO_ERROR;..
11980 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
11990 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
119a0 4f 43 4b 20 25 64 20 25 64 20 77 61 73 20 25 64  OCK %d %d was %d
119b0 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  (%d)\n",.       
119c0 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f      pFile->h, lo
119d0 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 6c  cktype, pFile->l
119e0 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e  ocktype, pFile->
119f0 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 29 29  sharedLockByte))
11a00 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
11a10 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f   is already a lo
11a20 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ck of this type 
11a30 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74  or more restrict
11a40 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ive on the.  ** 
11a50 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69  OsFile, do nothi
11a60 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68  ng. Don't use th
11a70 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  e end_lock: exit
11a80 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 73   path, as.  ** s
11a90 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74  qlite3OsEnterMut
11aa0 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
11ab0 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
11ac0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
11ad0 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70  ocktype>=locktyp
11ae0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
11af0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
11b00 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
11b10 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
11b20 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20  nce is correct. 
11b30 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
11b40 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e  ile->locktype!=N
11b50 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79  O_LOCK || lockty
11b60 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
11b70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
11b80 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c  ktype!=PENDING_L
11b90 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
11ba0 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52   locktype!=RESER
11bb0 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
11bc0 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  e->locktype==SHA
11bd0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  RED_LOCK );..  /
11be0 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e 44 49  * Lock the PENDI
11bf0 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 66 20  NG_LOCK byte if 
11c00 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71 75 69  we need to acqui
11c10 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  re a PENDING loc
11c20 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48 41 52  k or.  ** a SHAR
11c30 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77 65 20  ED lock.  If we 
11c40 61 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20  are acquiring a 
11c50 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
11c60 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f 66 0a   acquisition of.
11c70 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49 4e 47    ** the PENDING
11c80 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20 74 65  _LOCK byte is te
11c90 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  mporary..  */.  
11ca0 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 70 46  newLocktype = pF
11cb0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  ile->locktype;. 
11cc0 20 69 66 28 20 20 20 28 70 46 69 6c 65 2d 3e 6c   if(   (pFile->l
11cd0 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
11ce0 29 0a 20 20 20 20 20 7c 7c 20 28 20 20 20 28 6c  ).     || (   (l
11cf0 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
11d00 56 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20  VE_LOCK).       
11d10 20 20 26 26 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    && (pFile->loc
11d20 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f  ktype==RESERVED_
11d30 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20  LOCK)).  ){.    
11d40 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20 20 20  int cnt = 3;.   
11d50 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20   while( cnt-->0 
11d60 26 26 20 28 72 65 73 20 3d 20 77 69 6e 4c 6f 63  && (res = winLoc
11d70 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
11d80 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
11d90 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20  _FLAGS,.        
11da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11dc0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30   PENDING_BYTE, 0
11dd0 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20  , 1, 0))==0 ){. 
11de0 20 20 20 20 20 2f 2a 20 54 72 79 20 33 20 74 69       /* Try 3 ti
11df0 6d 65 73 20 74 6f 20 67 65 74 20 74 68 65 20 70  mes to get the p
11e00 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68  ending lock.  Th
11e10 69 73 20 69 73 20 6e 65 65 64 65 64 20 74 6f 20  is is needed to 
11e20 77 6f 72 6b 0a 20 20 20 20 20 20 2a 2a 20 61 72  work.      ** ar
11e30 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63 61  ound problems ca
11e40 75 73 65 64 20 62 79 20 69 6e 64 65 78 69 6e 67  used by indexing
11e50 20 61 6e 64 2f 6f 72 20 61 6e 74 69 2d 76 69 72   and/or anti-vir
11e60 75 73 20 73 6f 66 74 77 61 72 65 20 6f 6e 0a 20  us software on. 
11e70 20 20 20 20 20 2a 2a 20 57 69 6e 64 6f 77 73 20       ** Windows 
11e80 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20 20 2a  systems..      *
11e90 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 73 69  * If you are usi
11ea0 6e 67 20 74 68 69 73 20 63 6f 64 65 20 61 73 20  ng this code as 
11eb0 61 20 6d 6f 64 65 6c 20 66 6f 72 20 61 6c 74 65  a model for alte
11ec0 72 6e 61 74 69 76 65 20 56 46 53 65 73 2c 20 64  rnative VFSes, d
11ed0 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63  o not.      ** c
11ee0 6f 70 79 20 74 68 69 73 20 72 65 74 72 79 20 6c  opy this retry l
11ef0 6f 67 69 63 2e 20 20 49 74 20 69 73 20 61 20 68  ogic.  It is a h
11f00 61 63 6b 20 69 6e 74 65 6e 64 65 64 20 66 6f 72  ack intended for
11f10 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79 2e 0a 20   Windows only.. 
11f20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4f 53       */.      OS
11f30 54 52 41 43 45 28 28 22 63 6f 75 6c 64 20 6e 6f  TRACE(("could no
11f40 74 20 67 65 74 20 61 20 50 45 4e 44 49 4e 47 20  t get a PENDING 
11f50 6c 6f 63 6b 2e 20 63 6e 74 3d 25 64 5c 6e 22 2c  lock. cnt=%d\n",
11f60 20 63 6e 74 29 29 3b 0a 20 20 20 20 20 20 69 66   cnt));.      if
11f70 28 20 63 6e 74 20 29 20 73 71 6c 69 74 65 33 5f  ( cnt ) sqlite3_
11f80 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 29 3b 0a  win32_sleep(1);.
11f90 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50 65 6e      }.    gotPen
11fa0 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73 3b 0a  dingLock = res;.
11fb0 20 20 20 20 69 66 28 20 21 72 65 73 20 29 7b 0a      if( !res ){.
11fc0 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
11fd0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
11fe0 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ();.    }.  }.. 
11ff0 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 73 68   /* Acquire a sh
12000 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  ared lock.  */. 
12010 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
12020 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65  HARED_LOCK && re
12030 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  s ){.    assert(
12040 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
12050 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ==NO_LOCK );.   
12060 20 72 65 73 20 3d 20 67 65 74 52 65 61 64 4c 6f   res = getReadLo
12070 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 69  ck(pFile);.    i
12080 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
12090 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48  newLocktype = SH
120a0 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  ARED_LOCK;.    }
120b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74  else{.      last
120c0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
120d0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a  tError();.    }.
120e0 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
120f0 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  e a RESERVED loc
12100 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  k.  */.  if( loc
12110 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f  ktype==RESERVED_
12120 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
12130 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
12140 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ->locktype==SHAR
12150 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  ED_LOCK );.    r
12160 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
12170 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  (&pFile->h, SQLI
12180 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
12190 53 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  S, RESERVED_BYTE
121a0 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  , 0, 1, 0);.    
121b0 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
121c0 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52   newLocktype = R
121d0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20  ESERVED_LOCK;.  
121e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
121f0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
12200 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
12210 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71   }.  }..  /* Acq
12220 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c  uire a PENDING l
12230 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
12240 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
12250 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29  VE_LOCK && res )
12260 7b 0a 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70  {.    newLocktyp
12270 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  e = PENDING_LOCK
12280 3b 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67  ;.    gotPending
12290 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  Lock = 0;.  }.. 
122a0 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45   /* Acquire an E
122b0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 0a 20 20  XCLUSIVE lock.  
122c0 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
122d0 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
122e0 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
122f0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
12300 6f 63 6b 74 79 70 65 3e 3d 53 48 41 52 45 44 5f  ocktype>=SHARED_
12310 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20  LOCK );.    res 
12320 3d 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b  = unlockReadLock
12330 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 4f 53 54  (pFile);.    OST
12340 52 41 43 45 28 28 22 75 6e 72 65 61 64 6c 6f 63  RACE(("unreadloc
12350 6b 20 3d 20 25 64 5c 6e 22 2c 20 72 65 73 29 29  k = %d\n", res))
12360 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c  ;.    res = winL
12370 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
12380 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
12390 4c 45 5f 46 4c 41 47 53 2c 20 53 48 41 52 45 44  LE_FLAGS, SHARED
123a0 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20 20 20  _FIRST, 0,.     
123b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123c0 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
123d0 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b  ;.    if( res ){
123e0 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  .      newLockty
123f0 70 65 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c  pe = EXCLUSIVE_L
12400 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
12410 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
12420 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
12430 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  ();.      OSTRAC
12440 45 28 28 22 65 72 72 6f 72 2d 63 6f 64 65 20 3d  E(("error-code =
12450 20 25 64 5c 6e 22 2c 20 6c 61 73 74 45 72 72 6e   %d\n", lastErrn
12460 6f 29 29 3b 0a 20 20 20 20 20 20 67 65 74 52 65  o));.      getRe
12470 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
12480 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
12490 66 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67  f we are holding
124a0 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
124b0 74 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62 65  that ought to be
124c0 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e 0a   released, then.
124d0 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74 20    ** release it 
124e0 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
124f0 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 26  gotPendingLock &
12500 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  & locktype==SHAR
12510 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77  ED_LOCK ){.    w
12520 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
12530 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  ile->h, PENDING_
12540 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
12550 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
12560 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
12570 65 20 6c 6f 63 6b 20 68 61 73 20 68 65 6c 64 20  e lock has held 
12580 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  in the file desc
12590 72 69 70 74 6f 72 20 74 68 65 6e 0a 20 20 2a 2a  riptor then.  **
125a0 20 72 65 74 75 72 6e 20 74 68 65 20 61 70 70 72   return the appr
125b0 6f 70 72 69 61 74 65 20 72 65 73 75 6c 74 20 63  opriate result c
125c0 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ode..  */.  if( 
125d0 72 65 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  res ){.    rc = 
125e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
125f0 73 65 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  se{.    OSTRACE(
12600 28 22 4c 4f 43 4b 20 46 41 49 4c 45 44 20 25 64  ("LOCK FAILED %d
12610 20 74 72 79 69 6e 67 20 66 6f 72 20 25 64 20 62   trying for %d b
12620 75 74 20 67 6f 74 20 25 64 5c 6e 22 2c 20 70 46  ut got %d\n", pF
12630 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
12640 20 20 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77     locktype, new
12650 4c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 20 20  Locktype));.    
12660 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
12670 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
12680 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
12690 53 59 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  SY;.  }.  pFile-
126a0 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29  >locktype = (u8)
126b0 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20 20 72  newLocktype;.  r
126c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
126d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
126e0 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
126f0 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
12700 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
12710 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
12720 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
12730 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
12740 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
12750 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a   held, return.**
12760 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72   non-zero, other
12770 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  wise zero..*/.st
12780 61 74 69 63 20 69 6e 74 20 77 69 6e 43 68 65 63  atic int winChec
12790 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
127a0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
127b0 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
127c0 20 69 6e 74 20 72 63 3b 0a 20 20 77 69 6e 46 69   int rc;.  winFi
127d0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
127e0 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
127f0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
12800 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
12810 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
12820 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72  OCK; );..  asser
12830 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 69 66  t( id!=0 );.  if
12840 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
12850 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e>=RESERVED_LOCK
12860 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a   ){.    rc = 1;.
12870 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
12880 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
12890 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69   (local)\n", pFi
128a0 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d  le->h, rc));.  }
128b0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 77  else{.    rc = w
128c0 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
128d0 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
128e0 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52 45 53  KFILE_FLAGS, RES
128f0 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31  ERVED_BYTE, 0, 1
12900 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
12910 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 55 6e 6c   ){.      winUnl
12920 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
12930 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
12940 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  , 0, 1, 0);.    
12950 7d 0a 20 20 20 20 72 63 20 3d 20 21 72 63 3b 0a  }.    rc = !rc;.
12960 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
12970 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
12980 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 70 46   (remote)\n", pF
12990 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a 20 20  ile->h, rc));.  
129a0 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  }.  *pResOut = r
129b0 63 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  c;.  return SQLI
129c0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
129d0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
129e0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
129f0 64 65 73 63 72 69 70 74 6f 72 20 69 64 20 74 6f  descriptor id to
12a00 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b   locktype.  lock
12a10 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20  type.** must be 
12a20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
12a30 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
12a40 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
12a50 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
12a60 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
12a70 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
12a80 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
12a90 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
12aa0 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
12ab0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
12ac0 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74  .**.** It is not
12ad0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
12ae0 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 61  is routine to fa
12af0 69 6c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  il if the second
12b00 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20   argument.** is 
12b10 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65  NO_LOCK.  If the
12b20 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
12b30 20 69 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   is SHARED_LOCK 
12b40 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
12b50 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72  e.** might retur
12b60 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
12b70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
12b80 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  nUnlock(sqlite3_
12b90 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
12ba0 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 74  cktype){.  int t
12bb0 79 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ype;.  winFile *
12bc0 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
12bd0 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *)id;.  int rc =
12be0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
12bf0 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29  sert( pFile!=0 )
12c00 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
12c10 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  type<=SHARED_LOC
12c20 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  K );.  OSTRACE((
12c30 22 55 4e 4c 4f 43 4b 20 25 64 20 74 6f 20 25 64  "UNLOCK %d to %d
12c40 20 77 61 73 20 25 64 28 25 64 29 5c 6e 22 2c 20   was %d(%d)\n", 
12c50 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
12c60 70 65 2c 0a 20 20 20 20 20 20 20 20 20 20 70 46  pe,.          pF
12c70 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70  ile->locktype, p
12c80 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
12c90 42 79 74 65 29 29 3b 0a 20 20 74 79 70 65 20 3d  Byte));.  type =
12ca0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
12cb0 3b 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 45 58  ;.  if( type>=EX
12cc0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
12cd0 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c      winUnlockFil
12ce0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  e(&pFile->h, SHA
12cf0 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48  RED_FIRST, 0, SH
12d00 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20  ARED_SIZE, 0);. 
12d10 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d     if( locktype=
12d20 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
12d30 21 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69  !getReadLock(pFi
12d40 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  le) ){.      /* 
12d50 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65  This should neve
12d60 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20 73 68  r happen.  We sh
12d70 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 61  ould always be a
12d80 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
12d90 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65  reacquire the re
12da0 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ad lock */.     
12db0 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
12dc0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  r(SQLITE_IOERR_U
12dd0 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c 61 73 74  NLOCK, osGetLast
12de0 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
12df0 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f          "winUnlo
12e00 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ck", pFile->zPat
12e10 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  h);.    }.  }.  
12e20 69 66 28 20 74 79 70 65 3e 3d 52 45 53 45 52 56  if( type>=RESERV
12e30 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77  ED_LOCK ){.    w
12e40 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
12e50 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44  ile->h, RESERVED
12e60 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
12e70 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74  .  }.  if( lockt
12e80 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20  ype==NO_LOCK && 
12e90 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  type>=SHARED_LOC
12ea0 4b 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 52  K ){.    unlockR
12eb0 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  eadLock(pFile);.
12ec0 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d    }.  if( type>=
12ed0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a  PENDING_LOCK ){.
12ee0 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c      winUnlockFil
12ef0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e  e(&pFile->h, PEN
12f00 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c  DING_BYTE, 0, 1,
12f10 20 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65   0);.  }.  pFile
12f20 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38  ->locktype = (u8
12f30 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74  )locktype;.  ret
12f40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
12f50 20 49 66 20 2a 70 41 72 67 20 69 73 20 69 6e 69   If *pArg is ini
12f60 74 69 74 69 61 6c 6c 79 20 6e 65 67 61 74 69 76  titially negativ
12f70 65 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61  e then this is a
12f80 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a 70 41   query.  Set *pA
12f90 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20  rg to.** 1 or 0 
12fa0 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
12fb0 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69 74 20  ther or not bit 
12fc0 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63  mask of pFile->c
12fd0 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65 74 2e  trlFlags is set.
12fe0 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20  .**.** If *pArg 
12ff0 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20  is 0 or 1, then 
13000 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74 68 65  clear or set the
13010 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70 46 69   mask bit of pFi
13020 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a  le->ctrlFlags..*
13030 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
13040 6e 4d 6f 64 65 42 69 74 28 77 69 6e 46 69 6c 65  nModeBit(winFile
13050 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65   *pFile, unsigne
13060 64 20 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74  d char mask, int
13070 20 2a 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a   *pArg){.  if( *
13080 70 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70  pArg<0 ){.    *p
13090 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74  Arg = (pFile->ct
130a0 72 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21  rlFlags & mask)!
130b0 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  =0;.  }else if( 
130c0 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20  (*pArg)==0 ){.  
130d0 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
130e0 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d  gs &= ~mask;.  }
130f0 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
13100 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61  >ctrlFlags |= ma
13110 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  sk;.  }.}../*.**
13120 20 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65   Control and que
13130 72 79 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66  ry of the open f
13140 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ile handle..*/.s
13150 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c  tatic int winFil
13160 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
13170 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f  _file *id, int o
13180 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  p, void *pArg){.
13190 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
131a0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
131b0 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
131c0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
131d0 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45  _FCNTL_LOCKSTATE
131e0 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
131f0 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c  )pArg = pFile->l
13200 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 72  ocktype;.      r
13210 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13220 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
13230 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e  SQLITE_LAST_ERRN
13240 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  O: {.      *(int
13250 2a 29 70 41 72 67 20 3d 20 28 69 6e 74 29 70 46  *)pArg = (int)pF
13260 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  ile->lastErrno;.
13270 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
13280 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
13290 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
132a0 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20  NTL_CHUNK_SIZE: 
132b0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
132c0 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a  zChunk = *(int *
132d0 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74  )pArg;.      ret
132e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
132f0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
13300 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
13310 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 66  HINT: {.      if
13320 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
13330 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  >0 ){.        sq
13340 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 6c 64 53  lite3_int64 oldS
13350 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  z;.        int r
13360 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28  c = winFileSize(
13370 69 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a 20 20 20  id, &oldSz);.   
13380 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
13390 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
133a0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
133b0 34 20 6e 65 77 53 7a 20 3d 20 2a 28 73 71 6c 69  4 newSz = *(sqli
133c0 74 65 33 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b  te3_int64*)pArg;
133d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
133e0 65 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20  ewSz>oldSz ){.  
133f0 20 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61            Simula
13400 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
13410 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
13420 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65  rc = winTruncate
13430 28 69 64 2c 20 6e 65 77 53 7a 29 3b 0a 20 20 20  (id, newSz);.   
13440 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74           Simulat
13450 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
13460 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
13470 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13480 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
13490 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
134a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
134b0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
134c0 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f  E_FCNTL_PERSIST_
134d0 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e  WAL: {.      win
134e0 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57  ModeBit(pFile, W
134f0 49 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57  INFILE_PERSIST_W
13500 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b  AL, (int*)pArg);
13510 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
13520 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
13530 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
13540 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f  CNTL_POWERSAFE_O
13550 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20  VERWRITE: {.    
13560 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69    winModeBit(pFi
13570 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57  le, WINFILE_PSOW
13580 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20  , (int*)pArg);. 
13590 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
135a0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
135b0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
135c0 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20  TL_VFSNAME: {.  
135d0 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72      *(char**)pAr
135e0 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
135f0 6e 74 66 28 22 77 69 6e 33 32 22 29 3b 0a 20 20  ntf("win32");.  
13600 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13610 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
13620 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
13630 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59  L_WIN32_AV_RETRY
13640 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61  : {.      int *a
13650 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20   = (int*)pArg;. 
13660 20 20 20 20 20 69 66 28 20 61 5b 30 5d 3e 30 20       if( a[0]>0 
13670 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 33 32  ){.        win32
13680 49 6f 65 72 72 52 65 74 72 79 20 3d 20 61 5b 30  IoerrRetry = a[0
13690 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ];.      }else{.
136a0 20 20 20 20 20 20 20 20 61 5b 30 5d 20 3d 20 77          a[0] = w
136b0 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 3b 0a  in32IoerrRetry;.
136c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
136d0 28 20 61 5b 31 5d 3e 30 20 29 7b 0a 20 20 20 20  ( a[1]>0 ){.    
136e0 20 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52 65      win32IoerrRe
136f0 74 72 79 44 65 6c 61 79 20 3d 20 61 5b 31 5d 3b  tryDelay = a[1];
13700 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13710 20 20 20 20 20 20 61 5b 31 5d 20 3d 20 77 69 6e        a[1] = win
13720 33 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  32IoerrRetryDela
13730 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  y;.      }.     
13740 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13750 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
13760 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
13770 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  FOUND;.}../*.** 
13780 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f  Return the secto
13790 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  r size in bytes 
137a0 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
137b0 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66  g block device f
137c0 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66  or.** the specif
137d0 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69  ied file. This i
137e0 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20  s almost always 
137f0 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d  512 bytes, but m
13800 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20  ay be.** larger 
13810 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73  for some devices
13820 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63  ..**.** SQLite c
13830 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73  ode assumes this
13840 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74   function cannot
13850 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61   fail. It also a
13860 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69  ssumes that.** i
13870 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20  f two files are 
13880 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73  created in the s
13890 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ame file-system 
138a0 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a  directory (i.e..
138b0 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e  ** a database an
138c0 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  d its journal fi
138d0 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63  le) that the sec
138e0 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
138f0 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72   the.** same for
13900 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63   both..*/.static
13910 20 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53 69   int winSectorSi
13920 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
13930 2a 69 64 29 7b 0a 20 20 28 76 6f 69 64 29 69 64  *id){.  (void)id
13940 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
13950 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52  E_DEFAULT_SECTOR
13960 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _SIZE;.}../*.** 
13970 52 65 74 75 72 6e 20 61 20 76 65 63 74 6f 72 20  Return a vector 
13980 6f 66 20 64 65 76 69 63 65 20 63 68 61 72 61 63  of device charac
13990 74 65 72 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74  teristics..*/.st
139a0 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 76 69  atic int winDevi
139b0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
139c0 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
139d0 69 64 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  id){.  winFile *
139e0 70 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  p = (winFile*)id
139f0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
13a00 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41  E_IOCAP_UNDELETA
13a10 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a  BLE_WHEN_OPEN |.
13a20 20 20 20 20 20 20 20 20 20 28 28 70 2d 3e 63 74           ((p->ct
13a30 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c  rlFlags & WINFIL
13a40 45 5f 50 53 4f 57 29 3f 53 51 4c 49 54 45 5f 49  E_PSOW)?SQLITE_I
13a50 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
13a60 56 45 52 57 52 49 54 45 3a 30 29 3b 0a 7d 0a 0a  VERWRITE:0);.}..
13a70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13a80 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 20 0a 2a 2a 20  MIT_WAL../* .** 
13a90 57 69 6e 64 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c  Windows will onl
13aa0 79 20 6c 65 74 20 79 6f 75 20 63 72 65 61 74 65  y let you create
13ab0 20 66 69 6c 65 20 76 69 65 77 20 6d 61 70 70 69   file view mappi
13ac0 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61  ngs.** on alloca
13ad0 74 69 6f 6e 20 73 69 7a 65 20 67 72 61 6e 75 6c  tion size granul
13ae0 61 72 69 74 79 20 62 6f 75 6e 64 61 72 69 65 73  arity boundaries
13af0 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 73 71 6c 69  ..** During sqli
13b00 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 65  te3_os_init() we
13b10 20 64 6f 20 61 20 47 65 74 53 79 73 74 65 6d 49   do a GetSystemI
13b20 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20 67 65 74 20  nfo().** to get 
13b30 74 68 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20  the granularity 
13b40 73 69 7a 65 2e 0a 2a 2f 0a 53 59 53 54 45 4d 5f  size..*/.SYSTEM_
13b50 49 4e 46 4f 20 77 69 6e 53 79 73 49 6e 66 6f 3b  INFO winSysInfo;
13b60 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66  ../*.** Helper f
13b70 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61  unctions to obta
13b80 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73  in and relinquis
13b90 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74  h the global mut
13ba0 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61  ex. The.** globa
13bb0 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20  l mutex is used 
13bc0 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 77  to protect the w
13bd0 69 6e 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63  inLockInfo objec
13be0 74 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74  ts used by .** t
13bf0 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66  his file, all of
13c00 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 73 68   which may be sh
13c10 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65  ared by multiple
13c20 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20   threads..**.** 
13c30 46 75 6e 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d  Function winShmM
13c40 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73  utexHeld() is us
13c50 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  ed to assert() t
13c60 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  hat the global m
13c70 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64  utex .** is held
13c80 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20   when required. 
13c90 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
13ca0 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61   only used as pa
13cb0 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a  rt of assert() .
13cc0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65  ** statements. e
13cd0 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53  .g..**.**   winS
13ce0 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a  hmEnterMutex().*
13cf0 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 77 69  *     assert( wi
13d00 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
13d10 29 3b 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 4c 65  );.**   winShmLe
13d20 61 76 65 4d 75 74 65 78 28 29 0a 2a 2f 0a 73 74  aveMutex().*/.st
13d30 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d  atic void winShm
13d40 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29  EnterMutex(void)
13d50 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
13d60 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d  x_enter(sqlite3M
13d70 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
13d80 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
13d90 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63  STER));.}.static
13da0 20 76 6f 69 64 20 77 69 6e 53 68 6d 4c 65 61 76   void winShmLeav
13db0 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20  eMutex(void){.  
13dc0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
13dd0 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78  ave(sqlite3Mutex
13de0 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
13df0 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
13e00 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c  ));.}.#ifdef SQL
13e10 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
13e20 20 69 6e 74 20 77 69 6e 53 68 6d 4d 75 74 65 78   int winShmMutex
13e30 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72  Held(void) {.  r
13e40 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75  eturn sqlite3_mu
13e50 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33  tex_held(sqlite3
13e60 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
13e70 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
13e80 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69  ASTER));.}.#endi
13e90 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20  f../*.** Object 
13ea0 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
13eb0 74 20 61 20 73 69 6e 67 6c 65 20 66 69 6c 65 20  t a single file 
13ec0 6f 70 65 6e 65 64 20 61 6e 64 20 6d 6d 61 70 70  opened and mmapp
13ed0 65 64 20 74 6f 20 70 72 6f 76 69 64 65 0a 2a 2a  ed to provide.**
13ee0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20   shared memory. 
13ef0 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74   When multiple t
13f00 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72  hreads all refer
13f10 65 6e 63 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a  ence the same.**
13f20 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c 20 65 61   log-summary, ea
13f30 63 68 20 74 68 72 65 61 64 20 68 61 73 20 69 74  ch thread has it
13f40 73 20 6f 77 6e 20 77 69 6e 46 69 6c 65 20 6f 62  s own winFile ob
13f50 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79 20 61  ject, but they a
13f60 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61  ll.** point to a
13f70 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65   single instance
13f80 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 2e   of this object.
13f90 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
13fa0 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75  , each.** log-su
13fb0 6d 6d 61 72 79 20 69 73 20 6f 70 65 6e 65 64 20  mmary is opened 
13fc0 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72  only once per pr
13fd0 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e  ocess..**.** win
13fe0 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d  ShmMutexHeld() m
13ff0 75 73 74 20 62 65 20 74 72 75 65 20 77 68 65 6e  ust be true when
14000 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73   creating or des
14010 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20  troying.** this 
14020 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20  object or while 
14030 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
14040 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
14050 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20   fields:.**.**  
14060 20 20 20 20 6e 52 65 66 0a 2a 2a 20 20 20 20 20      nRef.**     
14070 20 70 4e 65 78 74 20 0a 2a 2a 0a 2a 2a 20 54 68   pNext .**.** Th
14080 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
14090 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79  ds are read-only
140a0 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63   after the objec
140b0 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a  t is created:.**
140c0 20 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a   .**      fid.**
140d0 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a        zFilename.
140e0 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 77 69 6e  **.** Either win
140f0 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75  ShmNode.mutex mu
14100 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20 77 69  st be held or wi
14110 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30  nShmNode.nRef==0
14120 20 61 6e 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75   and.** winShmMu
14130 74 65 78 48 65 6c 64 28 29 20 69 73 20 74 72 75  texHeld() is tru
14140 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f  e when reading o
14150 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74  r writing any ot
14160 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20  her field.** in 
14170 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a  this structure..
14180 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e  **.*/.struct win
14190 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 73 71 6c 69  ShmNode {.  sqli
141a0 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
141b0 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20  ;      /* Mutex 
141c0 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f  to access this o
141d0 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20  bject */.  char 
141e0 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
141f0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
14200 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 77   the file */.  w
14210 69 6e 46 69 6c 65 20 68 46 69 6c 65 3b 20 20 20  inFile hFile;   
14220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
14230 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 77 69  e handle from wi
14240 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20  nOpen */..  int 
14250 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  szRegion;       
14260 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
14270 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  f shared-memory 
14280 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  regions */.  int
14290 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20   nRegion;       
142a0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
142b0 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69 6f  of array apRegio
142c0 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 68  n */.  struct Sh
142d0 6d 52 65 67 69 6f 6e 20 7b 0a 20 20 20 20 48 41  mRegion {.    HA
142e0 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20  NDLE hMap;      
142f0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68         /* File h
14300 61 6e 64 6c 65 20 66 72 6f 6d 20 43 72 65 61 74  andle from Creat
14310 65 46 69 6c 65 4d 61 70 70 69 6e 67 20 2a 2f 0a  eFileMapping */.
14320 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 3b 0a      void *pMap;.
14330 20 20 7d 20 2a 61 52 65 67 69 6f 6e 3b 0a 20 20    } *aRegion;.  
14340 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
14350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
14360 65 20 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20  e Windows errno 
14370 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f  from the last I/
14380 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e  O error */..  in
14390 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
143a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
143b0 65 72 20 6f 66 20 77 69 6e 53 68 6d 20 6f 62 6a  er of winShm obj
143c0 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ects pointing to
143d0 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68   this */.  winSh
143e0 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  m *pFirst;      
143f0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 77 69 6e        /* All win
14400 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
14410 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
14420 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e    winShmNode *pN
14430 65 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ext;         /* 
14440 4e 65 78 74 20 69 6e 20 6c 69 73 74 20 6f 66 20  Next in list of 
14450 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f  all winShmNode o
14460 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66 64 65 66  bjects */.#ifdef
14470 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
14480 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20  u8 nextShmId;   
14490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
144a0 78 74 20 61 76 61 69 6c 61 62 6c 65 20 77 69 6e  xt available win
144b0 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a  Shm.id value */.
144c0 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
144d0 20 41 20 67 6c 6f 62 61 6c 20 61 72 72 61 79 20   A global array 
144e0 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64  of all winShmNod
144f0 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a  e objects..**.**
14500 20 54 68 65 20 77 69 6e 53 68 6d 4d 75 74 65 78   The winShmMutex
14510 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74  Held() must be t
14520 72 75 65 20 77 68 69 6c 65 20 72 65 61 64 69 6e  rue while readin
14530 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 69  g or writing thi
14540 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  s list..*/.stati
14550 63 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 77 69  c winShmNode *wi
14560 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 30  nShmNodeList = 0
14570 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75  ;../*.** Structu
14580 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  re used internal
14590 6c 79 20 62 79 20 74 68 69 73 20 56 46 53 20 74  ly by this VFS t
145a0 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61  o record the sta
145b0 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e  te of an.** open
145c0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63   shared memory c
145d0 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  onnection..**.**
145e0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
145f0 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61  ields are initia
14600 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20  lized when this 
14610 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
14620 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61  d and.** are rea
14630 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65  d-only thereafte
14640 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 77 69 6e 53  r:.**.**    winS
14650 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20  hm.pShmNode.**  
14660 20 20 77 69 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a    winShm.id.**.*
14670 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c  * All other fiel
14680 64 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74  ds are read/writ
14690 65 2e 20 20 54 68 65 20 77 69 6e 53 68 6d 2e 70  e.  The winShm.p
146a0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 6d  ShmNode->mutex m
146b0 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
146c0 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61  hile accessing a
146d0 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20 66 69  ny read/write fi
146e0 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  elds..*/.struct 
146f0 77 69 6e 53 68 6d 20 7b 0a 20 20 77 69 6e 53 68  winShm {.  winSh
14700 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
14710 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
14720 65 72 6c 79 69 6e 67 20 77 69 6e 53 68 6d 4e 6f  erlying winShmNo
14730 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 77  de object */.  w
14740 69 6e 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20  inShm *pNext;   
14750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
14760 74 20 77 69 6e 53 68 6d 20 77 69 74 68 20 74 68  t winShm with th
14770 65 20 73 61 6d 65 20 77 69 6e 53 68 6d 4e 6f 64  e same winShmNod
14780 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74  e */.  u8 hasMut
14790 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
147a0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c    /* True if hol
147b0 64 69 6e 67 20 74 68 65 20 77 69 6e 53 68 6d 4e  ding the winShmN
147c0 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75  ode mutex */.  u
147d0 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  16 sharedMask;  
147e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
147f0 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b  k of shared lock
14800 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20  s held */.  u16 
14810 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20  exclMask;       
14820 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
14830 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  f exclusive lock
14840 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66  s held */.#ifdef
14850 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
14860 75 38 20 69 64 3b 20 20 20 20 20 20 20 20 20 20  u8 id;          
14870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64             /* Id
14880 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   of this connect
14890 69 6f 6e 20 77 69 74 68 20 69 74 73 20 77 69 6e  ion with its win
148a0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69  ShmNode */.#endi
148b0 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  f.};../*.** Cons
148c0 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c  tants used for l
148d0 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e  ocking.*/.#defin
148e0 65 20 57 49 4e 5f 53 48 4d 5f 42 41 53 45 20 20  e WIN_SHM_BASE  
148f0 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d   ((22+SQLITE_SHM
14900 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20  _NLOCK)*4)      
14910 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20    /* first lock 
14920 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  byte */.#define 
14930 57 49 4e 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28  WIN_SHM_DMS    (
14940 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c  WIN_SHM_BASE+SQL
14950 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20  ITE_SHM_NLOCK)  
14960 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63  /* deadman switc
14970 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c  h */../*.** Appl
14980 79 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  y advisory locks
14990 20 66 6f 72 20 61 6c 6c 20 6e 20 62 79 74 65 73   for all n bytes
149a0 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 6f 66   beginning at of
149b0 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 5f  st..*/.#define _
149c0 53 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23 64 65  SHM_UNLCK  1.#de
149d0 66 69 6e 65 20 5f 53 48 4d 5f 52 44 4c 43 4b 20  fine _SHM_RDLCK 
149e0 20 32 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f   2.#define _SHM_
149f0 57 52 4c 43 4b 20 20 33 0a 73 74 61 74 69 63 20  WRLCK  3.static 
14a00 69 6e 74 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  int winShmSystem
14a10 4c 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e 6f  Lock(.  winShmNo
14a20 64 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a  de *pFile,    /*
14a30 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20   Apply locks to 
14a40 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64  this open shared
14a50 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20  -memory segment 
14a60 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70  */.  int lockTyp
14a70 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 5f 53  e,         /* _S
14a80 48 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52  HM_UNLCK, _SHM_R
14a90 44 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57 52  DLCK, or _SHM_WR
14aa0 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  LCK */.  int ofs
14ab0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
14ac0 2a 20 4f 66 66 73 65 74 20 74 6f 20 66 69 72 73  * Offset to firs
14ad0 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63  t byte to be loc
14ae0 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a  ked/unlocked */.
14af0 20 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20 20    int nByte     
14b00 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
14b10 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
14b20 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a  ck or unlock */.
14b30 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
14b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
14b50 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c  sult code form L
14b60 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78  ock/UnlockFileEx
14b70 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65  () */..  /* Acce
14b80 73 73 20 74 6f 20 74 68 65 20 77 69 6e 53 68 6d  ss to the winShm
14b90 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73  Node object is s
14ba0 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65  erialized by the
14bb0 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73   caller */.  ass
14bc0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
14bd0 65 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d  ex_held(pFile->m
14be0 75 74 65 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e  utex) || pFile->
14bf0 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nRef==0 );..  /*
14c00 20 52 65 6c 65 61 73 65 2f 41 63 71 75 69 72 65   Release/Acquire
14c10 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65   the system-leve
14c20 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  l lock */.  if( 
14c30 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55  lockType==_SHM_U
14c40 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  NLCK ){.    rc =
14c50 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
14c60 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  pFile->hFile.h, 
14c70 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20  ofst, 0, nByte, 
14c80 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
14c90 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
14ca0 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d  he locking param
14cb0 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 44 57 4f  eters */.    DWO
14cc0 52 44 20 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43  RD dwFlags = LOC
14cd0 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
14ce0 49 41 54 45 4c 59 3b 0a 20 20 20 20 69 66 28 20  IATELY;.    if( 
14cf0 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d  lockType == _SHM
14d00 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c 61 67 73  _WRLCK ) dwFlags
14d10 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43   |= LOCKFILE_EXC
14d20 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20  LUSIVE_LOCK;.   
14d30 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c   rc = winLockFil
14d40 65 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e  e(&pFile->hFile.
14d50 68 2c 20 64 77 46 6c 61 67 73 2c 20 6f 66 73 74  h, dwFlags, ofst
14d60 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a  , 0, nByte, 0);.
14d70 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 21    }.  .  if( rc!
14d80 3d 20 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  = 0 ){.    rc = 
14d90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
14da0 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  se{.    pFile->l
14db0 61 73 74 45 72 72 6e 6f 20 3d 20 20 6f 73 47 65  astErrno =  osGe
14dc0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
14dd0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
14de0 53 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41  SY;.  }..  OSTRA
14df0 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 25 64  CE(("SHM-LOCK %d
14e00 20 25 73 20 25 73 20 30 78 25 30 38 6c 78 5c 6e   %s %s 0x%08lx\n
14e10 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70  ", .           p
14e20 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20  File->hFile.h,. 
14e30 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51            rc==SQ
14e40 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
14e50 20 22 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 20   "failed",.     
14e60 20 20 20 20 20 20 6c 6f 63 6b 54 79 70 65 3d 3d        lockType==
14e70 5f 53 48 4d 5f 55 4e 4c 43 4b 20 3f 20 22 55 6e  _SHM_UNLCK ? "Un
14e80 6c 6f 63 6b 46 69 6c 65 45 78 22 20 3a 20 22 4c  lockFileEx" : "L
14e90 6f 63 6b 46 69 6c 65 45 78 22 2c 0a 20 20 20 20  ockFileEx",.    
14ea0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
14eb0 73 74 45 72 72 6e 6f 29 29 3b 0a 0a 20 20 72 65  stErrno));..  re
14ec0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
14ed0 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
14ee0 73 20 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73  s to VFS methods
14ef0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77   */.static int w
14f00 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  inOpen(sqlite3_v
14f10 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  fs*,const char*,
14f20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e  sqlite3_file*,in
14f30 74 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20  t,int*);.static 
14f40 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 73 71  int winDelete(sq
14f50 6c 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73  lite3_vfs *,cons
14f60 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f  t char*,int);../
14f70 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 77  *.** Purge the w
14f80 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69  inShmNodeList li
14f90 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65  st of all entrie
14fa0 73 20 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64  s with winShmNod
14fb0 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a  e.nRef==0..**.**
14fc0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56   This is not a V
14fd0 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
14fe0 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61   method; it is a
14ff0 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f   utility functio
15000 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56  n called.** by V
15010 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
15020 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61   methods..*/.sta
15030 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 50  tic void winShmP
15040 75 72 67 65 28 73 71 6c 69 74 65 33 5f 76 66 73  urge(sqlite3_vfs
15050 20 2a 70 56 66 73 2c 20 69 6e 74 20 64 65 6c 65   *pVfs, int dele
15060 74 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68  teFlag){.  winSh
15070 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69  mNode **pp;.  wi
15080 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 42  nShmNode *p;.  B
15090 4f 4f 4c 20 62 52 63 3b 0a 20 20 61 73 73 65 72  OOL bRc;.  asser
150a0 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  t( winShmMutexHe
150b0 6c 64 28 29 20 29 3b 0a 20 20 70 70 20 3d 20 26  ld() );.  pp = &
150c0 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a  winShmNodeList;.
150d0 20 20 77 68 69 6c 65 28 20 28 70 20 3d 20 2a 70    while( (p = *p
150e0 70 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  p)!=0 ){.    if(
150f0 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20   p->nRef==0 ){. 
15100 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
15110 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20 29    if( p->mutex )
15120 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
15130 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20  ree(p->mutex);. 
15140 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
15150 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29  p->nRegion; i++)
15160 7b 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d 20  {.        bRc = 
15170 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
15180 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e  e(p->aRegion[i].
15190 70 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f  pMap);.        O
151a0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52  STRACE(("SHM-PUR
151b0 47 45 20 70 69 64 2d 25 64 20 75 6e 6d 61 70 20  GE pid-%d unmap 
151c0 72 65 67 69 6f 6e 3d 25 64 20 25 73 5c 6e 22 2c  region=%d %s\n",
151d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
151e0 20 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72    (int)osGetCurr
151f0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
15200 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i,.             
15210 20 20 20 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a      bRc ? "ok" :
15220 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
15230 20 20 20 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f       bRc = osClo
15240 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67  seHandle(p->aReg
15250 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20  ion[i].hMap);.  
15260 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
15270 53 48 4d 2d 50 55 52 47 45 20 70 69 64 2d 25 64  SHM-PURGE pid-%d
15280 20 63 6c 6f 73 65 20 72 65 67 69 6f 6e 3d 25 64   close region=%d
15290 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
152a0 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73           (int)os
152b0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
152c0 73 49 64 28 29 2c 20 69 2c 0a 20 20 20 20 20 20  sId(), i,.      
152d0 20 20 20 20 20 20 20 20 20 20 20 62 52 63 20 3f             bRc ?
152e0 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
152f0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
15300 20 20 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68    if( p->hFile.h
15310 20 21 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44   != INVALID_HAND
15320 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20  LE_VALUE ){.    
15330 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
15340 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
15350 20 20 20 20 20 20 77 69 6e 43 6c 6f 73 65 28 28        winClose((
15360 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
15370 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 20 20 20 20  p->hFile);.     
15380 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
15390 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
153a0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64     }.      if( d
153b0 65 6c 65 74 65 46 6c 61 67 20 29 7b 0a 20 20 20  eleteFlag ){.   
153c0 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
153d0 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
153e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
153f0 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
15400 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 44 65  );.        winDe
15410 6c 65 74 65 28 70 56 66 73 2c 20 70 2d 3e 7a 46  lete(pVfs, p->zF
15420 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ilename, 0);.   
15430 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
15440 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
15450 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
15460 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
15470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
15480 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  pp = p->pNext;. 
15490 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
154a0 65 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a 20  e(p->aRegion);. 
154b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
154c0 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e(p);.    }else{
154d0 0a 20 20 20 20 20 20 70 70 20 3d 20 26 70 2d 3e  .      pp = &p->
154e0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
154f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
15500 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
15510 20 61 72 65 61 20 61 73 73 6f 63 69 61 74 65 64   area associated
15520 20 77 69 74 68 20 64 61 74 61 62 61 73 65 20 66   with database f
15530 69 6c 65 20 70 44 62 46 64 2e 0a 2a 2a 0a 2a 2a  ile pDbFd..**.**
15540 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   When opening a 
15550 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  new shared-memor
15560 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74  y file, if no ot
15570 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  her instances of
15580 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72   that.** file ar
15590 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  e currently open
155a0 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  , in this proces
155b0 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72  s or in other pr
155c0 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a  ocesses, then.**
155d0 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62   the file must b
155e0 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  e truncated to z
155f0 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61  ero length or ha
15600 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63 6c  ve its header cl
15610 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eared..*/.static
15620 20 69 6e 74 20 77 69 6e 4f 70 65 6e 53 68 61 72   int winOpenShar
15630 65 64 4d 65 6d 6f 72 79 28 77 69 6e 46 69 6c 65  edMemory(winFile
15640 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75   *pDbFd){.  stru
15650 63 74 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20  ct winShm *p;   
15660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15670 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
15680 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
15690 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  .  struct winShm
156a0 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d  Node *pShmNode =
156b0 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64   0;   /* The und
156c0 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20  erlying mmapped 
156d0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  file */.  int rc
156e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
156f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15700 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
15710 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f   struct winShmNo
15720 64 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  de *pNew;       
15730 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c      /* Newly all
15740 6f 63 61 74 65 64 20 77 69 6e 53 68 6d 4e 6f 64  ocated winShmNod
15750 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  e */.  int nName
15760 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
15780 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20 62 79  e of zName in by
15790 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  tes */..  assert
157a0 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30  ( pDbFd->pShm==0
157b0 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 70 72   );    /* Not pr
157c0 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20  eviously opened 
157d0 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
157e0 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
157f0 6e 65 77 20 73 71 6c 69 74 65 33 5f 73 68 6d 20  new sqlite3_shm 
15800 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20 73 70  object.  Also sp
15810 65 63 75 6c 61 74 69 76 65 6c 79 0a 20 20 2a 2a  eculatively.  **
15820 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
15830 66 6f 72 20 61 20 6e 65 77 20 77 69 6e 53 68 6d  for a new winShm
15840 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e 61 6d  Node and filenam
15850 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71  e..  */.  p = sq
15860 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
15870 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
15880 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
15890 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
158a0 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  EM;.  memset(p, 
158b0 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
158c0 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
158d0 33 53 74 72 6c 65 6e 33 30 28 70 44 62 46 64 2d  3Strlen30(pDbFd-
158e0 3e 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65 77 20  >zPath);.  pNew 
158f0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
15900 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f  ( sizeof(*pShmNo
15910 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 37  de) + nName + 17
15920 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
15930 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
15940 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 72 65  _free(p);.    re
15950 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
15960 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d  R_NOMEM;.  }.  m
15970 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
15980 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 6e  izeof(*pNew) + n
15990 4e 61 6d 65 20 2b 20 31 37 29 3b 0a 20 20 70 4e  Name + 17);.  pN
159a0 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  ew->zFilename = 
159b0 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b  (char*)&pNew[1];
159c0 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
159d0 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e  ntf(nName+15, pN
159e0 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  ew->zFilename, "
159f0 25 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e  %s-shm", pDbFd->
15a00 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c 69 74 65  zPath);.  sqlite
15a10 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62  3FileSuffix3(pDb
15a20 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e 65 77 2d  Fd->zPath, pNew-
15a30 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 20 0a 0a 20  >zFilename); .. 
15a40 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20   /* Look to see 
15a50 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 65  if there is an e
15a60 78 69 73 74 69 6e 67 20 77 69 6e 53 68 6d 4e 6f  xisting winShmNo
15a70 64 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  de that can be u
15a80 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20  sed..  ** If no 
15a90 6d 61 74 63 68 69 6e 67 20 77 69 6e 53 68 6d 4e  matching winShmN
15aa0 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ode currently ex
15ab0 69 73 74 73 2c 20 63 72 65 61 74 65 20 61 20 6e  ists, create a n
15ac0 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77  ew one..  */.  w
15ad0 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
15ae0 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d 4e 6f 64  );.  for(pShmNod
15af0 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69  e = winShmNodeLi
15b00 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b 20 70 53  st; pShmNode; pS
15b10 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64 65 2d  hmNode=pShmNode-
15b20 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20  >pNext){.    /* 
15b30 54 42 44 20 6e 65 65 64 20 74 6f 20 63 6f 6d 65  TBD need to come
15b40 20 75 70 20 77 69 74 68 20 62 65 74 74 65 72 20   up with better 
15b50 6d 61 74 63 68 20 68 65 72 65 2e 20 20 50 65 72  match here.  Per
15b60 68 61 70 73 0a 20 20 20 20 2a 2a 20 75 73 65 20  haps.    ** use 
15b70 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f 44 49 52  FILE_ID_BOTH_DIR
15b80 5f 49 4e 46 4f 20 53 74 72 75 63 74 75 72 65 2e  _INFO Structure.
15b90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
15ba0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
15bb0 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
15bc0 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e  me, pNew->zFilen
15bd0 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
15be0 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e  .  }.  if( pShmN
15bf0 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ode ){.    sqlit
15c00 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
15c10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 68 6d   }else{.    pShm
15c20 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Node = pNew;.   
15c30 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 28   pNew = 0;.    (
15c40 28 77 69 6e 46 69 6c 65 2a 29 28 26 70 53 68 6d  (winFile*)(&pShm
15c50 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29 2d 3e 68  Node->hFile))->h
15c60 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c   = INVALID_HANDL
15c70 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20 70 53 68  E_VALUE;.    pSh
15c80 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 77  mNode->pNext = w
15c90 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20  inShmNodeList;. 
15ca0 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73     winShmNodeLis
15cb0 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20  t = pShmNode;.. 
15cc0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74     pShmNode->mut
15cd0 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
15ce0 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
15cf0 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
15d00 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d   if( pShmNode->m
15d10 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
15d20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
15d30 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
15d40 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
15d50 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  r;.    }..    rc
15d60 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62 46 64   = winOpen(pDbFd
15d70 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20 20 20 20  ->pVfs,.        
15d80 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
15d90 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  e->zFilename,   
15da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
15db0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55  e of the file (U
15dc0 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20 20 20 20  TF-8) */.       
15dd0 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
15de0 65 33 5f 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f  e3_file*)&pShmNo
15df0 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 46  de->hFile,  /* F
15e00 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20  ile handle here 
15e10 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
15e20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
15e30 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  WAL | SQLITE_OPE
15e40 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
15e50 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
15e60 2c 20 2f 2a 20 4d 6f 64 65 20 66 6c 61 67 73 20  , /* Mode flags 
15e70 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
15e80 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20      0);.    if( 
15e90 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
15ea0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
15eb0 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
15ec0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
15ed0 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20   see if another 
15ee0 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
15ef0 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20  ng the dead-man 
15f00 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49  switch..    ** I
15f10 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20  f not, truncate 
15f20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  the file to zero
15f30 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f   length. .    */
15f40 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68 6d 53  .    if( winShmS
15f50 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
15f60 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20  de, _SHM_WRLCK, 
15f70 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d  WIN_SHM_DMS, 1)=
15f80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15f90 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e      rc = winTrun
15fa0 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69  cate((sqlite3_fi
15fb0 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  le *)&pShmNode->
15fc0 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  hFile, 0);.     
15fd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15fe0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
15ff0 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
16000 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f  QLITE_IOERR_SHMO
16010 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  PEN, osGetLastEr
16020 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
16030 20 20 20 20 20 20 20 20 22 77 69 6e 4f 70 65 6e          "winOpen
16040 53 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  Shm", pDbFd->zPa
16050 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  th);.      }.   
16060 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
16070 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16080 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f    winShmSystemLo
16090 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
160a0 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d  M_UNLCK, WIN_SHM
160b0 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20  _DMS, 1);.      
160c0 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
160d0 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
160e0 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f  _SHM_RDLCK, WIN_
160f0 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20  SHM_DMS, 1);.   
16100 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20   }.    if( rc ) 
16110 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
16120 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  r;.  }..  /* Mak
16130 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63  e the new connec
16140 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20  tion a child of 
16150 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  the winShmNode *
16160 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20  /.  p->pShmNode 
16170 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64  = pShmNode;.#ifd
16180 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
16190 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f    p->id = pShmNo
161a0 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b  de->nextShmId++;
161b0 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f  .#endif.  pShmNo
161c0 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44  de->nRef++;.  pD
161d0 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20  bFd->pShm = p;. 
161e0 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
161f0 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72  x();..  /* The r
16200 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
16210 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61  n pShmNode has a
16220 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
16230 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20  emented under.  
16240 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20  ** the cover of 
16250 74 68 65 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  the winShmEnterM
16260 75 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64  utex() mutex and
16270 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f   the pointer fro
16280 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28  m the.  ** new (
16290 73 74 72 75 63 74 20 77 69 6e 53 68 6d 29 20 6f  struct winShm) o
162a0 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53 68  bject to the pSh
162b0 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73  mNode has been s
162c0 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a  et. All that is.
162d0 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20    ** left to do 
162e0 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e  is to link the n
162f0 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74  ew object into t
16300 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
16310 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20  tarting.  ** at 
16320 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
16330 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64  . This must be d
16340 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e  one while holdin
16350 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e  g the pShmNode->
16360 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65  mutex .  ** mute
16370 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  x..  */.  sqlite
16380 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
16390 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
163a0 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68    p->pNext = pSh
163b0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20  mNode->pFirst;. 
163c0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
163d0 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33  t = p;.  sqlite3
163e0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
163f0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
16400 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16410 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  K;..  /* Jump he
16420 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20  re on any error 
16430 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a  */.shm_open_err:
16440 0a 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c  .  winShmSystemL
16450 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
16460 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48  HM_UNLCK, WIN_SH
16470 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 77 69 6e  M_DMS, 1);.  win
16480 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e  ShmPurge(pDbFd->
16490 70 56 66 73 2c 20 30 29 3b 20 20 20 20 20 20 2f  pVfs, 0);      /
164a0 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65  * This call free
164b0 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65  s pShmNode if re
164c0 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69  quired */.  sqli
164d0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 73  te3_free(p);.  s
164e0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
164f0 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65  );.  winShmLeave
16500 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
16510 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
16520 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f  lose a connectio
16530 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f  n to shared-memo
16540 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20  ry.  Delete the 
16550 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73  underlying .** s
16560 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74 65  torage if delete
16570 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f  Flag is true..*/
16580 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
16590 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74  hmUnmap(.  sqlit
165a0 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
165b0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
165c0 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  e holding shared
165d0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
165e0 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20   deleteFlag     
165f0 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
16600 65 20 61 66 74 65 72 20 63 6c 6f 73 69 6e 67 20  e after closing 
16610 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
16620 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 3b 20  winFile *pDbFd; 
16630 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
16640 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  e holding shared
16650 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e  -memory */.  win
16660 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Shm *p;         
16670 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
16680 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65  tion to be close
16690 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  d */.  winShmNod
166a0 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20  e *pShmNode; /* 
166b0 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73  The underlying s
166c0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
166d0 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 2a  e */.  winShm **
166e0 70 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pp;          /* 
166f0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
16700 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
16710 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44 62 46 64  ions */..  pDbFd
16720 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b   = (winFile*)fd;
16730 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  .  p = pDbFd->pS
16740 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  hm;.  if( p==0 )
16750 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16760 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  K;.  pShmNode = 
16770 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20  p->pShmNode;..  
16780 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63  /* Remove connec
16790 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20  tion p from the 
167a0 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f  set of connectio
167b0 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  ns associated.  
167c0 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65  ** with pShmNode
167d0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
167e0 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
167f0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f  de->mutex);.  fo
16800 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e  r(pp=&pShmNode->
16810 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70  pFirst; (*pp)!=p
16820 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70  ; pp = &(*pp)->p
16830 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20  Next){}.  *pp = 
16840 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20  p->pNext;..  /* 
16850 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  Free the connect
16860 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74  ion p */.  sqlit
16870 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44  e3_free(p);.  pD
16880 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20  bFd->pShm = 0;. 
16890 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
168a0 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
168b0 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  utex);..  /* If 
168c0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68  pShmNode->nRef h
168d0 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74 68  as reached 0, th
168e0 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64  en close the und
168f0 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61  erlying.  ** sha
16900 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
16910 20 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53 68 6d   too */.  winShm
16920 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
16930 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
16940 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53  ->nRef>0 );.  pS
16950 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a  hmNode->nRef--;.
16960 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
16970 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 77  nRef==0 ){.    w
16980 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  inShmPurge(pDbFd
16990 2d 3e 70 56 66 73 2c 20 64 65 6c 65 74 65 46 6c  ->pVfs, deleteFl
169a0 61 67 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 53 68  ag);.  }.  winSh
169b0 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  mLeaveMutex();..
169c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
169d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
169e0 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  nge the lock sta
169f0 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d  te for a shared-
16a00 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a  memory segment..
16a10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
16a20 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69  nShmLock(.  sqli
16a30 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
16a40 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
16a50 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20  se file holding 
16a60 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
16a70 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  y */.  int ofst,
16a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a90 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20    /* First lock 
16aa0 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
16ab0 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lease */.  int n
16ac0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16ad0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
16ae0 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75  of locks to acqu
16af0 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
16b00 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
16b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16b20 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
16b30 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  h the lock */.){
16b40 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  .  winFile *pDbF
16b50 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
16b60 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  ;        /* Conn
16b70 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73  ection holding s
16b80 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
16b90 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44    winShm *p = pD
16ba0 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20  bFd->pShm;      
16bb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
16bc0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69  hared memory bei
16bd0 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 77  ng locked */.  w
16be0 69 6e 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20  inShm *pX;      
16bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c00 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
16c10 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62  ing over all sib
16c20 6c 69 6e 67 73 20 2a 2f 0a 20 20 77 69 6e 53 68  lings */.  winSh
16c30 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20  mNode *pShmNode 
16c40 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  = p->pShmNode;. 
16c50 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16c60 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
16c70 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
16c80 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d   code */.  u16 m
16c90 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
16ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cb0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
16cc0 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c  s to take or rel
16cd0 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ease */..  asser
16ce0 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66  t( ofst>=0 && of
16cf0 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d  st+n<=SQLITE_SHM
16d00 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  _NLOCK );.  asse
16d10 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73  rt( n>=1 );.  as
16d20 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51  sert( flags==(SQ
16d30 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
16d40 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
16d50 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  D).       || fla
16d60 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
16d70 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
16d80 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20  M_EXCLUSIVE).   
16d90 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
16da0 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
16db0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   | SQLITE_SHM_SH
16dc0 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
16dd0 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
16de0 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
16df0 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
16e00 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
16e10 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==1 || (flags & 
16e20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
16e30 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a 20 20 6d  SIVE)!=0 );..  m
16e40 61 73 6b 20 3d 20 28 75 31 36 29 28 28 31 55 3c  ask = (u16)((1U<
16e50 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 55  <(ofst+n)) - (1U
16e60 3c 3c 6f 66 73 74 29 29 3b 0a 20 20 61 73 73 65  <<ofst));.  asse
16e70 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d  rt( n>1 || mask=
16e80 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20  =(1<<ofst) );.  
16e90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
16ea0 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
16eb0 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67  tex);.  if( flag
16ec0 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s & SQLITE_SHM_U
16ed0 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36  NLOCK ){.    u16
16ee0 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a   allMask = 0; /*
16ef0 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68   Mask of locks h
16f00 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20  eld by siblings 
16f10 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69  */..    /* See i
16f20 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68  f any siblings h
16f30 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f  old this same lo
16f40 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58  ck */.    for(pX
16f50 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
16f60 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
16f70 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
16f80 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65  pX==p ) continue
16f90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16fa0 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
16fb0 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e  (p->exclMask|p->
16fc0 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20  sharedMask))==0 
16fd0 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b  );.      allMask
16fe0 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
16ff0 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
17000 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73  * Unlock the sys
17010 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20  tem-level locks 
17020 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b  */.    if( (mask
17030 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29   & allMask)==0 )
17040 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
17050 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
17060 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c  hmNode, _SHM_UNL
17070 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d  CK, ofst+WIN_SHM
17080 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d  _BASE, n);.    }
17090 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
170a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
170b0 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74  }..    /* Undo t
170c0 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a  he local locks *
170d0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
170e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
170f0 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20   p->exclMask &= 
17100 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e  ~mask;.      p->
17110 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
17120 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65  ask;.    } .  }e
17130 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
17140 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
17150 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  D ){.    u16 all
17160 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20  Shared = 0;  /* 
17170 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68  Union of locks h
17180 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f  eld by connectio
17190 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70  ns other than "p
171a0 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  " */..    /* Fin
171b0 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72  d out which shar
171c0 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72  ed locks are alr
171d0 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62  eady held by sib
171e0 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
171f0 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20  ..    ** If any 
17200 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20  sibling already 
17210 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69  holds an exclusi
17220 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61  ve lock, go ahea
17230 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20  d and return.   
17240 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e   ** SQLITE_BUSY.
17250 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
17260 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
17270 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
17280 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
17290 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
172a0 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
172b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
172c0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
172d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
172e0 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c       allShared |
172f0 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
17300 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
17310 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  Get shared locks
17320 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
17330 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61  evel, if necessa
17340 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ry */.    if( rc
17350 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17360 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61       if( (allSha
17370 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  red & mask)==0 )
17380 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
17390 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
173a0 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52  pShmNode, _SHM_R
173b0 44 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53  DLCK, ofst+WIN_S
173c0 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
173d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
173e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
173f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17400 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
17410 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63  local shared loc
17420 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
17430 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17440 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
17450 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
17460 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
17470 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73  * Make sure no s
17480 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
17490 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68  ns hold locks th
174a0 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68  at will block th
174b0 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20  is.    ** lock. 
174c0 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75   If any do, retu
174d0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72  rn SQLITE_BUSY r
174e0 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a  ight away..    *
174f0 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
17500 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
17510 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
17520 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
17530 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
17540 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61  )!=0 || (pX->sha
17550 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  redMask & mask)!
17560 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
17570 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
17580 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
17590 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
175a0 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65      /* Get the e
175b0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61  xclusive locks a
175c0 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
175d0 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63  el.  Then if suc
175e0 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61  cessful.    ** a
175f0 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63  lso mark the loc
17600 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73  al connection as
17610 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20   being locked.. 
17620 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
17630 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17640 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d       rc = winShm
17650 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
17660 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c  ode, _SHM_WRLCK,
17670 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
17680 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66  SE, n);.      if
17690 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
176a0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
176b0 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73  t( (p->sharedMas
176c0 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a  k & mask)==0 );.
176d0 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d          p->exclM
176e0 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
176f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
17700 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
17710 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
17720 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45  utex);.  OSTRACE
17730 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69  (("SHM-LOCK shmi
17740 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74  d-%d, pid-%d got
17750 20 25 30 33 78 2c 25 30 33 78 20 25 73 5c 6e 22   %03x,%03x %s\n"
17760 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
17770 69 64 2c 20 28 69 6e 74 29 6f 73 47 65 74 43 75  id, (int)osGetCu
17780 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
17790 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c  , p->sharedMask,
177a0 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c 0a 20 20   p->exclMask,.  
177b0 20 20 20 20 20 20 20 20 20 72 63 20 3f 20 22 66           rc ? "f
177c0 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b  ailed" : "ok"));
177d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
177e0 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
177f0 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65   a memory barrie
17800 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63  r or memory fenc
17810 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  e on shared memo
17820 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ry.  .**.** All 
17830 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73  loads and stores
17840 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68   begun before th
17850 65 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63  e barrier must c
17860 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a  omplete before.*
17870 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74  * any load or st
17880 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20  ore begun after 
17890 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a  the barrier..*/.
178a0 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
178b0 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c  hmBarrier(.  sql
178c0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20  ite3_file *fd   
178d0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
178e0 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  se holding the s
178f0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
17900 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
17910 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 2f 2a 20  METER(fd);.  /* 
17920 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b  MemoryBarrier();
17930 20 2f 2f 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   // does not wor
17940 6b 20 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  k -- do not know
17950 20 77 68 79 20 6e 6f 74 20 2a 2f 0a 20 20 77 69   why not */.  wi
17960 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
17970 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  ;.  winShmLeaveM
17980 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  utex();.}../*.**
17990 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
179a0 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
179b0 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
179c0 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f  region iRegion o
179d0 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64  f the .** shared
179e0 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74  -memory associat
179f0 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
17a00 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68  base file fd. Sh
17a10 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
17a20 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62  ons .** are numb
17a30 65 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72  ered starting fr
17a40 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68  om zero. Each sh
17a50 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
17a60 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a  on is szRegion .
17a70 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
17a80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
17a90 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
17aa0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
17ab0 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73  urned and *pp is
17ac0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
17ad0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
17ae0 66 20 74 68 65 20 69 73 57 72 69 74 65 20 70 61  f the isWrite pa
17af0 72 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64  rameter is 0 and
17b00 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
17b10 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  hared-memory.** 
17b20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62  region has not b
17b30 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62  een allocated (b
17b40 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e  y any client, in
17b50 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e  cluding one runn
17b60 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61  ing in a.** sepa
17b70 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74  rate process), t
17b80 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74  hen *pp is set t
17b90 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  o NULL and SQLIT
17ba0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
17bb0 66 20 0a 2a 2a 20 69 73 57 72 69 74 65 20 69 73  f .** isWrite is
17bc0 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
17bd0 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
17be0 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
17bf0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a   has not yet .**
17c00 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
17c10 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   it is allocated
17c20 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
17c30 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
17c40 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
17c50 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  gion has already
17c60 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
17c70 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  or is allocated 
17c80 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  by.** this call 
17c90 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
17ca0 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d  ve, then it is m
17cb0 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
17cc0 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64  processes .** ad
17cd0 64 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20  dress space (if 
17ce0 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
17cf0 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74  y), *pp is set t
17d00 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d  o point to the m
17d10 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79  apped .** memory
17d20 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
17d30 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
17d40 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70  ic int winShmMap
17d50 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
17d60 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20   *fd,           
17d70 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70      /* Handle op
17d80 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66  en on database f
17d90 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ile */.  int iRe
17da0 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
17db0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
17dc0 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a  on to retrieve *
17dd0 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  /.  int szRegion
17de0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17df0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
17e00 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
17e10 69 73 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  isWrite,        
17e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17e30 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69  rue to extend fi
17e40 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  le if necessary 
17e50 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69  */.  void volati
17e60 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20  le **pp         
17e70 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70       /* OUT: Map
17e80 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  ped memory */.){
17e90 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  .  winFile *pDbF
17ea0 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
17eb0 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20  ;.  winShm *p = 
17ec0 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77  pDbFd->pShm;.  w
17ed0 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
17ee0 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
17ef0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
17f00 28 20 21 70 20 29 7b 0a 20 20 20 20 72 63 20 3d  ( !p ){.    rc =
17f10 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65   winOpenSharedMe
17f20 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20  mory(pDbFd);.   
17f30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17f40 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
17f50 20 20 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70      p = pDbFd->p
17f60 53 68 6d 3b 0a 20 20 7d 0a 20 20 70 53 68 6d 4e  Shm;.  }.  pShmN
17f70 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
17f80 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  e;..  sqlite3_mu
17f90 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
17fa0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  de->mutex);.  as
17fb0 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d  sert( szRegion==
17fc0 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
17fd0 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e  on || pShmNode->
17fe0 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20  nRegion==0 );.. 
17ff0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
18000 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20  Region<=iRegion 
18010 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 68  ){.    struct Sh
18020 6d 52 65 67 69 6f 6e 20 2a 61 70 4e 65 77 3b 20  mRegion *apNew; 
18030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
18040 20 61 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79   aRegion[] array
18050 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
18060 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  e = (iRegion+1)*
18070 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69  szRegion;  /* Mi
18080 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66  nimum required f
18090 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
180a0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
180b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
180c0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69     /* Current si
180d0 7a 65 20 6f 66 20 77 61 6c 2d 69 6e 64 65 78 20  ze of wal-index 
180e0 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 70 53 68  file */..    pSh
180f0 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
18100 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20  = szRegion;..   
18110 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
18120 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20  d region is not 
18130 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73  mapped into this
18140 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
18150 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a  ss space..    **
18160 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
18170 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c   it has been all
18180 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20  ocated (i.e. if 
18190 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69  the wal-index fi
181a0 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72  le is.    ** lar
181b0 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e  ge enough to con
181c0 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  tain the request
181d0 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20  ed region)..    
181e0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46  */.    rc = winF
181f0 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33  ileSize((sqlite3
18200 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64  _file *)&pShmNod
18210 65 2d 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a  e->hFile, &sz);.
18220 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18230 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
18240 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
18250 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
18260 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45  SIZE, osGetLastE
18270 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
18280 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61         "winShmMa
18290 70 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  p1", pDbFd->zPat
182a0 68 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  h);.      goto s
182b0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
182c0 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e 42  }..    if( sz<nB
182d0 79 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  yte ){.      /* 
182e0 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  The requested me
182f0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73  mory region does
18300 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 69   not exist. If i
18310 73 57 72 69 74 65 20 69 73 20 73 65 74 20 74 6f  sWrite is set to
18320 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20  .      ** zero, 
18330 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20  exit early. *pp 
18340 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e  will be set to N
18350 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
18360 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20  K returned..    
18370 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c    **.      ** Al
18380 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20  ternatively, if 
18390 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a  isWrite is non-z
183a0 65 72 6f 2c 20 75 73 65 20 66 74 72 75 6e 63 61  ero, use ftrunca
183b0 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65  te() to allocate
183c0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65  .      ** the re
183d0 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
183e0 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  egion..      */.
183f0 20 20 20 20 20 20 69 66 28 20 21 69 73 57 72 69        if( !isWri
18400 74 65 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67  te ) goto shmpag
18410 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72 63 20  e_out;.      rc 
18420 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73  = winTruncate((s
18430 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
18440 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
18450 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66  nByte);.      if
18460 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18470 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
18480 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
18490 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
184a0 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
184b0 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
184c0 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 32       "winShmMap2
184d0 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
184e0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
184f0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
18500 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
18510 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73  * Map the reques
18520 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
18530 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  n into this proc
18540 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70  esses address sp
18550 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65  ace. */.    apNe
18560 77 20 3d 20 28 73 74 72 75 63 74 20 53 68 6d 52  w = (struct ShmR
18570 65 67 69 6f 6e 20 2a 29 73 71 6c 69 74 65 33 5f  egion *)sqlite3_
18580 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  realloc(.       
18590 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
185a0 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  on, (iRegion+1)*
185b0 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b 30 5d 29  sizeof(apNew[0])
185c0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
185d0 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  !apNew ){.      
185e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
185f0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  R_NOMEM;.      g
18600 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
18610 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e  .    }.    pShmN
18620 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 20 3d 20 61  ode->aRegion = a
18630 70 4e 65 77 3b 0a 0a 20 20 20 20 77 68 69 6c 65  pNew;..    while
18640 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
18650 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a  ion<=iRegion ){.
18660 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61        HANDLE hMa
18670 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
18680 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70 70 69 6e    /* file-mappin
18690 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  g handle */.    
186a0 20 20 76 6f 69 64 20 2a 70 4d 61 70 20 3d 20 30    void *pMap = 0
186b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
186c0 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 72   Mapped memory r
186d0 65 67 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 0a 23  egion */.     .#
186e0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
186f0 52 54 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20  RT.      hMap = 
18700 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
18710 69 6e 67 46 72 6f 6d 41 70 70 28 70 53 68 6d 4e  ingFromApp(pShmN
18720 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20  ode->hFile.h,.  
18730 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41          NULL, PA
18740 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 6e 42  GE_READWRITE, nB
18750 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20  yte, NULL.      
18760 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 68  );.#else.      h
18770 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69  Map = osCreateFi
18780 6c 65 4d 61 70 70 69 6e 67 57 28 70 53 68 6d 4e  leMappingW(pShmN
18790 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a 20  ode->hFile.h, . 
187a0 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50           NULL, P
187b0 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30  AGE_READWRITE, 0
187c0 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20  , nByte, NULL.  
187d0 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20      );.#endif.  
187e0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48      OSTRACE(("SH
187f0 4d 2d 4d 41 50 20 70 69 64 2d 25 64 20 63 72 65  M-MAP pid-%d cre
18800 61 74 65 20 72 65 67 69 6f 6e 3d 25 64 20 6e 62  ate region=%d nb
18810 79 74 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20  yte=%d %s\n",.  
18820 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
18830 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  t)osGetCurrentPr
18840 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e  ocessId(), pShmN
18850 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 6e 42  ode->nRegion, nB
18860 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  yte,.           
18870 20 20 20 20 68 4d 61 70 20 3f 20 22 6f 6b 22 20      hMap ? "ok" 
18880 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
18890 20 20 20 20 69 66 28 20 68 4d 61 70 20 29 7b 0a      if( hMap ){.
188a0 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66          int iOff
188b0 73 65 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  set = pShmNode->
188c0 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e  nRegion*szRegion
188d0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f  ;.        int iO
188e0 66 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66  ffsetShift = iOf
188f0 66 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66  fset % winSysInf
18900 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72  o.dwAllocationGr
18910 61 6e 75 6c 61 72 69 74 79 3b 0a 23 69 66 20 53  anularity;.#if S
18920 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
18930 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20 6f 73         pMap = os
18940 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f  MapViewOfFileFro
18950 6d 41 70 70 28 68 4d 61 70 2c 20 46 49 4c 45 5f  mApp(hMap, FILE_
18960 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49 4c 45  MAP_WRITE | FILE
18970 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20 20 20  _MAP_READ,.     
18980 20 20 20 20 20 20 20 69 4f 66 66 73 65 74 20 2d         iOffset -
18990 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73   iOffsetShift, s
189a0 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65  zRegion + iOffse
189b0 74 53 68 69 66 74 0a 20 20 20 20 20 20 20 20 29  tShift.        )
189c0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20  ;.#else.        
189d0 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65 77  pMap = osMapView
189e0 4f 66 46 69 6c 65 28 68 4d 61 70 2c 20 46 49 4c  OfFile(hMap, FIL
189f0 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49  E_MAP_WRITE | FI
18a00 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20  LE_MAP_READ,.   
18a10 20 20 20 20 20 20 20 20 20 30 2c 20 69 4f 66 66           0, iOff
18a20 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69  set - iOffsetShi
18a30 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69  ft, szRegion + i
18a40 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20 20 20  OffsetShift.    
18a50 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20      );.#endif.  
18a60 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
18a70 53 48 4d 2d 4d 41 50 20 70 69 64 2d 25 64 20 6d  SHM-MAP pid-%d m
18a80 61 70 20 72 65 67 69 6f 6e 3d 25 64 20 6f 66 66  ap region=%d off
18a90 73 65 74 3d 25 64 20 73 69 7a 65 3d 25 64 20 25  set=%d size=%d %
18aa0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
18ab0 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73 47 65         (int)osGe
18ac0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
18ad0 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  d(), pShmNode->n
18ae0 52 65 67 69 6f 6e 2c 20 69 4f 66 66 73 65 74 2c  Region, iOffset,
18af0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18b00 20 20 73 7a 52 65 67 69 6f 6e 2c 20 70 4d 61 70    szRegion, pMap
18b10 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
18b20 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  d"));.      }.  
18b30 20 20 20 20 69 66 28 20 21 70 4d 61 70 20 29 7b      if( !pMap ){
18b40 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  .        pShmNod
18b50 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
18b60 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
18b70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69  .        rc = wi
18b80 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
18b90 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 70  _IOERR_SHMMAP, p
18ba0 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72  ShmNode->lastErr
18bb0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
18bc0 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 33       "winShmMap3
18bd0 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
18be0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 68 4d  ;.        if( hM
18bf0 61 70 20 29 20 6f 73 43 6c 6f 73 65 48 61 6e 64  ap ) osCloseHand
18c00 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20 20 20 20  le(hMap);.      
18c10 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
18c20 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ut;.      }..   
18c30 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65     pShmNode->aRe
18c40 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e  gion[pShmNode->n
18c50 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70  Region].pMap = p
18c60 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  Map;.      pShmN
18c70 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68  ode->aRegion[pSh
18c80 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e  mNode->nRegion].
18c90 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20  hMap = hMap;.   
18ca0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65     pShmNode->nRe
18cb0 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  gion++;.    }.  
18cc0 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a  }..shmpage_out:.
18cd0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
18ce0 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20  nRegion>iRegion 
18cf0 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73  ){.    int iOffs
18d00 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a 52  et = iRegion*szR
18d10 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69  egion;.    int i
18d20 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f  OffsetShift = iO
18d30 66 66 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e  ffset % winSysIn
18d40 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47  fo.dwAllocationG
18d50 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20 20  ranularity;.    
18d60 63 68 61 72 20 2a 70 20 3d 20 28 63 68 61 72 20  char *p = (char 
18d70 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67  *)pShmNode->aReg
18d80 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d 61  ion[iRegion].pMa
18d90 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28 76 6f  p;.    *pp = (vo
18da0 69 64 20 2a 29 26 70 5b 69 4f 66 66 73 65 74 53  id *)&p[iOffsetS
18db0 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  hift];.  }else{.
18dc0 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d      *pp = 0;.  }
18dd0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
18de0 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
18df0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
18e00 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23  n rc;.}..#else.#
18e10 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4d 61   define winShmMa
18e20 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  p     0.# define
18e30 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 20 30   winShmLock    0
18e40 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
18e50 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66 69  Barrier 0.# defi
18e60 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20  ne winShmUnmap  
18e70 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   0.#endif /* #if
18e80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18e90 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48  _WAL */../*.** H
18ea0 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70  ere ends the imp
18eb0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
18ec0 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ll sqlite3_file 
18ed0 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  methods..**.****
18ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ef0 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66  ** End sqlite3_f
18f00 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a  ile Methods ****
18f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
18f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
18f80 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64  ** This vector d
18f90 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d  efines all the m
18fa0 65 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20  ethods that can 
18fb0 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a  operate on an.**
18fc0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f   sqlite3_file fo
18fd0 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74  r win32..*/.stat
18fe0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
18ff0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49  _io_methods winI
19000 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 32 2c  oMethod = {.  2,
19010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19030 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77   iVersion */.  w
19040 69 6e 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  inClose,        
19050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19060 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69  * xClose */.  wi
19070 6e 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20  nRead,          
19080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19090 20 78 52 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57   xRead */.  winW
190a0 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
190b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
190c0 57 72 69 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72  Write */.  winTr
190d0 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
190e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54             /* xT
190f0 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e  runcate */.  win
19100 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Sync,           
19110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19120 78 53 79 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69  xSync */.  winFi
19130 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  leSize,         
19140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
19150 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e  ileSize */.  win
19160 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
19170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19180 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e  xLock */.  winUn
19190 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
191a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
191b0 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68  nlock */.  winCh
191c0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
191d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
191e0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
191f0 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e   */.  winFileCon
19200 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  trol,           
19210 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f        /* xFileCo
19220 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65  ntrol */.  winSe
19230 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20  ctorSize,       
19240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
19250 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77  ectorSize */.  w
19260 69 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65  inDeviceCharacte
19270 72 69 73 74 69 63 73 2c 20 20 20 20 20 20 20 2f  ristics,       /
19280 2a 20 78 44 65 76 69 63 65 43 68 61 72 61 63 74  * xDeviceCharact
19290 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 77 69  eristics */.  wi
192a0 6e 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20  nShmMap,        
192b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
192c0 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69   xShmMap */.  wi
192d0 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20  nShmLock,       
192e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
192f0 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77   xShmLock */.  w
19300 69 6e 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20  inShmBarrier,   
19310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19320 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f  * xShmBarrier */
19330 0a 20 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20  .  winShmUnmap  
19340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19350 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20     /* xShmUnmap 
19360 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  */.};../********
19370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193b0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
193c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193d0 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65  * sqlite3_vfs me
193e0 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
193f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19400 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69  **.**.** This di
19410 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  vision contains 
19420 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
19430 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e  on of methods on
19440 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   the.** sqlite3_
19450 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a  vfs object..*/..
19460 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
19470 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69  UTF-8 filename i
19480 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
19490 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
194a0 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79  .** operating sy
194b0 73 74 65 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e  stem wants filen
194c0 61 6d 65 73 20 69 6e 2e 20 20 53 70 61 63 65 20  ames in.  Space 
194d0 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75  to hold the resu
194e0 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65  lt.** is obtaine
194f0 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e  d from malloc an
19500 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
19510 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  by the calling.*
19520 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  * function..*/.s
19530 74 61 74 69 63 20 76 6f 69 64 20 2a 63 6f 6e 76  tatic void *conv
19540 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
19550 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
19560 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69 64 20 2a  ename){.  void *
19570 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a  zConverted = 0;.
19580 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
19590 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
195a0 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a   utf8ToUnicode(z
195b0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23  Filename);.  }.#
195c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
195d0 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
195e0 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74  se{.    zConvert
195f0 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  ed = sqlite3_win
19600 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28  32_utf8_to_mbcs(
19610 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zFilename);.  }.
19620 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c  #endif.  /* call
19630 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f  er will handle o
19640 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a  ut of memory */.
19650 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72    return zConver
19660 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  ted;.}../*.** Cr
19670 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  eate a temporary
19680 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42   file name in zB
19690 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62  uf.  zBuf must b
196a0 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 0a  e big enough to.
196b0 2a 2a 20 68 6f 6c 64 20 61 74 20 70 56 66 73 2d  ** hold at pVfs-
196c0 3e 6d 78 50 61 74 68 6e 61 6d 65 20 63 68 61 72  >mxPathname char
196d0 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  acters..*/.stati
196e0 63 20 69 6e 74 20 67 65 74 54 65 6d 70 6e 61 6d  c int getTempnam
196f0 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  e(int nBuf, char
19700 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69   *zBuf){.  stati
19710 63 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20  c char zChars[] 
19720 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69  =.    "abcdefghi
19730 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79  jklmnopqrstuvwxy
19740 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48  z".    "ABCDEFGH
19750 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58  IJKLMNOPQRSTUVWX
19760 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36  YZ".    "0123456
19770 37 38 39 22 3b 0a 20 20 73 69 7a 65 5f 74 20 69  789";.  size_t i
19780 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 6d 70  , j;.  int nTemp
19790 50 61 74 68 3b 0a 20 20 63 68 61 72 20 7a 54 65  Path;.  char zTe
197a0 6d 70 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 2b  mpPath[MAX_PATH+
197b0 32 5d 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f  2];..  /* It's o
197c0 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
197d0 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
197e0 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
197f0 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
19800 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
19810 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
19820 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
19830 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
19840 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
19850 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20  ailing. .  */.  
19860 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
19870 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
19880 4f 45 52 52 20 29 3b 0a 0a 20 20 6d 65 6d 73 65  OERR );..  memse
19890 74 28 7a 54 65 6d 70 50 61 74 68 2c 20 30 2c 20  t(zTempPath, 0, 
198a0 4d 41 58 5f 50 41 54 48 2b 32 29 3b 0a 0a 20 20  MAX_PATH+2);..  
198b0 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 6d 70  if( sqlite3_temp
198c0 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20  _directory ){.  
198d0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
198e0 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20  tf(MAX_PATH-30, 
198f0 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c  zTempPath, "%s",
19900 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
19910 72 65 63 74 6f 72 79 29 3b 0a 20 20 7d 0a 23 69  rectory);.  }.#i
19920 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
19930 52 54 0a 20 20 65 6c 73 65 20 69 66 28 20 69 73  RT.  else if( is
19940 4e 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72  NT() ){.    char
19950 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 57 43   *zMulti;.    WC
19960 48 41 52 20 7a 57 69 64 65 50 61 74 68 5b 4d 41  HAR zWidePath[MA
19970 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 6f 73 47  X_PATH];.    osG
19980 65 74 54 65 6d 70 50 61 74 68 57 28 4d 41 58 5f  etTempPathW(MAX_
19990 50 41 54 48 2d 33 30 2c 20 7a 57 69 64 65 50 61  PATH-30, zWidePa
199a0 74 68 29 3b 0a 20 20 20 20 7a 4d 75 6c 74 69 20  th);.    zMulti 
199b0 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  = unicodeToUtf8(
199c0 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20  zWidePath);.    
199d0 69 66 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20  if( zMulti ){.  
199e0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
199f0 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30  intf(MAX_PATH-30
19a00 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73  , zTempPath, "%s
19a10 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20  ", zMulti);.    
19a20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
19a30 4d 75 6c 74 69 29 3b 0a 20 20 20 20 7d 65 6c 73  Multi);.    }els
19a40 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
19a50 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
19a60 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69  EM;.    }.  }.#i
19a70 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
19a80 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
19a90 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 74  e{.    char *zUt
19aa0 66 38 3b 0a 20 20 20 20 63 68 61 72 20 7a 4d 62  f8;.    char zMb
19ab0 63 73 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d  csPath[MAX_PATH]
19ac0 3b 0a 20 20 20 20 6f 73 47 65 74 54 65 6d 70 50  ;.    osGetTempP
19ad0 61 74 68 41 28 4d 41 58 5f 50 41 54 48 2d 33 30  athA(MAX_PATH-30
19ae0 2c 20 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20  , zMbcsPath);.  
19af0 20 20 7a 55 74 66 38 20 3d 20 73 71 6c 69 74 65    zUtf8 = sqlite
19b00 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
19b10 75 74 66 38 28 7a 4d 62 63 73 50 61 74 68 29 3b  utf8(zMbcsPath);
19b20 0a 20 20 20 20 69 66 28 20 7a 55 74 66 38 20 29  .    if( zUtf8 )
19b30 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
19b40 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
19b50 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c  H-30, zTempPath,
19b60 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20   "%s", zUtf8);. 
19b70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
19b80 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d 65  e(zUtf8);.    }e
19b90 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
19ba0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
19bb0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
19bc0 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20  #endif.#endif.. 
19bd0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
19be0 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
19bf0 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
19c00 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61   for the tempora
19c10 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61  ry file .  ** na
19c20 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  me. If it is not
19c30 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
19c40 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 6e 54  ERROR..  */.  nT
19c50 65 6d 70 50 61 74 68 20 3d 20 73 71 6c 69 74 65  empPath = sqlite
19c60 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 50  3Strlen30(zTempP
19c70 61 74 68 29 3b 0a 0a 20 20 69 66 28 20 28 6e 54  ath);..  if( (nT
19c80 65 6d 70 50 61 74 68 20 2b 20 73 71 6c 69 74 65  empPath + sqlite
19c90 33 53 74 72 6c 65 6e 33 30 28 53 51 4c 49 54 45  3Strlen30(SQLITE
19ca0 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
19cb0 58 29 20 2b 20 31 38 29 20 3e 3d 20 6e 42 75 66  X) + 18) >= nBuf
19cc0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
19cd0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
19ce0 0a 0a 20 20 66 6f 72 28 69 3d 6e 54 65 6d 70 50  ..  for(i=nTempP
19cf0 61 74 68 3b 20 69 3e 30 20 26 26 20 7a 54 65 6d  ath; i>0 && zTem
19d00 70 50 61 74 68 5b 69 2d 31 5d 3d 3d 27 5c 5c 27  pPath[i-1]=='\\'
19d10 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a 54 65 6d 70  ; i--){}.  zTemp
19d20 50 61 74 68 5b 69 5d 20 3d 20 30 3b 0a 0a 20 20  Path[i] = 0;..  
19d30 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
19d40 28 6e 42 75 66 2d 31 38 2c 20 7a 42 75 66 2c 20  (nBuf-18, zBuf, 
19d50 28 6e 54 65 6d 70 50 61 74 68 20 3e 20 30 29 20  (nTempPath > 0) 
19d60 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
19d70 20 20 20 20 20 20 20 20 20 22 25 73 5c 5c 22 53           "%s\\"S
19d80 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
19d90 50 52 45 46 49 58 20 3a 20 53 51 4c 49 54 45 5f  PREFIX : SQLITE_
19da0 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
19db0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19dc0 20 20 20 20 20 7a 54 65 6d 70 50 61 74 68 29 3b       zTempPath);
19dd0 0a 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 53 74  .  j = sqlite3St
19de0 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20  rlen30(zBuf);.  
19df0 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
19e00 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29  ss(15, &zBuf[j])
19e10 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31  ;.  for(i=0; i<1
19e20 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20  5; i++, j++){.  
19e30 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61    zBuf[j] = (cha
19e40 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69  r)zChars[ ((unsi
19e50 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a  gned char)zBuf[j
19e60 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72  ])%(sizeof(zChar
19e70 73 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a  s)-1) ];.  }.  z
19e80 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7a 42  Buf[j] = 0;.  zB
19e90 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 0a 20 20  uf[j+1] = 0;..  
19ea0 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 20 46  OSTRACE(("TEMP F
19eb0 49 4c 45 4e 41 4d 45 3a 20 25 73 5c 6e 22 2c 20  ILENAME: %s\n", 
19ec0 7a 42 75 66 29 29 3b 0a 20 20 72 65 74 75 72 6e  zBuf));.  return
19ed0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a   SQLITE_OK; .}..
19ee0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
19ef0 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 66  E if the named f
19f00 69 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ile is really a 
19f10 64 69 72 65 63 74 6f 72 79 2e 20 20 52 65 74 75  directory.  Retu
19f20 72 6e 20 66 61 6c 73 65 20 69 66 0a 2a 2a 20 69  rn false if.** i
19f30 74 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f  t is something o
19f40 74 68 65 72 20 74 68 61 6e 20 61 20 64 69 72 65  ther than a dire
19f50 63 74 6f 72 79 2c 20 6f 72 20 69 66 20 74 68 65  ctory, or if the
19f60 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f  re is any kind o
19f70 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f  f memory.** allo
19f80 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  cation failure..
19f90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
19fa0 6e 49 73 44 69 72 28 63 6f 6e 73 74 20 76 6f 69  nIsDir(const voi
19fb0 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 29 7b 0a  d *zConverted){.
19fc0 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20    DWORD attr;.  
19fd0 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57  int rc = 0;.  DW
19fe0 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a  ORD lastErrno;..
19ff0 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
1a000 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
1a010 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f  .    WIN32_FILE_
1a020 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73  ATTRIBUTE_DATA s
1a030 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65  AttrData;.    me
1a040 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c  mset(&sAttrData,
1a050 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72   0, sizeof(sAttr
1a060 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c  Data));.    whil
1a070 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46  e( !(rc = osGetF
1a080 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
1a090 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
1a0a0 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
1a0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0c0 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f     GetFileExInfo
1a0d0 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20  Standard,.      
1a0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0f0 20 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74         &sAttrDat
1a100 61 29 29 20 26 26 20 72 65 74 72 79 49 6f 65 72  a)) && retryIoer
1a110 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
1a120 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20  no) ){}.    if( 
1a130 21 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !rc ){.      ret
1a140 75 72 6e 20 30 3b 20 2f 2a 20 49 6e 76 61 6c 69  urn 0; /* Invali
1a150 64 20 6e 61 6d 65 3f 20 2a 2f 0a 20 20 20 20 7d  d name? */.    }
1a160 0a 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74  .    attr = sAtt
1a170 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72  rData.dwFileAttr
1a180 69 62 75 74 65 73 3b 0a 23 69 66 20 53 51 4c 49  ibutes;.#if SQLI
1a190 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20  TE_OS_WINCE==0. 
1a1a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72   }else{.    attr
1a1b0 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
1a1c0 69 62 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a  ibutesA((char*)z
1a1d0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64  Converted);.#end
1a1e0 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  if.  }.  return 
1a1f0 28 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46  (attr!=INVALID_F
1a200 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 29 20  ILE_ATTRIBUTES) 
1a210 26 26 20 28 61 74 74 72 26 46 49 4c 45 5f 41 54  && (attr&FILE_AT
1a220 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52  TRIBUTE_DIRECTOR
1a230 59 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  Y);.}../*.** Ope
1a240 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  n a file..*/.sta
1a250 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28  tic int winOpen(
1a260 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1a270 70 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20  pVfs,        /* 
1a280 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f  Not used */.  co
1a290 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
1a2a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1a2b0 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46  of the file (UTF
1a2c0 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  -8) */.  sqlite3
1a2d0 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20  _file *id,      
1a2e0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
1a2f0 53 51 4c 69 74 65 20 66 69 6c 65 20 68 61 6e 64  SQLite file hand
1a300 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  le here */.  int
1a310 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
1a320 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d         /* Open m
1a330 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69  ode flags */.  i
1a340 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20  nt *pOutFlags   
1a350 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
1a360 75 73 20 72 65 74 75 72 6e 20 66 6c 61 67 73 20  us return flags 
1a370 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68  */.){.  HANDLE h
1a380 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
1a390 72 6e 6f 3b 0a 20 20 44 57 4f 52 44 20 64 77 44  rno;.  DWORD dwD
1a3a0 65 73 69 72 65 64 41 63 63 65 73 73 3b 0a 20 20  esiredAccess;.  
1a3b0 44 57 4f 52 44 20 64 77 53 68 61 72 65 4d 6f 64  DWORD dwShareMod
1a3c0 65 3b 0a 20 20 44 57 4f 52 44 20 64 77 43 72 65  e;.  DWORD dwCre
1a3d0 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
1a3e0 3b 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67  ;.  DWORD dwFlag
1a3f0 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
1a400 20 30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   0;.#if SQLITE_O
1a410 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 69 73  S_WINCE.  int is
1a420 54 65 6d 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66  Temp = 0;.#endif
1a430 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
1a440 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
1a450 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
1a460 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  rted;           
1a470 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69     /* Filename i
1a480 6e 20 4f 53 20 65 6e 63 6f 64 69 6e 67 20 2a 2f  n OS encoding */
1a490 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1a4a0 55 74 66 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  Utf8Name = zName
1a4b0 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e  ; /* Filename in
1a4c0 20 55 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20   UTF-8 encoding 
1a4d0 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  */.  int cnt = 0
1a4e0 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d  ;..  /* If argum
1a4f0 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e  ent zPath is a N
1a500 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69  ULL pointer, thi
1a510 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  s function is re
1a520 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20  quired to open. 
1a530 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20   ** a temporary 
1a540 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62  file. Use this b
1a550 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74  uffer to store t
1a560 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e  he file name in.
1a570 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d  .  */.  char zTm
1a580 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 2b 32  pname[MAX_PATH+2
1a590 5d 3b 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72  ];     /* Buffer
1a5a0 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20   used to create 
1a5b0 74 65 6d 70 20 66 69 6c 65 6e 61 6d 65 20 2a 2f  temp filename */
1a5c0 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ..  int rc = SQL
1a5d0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
1a5e0 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52     /* Function R
1a5f0 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69  eturn Code */.#i
1a600 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
1a610 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  G) || SQLITE_OS_
1a620 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 54 79 70  WINCE.  int eTyp
1a630 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46  e = flags&0xFFFF
1a640 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f  FF00;  /* Type o
1a650 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  f file to open *
1a660 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20  /.#endif..  int 
1a670 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28  isExclusive  = (
1a680 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
1a690 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a  PEN_EXCLUSIVE);.
1a6a0 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20    int isDelete  
1a6b0 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
1a6c0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
1a6d0 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20  ONCLOSE);.  int 
1a6e0 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28  isCreate     = (
1a6f0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
1a700 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 23 69 66  PEN_CREATE);.#if
1a710 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e  ndef NDEBUG.  in
1a720 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d  t isReadonly   =
1a730 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1a740 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
1a750 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 69 73  .#endif.  int is
1a760 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c  ReadWrite  = (fl
1a770 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
1a780 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 0a 23  N_READWRITE);..#
1a790 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
1a7a0 69 6e 74 20 69 73 4f 70 65 6e 4a 6f 75 72 6e 61  int isOpenJourna
1a7b0 6c 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26  l = (isCreate &&
1a7c0 20 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65   (.        eType
1a7d0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
1a7e0 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
1a7f0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
1a800 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
1a810 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65  URNAL .     || e
1a820 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1a830 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 23 65 6e 64  N_WAL.  ));.#end
1a840 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  if..  /* Check t
1a850 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61  he following sta
1a860 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65  tements are true
1a870 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28  : .  **.  **   (
1a880 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f  a) Exactly one o
1a890 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45 20  f the READWRITE 
1a8a0 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61  and READONLY fla
1a8b0 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20  gs must be set, 
1a8c0 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20  and .  **   (b) 
1a8d0 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65 74  if CREATE is set
1a8e0 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54 45  , then READWRITE
1a8f0 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
1a900 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63  t, and.  **   (c
1a910 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20 69  ) if EXCLUSIVE i
1a920 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41  s set, then CREA
1a930 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
1a940 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20  set..  **   (d) 
1a950 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  if DELETEONCLOSE
1a960 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
1a970 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
1a980 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e set..  */.  as
1a990 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79  sert((isReadonly
1a9a0 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
1a9b0 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61  te==0) && (isRea
1a9c0 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64  dWrite || isRead
1a9d0 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74  only));.  assert
1a9e0 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20  (isCreate==0 || 
1a9f0 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20  isReadWrite);.  
1aa00 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73 69  assert(isExclusi
1aa10 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74  ve==0 || isCreat
1aa20 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44  e);.  assert(isD
1aa30 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72  elete==0 || isCr
1aa40 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  eate);..  /* The
1aa50 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a   main DB, main j
1aa60 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65  ournal, WAL file
1aa70 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72   and master jour
1aa80 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20  nal are never . 
1aa90 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
1aaa0 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61  y deleted. Nor a
1aab0 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d  re they ever tem
1aac0 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a  porary files.  *
1aad0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  /.  assert( (!is
1aae0 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
1aaf0 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
1ab00 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29  E_OPEN_MAIN_DB )
1ab10 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
1ab20 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
1ab30 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
1ab40 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
1ab50 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
1ab60 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
1ab70 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
1ab80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
1ab90 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  ER_JOURNAL );.  
1aba0 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
1abb0 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
1abc0 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
1abd0 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20  EN_WAL );..  /* 
1abe0 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
1abf0 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20  upper layer has 
1ac00 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22  set one of the "
1ac10 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73  file-type" flags
1ac20 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65  . */.  assert( e
1ac30 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1ac40 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c  N_MAIN_DB      |
1ac50 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
1ac60 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20  OPEN_TEMP_DB .  
1ac70 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
1ac80 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1ac90 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65  JOURNAL || eType
1aca0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
1acb0 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  MP_JOURNAL .    
1acc0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
1acd0 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
1ace0 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  NAL   || eType==
1acf0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
1ad00 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  ER_JOURNAL .    
1ad10 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
1ad20 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
1ad30 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d  NT_DB || eType==
1ad40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
1ad50 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20    );..  assert( 
1ad60 69 64 21 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45  id!=0 );.  UNUSE
1ad70 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
1ad80 29 3b 0a 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d  );..  pFile->h =
1ad90 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f   INVALID_HANDLE_
1ada0 56 41 4c 55 45 3b 0a 0a 20 20 2f 2a 20 49 66 20  VALUE;..  /* If 
1adb0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1adc0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
1add0 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 65  tion is NULL, ge
1ade0 6e 65 72 61 74 65 20 61 20 0a 20 20 2a 2a 20 74  nerate a .  ** t
1adf0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61  emporary file na
1ae00 6d 65 20 74 6f 20 75 73 65 20 0a 20 20 2a 2f 0a  me to use .  */.
1ae10 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65    if( !zUtf8Name
1ae20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 69   ){.    assert(i
1ae30 73 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70  sDelete && !isOp
1ae40 65 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  enJournal);.    
1ae50 72 63 20 3d 20 67 65 74 54 65 6d 70 6e 61 6d 65  rc = getTempname
1ae60 28 4d 41 58 5f 50 41 54 48 2b 32 2c 20 7a 54 6d  (MAX_PATH+2, zTm
1ae70 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pname);.    if( 
1ae80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1ae90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1aea0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66  ;.    }.    zUtf
1aeb0 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65  8Name = zTmpname
1aec0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61  ;.  }..  /* Data
1aed0 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61  base filenames a
1aee0 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74  re double-zero t
1aef0 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65  erminated if the
1af00 79 20 61 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55  y are not.  ** U
1af10 52 49 73 20 77 69 74 68 20 70 61 72 61 6d 65 74  RIs with paramet
1af20 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ers.  Hence, the
1af30 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20  y can always be 
1af40 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a  passed into.  **
1af50 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
1af60 61 6d 65 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20  ameter()..  */. 
1af70 20 61 73 73 65 72 74 28 20 28 65 54 79 70 65 21   assert( (eType!
1af80 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
1af90 4e 5f 44 42 29 20 7c 7c 20 28 66 6c 61 67 73 20  N_DB) || (flags 
1afa0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  & SQLITE_OPEN_UR
1afb0 49 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 7a 55  I) ||.        zU
1afc0 74 66 38 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a  tf8Name[strlen(z
1afd0 55 74 66 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20  Utf8Name)+1]==0 
1afe0 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74  );..  /* Convert
1aff0 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f   the filename to
1b000 20 74 68 65 20 73 79 73 74 65 6d 20 65 6e 63 6f   the system enco
1b010 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76  ding. */.  zConv
1b020 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55  erted = convertU
1b030 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66  tf8Filename(zUtf
1b040 38 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43  8Name);.  if( zC
1b050 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
1b060 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b070 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
1b080 7d 0a 0a 20 20 69 66 28 20 77 69 6e 49 73 44 69  }..  if( winIsDi
1b090 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b  r(zConverted) ){
1b0a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1b0b0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
1b0c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b0d0 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3b  _CANTOPEN_ISDIR;
1b0e0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 65  .  }..  if( isRe
1b0f0 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 64  adWrite ){.    d
1b100 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20 3d  wDesiredAccess =
1b110 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20   GENERIC_READ | 
1b120 47 45 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a 20  GENERIC_WRITE;. 
1b130 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 44 65   }else{.    dwDe
1b140 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47 45  siredAccess = GE
1b150 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d 0a  NERIC_READ;.  }.
1b160 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50 45  .  /* SQLITE_OPE
1b170 4e 5f 45 58 43 4c 55 53 49 56 45 20 69 73 20 75  N_EXCLUSIVE is u
1b180 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  sed to make sure
1b190 20 74 68 61 74 20 61 20 6e 65 77 20 66 69 6c 65   that a new file
1b1a0 20 69 73 20 0a 20 20 2a 2a 20 63 72 65 61 74 65   is .  ** create
1b1b0 64 2e 20 53 51 4c 69 74 65 20 64 6f 65 73 6e 27  d. SQLite doesn'
1b1c0 74 20 75 73 65 20 69 74 20 74 6f 20 69 6e 64 69  t use it to indi
1b1d0 63 61 74 65 20 22 65 78 63 6c 75 73 69 76 65 20  cate "exclusive 
1b1e0 61 63 63 65 73 73 22 20 0a 20 20 2a 2a 20 61 73  access" .  ** as
1b1f0 20 69 74 20 69 73 20 75 73 75 61 6c 6c 79 20 75   it is usually u
1b200 6e 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a  nderstood..  */.
1b210 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76    if( isExclusiv
1b220 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61  e ){.    /* Crea
1b230 74 65 73 20 61 20 6e 65 77 20 66 69 6c 65 2c 20  tes a new file, 
1b240 6f 6e 6c 79 20 69 66 20 69 74 20 64 6f 65 73 20  only if it does 
1b250 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
1b260 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20  t. */.    /* If 
1b270 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c  the file exists,
1b280 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20   it fails. */.  
1b290 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
1b2a0 6f 73 69 74 69 6f 6e 20 3d 20 43 52 45 41 54 45  osition = CREATE
1b2b0 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _NEW;.  }else if
1b2c0 28 20 69 73 43 72 65 61 74 65 20 29 7b 0a 20 20  ( isCreate ){.  
1b2d0 20 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74 69    /* Open existi
1b2e0 6e 67 20 66 69 6c 65 2c 20 6f 72 20 63 72 65 61  ng file, or crea
1b2f0 74 65 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74  te if it doesn't
1b300 20 65 78 69 73 74 20 2a 2f 0a 20 20 20 20 64 77   exist */.    dw
1b310 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
1b320 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59  ion = OPEN_ALWAY
1b330 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  S;.  }else{.    
1b340 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c  /* Opens a file,
1b350 20 6f 6e 6c 79 20 69 66 20 69 74 20 65 78 69 73   only if it exis
1b360 74 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65  ts. */.    dwCre
1b370 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
1b380 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47   = OPEN_EXISTING
1b390 3b 0a 20 20 7d 0a 0a 20 20 64 77 53 68 61 72 65  ;.  }..  dwShare
1b3a0 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48 41 52  Mode = FILE_SHAR
1b3b0 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48  E_READ | FILE_SH
1b3c0 41 52 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69 66  ARE_WRITE;..  if
1b3d0 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69  ( isDelete ){.#i
1b3e0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
1b3f0 45 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64  E.    dwFlagsAnd
1b400 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c  Attributes = FIL
1b410 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44  E_ATTRIBUTE_HIDD
1b420 45 4e 3b 0a 20 20 20 20 69 73 54 65 6d 70 20 3d  EN;.    isTemp =
1b430 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 77   1;.#else.    dw
1b440 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
1b450 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42  es = FILE_ATTRIB
1b460 55 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20  UTE_TEMPORARY.  
1b470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b480 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46               | F
1b490 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49  ILE_ATTRIBUTE_HI
1b4a0 44 44 45 4e 0a 20 20 20 20 20 20 20 20 20 20 20  DDEN.           
1b4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4c0 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f      | FILE_FLAG_
1b4d0 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b  DELETE_ON_CLOSE;
1b4e0 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
1b4f0 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41  .    dwFlagsAndA
1b500 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45  ttributes = FILE
1b510 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41  _ATTRIBUTE_NORMA
1b520 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70 6f  L;.  }.  /* Repo
1b530 72 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 74  rts from the int
1b540 65 72 6e 65 74 20 61 72 65 20 74 68 61 74 20 70  ernet are that p
1b550 65 72 66 6f 72 6d 61 6e 63 65 20 69 73 20 61 6c  erformance is al
1b560 77 61 79 73 0a 20 20 2a 2a 20 62 65 74 74 65 72  ways.  ** better
1b570 20 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41   if FILE_FLAG_RA
1b580 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69 73 20 75  NDOM_ACCESS is u
1b590 73 65 64 2e 20 20 54 69 63 6b 65 74 20 23 32 36  sed.  Ticket #26
1b5a0 39 39 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  99. */.#if SQLIT
1b5b0 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77 46  E_OS_WINCE.  dwF
1b5c0 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
1b5d0 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52  s |= FILE_FLAG_R
1b5e0 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23 65  ANDOM_ACCESS;.#e
1b5f0 6e 64 69 66 0a 0a 20 20 69 66 28 20 69 73 4e 54  ndif..  if( isNT
1b600 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  () ){.#if SQLITE
1b610 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 43 52  _OS_WINRT.    CR
1b620 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44  EATEFILE2_EXTEND
1b630 45 44 5f 50 41 52 41 4d 45 54 45 52 53 20 65 78  ED_PARAMETERS ex
1b640 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
1b650 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61  ;.    extendedPa
1b660 72 61 6d 65 74 65 72 73 2e 64 77 53 69 7a 65 20  rameters.dwSize 
1b670 3d 20 73 69 7a 65 6f 66 28 43 52 45 41 54 45 46  = sizeof(CREATEF
1b680 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41  ILE2_EXTENDED_PA
1b690 52 41 4d 45 54 45 52 53 29 3b 0a 20 20 20 20 65  RAMETERS);.    e
1b6a0 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
1b6b0 73 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74  s.dwFileAttribut
1b6c0 65 73 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  es =.           
1b6d0 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
1b6e0 62 75 74 65 73 20 26 20 46 49 4c 45 5f 41 54 54  butes & FILE_ATT
1b6f0 52 49 42 55 54 45 5f 4d 41 53 4b 3b 0a 20 20 20  RIBUTE_MASK;.   
1b700 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
1b710 65 72 73 2e 64 77 46 69 6c 65 46 6c 61 67 73 20  ers.dwFileFlags 
1b720 3d 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72  = dwFlagsAndAttr
1b730 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f 46 4c  ibutes & FILE_FL
1b740 41 47 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74  AG_MASK;.    ext
1b750 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
1b760 64 77 53 65 63 75 72 69 74 79 51 6f 73 46 6c 61  dwSecurityQosFla
1b770 67 73 20 3d 20 53 45 43 55 52 49 54 59 5f 41 4e  gs = SECURITY_AN
1b780 4f 4e 59 4d 4f 55 53 3b 0a 20 20 20 20 65 78 74  ONYMOUS;.    ext
1b790 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
1b7a0 6c 70 53 65 63 75 72 69 74 79 41 74 74 72 69 62  lpSecurityAttrib
1b7b0 75 74 65 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  utes = NULL;.   
1b7c0 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
1b7d0 65 72 73 2e 68 54 65 6d 70 6c 61 74 65 46 69 6c  ers.hTemplateFil
1b7e0 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 77 68  e = NULL;.    wh
1b7f0 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61  ile( (h = osCrea
1b800 74 65 46 69 6c 65 32 28 28 4c 50 43 57 53 54 52  teFile2((LPCWSTR
1b810 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
1b820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b830 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73             dwDes
1b840 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20  iredAccess,.    
1b850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b860 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61 72            dwShar
1b870 65 4d 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 20  eMode,.         
1b880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b890 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44       dwCreationD
1b8a0 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20  isposition,.    
1b8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8c0 20 20 20 20 20 20 20 20 20 20 26 65 78 74 65 6e            &exten
1b8d0 64 65 64 50 61 72 61 6d 65 74 65 72 73 29 29 3d  dedParameters))=
1b8e0 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
1b8f0 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20  VALUE &&.       
1b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b910 20 20 20 20 20 20 20 72 65 74 72 79 49 6f 65 72         retryIoer
1b920 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
1b930 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  no) ){.         
1b940 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f        /* Noop */
1b950 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
1b960 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43   while( (h = osC
1b970 72 65 61 74 65 46 69 6c 65 57 28 28 4c 50 43 57  reateFileW((LPCW
1b980 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  STR)zConverted,.
1b990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
1b9b0 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20  DesiredAccess,. 
1b9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53               dwS
1b9e0 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a  hareMode, NULL,.
1b9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
1ba10 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
1ba20 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ion,.           
1ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba40 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
1ba50 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20  ributes,.       
1ba60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba70 20 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49         NULL))==I
1ba80 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
1ba90 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20 20 20  LUE &&.         
1baa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bab0 20 20 20 20 20 72 65 74 72 79 49 6f 65 72 72 28       retryIoerr(
1bac0 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
1bad0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1bae0 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20      /* Noop */. 
1baf0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
1bb00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
1bb10 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
1bb20 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
1bb30 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  (h = osCreateFil
1bb40 65 41 28 28 4c 50 43 53 54 52 29 7a 43 6f 6e 76  eA((LPCSTR)zConv
1bb50 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
1bb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb70 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63       dwDesiredAc
1bb80 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cess,.          
1bb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bba0 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c      dwShareMode,
1bbb0 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
1bbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbd0 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44       dwCreationD
1bbe0 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20  isposition,.    
1bbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc00 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67            dwFlag
1bc10 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a  sAndAttributes,.
1bc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
1bc40 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  LL))==INVALID_HA
1bc50 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20  NDLE_VALUE &&.  
1bc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc70 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 72              retr
1bc80 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
1bc90 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20  stErrno) ){.    
1bca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
1bcb0 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  op */.    }.  }.
1bcc0 23 65 6e 64 69 66 0a 20 20 6c 6f 67 49 6f 65 72  #endif.  logIoer
1bcd0 72 28 63 6e 74 29 3b 0a 0a 20 20 4f 53 54 52 41  r(cnt);..  OSTRA
1bce0 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 20  CE(("OPEN %d %s 
1bcf0 30 78 25 6c 78 20 25 73 5c 6e 22 2c 20 0a 20 20  0x%lx %s\n", .  
1bd00 20 20 20 20 20 20 20 20 20 68 2c 20 7a 4e 61 6d           h, zNam
1bd10 65 2c 20 64 77 44 65 73 69 72 65 64 41 63 63 65  e, dwDesiredAcce
1bd20 73 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ss, .           
1bd30 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h==INVALID_HANDL
1bd40 45 5f 56 41 4c 55 45 20 3f 20 22 66 61 69 6c 65  E_VALUE ? "faile
1bd50 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20 20  d" : "ok"));..  
1bd60 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48  if( h==INVALID_H
1bd70 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20  ANDLE_VALUE ){. 
1bd80 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1bd90 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
1bda0 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  .    winLogError
1bdb0 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
1bdc0 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
1bdd0 6e 6f 2c 20 22 77 69 6e 4f 70 65 6e 22 2c 20 7a  no, "winOpen", z
1bde0 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 20 20 73  Utf8Name);.    s
1bdf0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
1be00 76 65 72 74 65 64 29 3b 0a 20 20 20 20 69 66 28  verted);.    if(
1be10 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20   isReadWrite && 
1be20 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a  !isExclusive ){.
1be30 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
1be40 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61 6d 65  Open(pVfs, zName
1be50 2c 20 69 64 2c 20 0a 20 20 20 20 20 20 20 20 20  , id, .         
1be60 20 20 20 20 28 28 66 6c 61 67 73 7c 53 51 4c 49      ((flags|SQLI
1be70 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
1be80 29 26 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  )&~(SQLITE_OPEN_
1be90 43 52 45 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50  CREATE|SQLITE_OP
1bea0 45 4e 5f 52 45 41 44 57 52 49 54 45 29 29 2c 20  EN_READWRITE)), 
1beb0 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 20 20  pOutFlags);.    
1bec0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
1bed0 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
1bee0 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  PEN_BKPT;.    }.
1bef0 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f 75 74 46    }..  if( pOutF
1bf00 6c 61 67 73 20 29 7b 0a 20 20 20 20 69 66 28 20  lags ){.    if( 
1bf10 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20  isReadWrite ){. 
1bf20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20       *pOutFlags 
1bf30 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
1bf40 41 44 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c  ADWRITE;.    }el
1bf50 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46  se{.      *pOutF
1bf60 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
1bf70 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
1bf80 20 7d 0a 20 20 7d 0a 0a 20 20 6d 65 6d 73 65 74   }.  }..  memset
1bf90 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f  (pFile, 0, sizeo
1bfa0 66 28 2a 70 46 69 6c 65 29 29 3b 0a 20 20 70 46  f(*pFile));.  pF
1bfb0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26  ile->pMethod = &
1bfc0 77 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 70  winIoMethod;.  p
1bfd0 46 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20 20 70  File->h = h;.  p
1bfe0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1bff0 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46  = NO_ERROR;.  pF
1c000 69 6c 65 2d 3e 70 56 66 73 20 3d 20 70 56 66 73  ile->pVfs = pVfs
1c010 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1c020 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 70 46 69 6c  _OMIT_WAL.  pFil
1c030 65 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 23 65 6e  e->pShm = 0;.#en
1c040 64 69 66 0a 20 20 70 46 69 6c 65 2d 3e 7a 50 61  dif.  pFile->zPa
1c050 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 69 66  th = zName;.  if
1c060 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  ( sqlite3_uri_bo
1c070 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 70 73  olean(zName, "ps
1c080 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45  ow", SQLITE_POWE
1c090 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29  RSAFE_OVERWRITE)
1c0a0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63   ){.    pFile->c
1c0b0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46  trlFlags |= WINF
1c0c0 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 0a 23  ILE_PSOW;.  }..#
1c0d0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1c0e0 43 45 0a 20 20 69 66 28 20 69 73 52 65 61 64 57  CE.  if( isReadW
1c0f0 72 69 74 65 20 26 26 20 65 54 79 70 65 3d 3d 53  rite && eType==S
1c100 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1c110 44 42 0a 20 20 20 20 20 20 20 26 26 20 21 77 69  DB.       && !wi
1c120 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e  nceCreateLock(zN
1c130 61 6d 65 2c 20 70 46 69 6c 65 29 0a 20 20 29 7b  ame, pFile).  ){
1c140 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64  .    osCloseHand
1c150 6c 65 28 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  le(h);.    sqlit
1c160 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
1c170 65 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ed);.    return 
1c180 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
1c190 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
1c1a0 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 70 46  isTemp ){.    pF
1c1b0 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
1c1c0 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64  ose = zConverted
1c1d0 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
1c1e0 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .  {.    sqlite3
1c1f0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
1c200 29 3b 0a 20 20 7d 0a 0a 20 20 4f 70 65 6e 43 6f  );.  }..  OpenCo
1c210 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72 65 74  unter(+1);.  ret
1c220 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1c230 20 44 65 6c 65 74 65 20 74 68 65 20 6e 61 6d 65   Delete the name
1c240 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  d file..**.** No
1c250 74 65 20 74 68 61 74 20 57 69 6e 64 6f 77 73 20  te that Windows 
1c260 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  does not allow a
1c270 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65   file to be dele
1c280 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  ted if some othe
1c290 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 68 61 73  r.** process has
1c2a0 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f 6d 65 74   it open.  Somet
1c2b0 69 6d 65 73 20 61 20 76 69 72 75 73 20 73 63 61  imes a virus sca
1c2c0 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78 69 6e 67  nner or indexing
1c2d0 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c   program.** will
1c2e0 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20   open a journal 
1c2f0 66 69 6c 65 20 73 68 6f 72 74 6c 79 20 61 66 74  file shortly aft
1c300 65 72 20 69 74 20 69 73 20 63 72 65 61 74 65 64  er it is created
1c310 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a   in order to do.
1c320 2a 2a 20 77 68 61 74 65 76 65 72 20 69 74 20 64  ** whatever it d
1c330 6f 65 73 2e 20 20 57 68 69 6c 65 20 74 68 69 73  oes.  While this
1c340 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
1c350 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a 2a  s holding the.**
1c360 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20 77   file open, we w
1c370 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20 74 6f  ill be unable to
1c380 20 64 65 6c 65 74 65 20 69 74 2e 20 20 54 6f 20   delete it.  To 
1c390 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
1c3a0 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20  .** problem, we 
1c3b0 64 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c 69 73  delay 100 millis
1c3c0 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 74  econds and try t
1c3d0 6f 20 64 65 6c 65 74 65 20 61 67 61 69 6e 2e 20  o delete again. 
1c3e0 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c   Up.** to MX_DEL
1c3f0 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 73 20 64  ETION_ATTEMPTs d
1c400 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  eletion attempts
1c410 20 61 72 65 20 72 75 6e 20 62 65 66 6f 72 65 20   are run before 
1c420 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20 61 6e 64  giving.** up and
1c430 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   returning an er
1c440 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ror..*/.static i
1c450 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 0a 20 20  nt winDelete(.  
1c460 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1c470 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  s,          /* N
1c480 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32  ot used on win32
1c490 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1c4a0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20   *zFilename,    
1c4b0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
1c4c0 65 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  e to delete */. 
1c4d0 20 69 6e 74 20 73 79 6e 63 44 69 72 20 20 20 20   int syncDir    
1c4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c4f0 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33  Not used on win3
1c500 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 6e  2 */.){.  int cn
1c510 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  t = 0;.  int rc;
1c520 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20  .  DWORD attr;. 
1c530 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
1c540 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
1c550 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rted;.  UNUSED_P
1c560 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
1c570 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1c580 45 52 28 73 79 6e 63 44 69 72 29 3b 0a 0a 20 20  ER(syncDir);..  
1c590 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1c5a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1c5b0 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 7a  ERR_DELETE);.  z
1c5c0 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
1c5d0 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
1c5e0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
1c5f0 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
1c600 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1c610 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1c620 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54  ;.  }.  if( isNT
1c630 28 29 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 23  () ){.    do {.#
1c640 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1c650 52 54 0a 20 20 20 20 20 20 57 49 4e 33 32 5f 46  RT.      WIN32_F
1c660 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41  ILE_ATTRIBUTE_DA
1c670 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20  TA sAttrData;.  
1c680 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74      memset(&sAtt
1c690 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66  rData, 0, sizeof
1c6a0 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20  (sAttrData));.  
1c6b0 20 20 20 20 69 66 20 28 20 6f 73 47 65 74 46 69      if ( osGetFi
1c6c0 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28  leAttributesExW(
1c6d0 7a 43 6f 6e 76 65 72 74 65 64 2c 20 47 65 74 46  zConverted, GetF
1c6e0 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72  ileExInfoStandar
1c6f0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
1c700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c710 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61 29       &sAttrData)
1c720 20 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72   ){.        attr
1c730 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77 46   = sAttrData.dwF
1c740 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20  ileAttributes;. 
1c750 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c760 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c770 4f 4b 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67  OK; /* Already g
1c780 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20  one? */.        
1c790 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
1c7a0 65 6c 73 65 0a 20 20 20 20 20 20 61 74 74 72 20  else.      attr 
1c7b0 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  = osGetFileAttri
1c7c0 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74 65  butesW(zConverte
1c7d0 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  d);.#endif.     
1c7e0 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41   if ( attr==INVA
1c7f0 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
1c800 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20 72  TES ){.        r
1c810 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f  c = SQLITE_OK; /
1c820 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20  * Already gone? 
1c830 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
1c840 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c850 69 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f 41  if ( attr&FILE_A
1c860 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f  TTRIBUTE_DIRECTO
1c870 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  RY ){.        rc
1c880 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1c890 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20   /* Files only. 
1c8a0 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
1c8b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c8c0 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69 6c  if ( osDeleteFil
1c8d0 65 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29  eW(zConverted) )
1c8e0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1c8f0 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c  QLITE_OK; /* Del
1c900 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20  eted OK. */.    
1c910 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1c920 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21 72   }.      if ( !r
1c930 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
1c940 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20  &lastErrno) ){. 
1c950 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1c960 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20  TE_ERROR; /* No 
1c970 6d 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a 2f  more retries. */
1c980 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1c990 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77 68        }.    } wh
1c9a0 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 69 66 64  ile(1);.  }.#ifd
1c9b0 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
1c9c0 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
1c9d0 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
1c9e0 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65  attr = osGetFile
1c9f0 41 74 74 72 69 62 75 74 65 73 41 28 7a 43 6f 6e  AttributesA(zCon
1ca00 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 69  verted);.      i
1ca10 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49  f ( attr==INVALI
1ca20 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
1ca30 53 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  S ){.        rc 
1ca40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20  = SQLITE_OK; /* 
1ca50 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f  Already gone? */
1ca60 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1ca70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1ca80 20 28 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54   ( attr&FILE_ATT
1ca90 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59  RIBUTE_DIRECTORY
1caa0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1cab0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
1cac0 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f  * Files only. */
1cad0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1cae0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1caf0 20 28 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41   ( osDeleteFileA
1cb00 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a  (zConverted) ){.
1cb10 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1cb20 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74  ITE_OK; /* Delet
1cb30 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20  ed OK. */.      
1cb40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1cb50 0a 20 20 20 20 20 20 69 66 20 28 20 21 72 65 74  .      if ( !ret
1cb60 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
1cb70 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20  astErrno) ){.   
1cb80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1cb90 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f  _ERROR; /* No mo
1cba0 72 65 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20  re retries. */. 
1cbb0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1cbc0 20 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c      }.    } whil
1cbd0 65 28 31 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  e(1);.  }.#endif
1cbe0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1cbf0 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
1cc00 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  r(SQLITE_IOERR_D
1cc10 45 4c 45 54 45 2c 20 6c 61 73 74 45 72 72 6e 6f  ELETE, lastErrno
1cc20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
1cc30 77 69 6e 44 65 6c 65 74 65 22 2c 20 7a 46 69 6c  winDelete", zFil
1cc40 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  ename);.  }else{
1cc50 0a 20 20 20 20 6c 6f 67 49 6f 65 72 72 28 63 6e  .    logIoerr(cn
1cc60 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
1cc70 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
1cc80 64 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  d);.  OSTRACE(("
1cc90 44 45 4c 45 54 45 20 5c 22 25 73 5c 22 20 25 73  DELETE \"%s\" %s
1cca0 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  \n", zFilename, 
1ccb0 28 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20 3a  (rc ? "failed" :
1ccc0 20 22 6f 6b 22 20 29 29 29 3b 0a 20 20 72 65 74   "ok" )));.  ret
1ccd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1cce0 20 43 68 65 63 6b 20 74 68 65 20 65 78 69 73 74   Check the exist
1ccf0 61 6e 63 65 20 61 6e 64 20 73 74 61 74 75 73 20  ance and status 
1cd00 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  of a file..*/.st
1cd10 61 74 69 63 20 69 6e 74 20 77 69 6e 41 63 63 65  atic int winAcce
1cd20 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ss(.  sqlite3_vf
1cd30 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
1cd40 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20   /* Not used on 
1cd50 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74  win32 */.  const
1cd60 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1cd70 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ,     /* Name of
1cd80 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a   file to check *
1cd90 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
1cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cdb0 2a 20 54 79 70 65 20 6f 66 20 74 65 73 74 20 74  * Type of test t
1cdc0 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 66  o make on this f
1cdd0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  ile */.  int *pR
1cde0 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  esOut           
1cdf0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75      /* OUT: Resu
1ce00 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44  lt */.){.  DWORD
1ce10 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20   attr;.  int rc 
1ce20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  = 0;.  DWORD las
1ce30 74 45 72 72 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a  tErrno;.  void *
1ce40 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e  zConverted;.  UN
1ce50 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
1ce60 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  Vfs);..  Simulat
1ce70 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
1ce80 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
1ce90 43 45 53 53 3b 20 29 3b 0a 20 20 7a 43 6f 6e 76  CESS; );.  zConv
1cea0 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55  erted = convertU
1ceb0 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c  tf8Filename(zFil
1cec0 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43  ename);.  if( zC
1ced0 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
1cee0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1cef0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
1cf00 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  }.  if( isNT() )
1cf10 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20  {.    int cnt = 
1cf20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c  0;.    WIN32_FIL
1cf30 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41  E_ATTRIBUTE_DATA
1cf40 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20   sAttrData;.    
1cf50 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74  memset(&sAttrDat
1cf60 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74  a, 0, sizeof(sAt
1cf70 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68  trData));.    wh
1cf80 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65  ile( !(rc = osGe
1cf90 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
1cfa0 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  xW((LPCWSTR)zCon
1cfb0 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
1cfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfd0 20 20 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e       GetFileExIn
1cfe0 66 6f 53 74 61 6e 64 61 72 64 2c 20 0a 20 20 20  foStandard, .   
1cff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d000 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72            &sAttr
1d010 44 61 74 61 29 29 20 26 26 20 72 65 74 72 79 49  Data)) && retryI
1d020 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
1d030 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69  Errno) ){}.    i
1d040 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  f( rc ){.      /
1d050 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f  * For an SQLITE_
1d060 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 71 75  ACCESS_EXISTS qu
1d070 65 72 79 2c 20 74 72 65 61 74 20 61 20 7a 65 72  ery, treat a zer
1d080 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65 0a 20 20  o-length file.  
1d090 20 20 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20      ** as if it 
1d0a0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
1d0b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1d0c0 66 28 20 20 20 20 66 6c 61 67 73 3d 3d 53 51 4c  f(    flags==SQL
1d0d0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
1d0e0 53 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73  S.          && s
1d0f0 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69  AttrData.nFileSi
1d100 7a 65 48 69 67 68 3d 3d 30 20 0a 20 20 20 20 20  zeHigh==0 .     
1d110 20 20 20 20 20 26 26 20 73 41 74 74 72 44 61 74       && sAttrDat
1d120 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d  a.nFileSizeLow==
1d130 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74  0 ){.        att
1d140 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  r = INVALID_FILE
1d150 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20  _ATTRIBUTES;.   
1d160 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d170 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61    attr = sAttrDa
1d180 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75  ta.dwFileAttribu
1d190 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  tes;.      }.   
1d1a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f   }else{.      lo
1d1b0 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20 20 20  gIoerr(cnt);.   
1d1c0 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f     if( lastErrno
1d1d0 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54  !=ERROR_FILE_NOT
1d1e0 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20  _FOUND ){.      
1d1f0 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
1d200 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
1d210 53 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77  S, lastErrno, "w
1d220 69 6e 41 63 63 65 73 73 22 2c 20 7a 46 69 6c 65  inAccess", zFile
1d230 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73  name);.        s
1d240 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
1d250 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  verted);.       
1d260 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1d270 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20  OERR_ACCESS;.   
1d280 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d290 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44    attr = INVALID
1d2a0 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
1d2b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d2c0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
1d2d0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
1d2e0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 61 74 74  .  else{.    att
1d2f0 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74  r = osGetFileAtt
1d300 72 69 62 75 74 65 73 41 28 28 63 68 61 72 2a 29  ributesA((char*)
1d310 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d  zConverted);.  }
1d320 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
1d330 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
1d340 64 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c  d);.  switch( fl
1d350 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ags ){.    case 
1d360 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
1d370 41 44 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  AD:.    case SQL
1d380 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
1d390 53 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74  S:.      rc = at
1d3a0 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr!=INVALID_FILE
1d3b0 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20  _ATTRIBUTES;.   
1d3c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1d3d0 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
1d3e0 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20  _READWRITE:.    
1d3f0 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56    rc = attr!=INV
1d400 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
1d410 55 54 45 53 20 26 26 0a 20 20 20 20 20 20 20 20  UTES &&.        
1d420 20 20 20 20 20 28 61 74 74 72 20 26 20 46 49 4c       (attr & FIL
1d430 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45 41 44  E_ATTRIBUTE_READ
1d440 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ONLY)==0;.      
1d450 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
1d460 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  lt:.      assert
1d470 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73  (!"Invalid flags
1d480 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d   argument");.  }
1d490 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63  .  *pResOut = rc
1d4a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1d4b0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
1d4c0 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  Returns non-zero
1d4d0 20 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65   if the specifie
1d4e0 64 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75  d path name shou
1d4f0 6c 64 20 62 65 20 75 73 65 64 20 76 65 72 62 61  ld be used verba
1d500 74 69 6d 2e 20 20 49 66 0a 2a 2a 20 6e 6f 6e 2d  tim.  If.** non-
1d510 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
1d520 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
1d530 69 6f 6e 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  ion, the calling
1d540 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 73   function must s
1d550 69 6d 70 6c 79 0a 2a 2a 20 75 73 65 20 74 68 65  imply.** use the
1d560 20 70 72 6f 76 69 64 65 64 20 70 61 74 68 20 6e   provided path n
1d570 61 6d 65 20 76 65 72 62 61 74 69 6d 20 2d 4f 52  ame verbatim -OR
1d580 2d 20 72 65 73 6f 6c 76 65 20 69 74 20 69 6e 74  - resolve it int
1d590 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 20 6e 61  o a full path na
1d5a0 6d 65 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  me.** using the 
1d5b0 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 20  GetFullPathName 
1d5c0 57 69 6e 33 32 20 41 50 49 20 66 75 6e 63 74 69  Win32 API functi
1d5d0 6f 6e 20 28 69 66 20 61 76 61 69 6c 61 62 6c 65  on (if available
1d5e0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  )..*/.static BOO
1d5f0 4c 20 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50  L winIsVerbatimP
1d600 61 74 68 6e 61 6d 65 28 0a 20 20 63 6f 6e 73 74  athname(.  const
1d610 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
1d620 0a 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66  .){.  /*.  ** If
1d630 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73   the path name s
1d640 74 61 72 74 73 20 77 69 74 68 20 61 20 66 6f 72  tarts with a for
1d650 77 61 72 64 20 73 6c 61 73 68 20 6f 72 20 61 20  ward slash or a 
1d660 62 61 63 6b 73 6c 61 73 68 2c 20 69 74 20 69 73  backslash, it is
1d670 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 61 20 6c   either.  ** a l
1d680 65 67 61 6c 20 55 4e 43 20 6e 61 6d 65 2c 20 61  egal UNC name, a
1d690 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65   volume relative
1d6a0 20 70 61 74 68 2c 20 6f 72 20 61 6e 20 61 62 73   path, or an abs
1d6b0 6f 6c 75 74 65 20 70 61 74 68 20 6e 61 6d 65 20  olute path name 
1d6c0 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 55 6e 69  in the.  ** "Uni
1d6d0 78 22 20 66 6f 72 6d 61 74 20 6f 6e 20 57 69 6e  x" format on Win
1d6e0 64 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  dows.  There is 
1d6f0 6e 6f 20 65 61 73 79 20 77 61 79 20 74 6f 20 64  no easy way to d
1d700 69 66 66 65 72 65 6e 74 69 61 74 65 20 62 65 74  ifferentiate bet
1d710 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 66 69  ween.  ** the fi
1d720 6e 61 6c 20 74 77 6f 20 63 61 73 65 73 3b 20 74  nal two cases; t
1d730 68 65 72 65 66 6f 72 65 2c 20 77 65 20 72 65 74  herefore, we ret
1d740 75 72 6e 20 74 68 65 20 73 61 66 65 72 20 72 65  urn the safer re
1d750 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 54 52  turn value of TR
1d760 55 45 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  UE.  ** so that 
1d770 63 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20  callers of this 
1d780 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 69  function will si
1d790 6d 70 6c 79 20 75 73 65 20 69 74 20 76 65 72 62  mply use it verb
1d7a0 61 74 69 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 20  atim..  */.  if 
1d7b0 28 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 3d 3d  ( zPathname[0]==
1d7c0 27 2f 27 20 7c 7c 20 7a 50 61 74 68 6e 61 6d 65  '/' || zPathname
1d7d0 5b 30 5d 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20  [0]=='\\' ){.   
1d7e0 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20   return TRUE;.  
1d7f0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  }..  /*.  ** If 
1d800 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74  the path name st
1d810 61 72 74 73 20 77 69 74 68 20 61 20 6c 65 74 74  arts with a lett
1d820 65 72 20 61 6e 64 20 61 20 63 6f 6c 6f 6e 20 69  er and a colon i
1d830 74 20 69 73 20 65 69 74 68 65 72 20 61 20 76 6f  t is either a vo
1d840 6c 75 6d 65 0a 20 20 2a 2a 20 72 65 6c 61 74 69  lume.  ** relati
1d850 76 65 20 70 61 74 68 20 6f 72 20 61 6e 20 61 62  ve path or an ab
1d860 73 6f 6c 75 74 65 20 70 61 74 68 2e 20 20 43 61  solute path.  Ca
1d870 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66 75  llers of this fu
1d880 6e 63 74 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 0a  nction must not.
1d890 20 20 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20    ** attempt to 
1d8a0 74 72 65 61 74 20 69 74 20 61 73 20 61 20 72 65  treat it as a re
1d8b0 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
1d8c0 20 28 69 2e 65 2e 20 74 68 65 79 20 73 68 6f 75   (i.e. they shou
1d8d0 6c 64 20 73 69 6d 70 6c 79 20 75 73 65 0a 20 20  ld simply use.  
1d8e0 2a 2a 20 69 74 20 76 65 72 62 61 74 69 6d 29 2e  ** it verbatim).
1d8f0 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 73 71 6c  .  */.  if ( sql
1d900 69 74 65 33 49 73 61 6c 70 68 61 28 7a 50 61 74  ite3Isalpha(zPat
1d910 68 6e 61 6d 65 5b 30 5d 29 20 26 26 20 7a 50 61  hname[0]) && zPa
1d920 74 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27 20 29  thname[1]==':' )
1d930 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52 55  {.    return TRU
1d940 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  E;.  }..  /*.  *
1d950 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20 74  * If we get to t
1d960 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 70  his point, the p
1d970 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20  ath name should 
1d980 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c 79  almost certainly
1d990 20 62 65 20 61 20 70 75 72 65 6c 79 0a 20 20 2a   be a purely.  *
1d9a0 2a 20 72 65 6c 61 74 69 76 65 20 6f 6e 65 20 28  * relative one (
1d9b0 69 2e 65 2e 20 6e 6f 74 20 61 20 55 4e 43 20 6e  i.e. not a UNC n
1d9c0 61 6d 65 2c 20 6e 6f 74 20 61 62 73 6f 6c 75 74  ame, not absolut
1d9d0 65 2c 20 61 6e 64 20 6e 6f 74 20 76 6f 6c 75 6d  e, and not volum
1d9e0 65 20 72 65 6c 61 74 69 76 65 29 2e 0a 20 20 2a  e relative)..  *
1d9f0 2f 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45  /.  return FALSE
1da00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20  ;.}../*.** Turn 
1da10 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
1da20 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20  ame into a full 
1da30 70 61 74 68 6e 61 6d 65 2e 20 20 57 72 69 74 65  pathname.  Write
1da40 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61 74   the full.** pat
1da50 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74 5b  hname into zOut[
1da60 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20  ].  zOut[] will 
1da70 62 65 20 61 74 20 6c 65 61 73 74 20 70 56 66 73  be at least pVfs
1da80 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a 20  ->mxPathname.** 
1da90 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
1daa0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1dab0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20  FullPathname(.  
1dac0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1dad0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
1dae0 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20   Pointer to vfs 
1daf0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73  object */.  cons
1db00 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76  t char *zRelativ
1db10 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73  e,        /* Pos
1db20 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69  sibly relative i
1db30 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69  nput path */.  i
1db40 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20 20  nt nFull,       
1db50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1db60 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62  Size of output b
1db70 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a  uffer in bytes *
1db80 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20  /.  char *zFull 
1db90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dba0 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66    /* Output buff
1dbb0 65 72 20 2a 2f 0a 29 7b 0a 20 20 0a 23 69 66 20  er */.){.  .#if 
1dbc0 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
1dbd0 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  __).  SimulateIO
1dbe0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
1dbf0 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20  LITE_ERROR );.  
1dc00 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1dc10 28 6e 46 75 6c 6c 29 3b 0a 20 20 61 73 73 65 72  (nFull);.  asser
1dc20 74 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  t( pVfs->mxPathn
1dc30 61 6d 65 3e 3d 4d 41 58 5f 50 41 54 48 20 29 3b  ame>=MAX_PATH );
1dc40 0a 20 20 61 73 73 65 72 74 28 20 6e 46 75 6c 6c  .  assert( nFull
1dc50 3e 3d 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  >=pVfs->mxPathna
1dc60 6d 65 20 29 3b 0a 20 20 69 66 20 28 20 73 71 6c  me );.  if ( sql
1dc70 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
1dc80 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56 65 72  ory && !winIsVer
1dc90 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52  batimPathname(zR
1dca0 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20  elative) ){.    
1dcb0 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20  /*.    ** NOTE: 
1dcc0 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  We are dealing w
1dcd0 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70  ith a relative p
1dce0 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ath name and the
1dcf0 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20   data.    **    
1dd00 20 20 20 64 69 72 65 63 74 6f 72 79 20 68 61 73     directory has
1dd10 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72   been set.  Ther
1dd20 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73  efore, use it as
1dd30 20 74 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a   the basis.    *
1dd40 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76  *       for conv
1dd50 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74  erting the relat
1dd60 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f  ive path name to
1dd70 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20   an absolute.   
1dd80 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79   **       one by
1dd90 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20   prepending the 
1dda0 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 61  data directory a
1ddb0 6e 64 20 61 20 73 6c 61 73 68 2e 0a 20 20 20 20  nd a slash..    
1ddc0 2a 2f 0a 20 20 20 20 63 68 61 72 20 7a 4f 75 74  */.    char zOut
1ddd0 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 0a 20 20  [MAX_PATH+1];.  
1dde0 20 20 6d 65 6d 73 65 74 28 7a 4f 75 74 2c 20 30    memset(zOut, 0
1ddf0 2c 20 4d 41 58 5f 50 41 54 48 2b 31 29 3b 0a 20  , MAX_PATH+1);. 
1de00 20 20 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 74     cygwin_conv_t
1de10 6f 5f 77 69 6e 33 32 5f 70 61 74 68 28 7a 52 65  o_win32_path(zRe
1de20 6c 61 74 69 76 65 2c 20 7a 4f 75 74 29 3b 20 2f  lative, zOut); /
1de30 2a 20 50 4f 53 49 58 20 74 6f 20 57 69 6e 33 32  * POSIX to Win32
1de40 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
1de50 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75  snprintf(MIN(nFu
1de60 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll, pVfs->mxPath
1de70 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25  name), zFull, "%
1de80 73 5c 5c 25 73 22 2c 0a 20 20 20 20 20 20 20 20  s\\%s",.        
1de90 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1dea0 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
1deb0 6f 72 79 2c 20 7a 4f 75 74 29 3b 0a 20 20 7d 65  ory, zOut);.  }e
1dec0 6c 73 65 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  lse{.    /*.    
1ded0 2a 2a 20 4e 4f 54 45 3a 20 54 68 65 20 43 79 67  ** NOTE: The Cyg
1dee0 77 69 6e 20 64 6f 63 73 20 73 74 61 74 65 20 74  win docs state t
1def0 68 61 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  hat the maximum 
1df00 6c 65 6e 67 74 68 20 6e 65 65 64 65 64 0a 20 20  length needed.  
1df10 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 74    **       for t
1df20 68 65 20 62 75 66 66 65 72 20 70 61 73 73 65 64  he buffer passed
1df30 20 74 6f 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f   to cygwin_conv_
1df40 74 6f 5f 66 75 6c 6c 5f 77 69 6e 33 32 5f 70 61  to_full_win32_pa
1df50 74 68 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  th.    **       
1df60 69 73 20 4d 41 58 5f 50 41 54 48 2e 0a 20 20 20  is MAX_PATH..   
1df70 20 2a 2f 0a 20 20 20 20 63 79 67 77 69 6e 5f 63   */.    cygwin_c
1df80 6f 6e 76 5f 74 6f 5f 66 75 6c 6c 5f 77 69 6e 33  onv_to_full_win3
1df90 32 5f 70 61 74 68 28 7a 52 65 6c 61 74 69 76 65  2_path(zRelative
1dfa0 2c 20 7a 46 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20  , zFull);.  }.  
1dfb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1dfc0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 28 53  ;.#endif..#if (S
1dfd0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
1dfe0 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  | SQLITE_OS_WINR
1dff0 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  T) && !defined(_
1e000 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d  _CYGWIN__).  Sim
1e010 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
1e020 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1e030 52 20 29 3b 0a 20 20 2f 2a 20 57 69 6e 43 45 20  R );.  /* WinCE 
1e040 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f  has no concept o
1e050 66 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  f a relative pat
1e060 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61  hname, or so I a
1e070 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 2f 2a 20  m told. */.  /* 
1e080 57 69 6e 52 54 20 68 61 73 20 6e 6f 20 77 61 79  WinRT has no way
1e090 20 74 6f 20 63 6f 6e 76 65 72 74 20 61 20 72 65   to convert a re
1e0a0 6c 61 74 69 76 65 20 70 61 74 68 20 74 6f 20 61  lative path to a
1e0b0 6e 20 61 62 73 6f 6c 75 74 65 20 6f 6e 65 2e 20  n absolute one. 
1e0c0 2a 2f 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65  */.  if ( sqlite
1e0d0 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
1e0e0 20 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 74   && !winIsVerbat
1e0f0 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61  imPathname(zRela
1e100 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a  tive) ){.    /*.
1e110 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20      ** NOTE: We 
1e120 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
1e130 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
1e140 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61   name and the da
1e150 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ta.    **       
1e160 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
1e170 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f  en set.  Therefo
1e180 72 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 68  re, use it as th
1e190 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20  e basis.    **  
1e1a0 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74       for convert
1e1b0 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 65  ing the relative
1e1c0 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e   path name to an
1e1d0 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a   absolute.    **
1e1e0 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72         one by pr
1e1f0 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74  epending the dat
1e200 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20  a directory and 
1e210 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20  a backslash..   
1e220 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
1e230 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75  snprintf(MIN(nFu
1e240 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll, pVfs->mxPath
1e250 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25  name), zFull, "%
1e260 73 5c 5c 25 73 22 2c 0a 20 20 20 20 20 20 20 20  s\\%s",.        
1e270 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1e280 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
1e290 6f 72 79 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  ory, zRelative);
1e2a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1e2b0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
1e2c0 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
1e2d0 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
1e2e0 6c 6c 2c 20 22 25 73 22 2c 20 7a 52 65 6c 61 74  ll, "%s", zRelat
1e2f0 69 76 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ive);.  }.  retu
1e300 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
1e310 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54  ndif..#if !SQLIT
1e320 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
1e330 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
1e340 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  & !defined(__CYG
1e350 57 49 4e 5f 5f 29 0a 20 20 69 6e 74 20 6e 42 79  WIN__).  int nBy
1e360 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  te;.  void *zCon
1e370 76 65 72 74 65 64 3b 0a 20 20 63 68 61 72 20 2a  verted;.  char *
1e380 7a 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  zOut;..  /* If t
1e390 68 69 73 20 70 61 74 68 20 6e 61 6d 65 20 62 65  his path name be
1e3a0 67 69 6e 73 20 77 69 74 68 20 22 2f 58 3a 22 2c  gins with "/X:",
1e3b0 20 77 68 65 72 65 20 22 58 22 20 69 73 20 61 6e   where "X" is an
1e3c0 79 20 61 6c 70 68 61 62 65 74 69 63 0a 20 20 2a  y alphabetic.  *
1e3d0 2a 20 63 68 61 72 61 63 74 65 72 2c 20 64 69 73  * character, dis
1e3e0 63 61 72 64 20 74 68 65 20 69 6e 69 74 69 61 6c  card the initial
1e3f0 20 22 2f 22 20 66 72 6f 6d 20 74 68 65 20 70 61   "/" from the pa
1e400 74 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  thname..  */.  i
1e410 66 28 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d  f( zRelative[0]=
1e420 3d 27 2f 27 20 26 26 20 73 71 6c 69 74 65 33 49  ='/' && sqlite3I
1e430 73 61 6c 70 68 61 28 7a 52 65 6c 61 74 69 76 65  salpha(zRelative
1e440 5b 31 5d 29 20 26 26 20 7a 52 65 6c 61 74 69 76  [1]) && zRelativ
1e450 65 5b 32 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20  e[2]==':' ){.   
1e460 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b 0a 20 20   zRelative++;.  
1e470 7d 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  }..  /* It's odd
1e480 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
1e490 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
1e4a0 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
1e4b0 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
1e4c0 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
1e4d0 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
1e4e0 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
1e4f0 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
1e500 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
1e510 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74  ling. This funct
1e520 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69  ion could fail i
1e530 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  f, for example, 
1e540 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
1e550 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f   working directo
1e560 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69  ry has been unli
1e570 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  nked..  */.  Sim
1e580 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
1e590 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1e5a0 52 20 29 3b 0a 20 20 69 66 20 28 20 73 71 6c 69  R );.  if ( sqli
1e5b0 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
1e5c0 72 79 20 26 26 20 21 77 69 6e 49 73 56 65 72 62  ry && !winIsVerb
1e5d0 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65  atimPathname(zRe
1e5e0 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f  lative) ){.    /
1e5f0 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57  *.    ** NOTE: W
1e600 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
1e610 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  th a relative pa
1e620 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  th name and the 
1e630 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20  data.    **     
1e640 20 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20    directory has 
1e650 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65  been set.  There
1e660 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73 20  fore, use it as 
1e670 74 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a  the basis.    **
1e680 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65         for conve
1e690 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69  rting the relati
1e6a0 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20  ve path name to 
1e6b0 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20  an absolute.    
1e6c0 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20  **       one by 
1e6d0 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64  prepending the d
1e6e0 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e  ata directory an
1e6f0 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20  d a backslash.. 
1e700 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
1e710 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e  3_snprintf(MIN(n
1e720 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61  Full, pVfs->mxPa
1e730 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20  thname), zFull, 
1e740 22 25 73 5c 5c 25 73 22 2c 0a 20 20 20 20 20 20  "%s\\%s",.      
1e750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1e760 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
1e770 63 74 6f 72 79 2c 20 7a 52 65 6c 61 74 69 76 65  ctory, zRelative
1e780 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1e790 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 7a  LITE_OK;.  }.  z
1e7a0 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
1e7b0 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
1e7c0 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 69 66  zRelative);.  if
1e7d0 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
1e7e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1e7f0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1e800 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54  ;.  }.  if( isNT
1e810 28 29 20 29 7b 0a 20 20 20 20 4c 50 57 53 54 52  () ){.    LPWSTR
1e820 20 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74   zTemp;.    nByt
1e830 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  e = osGetFullPat
1e840 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29  hNameW((LPCWSTR)
1e850 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30  zConverted, 0, 0
1e860 2c 20 30 29 20 2b 20 33 3b 0a 20 20 20 20 7a 54  , 0) + 3;.    zT
1e870 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  emp = sqlite3_ma
1e880 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a 65  lloc( nByte*size
1e890 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a  of(zTemp[0]) );.
1e8a0 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30      if( zTemp==0
1e8b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1e8c0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
1e8d0 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
1e8e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
1e8f0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  MEM;.    }.    o
1e900 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
1e910 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
1e920 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54  erted, nByte, zT
1e930 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  emp, 0);.    sql
1e940 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
1e950 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20  rted);.    zOut 
1e960 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  = unicodeToUtf8(
1e970 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69  zTemp);.    sqli
1e980 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b  te3_free(zTemp);
1e990 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
1e9a0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
1e9b0 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68  I.  else{.    ch
1e9c0 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e  ar *zTemp;.    n
1e9d0 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c  Byte = osGetFull
1e9e0 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a  PathNameA((char*
1e9f0 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20  )zConverted, 0, 
1ea00 30 2c 20 30 29 20 2b 20 33 3b 0a 20 20 20 20 7a  0, 0) + 3;.    z
1ea10 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Temp = sqlite3_m
1ea20 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a  alloc( nByte*siz
1ea30 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b  eof(zTemp[0]) );
1ea40 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d  .    if( zTemp==
1ea50 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1ea60 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
1ea70 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ed);.      retur
1ea80 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
1ea90 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
1eaa0 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
1eab0 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  eA((char*)zConve
1eac0 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65  rted, nByte, zTe
1ead0 6d 70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  mp, 0);.    sqli
1eae0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
1eaf0 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d  ted);.    zOut =
1eb00 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d   sqlite3_win32_m
1eb10 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d  bcs_to_utf8(zTem
1eb20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  p);.    sqlite3_
1eb30 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d  free(zTemp);.  }
1eb40 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 4f  .#endif.  if( zO
1eb50 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ut ){.    sqlite
1eb60 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e  3_snprintf(MIN(n
1eb70 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61  Full, pVfs->mxPa
1eb80 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20  thname), zFull, 
1eb90 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20  "%s", zOut);.   
1eba0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
1ebb0 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ut);.    return 
1ebc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
1ebd0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  se{.    return S
1ebe0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1ebf0 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  M;.  }.#endif.}.
1ec00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ec10 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
1ec20 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  ION./*.** Interf
1ec30 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67  aces for opening
1ec40 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72   a shared librar
1ec50 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79  y, finding entry
1ec60 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69   points.** withi
1ec70 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  n the shared lib
1ec80 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e  rary, and closin
1ec90 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  g the shared lib
1eca0 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49  rary..*/./*.** I
1ecb0 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70  nterfaces for op
1ecc0 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  ening a shared l
1ecd0 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20  ibrary, finding 
1ece0 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  entry points.** 
1ecf0 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65  within the share
1ed00 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63  d library, and c
1ed10 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65  losing the share
1ed20 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74  d library..*/.st
1ed30 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c  atic void *winDl
1ed40 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
1ed50 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68   *pVfs, const ch
1ed60 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
1ed70 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 76 6f    HANDLE h;.  vo
1ed80 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d  id *zConverted =
1ed90 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65   convertUtf8File
1eda0 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
1edb0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1edc0 54 45 52 28 70 56 66 73 29 3b 0a 20 20 69 66 28  TER(pVfs);.  if(
1edd0 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
1ede0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
1edf0 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29    }.  if( isNT()
1ee00 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
1ee10 53 5f 57 49 4e 52 54 0a 20 20 20 20 68 20 3d 20  S_WINRT.    h = 
1ee20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69  osLoadPackagedLi
1ee30 62 72 61 72 79 28 28 4c 50 43 57 53 54 52 29 7a  brary((LPCWSTR)z
1ee40 43 6f 6e 76 65 72 74 65 64 2c 20 30 29 3b 0a 23  Converted, 0);.#
1ee50 65 6c 73 65 0a 20 20 20 20 68 20 3d 20 6f 73 4c  else.    h = osL
1ee60 6f 61 64 4c 69 62 72 61 72 79 57 28 28 4c 50 43  oadLibraryW((LPC
1ee70 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 29  WSTR)zConverted)
1ee80 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66  ;.#endif.  }.#if
1ee90 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
1eea0 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
1eeb0 7b 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64  {.    h = osLoad
1eec0 4c 69 62 72 61 72 79 41 28 28 63 68 61 72 2a 29  LibraryA((char*)
1eed0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d  zConverted);.  }
1eee0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
1eef0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
1ef00 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  d);.  return (vo
1ef10 69 64 2a 29 68 3b 0a 7d 0a 73 74 61 74 69 63 20  id*)h;.}.static 
1ef20 76 6f 69 64 20 77 69 6e 44 6c 45 72 72 6f 72 28  void winDlError(
1ef30 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1ef40 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
1ef50 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 55  r *zBufOut){.  U
1ef60 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1ef70 70 56 66 73 29 3b 0a 20 20 67 65 74 4c 61 73 74  pVfs);.  getLast
1ef80 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61  ErrorMsg(osGetLa
1ef90 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c  stError(), nBuf,
1efa0 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 73 74 61   zBufOut);.}.sta
1efb0 74 69 63 20 76 6f 69 64 20 28 2a 77 69 6e 44 6c  tic void (*winDl
1efc0 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20  Sym(sqlite3_vfs 
1efd0 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61  *pVfs, void *pHa
1efe0 6e 64 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  ndle, const char
1eff0 20 2a 7a 53 79 6d 62 6f 6c 29 29 28 76 6f 69 64   *zSymbol))(void
1f000 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
1f010 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72  METER(pVfs);.  r
1f020 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28 76  eturn (void(*)(v
1f030 6f 69 64 29 29 6f 73 47 65 74 50 72 6f 63 41 64  oid))osGetProcAd
1f040 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45 29 70  dressA((HANDLE)p
1f050 48 61 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29  Handle, zSymbol)
1f060 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
1f070 77 69 6e 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74  winDlClose(sqlit
1f080 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f  e3_vfs *pVfs, vo
1f090 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20  id *pHandle){.  
1f0a0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1f0b0 28 70 56 66 73 29 3b 0a 20 20 6f 73 46 72 65 65  (pVfs);.  osFree
1f0c0 4c 69 62 72 61 72 79 28 28 48 41 4e 44 4c 45 29  Library((HANDLE)
1f0d0 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73  pHandle);.}.#els
1f0e0 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f  e /* if SQLITE_O
1f0f0 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
1f100 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a  ON is defined: *
1f110 2f 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44  /.  #define winD
1f120 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69  lOpen  0.  #defi
1f130 6e 65 20 77 69 6e 44 6c 45 72 72 6f 72 20 30 0a  ne winDlError 0.
1f140 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 53    #define winDlS
1f150 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65  ym   0.  #define
1f160 20 77 69 6e 44 6c 43 6c 6f 73 65 20 30 0a 23 65   winDlClose 0.#e
1f170 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  ndif.../*.** Wri
1f180 74 65 20 75 70 20 74 6f 20 6e 42 75 66 20 62 79  te up to nBuf by
1f190 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73  tes of randomnes
1f1a0 73 20 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a  s into zBuf..*/.
1f1b0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 61  static int winRa
1f1c0 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33  ndomness(sqlite3
1f1d0 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
1f1e0 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
1f1f0 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a  ){.  int n = 0;.
1f200 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1f210 45 52 28 70 56 66 73 29 3b 0a 23 69 66 20 64 65  ER(pVfs);.#if de
1f220 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
1f230 54 29 0a 20 20 6e 20 3d 20 6e 42 75 66 3b 0a 20  T).  n = nBuf;. 
1f240 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c   memset(zBuf, 0,
1f250 20 6e 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20   nBuf);.#else.  
1f260 69 66 28 20 73 69 7a 65 6f 66 28 53 59 53 54 45  if( sizeof(SYSTE
1f270 4d 54 49 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20 29  MTIME)<=nBuf-n )
1f280 7b 0a 20 20 20 20 53 59 53 54 45 4d 54 49 4d 45  {.    SYSTEMTIME
1f290 20 78 3b 0a 20 20 20 20 6f 73 47 65 74 53 79 73   x;.    osGetSys
1f2a0 74 65 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20 20  temTime(&x);.   
1f2b0 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d   memcpy(&zBuf[n]
1f2c0 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29  , &x, sizeof(x))
1f2d0 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
1f2e0 66 28 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  f(x);.  }.  if( 
1f2f0 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e  sizeof(DWORD)<=n
1f300 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f  Buf-n ){.    DWO
1f310 52 44 20 70 69 64 20 3d 20 6f 73 47 65 74 43 75  RD pid = osGetCu
1f320 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1f330 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
1f340 75 66 5b 6e 5d 2c 20 26 70 69 64 2c 20 73 69 7a  uf[n], &pid, siz
1f350 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20 6e  eof(pid));.    n
1f360 20 2b 3d 20 73 69 7a 65 6f 66 28 70 69 64 29 3b   += sizeof(pid);
1f370 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f  .  }.#if SQLITE_
1f380 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 73  OS_WINRT.  if( s
1f390 69 7a 65 6f 66 28 55 4c 4f 4e 47 4c 4f 4e 47 29  izeof(ULONGLONG)
1f3a0 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20  <=nBuf-n ){.    
1f3b0 55 4c 4f 4e 47 4c 4f 4e 47 20 63 6e 74 20 3d 20  ULONGLONG cnt = 
1f3c0 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34  osGetTickCount64
1f3d0 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ();.    memcpy(&
1f3e0 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73  zBuf[n], &cnt, s
1f3f0 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20  izeof(cnt));.   
1f400 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74   n += sizeof(cnt
1f410 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69  );.  }.#else.  i
1f420 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29  f( sizeof(DWORD)
1f430 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20  <=nBuf-n ){.    
1f440 44 57 4f 52 44 20 63 6e 74 20 3d 20 6f 73 47 65  DWORD cnt = osGe
1f450 74 54 69 63 6b 43 6f 75 6e 74 28 29 3b 0a 20 20  tTickCount();.  
1f460 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e    memcpy(&zBuf[n
1f470 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28  ], &cnt, sizeof(
1f480 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  cnt));.    n += 
1f490 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d  sizeof(cnt);.  }
1f4a0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 69  .#endif.  if( si
1f4b0 7a 65 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45 47  zeof(LARGE_INTEG
1f4c0 45 52 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20  ER)<=nBuf-n ){. 
1f4d0 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52     LARGE_INTEGER
1f4e0 20 69 3b 0a 20 20 20 20 6f 73 51 75 65 72 79 50   i;.    osQueryP
1f4f0 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65  erformanceCounte
1f500 72 28 26 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70  r(&i);.    memcp
1f510 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c 20  y(&zBuf[n], &i, 
1f520 73 69 7a 65 6f 66 28 69 29 29 3b 0a 20 20 20 20  sizeof(i));.    
1f530 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 69 29 3b 0a  n += sizeof(i);.
1f540 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
1f550 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn n;.}.../*.**
1f560 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74   Sleep for a lit
1f570 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75  tle while.  Retu
1f580 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  rn the amount of
1f590 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a   time slept..*/.
1f5a0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 6c  static int winSl
1f5b0 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20  eep(sqlite3_vfs 
1f5c0 2a 70 56 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f  *pVfs, int micro
1f5d0 73 65 63 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  sec){.  sqlite3_
1f5e0 77 69 6e 33 32 5f 73 6c 65 65 70 28 28 6d 69 63  win32_sleep((mic
1f5f0 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29  rosec+999)/1000)
1f600 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1f610 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65  ETER(pVfs);.  re
1f620 74 75 72 6e 20 28 28 6d 69 63 72 6f 73 65 63 2b  turn ((microsec+
1f630 39 39 39 29 2f 31 30 30 30 29 2a 31 30 30 30 3b  999)/1000)*1000;
1f640 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
1f650 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
1f660 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f  , if set to a no
1f670 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73  n-zero value, is
1f680 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a   interpreted as.
1f690 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
1f6a0 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
1f6b0 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20  970 and is used 
1f6c0 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c  to set the resul
1f6d0 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f  t of.** sqlite3O
1f6e0 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64  sCurrentTime() d
1f6f0 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a  uring testing..*
1f700 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1f710 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
1f720 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20  _current_time = 
1f730 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74  0;  /* Fake syst
1f740 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e  em time in secon
1f750 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a  ds since 1970. *
1f760 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
1f770 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
1f780 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
1f790 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
1f7a0 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e  Time).  Write in
1f7b0 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65  to *piNow.** the
1f7c0 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
1f7d0 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
1f7e0 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69  an Day number ti
1f7f0 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20  mes 86_400_000. 
1f800 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72   In.** other wor
1f810 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a  ds, write into *
1f820 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72  piNow the number
1f830 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
1f840 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61   since the Julia
1f850 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f  n.** epoch of no
1f860 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20  on in Greenwich 
1f870 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20  on November 24, 
1f880 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69  4714 B.C accordi
1f890 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f  ng to the.** pro
1f8a0 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e  leptic Gregorian
1f8b0 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a   calendar..**.**
1f8c0 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   On success, ret
1f8d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20  urn SQLITE_OK.  
1f8e0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  Return SQLITE_ER
1f8f0 52 4f 52 20 69 66 20 74 68 65 20 74 69 6d 65 20  ROR if the time 
1f900 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e  and date .** can
1f910 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
1f920 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43  .static int winC
1f930 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
1f940 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1f950 73 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  s, sqlite3_int64
1f960 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46   *piNow){.  /* F
1f970 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74 75 72  ILETIME structur
1f980 65 20 69 73 20 61 20 36 34 2d 62 69 74 20 76 61  e is a 64-bit va
1f990 6c 75 65 20 72 65 70 72 65 73 65 6e 74 69 6e 67  lue representing
1f9a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a   the number of .
1f9b0 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65 63       100-nanosec
1f9c0 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 20 73 69  ond intervals si
1f9d0 6e 63 65 20 4a 61 6e 75 61 72 79 20 31 2c 20 31  nce January 1, 1
1f9e0 36 30 31 20 28 3d 20 4a 44 20 32 33 30 35 38 31  601 (= JD 230581
1f9f0 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20 20 46 49  3.5). .  */.  FI
1fa00 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 73 74 61  LETIME ft;.  sta
1fa10 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
1fa20 33 5f 69 6e 74 36 34 20 77 69 6e 46 69 6c 65 74  3_int64 winFilet
1fa30 69 6d 65 45 70 6f 63 68 20 3d 20 32 33 30 35 38  imeEpoch = 23058
1fa40 31 33 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  135*(sqlite3_int
1fa50 36 34 29 38 36 34 30 30 30 30 3b 0a 23 69 66 64  64)8640000;.#ifd
1fa60 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1fa70 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
1fa80 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78  lite3_int64 unix
1fa90 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35  Epoch = 24405875
1faa0 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
1fab0 38 36 34 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a  8640000;.#endif.
1fac0 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74 6f 20 61    /* 2^32 - to a
1fad0 76 6f 69 64 20 75 73 65 20 6f 66 20 4c 4c 20 61  void use of LL a
1fae0 6e 64 20 77 61 72 6e 69 6e 67 73 20 69 6e 20 67  nd warnings in g
1faf0 63 63 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63  cc */.  static c
1fb00 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
1fb10 36 34 20 6d 61 78 33 32 42 69 74 56 61 6c 75 65  64 max32BitValue
1fb20 20 3d 20 0a 20 20 20 20 20 20 28 73 71 6c 69 74   = .      (sqlit
1fb30 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30  e3_int64)2000000
1fb40 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 69  000 + (sqlite3_i
1fb50 6e 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20  nt64)2000000000 
1fb60 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  + (sqlite3_int64
1fb70 29 32 39 34 39 36 37 32 39 36 3b 0a 0a 23 69 66  )294967296;..#if
1fb80 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
1fb90 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69  .  SYSTEMTIME ti
1fba0 6d 65 3b 0a 20 20 6f 73 47 65 74 53 79 73 74 65  me;.  osGetSyste
1fbb0 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20  mTime(&time);.  
1fbc0 2f 2a 20 69 66 20 53 79 73 74 65 6d 54 69 6d 65  /* if SystemTime
1fbd0 54 6f 46 69 6c 65 54 69 6d 65 28 29 20 66 61 69  ToFileTime() fai
1fbe0 6c 73 2c 20 69 74 20 72 65 74 75 72 6e 73 20 7a  ls, it returns z
1fbf0 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21 6f  ero. */.  if (!o
1fc00 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c  sSystemTimeToFil
1fc10 65 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74 29  eTime(&time,&ft)
1fc20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1fc30 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
1fc40 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73  #else.  osGetSys
1fc50 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
1fc60 65 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66  e( &ft );.#endif
1fc70 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e  ..  *piNow = win
1fc80 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a  FiletimeEpoch +.
1fc90 20 20 20 20 20 20 20 20 20 20 20 20 28 28 28 28              ((((
1fca0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74  sqlite3_int64)ft
1fcb0 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 29  .dwHighDateTime)
1fcc0 2a 6d 61 78 33 32 42 69 74 56 61 6c 75 65 29 20  *max32BitValue) 
1fcd0 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  + .             
1fce0 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34    (sqlite3_int64
1fcf0 29 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d  )ft.dwLowDateTim
1fd00 65 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  e)/(sqlite3_int6
1fd10 34 29 31 30 30 30 30 3b 0a 0a 23 69 66 64 65 66  4)10000;..#ifdef
1fd20 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
1fd30 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  f( sqlite3_curre
1fd40 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a  nt_time ){.    *
1fd50 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71  piNow = 1000*(sq
1fd60 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69  lite3_int64)sqli
1fd70 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
1fd80 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20   + unixEpoch;.  
1fd90 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45  }.#endif.  UNUSE
1fda0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
1fdb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1fdc0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1fdd0 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
1fde0 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
1fdf0 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
1fe00 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68  Time).  Write th
1fe10 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d  e.** current tim
1fe20 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
1fe30 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
1fe40 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e  r into *prNow an
1fe50 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20  d.** return 0.  
1fe60 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
1fe70 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61  time and date ca
1fe80 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
1fe90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1fea0 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69  CurrentTime(sqli
1feb0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64  te3_vfs *pVfs, d
1fec0 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20  ouble *prNow){. 
1fed0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
1fee0 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72 63  e3_int64 i;.  rc
1fef0 20 3d 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d   = winCurrentTim
1ff00 65 49 6e 74 36 34 28 70 56 66 73 2c 20 26 69 29  eInt64(pVfs, &i)
1ff10 3b 0a 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20  ;.  if( !rc ){. 
1ff20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36     *prNow = i/86
1ff30 34 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20  400000.0;.  }.  
1ff40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ff50 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20  .** The idea is 
1ff60 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69  that this functi
1ff70 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20  on works like a 
1ff80 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a  combination of.*
1ff90 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  * GetLastError()
1ffa0 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73 61   and FormatMessa
1ffb0 67 65 28 29 20 6f 6e 20 57 69 6e 64 6f 77 73 20  ge() on Windows 
1ffc0 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a  (or errno and.**
1ffd0 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e   strerror_r() on
1ffe0 20 55 6e 69 78 29 2e 20 41 66 74 65 72 20 61 6e   Unix). After an
1fff0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
20000 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66  ed by an OS.** f
20010 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20  unction, SQLite 
20020 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
20030 69 6f 6e 20 77 69 74 68 20 7a 42 75 66 20 70 6f  ion with zBuf po
20040 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62  inting to.** a b
20050 75 66 66 65 72 20 6f 66 20 6e 42 75 66 20 62 79  uffer of nBuf by
20060 74 65 73 2e 20 54 68 65 20 4f 53 20 6c 61 79 65  tes. The OS laye
20070 72 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74  r should populat
20080 65 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 20  e the.** buffer 
20090 77 69 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69  with a nul-termi
200a0 6e 61 74 65 64 20 55 54 46 2d 38 20 65 6e 63 6f  nated UTF-8 enco
200b0 64 65 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ded error messag
200c0 65 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20  e.** describing 
200d0 74 68 65 20 6c 61 73 74 20 49 4f 20 65 72 72 6f  the last IO erro
200e0 72 20 74 6f 20 68 61 76 65 20 6f 63 63 75 72 72  r to have occurr
200f0 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61  ed within the ca
20100 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e  lling.** thread.
20110 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72  .**.** If the er
20120 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 74  ror message is t
20130 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20 74 68 65  oo large for the
20140 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72   supplied buffer
20150 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20 62  ,.** it should b
20160 65 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65  e truncated. The
20170 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
20180 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a   xGetLastError.*
20190 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65  * is zero if the
201a0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
201b0 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65  its in the buffe
201c0 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a  r, or non-zero.*
201d0 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20  * otherwise (if 
201e0 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20  the message was 
201f0 74 72 75 6e 63 61 74 65 64 29 2e 20 49 66 20 6e  truncated). If n
20200 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72  on-zero is retur
20210 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20  ned,.** then it 
20220 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
20230 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20   to include the 
20240 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63  nul-terminator c
20250 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74  haracter.** in t
20260 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
20270 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70  ..**.** Not supp
20280 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d  lying an error m
20290 65 73 73 61 67 65 20 77 69 6c 6c 20 68 61 76 65  essage will have
202a0 20 6e 6f 20 61 64 76 65 72 73 65 20 65 66 66 65   no adverse effe
202b0 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e  ct.** on SQLite.
202c0 20 49 74 20 69 73 20 66 69 6e 65 20 74 6f 20 68   It is fine to h
202d0 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74  ave an implement
202e0 61 74 69 6f 6e 20 74 68 61 74 20 6e 65 76 65 72  ation that never
202f0 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65  .** returns an e
20300 72 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a  rror message:.**
20310 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65 74 4c 61  .**   int xGetLa
20320 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  stError(sqlite3_
20330 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
20340 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
20350 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28  {.**     assert(
20360 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a  zBuf[0]=='\0');.
20370 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  **     return 0;
20380 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f  .**   }.**.** Ho
20390 77 65 76 65 72 20 69 66 20 61 6e 20 65 72 72 6f  wever if an erro
203a0 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 75 70  r message is sup
203b0 70 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c 20 62  plied, it will b
203c0 65 20 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a  e incorporated.*
203d0 2a 20 62 79 20 73 71 6c 69 74 65 20 69 6e 74 6f  * by sqlite into
203e0 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
203f0 67 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ge available to 
20400 74 68 65 20 75 73 65 72 20 75 73 69 6e 67 0a 2a  the user using.*
20410 2a 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  * sqlite3_errmsg
20420 28 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b  (), possibly mak
20430 69 6e 67 20 49 4f 20 65 72 72 6f 72 73 20 65 61  ing IO errors ea
20440 73 69 65 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a  sier to debug..*
20450 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
20460 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c  GetLastError(sql
20470 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
20480 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
20490 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f  zBuf){.  UNUSED_
204a0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
204b0 0a 20 20 72 65 74 75 72 6e 20 67 65 74 4c 61 73  .  return getLas
204c0 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c  tErrorMsg(osGetL
204d0 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 66  astError(), nBuf
204e0 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , zBuf);.}../*.*
204f0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64  * Initialize and
20500 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68   deinitialize th
20510 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
20520 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  em interface..*/
20530 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
20540 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73 74  init(void){.  st
20550 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
20560 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20   winVfs = {.    
20570 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3,              
20580 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
20590 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77   */.    sizeof(w
205a0 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20  inFile),     /* 
205b0 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20  szOsFile */.    
205c0 4d 41 58 5f 50 41 54 48 2c 20 20 20 20 20 20 20  MAX_PATH,       
205d0 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61       /* mxPathna
205e0 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  me */.    0,    
205f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20600 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22  * pNext */.    "
20610 77 69 6e 33 32 22 2c 20 20 20 20 20 20 20 20 20  win32",         
20620 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a      /* zName */.
20630 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
20640 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70           /* pApp
20650 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f  Data */.    winO
20660 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pen,            
20670 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20   /* xOpen */.   
20680 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20   winDelete,     
20690 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65        /* xDelete
206a0 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73   */.    winAcces
206b0 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
206c0 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77  xAccess */.    w
206d0 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  inFullPathname, 
206e0 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68      /* xFullPath
206f0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44  name */.    winD
20700 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  lOpen,          
20710 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20   /* xDlOpen */. 
20720 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20     winDlError,  
20730 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72          /* xDlEr
20740 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ror */.    winDl
20750 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sym,            
20760 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20  /* xDlSym */.   
20770 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20   winDlClose,    
20780 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
20790 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64  e */.    winRand
207a0 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a  omness,       /*
207b0 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a   xRandomness */.
207c0 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20      winSleep,   
207d0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65           /* xSle
207e0 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  ep */.    winCur
207f0 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f  rentTime,      /
20800 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a  * xCurrentTime *
20810 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74  /.    winGetLast
20820 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47  Error,     /* xG
20830 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20  etLastError */. 
20840 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d     winCurrentTim
20850 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72  eInt64, /* xCurr
20860 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a  entTimeInt64 */.
20870 20 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d      winSetSystem
20880 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74  Call,    /* xSet
20890 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
208a0 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61    winGetSystemCa
208b0 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79  ll,    /* xGetSy
208c0 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
208d0 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  winNextSystemCal
208e0 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73  l,   /* xNextSys
208f0 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a  temCall */.  };.
20900 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63 68 65  .  /* Double-che
20910 63 6b 20 74 68 61 74 20 74 68 65 20 61 53 79 73  ck that the aSys
20920 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68 61 73  call[] array has
20930 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65   been constructe
20940 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79  d.  ** correctly
20950 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b 62  .  See ticket [b
20960 62 33 61 38 36 65 38 39 30 63 38 65 39 36 61 62  b3a86e890c8e96ab
20970 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 41  ] */.  assert( A
20980 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c  rraySize(aSyscal
20990 6c 29 3d 3d 37 33 20 29 3b 0a 0a 23 69 66 6e 64  l)==73 );..#ifnd
209a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
209b0 41 4c 0a 20 20 2f 2a 20 67 65 74 20 6d 65 6d 6f  AL.  /* get memo
209c0 72 79 20 6d 61 70 20 61 6c 6c 6f 63 61 74 69 6f  ry map allocatio
209d0 6e 20 67 72 61 6e 75 6c 61 72 69 74 79 20 2a 2f  n granularity */
209e0 0a 20 20 6d 65 6d 73 65 74 28 26 77 69 6e 53 79  .  memset(&winSy
209f0 73 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  sInfo, 0, sizeof
20a00 28 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a  (SYSTEM_INFO));.
20a10 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
20a20 4e 52 54 0a 20 20 6f 73 47 65 74 4e 61 74 69 76  NRT.  osGetNativ
20a30 65 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e  eSystemInfo(&win
20a40 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a  SysInfo);.#else.
20a50 20 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66    osGetSystemInf
20a60 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a  o(&winSysInfo);.
20a70 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
20a80 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c  winSysInfo.dwAll
20a90 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69  ocationGranulari
20aa0 74 79 20 3e 20 30 29 3b 0a 23 65 6e 64 69 66 0a  ty > 0);.#endif.
20ab0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  .  sqlite3_vfs_r
20ac0 65 67 69 73 74 65 72 28 26 77 69 6e 56 66 73 2c  egister(&winVfs,
20ad0 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51   1);.  return SQ
20ae0 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 69 6e 74  LITE_OK; .}..int
20af0 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28   sqlite3_os_end(
20b00 76 6f 69 64 29 7b 20 0a 23 69 66 20 53 51 4c 49  void){ .#if SQLI
20b10 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66  TE_OS_WINRT.  if
20b20 28 20 73 6c 65 65 70 4f 62 6a 20 21 3d 20 4e 55  ( sleepObj != NU
20b30 4c 4c 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73  LL ){.    osClos
20b40 65 48 61 6e 64 6c 65 28 73 6c 65 65 70 4f 62 6a  eHandle(sleepObj
20b50 29 3b 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a 20  );.    sleepObj 
20b60 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 23 65 6e 64  = NULL;.  }.#end
20b70 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
20b80 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66  TE_OK;.}..#endif
20b90 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   /* SQLITE_OS_WI
20ba0 4e 20 2a 2f 0a                                   N */.