/ Hex Artifact Content
Login

Artifact 4ee163bab365408d971045dd71dd0c05491b70c7:


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 54 68 65 20 76 61 6c 75 65 20 75 73 65 64  * The value used
0d30: 20 77 69 74 68 20 73 71 6c 69 74 65 33 5f 77 69   with sqlite3_wi
0d40: 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
0d50: 79 28 29 20 74 6f 20 73 70 65 63 69 66 79 20 74  y() to specify t
0d60: 68 61 74 0a 20 2a 20 74 68 65 20 64 61 74 61 20  hat. * the data 
0d70: 64 69 72 65 63 74 6f 72 79 20 73 68 6f 75 6c 64  directory should
0d80: 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 2a 2f   be changed.. */
0d90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0da0: 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43  WIN32_DATA_DIREC
0db0: 54 4f 52 59 5f 54 59 50 45 0a 23 20 20 64 65 66  TORY_TYPE.#  def
0dc0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
0dd0: 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f  _DATA_DIRECTORY_
0de0: 54 59 50 45 20 28 31 29 0a 23 65 6e 64 69 66 0a  TYPE (1).#endif.
0df0: 0a 2f 2a 0a 20 2a 20 54 68 65 20 76 61 6c 75 65  ./*. * The value
0e00: 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69 74   used with sqlit
0e10: 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
0e20: 65 63 74 6f 72 79 28 29 20 74 6f 20 73 70 65 63  ectory() to spec
0e30: 69 66 79 20 74 68 61 74 0a 20 2a 20 74 68 65 20  ify that. * the 
0e40: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
0e50: 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20 63 68  ory should be ch
0e60: 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64  anged.. */.#ifnd
0e70: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
0e80: 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54  TEMP_DIRECTORY_T
0e90: 59 50 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  YPE.#  define SQ
0ea0: 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f  LITE_WIN32_TEMP_
0eb0: 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 28  DIRECTORY_TYPE (
0ec0: 32 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  2).#endif../*. *
0ed0: 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   If compiled wit
0ee0: 68 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  h SQLITE_WIN32_M
0ef0: 41 4c 4c 4f 43 20 6f 6e 20 57 69 6e 64 6f 77 73  ALLOC on Windows
0f00: 2c 20 77 65 20 77 69 6c 6c 20 75 73 65 20 74 68  , we will use th
0f10: 65 0a 20 2a 20 76 61 72 69 6f 75 73 20 57 69 6e  e. * various Win
0f20: 33 32 20 41 50 49 20 68 65 61 70 20 66 75 6e 63  32 API heap func
0f30: 74 69 6f 6e 73 20 69 6e 73 74 65 61 64 20 6f 66  tions instead of
0f40: 20 6f 75 72 20 6f 77 6e 2e 0a 20 2a 2f 0a 23 69   our own.. */.#i
0f50: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
0f60: 32 5f 4d 41 4c 4c 4f 43 0a 0a 2f 2a 0a 20 2a 20  2_MALLOC../*. * 
0f70: 49 66 20 74 68 69 73 20 69 73 20 6e 6f 6e 2d 7a  If this is non-z
0f80: 65 72 6f 2c 20 61 6e 20 69 73 6f 6c 61 74 65 64  ero, an isolated
0f90: 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20 63 72   heap will be cr
0fa0: 65 61 74 65 64 20 62 79 20 74 68 65 20 6e 61 74  eated by the nat
0fb0: 69 76 65 20 57 69 6e 33 32 0a 20 2a 20 61 6c 6c  ive Win32. * all
0fc0: 6f 63 61 74 6f 72 20 73 75 62 73 79 73 74 65 6d  ocator subsystem
0fd0: 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 74 68 65  ; otherwise, the
0fe0: 20 64 65 66 61 75 6c 74 20 70 72 6f 63 65 73 73   default process
0ff0: 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20 75 73   heap will be us
1000: 65 64 2e 20 20 54 68 69 73 0a 20 2a 20 73 65 74  ed.  This. * set
1010: 74 69 6e 67 20 68 61 73 20 6e 6f 20 65 66 66 65  ting has no effe
1020: 63 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e  ct when compilin
1030: 67 20 66 6f 72 20 57 69 6e 52 54 2e 20 20 42 79  g for WinRT.  By
1040: 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20 69   default, this i
1050: 73 20 65 6e 61 62 6c 65 64 0a 20 2a 20 61 6e 64  s enabled. * and
1060: 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 68 65 61   an isolated hea
1070: 70 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65  p will be create
1080: 64 20 74 6f 20 73 74 6f 72 65 20 61 6c 6c 20 61  d to store all a
1090: 6c 6c 6f 63 61 74 65 64 20 64 61 74 61 2e 0a 20  llocated data.. 
10a0: 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *. *************
10b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 20 2a 20 57 41 52 4e 49 4e 47 3a 20 49 74  *. * WARNING: It
1100: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
1110: 20 6e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20   note that when 
1120: 74 68 69 73 20 73 65 74 74 69 6e 67 20 69 73 20  this setting is 
1130: 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65  non-zero and the
1140: 0a 20 2a 20 20 20 20 20 20 20 20 20 20 77 69 6e  . *          win
1150: 4d 65 6d 53 68 75 74 64 6f 77 6e 20 66 75 6e 63  MemShutdown func
1160: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28  tion is called (
1170: 65 2e 67 2e 20 62 79 20 74 68 65 20 73 71 6c 69  e.g. by the sqli
1180: 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a 20 2a 20  te3_shutdown. * 
1190: 20 20 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f           functio
11a0: 6e 29 2c 20 61 6c 6c 20 64 61 74 61 20 74 68 61  n), all data tha
11b0: 74 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  t was allocated 
11c0: 75 73 69 6e 67 20 74 68 65 20 69 73 6f 6c 61 74  using the isolat
11d0: 65 64 20 68 65 61 70 20 77 69 6c 6c 0a 20 2a 20  ed heap will. * 
11e0: 20 20 20 20 20 20 20 20 20 62 65 20 66 72 65 65           be free
11f0: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 6e  d immediately an
1200: 64 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74 6f  d any attempt to
1210: 20 61 63 63 65 73 73 20 61 6e 79 20 6f 66 20 74   access any of t
1220: 68 61 74 20 66 72 65 65 64 0a 20 2a 20 20 20 20  hat freed. *    
1230: 20 20 20 20 20 20 64 61 74 61 20 77 69 6c 6c 20        data will 
1240: 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c 79  almost certainly
1250: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6d   result in an im
1260: 6d 65 64 69 61 74 65 20 61 63 63 65 73 73 20 76  mediate access v
1270: 69 6f 6c 61 74 69 6f 6e 2e 0a 20 2a 2a 2a 2a 2a  iolation.. *****
1280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 2f 0a 23 69  *********. */.#i
12d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
12e0: 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45 0a 23  32_HEAP_CREATE.#
12f0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
1300: 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54  WIN32_HEAP_CREAT
1310: 45 20 20 20 20 28 54 52 55 45 29 0a 23 65 6e 64  E    (TRUE).#end
1320: 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 69 6e  if../*. * The in
1330: 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  itial size of th
1340: 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63  e Win32-specific
1350: 20 68 65 61 70 2e 20 20 54 68 69 73 20 76 61 6c   heap.  This val
1360: 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e 0a  ue may be zero..
1370: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
1380: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e  TE_WIN32_HEAP_IN
1390: 49 54 5f 53 49 5a 45 0a 23 20 20 64 65 66 69 6e  IT_SIZE.#  defin
13a0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e SQLITE_WIN32_H
13b0: 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 20 28 28  EAP_INIT_SIZE ((
13c0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43  SQLITE_DEFAULT_C
13d0: 41 43 48 45 5f 53 49 5a 45 29 20 2a 20 5c 0a 20  ACHE_SIZE) * \. 
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1400: 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 44 45        (SQLITE_DE
1410: 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29  FAULT_PAGE_SIZE)
1420: 20 2b 20 34 31 39 34 33 30 34 29 0a 23 65 6e 64   + 4194304).#end
1430: 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 6d 61  if../*. * The ma
1440: 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74 68  ximum size of th
1450: 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63  e Win32-specific
1460: 20 68 65 61 70 2e 20 20 54 68 69 73 20 76 61 6c   heap.  This val
1470: 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e 0a  ue may be zero..
1480: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
1490: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41  TE_WIN32_HEAP_MA
14a0: 58 5f 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65  X_SIZE.#  define
14b0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
14c0: 41 50 5f 4d 41 58 5f 53 49 5a 45 20 20 28 30 29  AP_MAX_SIZE  (0)
14d0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
14e0: 68 65 20 65 78 74 72 61 20 66 6c 61 67 73 20 74  he extra flags t
14f0: 6f 20 75 73 65 20 69 6e 20 63 61 6c 6c 73 20 74  o use in calls t
1500: 6f 20 74 68 65 20 57 69 6e 33 32 20 68 65 61 70  o the Win32 heap
1510: 20 41 50 49 73 2e 20 20 54 68 69 73 20 76 61 6c   APIs.  This val
1520: 75 65 20 6d 61 79 20 62 65 0a 20 2a 20 7a 65 72  ue may be. * zer
1530: 6f 20 66 6f 72 20 74 68 65 20 64 65 66 61 75 6c  o for the defaul
1540: 74 20 62 65 68 61 76 69 6f 72 2e 0a 20 2a 2f 0a  t behavior.. */.
1550: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
1560: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 0a  IN32_HEAP_FLAGS.
1570: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
1580: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
1590: 53 20 20 20 20 20 28 30 29 0a 23 65 6e 64 69 66  S     (0).#endif
15a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 4d  ../*.** The winM
15b0: 65 6d 44 61 74 61 20 73 74 72 75 63 74 75 72 65  emData structure
15c0: 20 73 74 6f 72 65 73 20 69 6e 66 6f 72 6d 61 74   stores informat
15d0: 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20  ion required by 
15e0: 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66  the Win32-specif
15f0: 69 63 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65  ic.** sqlite3_me
1600: 6d 5f 6d 65 74 68 6f 64 73 20 69 6d 70 6c 65 6d  m_methods implem
1610: 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70  entation..*/.typ
1620: 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 4d  edef struct winM
1630: 65 6d 44 61 74 61 20 77 69 6e 4d 65 6d 44 61 74  emData winMemDat
1640: 61 3b 0a 73 74 72 75 63 74 20 77 69 6e 4d 65 6d  a;.struct winMem
1650: 44 61 74 61 20 7b 0a 23 69 66 6e 64 65 66 20 4e  Data {.#ifndef N
1660: 44 45 42 55 47 0a 20 20 75 33 32 20 6d 61 67 69  DEBUG.  u32 magi
1670: 63 3b 20 20 20 20 2f 2a 20 4d 61 67 69 63 20 6e  c;    /* Magic n
1680: 75 6d 62 65 72 20 74 6f 20 64 65 74 65 63 74 20  umber to detect 
1690: 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75 70  structure corrup
16a0: 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  tion. */.#endif.
16b0: 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 20    HANDLE hHeap; 
16c0: 2f 2a 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f  /* The handle to
16d0: 20 6f 75 72 20 68 65 61 70 2e 20 2a 2f 0a 20 20   our heap. */.  
16e0: 42 4f 4f 4c 20 62 4f 77 6e 65 64 3b 20 20 2f 2a  BOOL bOwned;  /*
16f0: 20 44 6f 20 77 65 20 6f 77 6e 20 74 68 65 20 68   Do we own the h
1700: 65 61 70 20 28 69 2e 65 2e 20 64 65 73 74 72 6f  eap (i.e. destro
1710: 79 20 69 74 20 6f 6e 20 73 68 75 74 64 6f 77 6e  y it on shutdown
1720: 29 3f 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e 64 65  )? */.};..#ifnde
1730: 66 20 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65  f NDEBUG.#define
1740: 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 20 20   WINMEM_MAGIC   
1750: 20 20 30 78 34 32 62 32 38 33 30 62 0a 23 65 6e    0x42b2830b.#en
1760: 64 69 66 0a 0a 73 74 61 74 69 63 20 73 74 72 75  dif..static stru
1770: 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 77 69  ct winMemData wi
1780: 6e 5f 6d 65 6d 5f 64 61 74 61 20 3d 20 7b 0a 23  n_mem_data = {.#
1790: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
17a0: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 2c 0a 23 65  WINMEM_MAGIC,.#e
17b0: 6e 64 69 66 0a 20 20 4e 55 4c 4c 2c 20 46 41 4c  ndif.  NULL, FAL
17c0: 53 45 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e  SE.};..#ifndef N
17d0: 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20 77 69  DEBUG.#define wi
17e0: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
17f0: 29 20 61 73 73 65 72 74 28 20 77 69 6e 5f 6d 65  ) assert( win_me
1800: 6d 5f 64 61 74 61 2e 6d 61 67 69 63 3d 3d 57 49  m_data.magic==WI
1810: 4e 4d 45 4d 5f 4d 41 47 49 43 20 29 0a 23 65 6c  NMEM_MAGIC ).#el
1820: 73 65 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65  se.#define winMe
1830: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 0a 23  mAssertMagic().#
1840: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 77  endif..#define w
1850: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 20 77  inMemGetHeap() w
1860: 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 68 48 65 61  in_mem_data.hHea
1870: 70 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  p..static void *
1880: 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74  winMemMalloc(int
1890: 20 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69 63   nBytes);.static
18a0: 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65 65   void winMemFree
18b0: 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 3b 0a  (void *pPrior);.
18c0: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e  static void *win
18d0: 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20  MemRealloc(void 
18e0: 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79  *pPrior, int nBy
18f0: 74 65 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  tes);.static int
1900: 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64   winMemSize(void
1910: 20 2a 70 29 3b 0a 73 74 61 74 69 63 20 69 6e 74   *p);.static int
1920: 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69   winMemRoundup(i
1930: 6e 74 20 6e 29 3b 0a 73 74 61 74 69 63 20 69 6e  nt n);.static in
1940: 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69  t winMemInit(voi
1950: 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 73 74  d *pAppData);.st
1960: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d  atic void winMem
1970: 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70  Shutdown(void *p
1980: 41 70 70 44 61 74 61 29 3b 0a 0a 63 6f 6e 73 74  AppData);..const
1990: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
19a0: 68 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d  hods *sqlite3Mem
19b0: 47 65 74 57 69 6e 33 32 28 76 6f 69 64 29 3b 0a  GetWin32(void);.
19c0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
19d0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f  _WIN32_MALLOC */
19e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
19f0: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69  owing variable i
1a00: 73 20 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65 74  s (normally) set
1a10: 20 6f 6e 63 65 20 61 6e 64 20 6e 65 76 65 72 20   once and never 
1a20: 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72 65  changes.** there
1a30: 61 66 74 65 72 2e 20 20 49 74 20 72 65 63 6f 72  after.  It recor
1a40: 64 73 20 77 68 65 74 68 65 72 20 74 68 65 20 6f  ds whether the o
1a50: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
1a60: 69 73 20 57 69 6e 39 78 0a 2a 2a 20 6f 72 20 57  is Win9x.** or W
1a70: 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20  inNT..**.** 0:  
1a80: 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   Operating syste
1a90: 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a  m unknown..** 1:
1aa0: 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73     Operating sys
1ab0: 74 65 6d 20 69 73 20 57 69 6e 39 78 2e 0a 2a 2a  tem is Win9x..**
1ac0: 20 32 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20   2:   Operating 
1ad0: 73 79 73 74 65 6d 20 69 73 20 57 69 6e 4e 54 2e  system is WinNT.
1ae0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20  .**.** In order 
1af0: 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 65  to facilitate te
1b00: 73 74 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e 54  sting on a WinNT
1b10: 20 73 79 73 74 65 6d 2c 20 74 68 65 20 74 65 73   system, the tes
1b20: 74 20 66 69 78 74 75 72 65 0a 2a 2a 20 63 61 6e  t fixture.** can
1b30: 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20 74 68   manually set th
1b40: 69 73 20 76 61 6c 75 65 20 74 6f 20 31 20 74 6f  is value to 1 to
1b50: 20 65 6d 75 6c 61 74 65 20 57 69 6e 39 38 20 62   emulate Win98 b
1b60: 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66 64  ehavior..*/.#ifd
1b70: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
1b80: 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  nt sqlite3_os_ty
1b90: 70 65 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  pe = 0;.#else.st
1ba0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
1bb0: 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65  _os_type = 0;.#e
1bc0: 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54  ndif..#if !SQLIT
1bd0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
1be0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 23  QLITE_OS_WINRT.#
1bf0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
1c00: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 23  WIN32_HAS_ANSI.#
1c10: 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
1c20: 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51  E_OS_WINCE || SQ
1c30: 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e 54 20 7c 7c  LITE_OS_WINNT ||
1c40: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
1c50: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
1c60: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
1c70: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
1c80: 20 53 59 53 43 41 4c 4c 0a 23 20 20 64 65 66 69   SYSCALL.#  defi
1c90: 6e 65 20 53 59 53 43 41 4c 4c 20 73 71 6c 69 74  ne SYSCALL sqlit
1ca0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 0a 23  e3_syscall_ptr.#
1cb0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1cc0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  s function is no
1cd0: 74 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57  t available on W
1ce0: 69 6e 64 6f 77 73 20 43 45 20 6f 72 20 57 69 6e  indows CE or Win
1cf0: 52 54 2e 0a 20 2a 2f 0a 0a 23 69 66 20 53 51 4c  RT.. */..#if SQL
1d00: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20  ITE_OS_WINCE || 
1d10: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
1d20: 23 20 20 64 65 66 69 6e 65 20 6f 73 41 72 65 46  #  define osAreF
1d30: 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 20 20  ileApisANSI()   
1d40: 20 20 20 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a      1.#endif../*
1d50: 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20  .** Many system 
1d60: 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73  calls are access
1d70: 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74  ed through point
1d80: 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20  er-to-functions 
1d90: 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20  so that.** they 
1da0: 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65  may be overridde
1db0: 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20  n at runtime to 
1dc0: 66 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74  facilitate fault
1dd0: 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e   injection durin
1de0: 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  g.** testing and
1df0: 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68   sandboxing.  Th
1e00: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61  e following arra
1e10: 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  y holds the name
1e20: 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a  s and pointers.*
1e30: 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64  * to all overrid
1e40: 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c  eable system cal
1e50: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  ls..*/.static st
1e60: 72 75 63 74 20 77 69 6e 5f 73 79 73 63 61 6c 6c  ruct win_syscall
1e70: 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   {.  const char 
1e80: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
1e90: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1ea0: 65 20 73 79 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a  e sytem call */.
1eb0: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
1ec0: 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20  l_ptr pCurrent; 
1ed0: 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65  /* Current value
1ee0: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   of the system c
1ef0: 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  all */.  sqlite3
1f00: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65  _syscall_ptr pDe
1f10: 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c  fault; /* Defaul
1f20: 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79  t value */.} aSy
1f30: 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 23 69 66 20  scall[] = {.#if 
1f40: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
1f50: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
1f60: 49 4e 52 54 0a 20 20 7b 20 22 41 72 65 46 69 6c  INRT.  { "AreFil
1f70: 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20  eApisANSI",     
1f80: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 41 72 65      (SYSCALL)Are
1f90: 46 69 6c 65 41 70 69 73 41 4e 53 49 2c 20 20 20  FileApisANSI,   
1fa0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
1fb0: 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41 70 69  .  { "AreFileApi
1fc0: 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20 20 20  sANSI",         
1fd0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
2000: 69 66 6e 64 65 66 20 6f 73 41 72 65 46 69 6c 65  ifndef osAreFile
2010: 41 70 69 73 41 4e 53 49 0a 23 64 65 66 69 6e 65  ApisANSI.#define
2020: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
2030: 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  SI ((BOOL(WINAPI
2040: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
2050: 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23  l[0].pCurrent).#
2060: 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
2070: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65  E_OS_WINCE && de
2080: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
2090: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
20a0: 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20   "CharLowerW",  
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
20c0: 43 41 4c 4c 29 43 68 61 72 4c 6f 77 65 72 57 2c  CALL)CharLowerW,
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
20e0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 68  },.#else.  { "Ch
20f0: 61 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20  arLowerW",      
2100: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
2110: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
2120: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
2130: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
2140: 73 43 68 61 72 4c 6f 77 65 72 57 20 28 28 4c 50  sCharLowerW ((LP
2150: 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c 50  WSTR(WINAPI*)(LP
2160: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 31  WSTR))aSyscall[1
2170: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
2180: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
2190: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
21a0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
21b0: 45 29 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65  E).  { "CharUppe
21c0: 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rW",            
21d0: 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72 55    (SYSCALL)CharU
21e0: 70 70 65 72 57 2c 20 20 20 20 20 20 20 20 20 20  pperW,          
21f0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
2200: 20 7b 20 22 43 68 61 72 55 70 70 65 72 57 22 2c   { "CharUpperW",
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
2220: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2240: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
2250: 66 69 6e 65 20 6f 73 43 68 61 72 55 70 70 65 72  fine osCharUpper
2260: 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e 41 50  W ((LPWSTR(WINAP
2270: 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53 79 73  I*)(LPWSTR))aSys
2280: 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74  call[2].pCurrent
2290: 29 0a 0a 20 20 7b 20 22 43 6c 6f 73 65 48 61 6e  )..  { "CloseHan
22a0: 64 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  dle",           
22b0: 20 20 28 53 59 53 43 41 4c 4c 29 43 6c 6f 73 65    (SYSCALL)Close
22c0: 48 61 6e 64 6c 65 2c 20 20 20 20 20 20 20 20 20  Handle,         
22d0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
22e0: 65 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 20  e osCloseHandle 
22f0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
2300: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
2310: 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [3].pCurrent)..#
2320: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
2330: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
2340: 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  ).  { "CreateFil
2350: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eA",            
2360: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
2370: 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20  FileA,          
2380: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
2390: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c  { "CreateFileA",
23a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
23b0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
23d0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
23e0: 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65  ine osCreateFile
23f0: 41 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  A ((HANDLE(WINAP
2400: 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44  I*)(LPCSTR,DWORD
2410: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
2420: 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54    LPSECURITY_ATT
2430: 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57  RIBUTES,DWORD,DW
2440: 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73  ORD,HANDLE))aSys
2450: 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74  call[4].pCurrent
2460: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
2470: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
2480: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
2490: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43  HAS_WIDE).  { "C
24a0: 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20  reateFileW",    
24b0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
24c0: 4c 29 43 72 65 61 74 65 46 69 6c 65 57 2c 20 20  L)CreateFileW,  
24d0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
24e0: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74  #else.  { "Creat
24f0: 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20  eFileW",        
2500: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2520: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
2530: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72  if..#define osCr
2540: 65 61 74 65 46 69 6c 65 57 20 28 28 48 41 4e 44  eateFileW ((HAND
2550: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  LE(WINAPI*)(LPCW
2560: 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  STR,DWORD,DWORD,
2570: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43   \.        LPSEC
2580: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
2590: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e  ,DWORD,DWORD,HAN
25a0: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d  DLE))aSyscall[5]
25b0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
25c0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
25d0: 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57  || (!SQLITE_OS_W
25e0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
25f0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
2600: 5f 57 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20  _WIDE) && \.    
2610: 20 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c      !defined(SQL
2620: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20  ITE_OMIT_WAL)). 
2630: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61   { "CreateFileMa
2640: 70 70 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53  ppingW",      (S
2650: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c  YSCALL)CreateFil
2660: 65 4d 61 70 70 69 6e 67 57 2c 20 20 20 20 20 20  eMappingW,      
2670: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
2680: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
2690: 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gW",      (SYSCA
26a0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
26c0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
26d0: 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
26e0: 70 69 6e 67 57 20 28 28 48 41 4e 44 4c 45 28 57  pingW ((HANDLE(W
26f0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
2700: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
2710: 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20  UTES, \.        
2720: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
2730: 44 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73 63  D,LPCWSTR))aSysc
2740: 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29  all[6].pCurrent)
2750: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
2760: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
2770: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
2780: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 72  AS_WIDE).  { "Cr
2790: 65 61 74 65 4d 75 74 65 78 57 22 2c 20 20 20 20  eateMutexW",    
27a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
27b0: 29 43 72 65 61 74 65 4d 75 74 65 78 57 2c 20 20  )CreateMutexW,  
27c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
27d0: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
27e0: 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20 20 20  MutexW",        
27f0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2810: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
2820: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
2830: 61 74 65 4d 75 74 65 78 57 20 28 28 48 41 4e 44  ateMutexW ((HAND
2840: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 45  LE(WINAPI*)(LPSE
2850: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
2860: 53 2c 42 4f 4f 4c 2c 20 5c 0a 20 20 20 20 20 20  S,BOOL, \.      
2870: 20 20 4c 50 43 57 53 54 52 29 29 61 53 79 73 63    LPCWSTR))aSysc
2880: 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29  all[7].pCurrent)
2890: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
28a0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
28b0: 4e 53 49 29 0a 20 20 7b 20 22 44 65 6c 65 74 65  NSI).  { "Delete
28c0: 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20  FileA",         
28d0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c      (SYSCALL)Del
28e0: 65 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20  eteFileA,       
28f0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
2900: 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65  .  { "DeleteFile
2910: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  A",             
2920: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2940: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
2950: 64 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46  define osDeleteF
2960: 69 6c 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41  ileA ((BOOL(WINA
2970: 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79  PI*)(LPCSTR))aSy
2980: 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e  scall[8].pCurren
2990: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
29a0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
29b0: 5f 57 49 44 45 29 0a 20 20 7b 20 22 44 65 6c 65  _WIDE).  { "Dele
29c0: 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20  teFileW",       
29d0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 44        (SYSCALL)D
29e0: 65 6c 65 74 65 46 69 6c 65 57 2c 20 20 20 20 20  eleteFileW,     
29f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
2a00: 73 65 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69  se.  { "DeleteFi
2a10: 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  leW",           
2a20: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
2a50: 0a 23 64 65 66 69 6e 65 20 6f 73 44 65 6c 65 74  .#define osDelet
2a60: 65 46 69 6c 65 57 20 28 28 42 4f 4f 4c 28 57 49  eFileW ((BOOL(WI
2a70: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29  NAPI*)(LPCWSTR))
2a80: 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72  aSyscall[9].pCur
2a90: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
2aa0: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22  E_OS_WINCE.  { "
2ab0: 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46  FileTimeToLocalF
2ac0: 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41  ileTime", (SYSCA
2ad0: 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63  LL)FileTimeToLoc
2ae0: 61 6c 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c  alFileTime, 0 },
2af0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65  .#else.  { "File
2b00: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
2b10: 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30  ime", (SYSCALL)0
2b20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b30: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
2b40: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46  dif..#define osF
2b50: 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69  ileTimeToLocalFi
2b60: 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49  leTime ((BOOL(WI
2b70: 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c  NAPI*)(CONST FIL
2b80: 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20  ETIME*, \.      
2b90: 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53    LPFILETIME))aS
2ba0: 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72  yscall[10].pCurr
2bb0: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
2bc0: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46  _OS_WINCE.  { "F
2bd0: 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54  ileTimeToSystemT
2be0: 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c  ime",    (SYSCAL
2bf0: 4c 29 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74  L)FileTimeToSyst
2c00: 65 6d 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a  emTime,    0 },.
2c10: 23 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54  #else.  { "FileT
2c20: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22  imeToSystemTime"
2c30: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c  ,    (SYSCALL)0,
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c50: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
2c60: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69  if..#define osFi
2c70: 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69  leTimeToSystemTi
2c80: 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  me ((BOOL(WINAPI
2c90: 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d  *)(CONST FILETIM
2ca0: 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  E*, \.        LP
2cb0: 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73  SYSTEMTIME))aSys
2cc0: 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e  call[11].pCurren
2cd0: 74 29 0a 0a 20 20 7b 20 22 46 6c 75 73 68 46 69  t)..  { "FlushFi
2ce0: 6c 65 42 75 66 66 65 72 73 22 2c 20 20 20 20 20  leBuffers",     
2cf0: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6c 75 73     (SYSCALL)Flus
2d00: 68 46 69 6c 65 42 75 66 66 65 72 73 2c 20 20 20  hFileBuffers,   
2d10: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
2d20: 6e 65 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75  ne osFlushFileBu
2d30: 66 66 65 72 73 20 28 28 42 4f 4f 4c 28 57 49 4e  ffers ((BOOL(WIN
2d40: 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53  API*)(HANDLE))aS
2d50: 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72  yscall[12].pCurr
2d60: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
2d70: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
2d80: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 46 6f  AS_ANSI).  { "Fo
2d90: 72 6d 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20  rmatMessageA",  
2da0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
2db0: 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 2c  )FormatMessageA,
2dc0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
2dd0: 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74  else.  { "Format
2de0: 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20 20 20  MessageA",      
2df0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e10: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
2e20: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f 72  f..#define osFor
2e30: 6d 61 74 4d 65 73 73 61 67 65 41 20 28 28 44 57  matMessageA ((DW
2e40: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f  ORD(WINAPI*)(DWO
2e50: 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44  RD,LPCVOID,DWORD
2e60: 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a  ,DWORD,LPSTR, \.
2e70: 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 76 61          DWORD,va
2e80: 5f 6c 69 73 74 2a 29 29 61 53 79 73 63 61 6c 6c  _list*))aSyscall
2e90: 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [13].pCurrent)..
2ea0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
2eb0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
2ec0: 45 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65  E).  { "FormatMe
2ed0: 73 73 61 67 65 57 22 2c 20 20 20 20 20 20 20 20  ssageW",        
2ee0: 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61    (SYSCALL)Forma
2ef0: 74 4d 65 73 73 61 67 65 57 2c 20 20 20 20 20 20  tMessageW,      
2f00: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
2f10: 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67   { "FormatMessag
2f20: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  eW",          (S
2f30: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f50: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
2f60: 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73  fine osFormatMes
2f70: 73 61 67 65 57 20 28 28 44 57 4f 52 44 28 57 49  sageW ((DWORD(WI
2f80: 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43  NAPI*)(DWORD,LPC
2f90: 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  VOID,DWORD,DWORD
2fa0: 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  ,LPWSTR, \.     
2fb0: 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74     DWORD,va_list
2fc0: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e  *))aSyscall[14].
2fd0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
2fe0: 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20 20 20  FreeLibrary",   
2ff0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3000: 4c 4c 29 46 72 65 65 4c 69 62 72 61 72 79 2c 20  LL)FreeLibrary, 
3010: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3020: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 72 65 65  ..#define osFree
3030: 4c 69 62 72 61 72 79 20 28 28 42 4f 4f 4c 28 57  Library ((BOOL(W
3040: 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c 45 29  INAPI*)(HMODULE)
3050: 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43  )aSyscall[15].pC
3060: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65  urrent)..  { "Ge
3070: 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
3080: 64 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  d",     (SYSCALL
3090: 29 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  )GetCurrentProce
30a0: 73 73 49 64 2c 20 20 20 20 20 30 20 7d 2c 0a 0a  ssId,     0 },..
30b0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 43 75 72  #define osGetCur
30c0: 72 65 6e 74 50 72 6f 63 65 73 73 49 64 20 28 28  rentProcessId ((
30d0: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56  DWORD(WINAPI*)(V
30e0: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 36  OID))aSyscall[16
30f0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3100: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
3110: 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  E && defined(SQL
3120: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
3130: 53 49 29 0a 20 20 7b 20 22 47 65 74 44 69 73 6b  SI).  { "GetDisk
3140: 46 72 65 65 53 70 61 63 65 41 22 2c 20 20 20 20  FreeSpaceA",    
3150: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 44     (SYSCALL)GetD
3160: 69 73 6b 46 72 65 65 53 70 61 63 65 41 2c 20 20  iskFreeSpaceA,  
3170: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
3180: 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65    { "GetDiskFree
3190: 53 70 61 63 65 41 22 2c 20 20 20 20 20 20 20 28  SpaceA",       (
31a0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
31d0: 65 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b 46  efine osGetDiskF
31e0: 72 65 65 53 70 61 63 65 41 20 28 28 42 4f 4f 4c  reeSpaceA ((BOOL
31f0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
3200: 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44  ,LPDWORD,LPDWORD
3210: 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  ,LPDWORD, \.    
3220: 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61 53 79      LPDWORD))aSy
3230: 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65  scall[17].pCurre
3240: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
3250: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
3260: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
3270: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3280: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
3290: 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65    { "GetDiskFree
32a0: 53 70 61 63 65 57 22 2c 20 20 20 20 20 20 20 28  SpaceW",       (
32b0: 53 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46  SYSCALL)GetDiskF
32c0: 72 65 65 53 70 61 63 65 57 2c 20 20 20 20 20 20  reeSpaceW,      
32d0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
32e0: 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  "GetDiskFreeSpac
32f0: 65 57 22 2c 20 20 20 20 20 20 20 28 53 59 53 43  eW",       (SYSC
3300: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3320: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
3330: 65 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53  e osGetDiskFreeS
3340: 70 61 63 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e  paceW ((BOOL(WIN
3350: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 4c 50  API*)(LPCWSTR,LP
3360: 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50  DWORD,LPDWORD,LP
3370: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
3380: 20 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63 61   LPDWORD))aSysca
3390: 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74 29  ll[18].pCurrent)
33a0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
33b0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
33c0: 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 46 69 6c  NSI).  { "GetFil
33d0: 65 41 74 74 72 69 62 75 74 65 73 41 22 2c 20 20  eAttributesA",  
33e0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
33f0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 2c  FileAttributesA,
3400: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3410: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74  .  { "GetFileAtt
3420: 72 69 62 75 74 65 73 41 22 2c 20 20 20 20 20 20  ributesA",      
3430: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3460: 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65  define osGetFile
3470: 41 74 74 72 69 62 75 74 65 73 41 20 28 28 44 57  AttributesA ((DW
3480: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  ORD(WINAPI*)(LPC
3490: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 31 39  STR))aSyscall[19
34a0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
34b0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
34c0: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
34d0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
34e0: 44 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  DE).  { "GetFile
34f0: 41 74 74 72 69 62 75 74 65 73 57 22 2c 20 20 20  AttributesW",   
3500: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
3510: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 2c 20  ileAttributesW, 
3520: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
3530: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
3540: 69 62 75 74 65 73 57 22 2c 20 20 20 20 20 20 28  ibutesW",      (
3550: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3570: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3580: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41  efine osGetFileA
3590: 74 74 72 69 62 75 74 65 73 57 20 28 28 44 57 4f  ttributesW ((DWO
35a0: 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  RD(WINAPI*)(LPCW
35b0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 30  STR))aSyscall[20
35c0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
35d0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
35e0: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
35f0: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
3600: 69 62 75 74 65 73 45 78 57 22 2c 20 20 20 20 28  ibutesExW",    (
3610: 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41  SYSCALL)GetFileA
3620: 74 74 72 69 62 75 74 65 73 45 78 57 2c 20 20 20  ttributesExW,   
3630: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3640: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
3650: 65 73 45 78 57 22 2c 20 20 20 20 28 53 59 53 43  esExW",    (SYSC
3660: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
3670: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3680: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
3690: 65 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  e osGetFileAttri
36a0: 62 75 74 65 73 45 78 57 20 28 28 42 4f 4f 4c 28  butesExW ((BOOL(
36b0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
36c0: 2c 47 45 54 5f 46 49 4c 45 45 58 5f 49 4e 46 4f  ,GET_FILEEX_INFO
36d0: 5f 4c 45 56 45 4c 53 2c 20 5c 0a 20 20 20 20 20  _LEVELS, \.     
36e0: 20 20 20 4c 50 56 4f 49 44 29 29 61 53 79 73 63     LPVOID))aSysc
36f0: 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74  all[21].pCurrent
3700: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
3710: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74  S_WINRT.  { "Get
3720: 46 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20 20  FileSize",      
3730: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3740: 47 65 74 46 69 6c 65 53 69 7a 65 2c 20 20 20 20  GetFileSize,    
3750: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3760: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  lse.  { "GetFile
3770: 53 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20  Size",          
3780: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
37b0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46  ..#define osGetF
37c0: 69 6c 65 53 69 7a 65 20 28 28 44 57 4f 52 44 28  ileSize ((DWORD(
37d0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
37e0: 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  LPDWORD))aSyscal
37f0: 6c 5b 32 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[22].pCurrent).
3800: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
3810: 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64  WINCE && defined
3820: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
3830: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74  S_ANSI).  { "Get
3840: 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22 2c 20  FullPathNameA", 
3850: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3860: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
3870: 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  ,        0 },.#e
3880: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c  lse.  { "GetFull
3890: 50 61 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20  PathNameA",     
38a0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
38b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38c0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
38d0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46  ..#define osGetF
38e0: 75 6c 6c 50 61 74 68 4e 61 6d 65 41 20 28 28 44  ullPathNameA ((D
38f0: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  WORD(WINAPI*)(LP
3900: 43 53 54 52 2c 44 57 4f 52 44 2c 4c 50 53 54 52  CSTR,DWORD,LPSTR
3910: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 54  , \.        LPST
3920: 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d  R*))aSyscall[23]
3930: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3940: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
3950: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
3960: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
3970: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3980: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46  _WIDE).  { "GetF
3990: 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20 20  ullPathNameW",  
39a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
39b0: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 2c  etFullPathNameW,
39c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
39d0: 73 65 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50  se.  { "GetFullP
39e0: 61 74 68 4e 61 6d 65 57 22 2c 20 20 20 20 20 20  athNameW",      
39f0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a10: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3a20: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 75  .#define osGetFu
3a30: 6c 6c 50 61 74 68 4e 61 6d 65 57 20 28 28 44 57  llPathNameW ((DW
3a40: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  ORD(WINAPI*)(LPC
3a50: 57 53 54 52 2c 44 57 4f 52 44 2c 4c 50 57 53 54  WSTR,DWORD,LPWST
3a60: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 57  R, \.        LPW
3a70: 53 54 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b 32  STR*))aSyscall[2
3a80: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  4].pCurrent)..  
3a90: 7b 20 22 47 65 74 4c 61 73 74 45 72 72 6f 72 22  { "GetLastError"
3aa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
3ab0: 53 43 41 4c 4c 29 47 65 74 4c 61 73 74 45 72 72  SCALL)GetLastErr
3ac0: 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  or,            0
3ad0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47   },..#define osG
3ae0: 65 74 4c 61 73 74 45 72 72 6f 72 20 28 28 44 57  etLastError ((DW
3af0: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49  ORD(WINAPI*)(VOI
3b00: 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 35 5d 2e  D))aSyscall[25].
3b10: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
3b20: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
3b30: 20 2f 2a 20 54 68 65 20 47 65 74 50 72 6f 63 41   /* The GetProcA
3b40: 64 64 72 65 73 73 41 28 29 20 72 6f 75 74 69 6e  ddressA() routin
3b50: 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  e is only availa
3b60: 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43  ble on Windows C
3b70: 45 2e 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72  E. */.  { "GetPr
3b80: 6f 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20  ocAddressA",    
3b90: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
3ba0: 74 50 72 6f 63 41 64 64 72 65 73 73 41 2c 20 20  tProcAddressA,  
3bb0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
3bc0: 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72  e.  /* All other
3bd0: 20 57 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72   Windows platfor
3be0: 6d 73 20 65 78 70 65 63 74 20 47 65 74 50 72 6f  ms expect GetPro
3bf0: 63 41 64 64 72 65 73 73 28 29 20 74 6f 20 74 61  cAddress() to ta
3c00: 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 4e 53 49 20  ke.  ** an ANSI 
3c10: 73 74 72 69 6e 67 20 72 65 67 61 72 64 6c 65 73  string regardles
3c20: 73 20 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f 44  s of the _UNICOD
3c30: 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 7b  E setting */.  {
3c40: 20 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73   "GetProcAddress
3c50: 41 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  A",         (SYS
3c60: 43 41 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72  CALL)GetProcAddr
3c70: 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 30 20  ess,          0 
3c80: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
3c90: 6e 65 20 6f 73 47 65 74 50 72 6f 63 41 64 64 72  ne osGetProcAddr
3ca0: 65 73 73 41 20 28 28 46 41 52 50 52 4f 43 28 57  essA ((FARPROC(W
3cb0: 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c 45 2c  INAPI*)(HMODULE,
3cc0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53 54   \.        LPCST
3cd0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 36 5d 2e  R))aSyscall[26].
3ce0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
3cf0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
3d00: 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e    { "GetSystemIn
3d10: 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  fo",           (
3d20: 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65  SYSCALL)GetSyste
3d30: 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  mInfo,          
3d40: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3d50: 22 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 22 2c  "GetSystemInfo",
3d60: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
3d70: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
3d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3d90: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
3da0: 65 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66  e osGetSystemInf
3db0: 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  o ((VOID(WINAPI*
3dc0: 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29  )(LPSYSTEM_INFO)
3dd0: 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d 2e 70 43  )aSyscall[27].pC
3de0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65  urrent)..  { "Ge
3df0: 74 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20  tSystemTime",   
3e00: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3e10: 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 2c 20  )GetSystemTime, 
3e20: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
3e30: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73  #define osGetSys
3e40: 74 65 6d 54 69 6d 65 20 28 28 56 4f 49 44 28 57  temTime ((VOID(W
3e50: 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d  INAPI*)(LPSYSTEM
3e60: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 32  TIME))aSyscall[2
3e70: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
3e80: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
3e90: 43 45 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65  CE.  { "GetSyste
3ea0: 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22  mTimeAsFileTime"
3eb0: 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79  , (SYSCALL)GetSy
3ec0: 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69  stemTimeAsFileTi
3ed0: 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  me, 0 },.#else. 
3ee0: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d   { "GetSystemTim
3ef0: 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53  eAsFileTime", (S
3f00: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f20: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
3f30: 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d  fine osGetSystem
3f40: 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 20 28  TimeAsFileTime (
3f50: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20  (VOID(WINAPI*)( 
3f60: 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45  \.        LPFILE
3f70: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 32  TIME))aSyscall[2
3f80: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
3f90: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
3fa0: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
3fb0: 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74  .  { "GetTempPat
3fc0: 68 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  hA",            
3fd0: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70  (SYSCALL)GetTemp
3fe0: 50 61 74 68 41 2c 20 20 20 20 20 20 20 20 20 20  PathA,          
3ff0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4000: 20 22 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c   "GetTempPathA",
4010: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4020: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4040: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4050: 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68  ne osGetTempPath
4060: 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  A ((DWORD(WINAPI
4070: 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54 52 29 29  *)(DWORD,LPSTR))
4080: 61 53 79 73 63 61 6c 6c 5b 33 30 5d 2e 70 43 75  aSyscall[30].pCu
4090: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
40a0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
40b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
40c0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
40d0: 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 57   { "GetTempPathW
40e0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
40f0: 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50 61  YSCALL)GetTempPa
4100: 74 68 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  thW,            
4110: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4120: 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20 20  GetTempPathW",  
4130: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4140: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4150: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4160: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4170: 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57 20   osGetTempPathW 
4180: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
4190: 28 44 57 4f 52 44 2c 4c 50 57 53 54 52 29 29 61  (DWORD,LPWSTR))a
41a0: 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70 43 75 72  Syscall[31].pCur
41b0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
41c0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
41d0: 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20  "GetTickCount", 
41e0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
41f0: 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e 74  ALL)GetTickCount
4200: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
4210: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
4220: 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20 20  TickCount",     
4230: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4240: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4250: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4260: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4270: 47 65 74 54 69 63 6b 43 6f 75 6e 74 20 28 28 44  GetTickCount ((D
4280: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f  WORD(WINAPI*)(VO
4290: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 32 5d  ID))aSyscall[32]
42a0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
42b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
42c0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
42d0: 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78   { "GetVersionEx
42e0: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  A",           (S
42f0: 59 53 43 41 4c 4c 29 47 65 74 56 65 72 73 69 6f  YSCALL)GetVersio
4300: 6e 45 78 41 2c 20 20 20 20 20 20 20 20 20 20 20  nExA,           
4310: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4320: 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20  GetVersionExA", 
4330: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4340: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4350: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4360: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4370: 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41   osGetVersionExA
4380: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4390: 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 53  ( \.        LPOS
43a0: 56 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29 61 53  VERSIONINFOA))aS
43b0: 79 73 63 61 6c 6c 5b 33 33 5d 2e 70 43 75 72 72  yscall[33].pCurr
43c0: 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 41  ent)..  { "HeapA
43d0: 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20  lloc",          
43e0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
43f0: 61 70 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20  apAlloc,        
4400: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
4410: 66 69 6e 65 20 6f 73 48 65 61 70 41 6c 6c 6f 63  fine osHeapAlloc
4420: 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49   ((LPVOID(WINAPI
4430: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
4440: 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f   \.        SIZE_
4450: 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 34 5d 2e  T))aSyscall[34].
4460: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
4470: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
4480: 20 20 7b 20 22 48 65 61 70 43 72 65 61 74 65 22    { "HeapCreate"
4490: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
44a0: 53 59 53 43 41 4c 4c 29 48 65 61 70 43 72 65 61  SYSCALL)HeapCrea
44b0: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
44c0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
44d0: 22 48 65 61 70 43 72 65 61 74 65 22 2c 20 20 20  "HeapCreate",   
44e0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
44f0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4500: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4510: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4520: 65 20 6f 73 48 65 61 70 43 72 65 61 74 65 20 28  e osHeapCreate (
4530: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
4540: 28 44 57 4f 52 44 2c 53 49 5a 45 5f 54 2c 20 5c  (DWORD,SIZE_T, \
4550: 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29  .        SIZE_T)
4560: 29 61 53 79 73 63 61 6c 6c 5b 33 35 5d 2e 70 43  )aSyscall[35].pC
4570: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
4580: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
4590: 7b 20 22 48 65 61 70 44 65 73 74 72 6f 79 22 2c  { "HeapDestroy",
45a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
45b0: 53 43 41 4c 4c 29 48 65 61 70 44 65 73 74 72 6f  SCALL)HeapDestro
45c0: 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  y,             0
45d0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48   },.#else.  { "H
45e0: 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20 20 20  eapDestroy",    
45f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4600: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4610: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4620: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4630: 6f 73 48 65 61 70 44 65 73 74 72 6f 79 20 28 28  osHeapDestroy ((
4640: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
4650: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 33  NDLE))aSyscall[3
4660: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  6].pCurrent)..  
4670: 7b 20 22 48 65 61 70 46 72 65 65 22 2c 20 20 20  { "HeapFree",   
4680: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4690: 53 43 41 4c 4c 29 48 65 61 70 46 72 65 65 2c 20  SCALL)HeapFree, 
46a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
46b0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48   },..#define osH
46c0: 65 61 70 46 72 65 65 20 28 28 42 4f 4f 4c 28 57  eapFree ((BOOL(W
46d0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
46e0: 57 4f 52 44 2c 4c 50 56 4f 49 44 29 29 61 53 79  WORD,LPVOID))aSy
46f0: 73 63 61 6c 6c 5b 33 37 5d 2e 70 43 75 72 72 65  scall[37].pCurre
4700: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 52 65  nt)..  { "HeapRe
4710: 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20  Alloc",         
4720: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
4730: 70 52 65 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20  pReAlloc,       
4740: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
4750: 69 6e 65 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f  ine osHeapReAllo
4760: 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50  c ((LPVOID(WINAP
4770: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
4780: 2c 4c 50 56 4f 49 44 2c 20 5c 0a 20 20 20 20 20  ,LPVOID, \.     
4790: 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63     SIZE_T))aSysc
47a0: 61 6c 6c 5b 33 38 5d 2e 70 43 75 72 72 65 6e 74  all[38].pCurrent
47b0: 29 0a 0a 20 20 7b 20 22 48 65 61 70 53 69 7a 65  )..  { "HeapSize
47c0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
47d0: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 53    (SYSCALL)HeapS
47e0: 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
47f0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
4800: 65 20 6f 73 48 65 61 70 53 69 7a 65 20 28 28 53  e osHeapSize ((S
4810: 49 5a 45 5f 54 28 57 49 4e 41 50 49 2a 29 28 48  IZE_T(WINAPI*)(H
4820: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20  ANDLE,DWORD, \. 
4830: 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29         LPCVOID))
4840: 61 53 79 73 63 61 6c 6c 5b 33 39 5d 2e 70 43 75  aSyscall[39].pCu
4850: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
4860: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
4870: 20 22 48 65 61 70 56 61 6c 69 64 61 74 65 22 2c   "HeapValidate",
4880: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4890: 43 41 4c 4c 29 48 65 61 70 56 61 6c 69 64 61 74  CALL)HeapValidat
48a0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  e,            0 
48b0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65  },.#else.  { "He
48c0: 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20 20 20  apValidate",    
48d0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
48e0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
48f0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4900: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4910: 73 48 65 61 70 56 61 6c 69 64 61 74 65 20 28 28  sHeapValidate ((
4920: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
4930: 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  NDLE,DWORD, \.  
4940: 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29 61        LPCVOID))a
4950: 53 79 73 63 61 6c 6c 5b 34 30 5d 2e 70 43 75 72  Syscall[40].pCur
4960: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
4970: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
4980: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 4c  HAS_ANSI).  { "L
4990: 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20 20  oadLibraryA",   
49a0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
49b0: 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 41 2c 20  L)LoadLibraryA, 
49c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
49d0: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c  #else.  { "LoadL
49e0: 69 62 72 61 72 79 41 22 2c 20 20 20 20 20 20 20  ibraryA",       
49f0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a10: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4a20: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f  if..#define osLo
4a30: 61 64 4c 69 62 72 61 72 79 41 20 28 28 48 4d 4f  adLibraryA ((HMO
4a40: 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  DULE(WINAPI*)(LP
4a50: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34  CSTR))aSyscall[4
4a60: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
4a70: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
4a80: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
4a90: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
4aa0: 49 44 45 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69  IDE).  { "LoadLi
4ab0: 62 72 61 72 79 57 22 2c 20 20 20 20 20 20 20 20  braryW",        
4ac0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61      (SYSCALL)Loa
4ad0: 64 4c 69 62 72 61 72 79 57 2c 20 20 20 20 20 20  dLibraryW,      
4ae0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
4af0: 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72  .  { "LoadLibrar
4b00: 79 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  yW",            
4b10: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b30: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4b40: 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62  define osLoadLib
4b50: 72 61 72 79 57 20 28 28 48 4d 4f 44 55 4c 45 28  raryW ((HMODULE(
4b60: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
4b70: 29 29 61 53 79 73 63 61 6c 6c 5b 34 32 5d 2e 70  ))aSyscall[42].p
4b80: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
4b90: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
4ba0: 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20   { "LocalFree", 
4bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
4bc0: 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46 72 65 65  YSCALL)LocalFree
4bd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4be0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4bf0: 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 20 20  LocalFree",     
4c00: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4c10: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4c20: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4c30: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4c40: 20 6f 73 4c 6f 63 61 6c 46 72 65 65 20 28 28 48   osLocalFree ((H
4c50: 4c 4f 43 41 4c 28 57 49 4e 41 50 49 2a 29 28 48  LOCAL(WINAPI*)(H
4c60: 4c 4f 43 41 4c 29 29 61 53 79 73 63 61 6c 6c 5b  LOCAL))aSyscall[
4c70: 34 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  43].pCurrent)..#
4c80: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4c90: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
4ca0: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c 6f 63  S_WINRT.  { "Loc
4cb0: 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  kFile",         
4cc0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4cd0: 4c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20 20  LockFile,       
4ce0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4cf0: 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c  lse.  { "LockFil
4d00: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
4d10: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d30: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4d40: 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63 6b  ..#ifndef osLock
4d50: 46 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73 4c  File.#define osL
4d60: 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  ockFile ((BOOL(W
4d70: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
4d80: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
4d90: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
4da0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 34 5d 2e  D))aSyscall[44].
4db0: 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66  pCurrent).#endif
4dc0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
4dd0: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c 6f 63 6b  _WINCE.  { "Lock
4de0: 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20  FileEx",        
4df0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c        (SYSCALL)L
4e00: 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20 20 20  ockFileEx,      
4e10: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
4e20: 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65  se.  { "LockFile
4e30: 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ex",            
4e40: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e60: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4e70: 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63 6b 46  .#ifndef osLockF
4e80: 69 6c 65 45 78 0a 23 64 65 66 69 6e 65 20 6f 73  ileEx.#define os
4e90: 4c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f  LockFileEx ((BOO
4ea0: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
4eb0: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
4ec0: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
4ed0: 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45       LPOVERLAPPE
4ee0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 35 5d 2e  D))aSyscall[45].
4ef0: 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66  pCurrent).#endif
4f00: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
4f10: 57 49 4e 43 45 20 7c 7c 20 28 21 53 51 4c 49 54  WINCE || (!SQLIT
4f20: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64  E_OS_WINRT && !d
4f30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
4f40: 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22 4d 61  IT_WAL)).  { "Ma
4f50: 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20  pViewOfFile",   
4f60: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4f70: 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c 20  )MapViewOfFile, 
4f80: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4f90: 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69 65  else.  { "MapVie
4fa0: 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  wOfFile",       
4fb0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fd0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4fe0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61 70  f..#define osMap
4ff0: 56 69 65 77 4f 66 46 69 6c 65 20 28 28 4c 50 56  ViewOfFile ((LPV
5000: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OID(WINAPI*)(HAN
5010: 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  DLE,DWORD,DWORD,
5020: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
5030: 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c   SIZE_T))aSyscal
5040: 6c 5b 34 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[46].pCurrent).
5050: 0a 20 20 7b 20 22 4d 75 6c 74 69 42 79 74 65 54  .  { "MultiByteT
5060: 6f 57 69 64 65 43 68 61 72 22 2c 20 20 20 20 20  oWideChar",     
5070: 28 53 59 53 43 41 4c 4c 29 4d 75 6c 74 69 42 79  (SYSCALL)MultiBy
5080: 74 65 54 6f 57 69 64 65 43 68 61 72 2c 20 20 20  teToWideChar,   
5090: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
50a0: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  osMultiByteToWid
50b0: 65 43 68 61 72 20 28 28 69 6e 74 28 57 49 4e 41  eChar ((int(WINA
50c0: 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52 44 2c  PI*)(UINT,DWORD,
50d0: 4c 50 43 53 54 52 2c 69 6e 74 2c 4c 50 57 53 54  LPCSTR,int,LPWST
50e0: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 69 6e 74  R, \.        int
50f0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 37 5d 2e 70  ))aSyscall[47].p
5100: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 51  Current)..  { "Q
5110: 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43  ueryPerformanceC
5120: 6f 75 6e 74 65 72 22 2c 20 28 53 59 53 43 41 4c  ounter", (SYSCAL
5130: 4c 29 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e  L)QueryPerforman
5140: 63 65 43 6f 75 6e 74 65 72 2c 20 30 20 7d 2c 0a  ceCounter, 0 },.
5150: 0a 23 64 65 66 69 6e 65 20 6f 73 51 75 65 72 79  .#define osQuery
5160: 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
5170: 65 72 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  er ((BOOL(WINAPI
5180: 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 41  *)( \.        LA
5190: 52 47 45 5f 49 4e 54 45 47 45 52 2a 29 29 61 53  RGE_INTEGER*))aS
51a0: 79 73 63 61 6c 6c 5b 34 38 5d 2e 70 43 75 72 72  yscall[48].pCurr
51b0: 65 6e 74 29 0a 0a 20 20 7b 20 22 52 65 61 64 46  ent)..  { "ReadF
51c0: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
51d0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 52 65       (SYSCALL)Re
51e0: 61 64 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  adFile,         
51f0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
5200: 66 69 6e 65 20 6f 73 52 65 61 64 46 69 6c 65 20  fine osReadFile 
5210: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
5220: 48 41 4e 44 4c 45 2c 4c 50 56 4f 49 44 2c 44 57  HANDLE,LPVOID,DW
5230: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
5240: 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50         LPOVERLAP
5250: 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 39  PED))aSyscall[49
5260: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5270: 20 22 53 65 74 45 6e 64 4f 66 46 69 6c 65 22 2c   "SetEndOfFile",
5280: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5290: 43 41 4c 4c 29 53 65 74 45 6e 64 4f 66 46 69 6c  CALL)SetEndOfFil
52a0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  e,            0 
52b0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65  },..#define osSe
52c0: 74 45 6e 64 4f 66 46 69 6c 65 20 28 28 42 4f 4f  tEndOfFile ((BOO
52d0: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
52e0: 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 30 5d 2e  E))aSyscall[50].
52f0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5300: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
5310: 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e    { "SetFilePoin
5320: 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 28  ter",          (
5330: 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c 65 50  SYSCALL)SetFileP
5340: 6f 69 6e 74 65 72 2c 20 20 20 20 20 20 20 20 20  ointer,         
5350: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
5360: 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 22  "SetFilePointer"
5370: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
5380: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
5390: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
53a0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
53b0: 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74  e osSetFilePoint
53c0: 65 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  er ((DWORD(WINAP
53d0: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f 4e 47 2c  I*)(HANDLE,LONG,
53e0: 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20 20 20 20  PLONG, \.       
53f0: 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c   DWORD))aSyscall
5400: 5b 35 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [51].pCurrent)..
5410: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5420: 49 4e 52 54 0a 20 20 7b 20 22 53 6c 65 65 70 22  INRT.  { "Sleep"
5430: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5440: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 6c 65      (SYSCALL)Sle
5450: 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ep,             
5460: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
5470: 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20  .  { "Sleep",   
5480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5490: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
54a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54b0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
54c0: 64 65 66 69 6e 65 20 6f 73 53 6c 65 65 70 20 28  define osSleep (
54d0: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 44  (VOID(WINAPI*)(D
54e0: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  WORD))aSyscall[5
54f0: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
5500: 7b 20 22 53 79 73 74 65 6d 54 69 6d 65 54 6f 46  { "SystemTimeToF
5510: 69 6c 65 54 69 6d 65 22 2c 20 20 20 20 28 53 59  ileTime",    (SY
5520: 53 43 41 4c 4c 29 53 79 73 74 65 6d 54 69 6d 65  SCALL)SystemTime
5530: 54 6f 46 69 6c 65 54 69 6d 65 2c 20 20 20 20 30  ToFileTime,    0
5540: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53   },..#define osS
5550: 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
5560: 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ime ((BOOL(WINAP
5570: 49 2a 29 28 43 4f 4e 53 54 20 53 59 53 54 45 4d  I*)(CONST SYSTEM
5580: 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20  TIME*, \.       
5590: 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79   LPFILETIME))aSy
55a0: 73 63 61 6c 6c 5b 35 33 5d 2e 70 43 75 72 72 65  scall[53].pCurre
55b0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
55c0: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
55d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
55e0: 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20  { "UnlockFile", 
55f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
5600: 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65  SCALL)UnlockFile
5610: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
5620: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55   },.#else.  { "U
5630: 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20  nlockFile",     
5640: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5650: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5660: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5670: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
5680: 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 0a 23 64 65  osUnlockFile.#de
5690: 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c  fine osUnlockFil
56a0: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
56b0: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44  )(HANDLE,DWORD,D
56c0: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
56d0: 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79        DWORD))aSy
56e0: 73 63 61 6c 6c 5b 35 34 5d 2e 70 43 75 72 72 65  scall[54].pCurre
56f0: 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  nt).#endif..#if 
5700: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
5710: 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65  .  { "UnlockFile
5720: 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ex",            
5730: 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46  (SYSCALL)UnlockF
5740: 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20 20  ileEx,          
5750: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5760: 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c   "UnlockFileEx",
5770: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5780: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
57a0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
57b0: 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45  ne osUnlockFileE
57c0: 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  x ((BOOL(WINAPI*
57d0: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44  )(HANDLE,DWORD,D
57e0: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
57f0: 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50        LPOVERLAPP
5800: 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 35 5d  ED))aSyscall[55]
5810: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
5820: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
5830: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
5840: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20 20 7b  TE_OMIT_WAL).  {
5850: 20 22 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c   "UnmapViewOfFil
5860: 65 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  e",         (SYS
5870: 43 41 4c 4c 29 55 6e 6d 61 70 56 69 65 77 4f 66  CALL)UnmapViewOf
5880: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 30 20  File,         0 
5890: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e  },.#else.  { "Un
58a0: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20  mapViewOfFile", 
58b0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
58c0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
58d0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
58e0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
58f0: 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  sUnmapViewOfFile
5900: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
5910: 28 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61  (LPCVOID))aSysca
5920: 6c 6c 5b 35 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[56].pCurrent)
5930: 0a 0a 20 20 7b 20 22 57 69 64 65 43 68 61 72 54  ..  { "WideCharT
5940: 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20 20 20 20  oMultiByte",    
5950: 20 28 53 59 53 43 41 4c 4c 29 57 69 64 65 43 68   (SYSCALL)WideCh
5960: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 2c 20 20  arToMultiByte,  
5970: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
5980: 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   osWideCharToMul
5990: 74 69 42 79 74 65 20 28 28 69 6e 74 28 57 49 4e  tiByte ((int(WIN
59a0: 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52 44  API*)(UINT,DWORD
59b0: 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c 4c 50 53  ,LPCWSTR,int,LPS
59c0: 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20 20 20 20  TR,int, \.      
59d0: 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f 4f 4c 29    LPCSTR,LPBOOL)
59e0: 29 61 53 79 73 63 61 6c 6c 5b 35 37 5d 2e 70 43  )aSyscall[57].pC
59f0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57 72  urrent)..  { "Wr
5a00: 69 74 65 46 69 6c 65 22 2c 20 20 20 20 20 20 20  iteFile",       
5a10: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5a20: 29 57 72 69 74 65 46 69 6c 65 2c 20 20 20 20 20  )WriteFile,     
5a30: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
5a40: 23 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65 46  #define osWriteF
5a50: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
5a60: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 43 56 4f  I*)(HANDLE,LPCVO
5a70: 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44  ID,DWORD,LPDWORD
5a80: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56  , \.        LPOV
5a90: 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61  ERLAPPED))aSysca
5aa0: 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e 74 29  ll[58].pCurrent)
5ab0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
5ac0: 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61 74  WINRT.  { "Creat
5ad0: 65 45 76 65 6e 74 45 78 57 22 2c 20 20 20 20 20  eEventExW",     
5ae0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
5af0: 65 61 74 65 45 76 65 6e 74 45 78 57 2c 20 20 20  eateEventExW,   
5b00: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
5b10: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76 65  e.  { "CreateEve
5b20: 6e 74 45 78 57 22 2c 20 20 20 20 20 20 20 20 20  ntExW",         
5b30: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b50: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5b60: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
5b70: 45 76 65 6e 74 45 78 57 20 28 28 48 41 4e 44 4c  EventExW ((HANDL
5b80: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 45 43  E(WINAPI*)(LPSEC
5b90: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
5ba0: 2c 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20 20 20  ,LPCWSTR, \.    
5bb0: 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 29      DWORD,DWORD)
5bc0: 29 61 53 79 73 63 61 6c 6c 5b 35 39 5d 2e 70 43  )aSyscall[59].pC
5bd0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5be0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
5bf0: 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65  { "WaitForSingle
5c00: 4f 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59  Object",     (SY
5c10: 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e  SCALL)WaitForSin
5c20: 67 6c 65 4f 62 6a 65 63 74 2c 20 20 20 20 20 30  gleObject,     0
5c30: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 57   },.#else.  { "W
5c40: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
5c50: 63 74 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  ct",     (SYSCAL
5c60: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5c70: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5c80: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5c90: 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  osWaitForSingleO
5ca0: 62 6a 65 63 74 20 28 28 44 57 4f 52 44 28 57 49  bject ((DWORD(WI
5cb0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c  NAPI*)(HANDLE, \
5cc0: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29  .        DWORD))
5cd0: 61 53 79 73 63 61 6c 6c 5b 36 30 5d 2e 70 43 75  aSyscall[60].pCu
5ce0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
5cf0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
5d00: 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  "WaitForSingleOb
5d10: 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59 53 43  jectEx",   (SYSC
5d20: 41 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e 67 6c  ALL)WaitForSingl
5d30: 65 4f 62 6a 65 63 74 45 78 2c 20 20 20 30 20 7d  eObjectEx,   0 }
5d40: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 57 61 69  ,.#else.  { "Wai
5d50: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
5d60: 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c 29  Ex",   (SYSCALL)
5d70: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5d80: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5d90: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5da0: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
5db0: 65 63 74 45 78 20 28 28 44 57 4f 52 44 28 57 49  ectEx ((DWORD(WI
5dc0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
5dd0: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 42  ORD, \.        B
5de0: 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36 31  OOL))aSyscall[61
5df0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5e00: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
5e10: 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69  .  { "SetFilePoi
5e20: 6e 74 65 72 45 78 22 2c 20 20 20 20 20 20 20 20  nterEx",        
5e30: 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c 65  (SYSCALL)SetFile
5e40: 50 6f 69 6e 74 65 72 45 78 2c 20 20 20 20 20 20  PointerEx,      
5e50: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5e60: 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72   "SetFilePointer
5e70: 45 78 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  Ex",        (SYS
5e80: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5ea0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5eb0: 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e  ne osSetFilePoin
5ec0: 74 65 72 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e  terEx ((BOOL(WIN
5ed0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 41 52  API*)(HANDLE,LAR
5ee0: 47 45 5f 49 4e 54 45 47 45 52 2c 20 5c 0a 20 20  GE_INTEGER, \.  
5ef0: 20 20 20 20 20 20 50 4c 41 52 47 45 5f 49 4e 54        PLARGE_INT
5f00: 45 47 45 52 2c 44 57 4f 52 44 29 29 61 53 79 73  EGER,DWORD))aSys
5f10: 63 61 6c 6c 5b 36 32 5d 2e 70 43 75 72 72 65 6e  call[62].pCurren
5f20: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
5f30: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74  S_WINRT.  { "Get
5f40: 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42  FileInformationB
5f50: 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53 59 53  yHandleEx", (SYS
5f60: 43 41 4c 4c 29 47 65 74 46 69 6c 65 49 6e 66 6f  CALL)GetFileInfo
5f70: 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45  rmationByHandleE
5f80: 78 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  x, 0 },.#else.  
5f90: 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d  { "GetFileInform
5fa0: 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22  ationByHandleEx"
5fb0: 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20  , (SYSCALL)0,   
5fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5fd0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5fe0: 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 49 6e 66  ine osGetFileInf
5ff0: 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65  ormationByHandle
6000: 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  Ex ((BOOL(WINAPI
6010: 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20  *)(HANDLE, \.   
6020: 20 20 20 20 20 46 49 4c 45 5f 49 4e 46 4f 5f 42       FILE_INFO_B
6030: 59 5f 48 41 4e 44 4c 45 5f 43 4c 41 53 53 2c 4c  Y_HANDLE_CLASS,L
6040: 50 56 4f 49 44 2c 44 57 4f 52 44 29 29 61 53 79  PVOID,DWORD))aSy
6050: 73 63 61 6c 6c 5b 36 33 5d 2e 70 43 75 72 72 65  scall[63].pCurre
6060: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
6070: 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66  OS_WINRT && !def
6080: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6090: 5f 57 41 4c 29 0a 20 20 7b 20 22 4d 61 70 56 69  _WAL).  { "MapVi
60a0: 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22  ewOfFileFromApp"
60b0: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61  ,    (SYSCALL)Ma
60c0: 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
60d0: 70 70 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  pp,    0 },.#els
60e0: 65 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66  e.  { "MapViewOf
60f0: 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20 20  FileFromApp",   
6100: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6120: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6130: 23 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65  #define osMapVie
6140: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 20 28  wOfFileFromApp (
6150: 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29  (LPVOID(WINAPI*)
6160: 28 48 41 4e 44 4c 45 2c 55 4c 4f 4e 47 2c 55 4c  (HANDLE,ULONG,UL
6170: 4f 4e 47 36 34 2c 20 5c 0a 20 20 20 20 20 20 20  ONG64, \.       
6180: 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c   SIZE_T))aSyscal
6190: 6c 5b 36 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[64].pCurrent).
61a0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
61b0: 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61 74 65  INRT.  { "Create
61c0: 46 69 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20  File2",         
61d0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
61e0: 61 74 65 46 69 6c 65 32 2c 20 20 20 20 20 20 20  ateFile2,       
61f0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
6200: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
6210: 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  2",             
6220: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
6230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6240: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
6250: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
6260: 69 6c 65 32 20 28 28 48 41 4e 44 4c 45 28 57 49  ile2 ((HANDLE(WI
6270: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44  NAPI*)(LPCWSTR,D
6280: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
6290: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 52  , \.        LPCR
62a0: 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44  EATEFILE2_EXTEND
62b0: 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29 29 61  ED_PARAMETERS))a
62c0: 53 79 73 63 61 6c 6c 5b 36 35 5d 2e 70 43 75 72  Syscall[65].pCur
62d0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
62e0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
62f0: 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72  LoadPackagedLibr
6300: 61 72 79 22 2c 20 20 20 20 20 28 53 59 53 43 41  ary",     (SYSCA
6310: 4c 4c 29 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c  LL)LoadPackagedL
6320: 69 62 72 61 72 79 2c 20 20 20 20 20 30 20 7d 2c  ibrary,     0 },
6330: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64  .#else.  { "Load
6340: 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 22  PackagedLibrary"
6350: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30  ,     (SYSCALL)0
6360: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6370: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6380: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c  dif..#define osL
6390: 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61  oadPackagedLibra
63a0: 72 79 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e  ry ((HMODULE(WIN
63b0: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 20 5c  API*)(LPCWSTR, \
63c0: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29  .        DWORD))
63d0: 61 53 79 73 63 61 6c 6c 5b 36 36 5d 2e 70 43 75  aSyscall[66].pCu
63e0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
63f0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
6400: 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 22  "GetTickCount64"
6410: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
6420: 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e 74  ALL)GetTickCount
6430: 36 34 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  64,          0 }
6440: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
6450: 54 69 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20  TickCount64",   
6460: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6470: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6480: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6490: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
64a0: 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 20 28  GetTickCount64 (
64b0: 28 55 4c 4f 4e 47 4c 4f 4e 47 28 57 49 4e 41 50  (ULONGLONG(WINAP
64c0: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61  I*)(VOID))aSysca
64d0: 6c 6c 5b 36 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[67].pCurrent)
64e0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
64f0: 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 4e 61  WINRT.  { "GetNa
6500: 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c  tiveSystemInfo",
6510: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
6520: 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66  tNativeSystemInf
6530: 6f 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  o,     0 },.#els
6540: 65 0a 20 20 7b 20 22 47 65 74 4e 61 74 69 76 65  e.  { "GetNative
6550: 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20  SystemInfo",    
6560: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6580: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6590: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 4e 61 74  #define osGetNat
65a0: 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 20 28 28  iveSystemInfo ((
65b0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20 5c  VOID(WINAPI*)( \
65c0: 0a 20 20 20 20 20 20 20 20 4c 50 53 59 53 54 45  .        LPSYSTE
65d0: 4d 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c  M_INFO))aSyscall
65e0: 5b 36 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [68].pCurrent)..
65f0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
6600: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
6610: 49 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65  I).  { "OutputDe
6620: 62 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20 20  bugStringA",    
6630: 20 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75    (SYSCALL)Outpu
6640: 74 44 65 62 75 67 53 74 72 69 6e 67 41 2c 20 20  tDebugStringA,  
6650: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6660: 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53   { "OutputDebugS
6670: 74 72 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53  tringA",      (S
6680: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
6690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66a0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
66b0: 66 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62  fine osOutputDeb
66c0: 75 67 53 74 72 69 6e 67 41 20 28 28 56 4f 49 44  ugStringA ((VOID
66d0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
66e0: 29 29 61 53 79 73 63 61 6c 6c 5b 36 39 5d 2e 70  ))aSyscall[69].p
66f0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
6700: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
6710: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
6720: 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72   "OutputDebugStr
6730: 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53  ingW",      (SYS
6740: 43 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67  CALL)OutputDebug
6750: 53 74 72 69 6e 67 57 2c 20 20 20 20 20 20 30 20  StringW,      0 
6760: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75  },.#else.  { "Ou
6770: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57  tputDebugStringW
6780: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
6790: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
67a0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
67b0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
67c0: 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  sOutputDebugStri
67d0: 6e 67 57 20 28 28 56 4f 49 44 28 57 49 4e 41 50  ngW ((VOID(WINAP
67e0: 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79  I*)(LPCWSTR))aSy
67f0: 73 63 61 6c 6c 5b 37 30 5d 2e 70 43 75 72 72 65  scall[70].pCurre
6800: 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 50 72 6f  nt)..  { "GetPro
6810: 63 65 73 73 48 65 61 70 22 2c 20 20 20 20 20 20  cessHeap",      
6820: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
6830: 50 72 6f 63 65 73 73 48 65 61 70 2c 20 20 20 20  ProcessHeap,    
6840: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
6850: 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 65 73 73  ine osGetProcess
6860: 48 65 61 70 20 28 28 48 41 4e 44 4c 45 28 57 49  Heap ((HANDLE(WI
6870: 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79  NAPI*)(VOID))aSy
6880: 73 63 61 6c 6c 5b 37 31 5d 2e 70 43 75 72 72 65  scall[71].pCurre
6890: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
68a0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66  OS_WINRT && !def
68b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
68c0: 5f 57 41 4c 29 0a 20 20 7b 20 22 43 72 65 61 74  _WAL).  { "Creat
68d0: 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d  eFileMappingFrom
68e0: 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c 29 43  App", (SYSCALL)C
68f0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
6900: 46 72 6f 6d 41 70 70 2c 20 30 20 7d 2c 0a 23 65  FromApp, 0 },.#e
6910: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46  lse.  { "CreateF
6920: 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70  ileMappingFromAp
6930: 70 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20  p", (SYSCALL)0, 
6940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6950: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6960: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
6970: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f  teFileMappingFro
6980: 6d 41 70 70 20 28 28 48 41 4e 44 4c 45 28 57 49  mApp ((HANDLE(WI
6990: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c  NAPI*)(HANDLE, \
69a0: 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43 55 52  .        LPSECUR
69b0: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 55  ITY_ATTRIBUTES,U
69c0: 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 4c 50 43  LONG,ULONG64,LPC
69d0: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37  WSTR))aSyscall[7
69e0: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d 3b  2].pCurrent)..};
69f0: 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f   /* End of the o
6a00: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
6a10: 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a  em calls */../*.
6a20: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
6a30: 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20  SetSystemCall() 
6a40: 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65  method of sqlite
6a50: 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66  3_vfs for all of
6a60: 20 74 68 65 0a 2a 2a 20 22 77 69 6e 33 32 22 20   the.** "win32" 
6a70: 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53  VFSes.  Return S
6a80: 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75  QLITE_OK opon su
6a90: 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74  ccessfully updat
6aa0: 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65  ing the.** syste
6ab0: 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20  m call pointer, 
6ac0: 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  or SQLITE_NOTFOU
6ad0: 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  ND if there is n
6ae0: 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a  o configurable.*
6af0: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  * system call na
6b00: 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74  med zName..*/.st
6b10: 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 74 53  atic int winSetS
6b20: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
6b30: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
6b40: 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ed,        /* Th
6b50: 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20  e VFS pointer.  
6b60: 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f  Not used */.  co
6b70: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
6b80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6b90: 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61  ame of system ca
6ba0: 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a  ll to override *
6bb0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63  /.  sqlite3_sysc
6bc0: 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63  all_ptr pNewFunc
6bd0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
6be0: 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  new system call 
6bf0: 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e  value */.){.  un
6c00: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20  signed int i;.  
6c10: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
6c20: 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55  NOTFOUND;..  UNU
6c30: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
6c40: 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a  otUsed);.  if( z
6c50: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Name==0 ){.    /
6c60: 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73  * If no zName is
6c70: 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20   given, restore 
6c80: 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  all system calls
6c90: 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c   to their defaul
6ca0: 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67  t.    ** setting
6cb0: 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  s and return NUL
6cc0: 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  L.    */.    rc 
6cd0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
6ce0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
6cf0: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
6d00: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
6d10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
6d20: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  ( aSyscall[i].pD
6d30: 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
6d40: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43    aSyscall[i].pC
6d50: 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c  urrent = aSyscal
6d60: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20  l[i].pDefault;. 
6d70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6d80: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
6d90: 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69  zName is specifi
6da0: 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f  ed, operate on o
6db0: 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74  nly the one syst
6dc0: 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  em call.    ** s
6dd0: 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f  pecified..    */
6de0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6df0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
6e00: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
6e10: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
6e20: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
6e30: 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  me, aSyscall[i].
6e40: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
6e50: 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c       if( aSyscal
6e60: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30  l[i].pDefault==0
6e70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53   ){.          aS
6e80: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
6e90: 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  lt = aSyscall[i]
6ea0: 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20  .pCurrent;.     
6eb0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
6ec0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
6ed0: 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e       if( pNewFun
6ee0: 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20  c==0 ) pNewFunc 
6ef0: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  = aSyscall[i].pD
6f00: 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20  efault;.        
6f10: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
6f20: 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b  rent = pNewFunc;
6f30: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
6f40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6f50: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6f60: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
6f70: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79  he value of a sy
6f80: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75  stem call.  Retu
6f90: 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65  rn NULL if zName
6fa0: 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63   is not a.** rec
6fb0: 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63  ognized system c
6fc0: 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20  all name.  NULL 
6fd0: 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
6fe0: 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   if the system c
6ff0: 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e  all.** is curren
7000: 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  tly undefined..*
7010: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
7020: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 77 69 6e  _syscall_ptr win
7030: 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20  GetSystemCall(. 
7040: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e   sqlite3_vfs *pN
7050: 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20  otUsed,.  const 
7060: 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20  char *zName.){. 
7070: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
7080: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
7090: 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a  ETER(pNotUsed);.
70a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
70b0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
70c0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
70d0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
70e0: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
70f0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
7100: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53  )==0 ) return aS
7110: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
7120: 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  nt;.  }.  return
7130: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
7140: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
7150: 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d  the first system
7160: 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d   call after zNam
7170: 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55  e.  If zName==NU
7180: 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  LL.** then retur
7190: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
71a0: 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63  e first system c
71b0: 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  all.  Return NUL
71c0: 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73  L if zName.** is
71d0: 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d   the last system
71e0: 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d   call or if zNam
71f0: 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d  e is not the nam
7200: 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20  e of a valid.** 
7210: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a  system call..*/.
7220: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
7230: 72 20 2a 77 69 6e 4e 65 78 74 53 79 73 74 65 6d  r *winNextSystem
7240: 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73  Call(sqlite3_vfs
7250: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
7260: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
7270: 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44   = -1;..  UNUSED
7280: 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20  _PARAMETER(p);. 
7290: 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
72a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
72b0: 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29  aySize(aSyscall)
72c0: 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  -1; i++){.      
72d0: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
72e0: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
72f0: 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
7300: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
7310: 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i++; i<ArraySiz
7320: 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b  e(aSyscall); i++
7330: 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73 63  ){.    if( aSysc
7340: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21  all[i].pCurrent!
7350: 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73  =0 ) return aSys
7360: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  call[i].zName;. 
7370: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
7380: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
7390: 63 74 69 6f 6e 20 6f 75 74 70 75 74 73 20 74 68  ction outputs th
73a0: 65 20 73 70 65 63 69 66 69 65 64 20 28 41 4e 53  e specified (ANS
73b0: 49 29 20 73 74 72 69 6e 67 20 74 6f 20 74 68 65  I) string to the
73c0: 20 57 69 6e 33 32 20 64 65 62 75 67 67 65 72 0a   Win32 debugger.
73d0: 2a 2a 20 28 69 66 20 61 76 61 69 6c 61 62 6c 65  ** (if available
73e0: 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73 71 6c 69  )..*/..void sqli
73f0: 74 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65 5f  te3_win32_write_
7400: 64 65 62 75 67 28 63 68 61 72 20 2a 7a 42 75 66  debug(char *zBuf
7410: 2c 20 69 6e 74 20 6e 42 75 66 29 7b 0a 20 20 63  , int nBuf){.  c
7420: 68 61 72 20 7a 44 62 67 42 75 66 5b 53 51 4c 49  har zDbgBuf[SQLI
7430: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
7440: 5f 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 6e 4d  _SIZE];.  int nM
7450: 69 6e 20 3d 20 4d 49 4e 28 6e 42 75 66 2c 20 28  in = MIN(nBuf, (
7460: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
7470: 5f 42 55 46 5f 53 49 5a 45 20 2d 20 31 29 29 3b  _BUF_SIZE - 1));
7480: 20 2f 2a 20 6d 61 79 20 62 65 20 6e 65 67 61 74   /* may be negat
7490: 69 76 65 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 4d  ive. */.  if( nM
74a0: 69 6e 3c 2d 31 20 29 20 6e 4d 69 6e 20 3d 20 2d  in<-1 ) nMin = -
74b0: 31 3b 20 2f 2a 20 61 6c 6c 20 6e 65 67 61 74 69  1; /* all negati
74c0: 76 65 20 76 61 6c 75 65 73 20 62 65 63 6f 6d 65  ve values become
74d0: 20 2d 31 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74   -1. */.  assert
74e0: 28 20 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c 20 6e 4d  ( nMin==-1 || nM
74f0: 69 6e 3d 3d 30 20 7c 7c 20 6e 4d 69 6e 3c 53 51  in==0 || nMin<SQ
7500: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
7510: 55 46 5f 53 49 5a 45 20 29 3b 0a 23 69 66 20 64  UF_SIZE );.#if d
7520: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
7530: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
7540: 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20  if( nMin>0 ){.  
7550: 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66    memset(zDbgBuf
7560: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  , 0, SQLITE_WIN3
7570: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b  2_DBG_BUF_SIZE);
7580: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 67  .    memcpy(zDbg
7590: 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29  Buf, zBuf, nMin)
75a0: 3b 0a 20 20 20 20 6f 73 4f 75 74 70 75 74 44 65  ;.    osOutputDe
75b0: 62 75 67 53 74 72 69 6e 67 41 28 7a 44 62 67 42  bugStringA(zDbgB
75c0: 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  uf);.  }else{.  
75d0: 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53    osOutputDebugS
75e0: 74 72 69 6e 67 41 28 7a 42 75 66 29 3b 0a 20 20  tringA(zBuf);.  
75f0: 7d 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  }.#elif defined(
7600: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
7610: 5f 57 49 44 45 29 0a 20 20 6d 65 6d 73 65 74 28  _WIDE).  memset(
7620: 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49  zDbgBuf, 0, SQLI
7630: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
7640: 5f 53 49 5a 45 29 3b 0a 20 20 69 66 20 28 20 6f  _SIZE);.  if ( o
7650: 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  sMultiByteToWide
7660: 43 68 61 72 28 0a 20 20 20 20 20 20 20 20 20 20  Char(.          
7670: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
7680: 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43  I() ? CP_ACP : C
7690: 50 5f 4f 45 4d 43 50 2c 20 30 2c 20 7a 42 75 66  P_OEMCP, 0, zBuf
76a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4d 69 6e  ,.          nMin
76b0: 2c 20 28 4c 50 57 53 54 52 29 7a 44 62 67 42 75  , (LPWSTR)zDbgBu
76c0: 66 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  f, SQLITE_WIN32_
76d0: 44 42 47 5f 42 55 46 5f 53 49 5a 45 2f 73 69 7a  DBG_BUF_SIZE/siz
76e0: 65 6f 66 28 57 43 48 41 52 29 29 3c 3d 30 20 29  eof(WCHAR))<=0 )
76f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
7700: 7d 0a 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75  }.  osOutputDebu
7710: 67 53 74 72 69 6e 67 57 28 28 4c 50 43 57 53 54  gStringW((LPCWST
7720: 52 29 7a 44 62 67 42 75 66 29 3b 0a 23 65 6c 73  R)zDbgBuf);.#els
7730: 65 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29  e.  if( nMin>0 )
7740: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 44 62  {.    memset(zDb
7750: 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f  gBuf, 0, SQLITE_
7760: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
7770: 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ZE);.    memcpy(
7780: 7a 44 62 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e  zDbgBuf, zBuf, n
7790: 4d 69 6e 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  Min);.    fprint
77a0: 66 28 73 74 64 65 72 72 2c 20 22 25 73 22 2c 20  f(stderr, "%s", 
77b0: 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73  zDbgBuf);.  }els
77c0: 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  e{.    fprintf(s
77d0: 74 64 65 72 72 2c 20 22 25 73 22 2c 20 7a 42 75  tderr, "%s", zBu
77e0: 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  f);.  }.#endif.}
77f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
7800: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 75  owing routine su
7810: 73 70 65 6e 64 73 20 74 68 65 20 63 75 72 72 65  spends the curre
7820: 6e 74 20 74 68 72 65 61 64 20 66 6f 72 20 61 74  nt thread for at
7830: 20 6c 65 61 73 74 20 6d 73 0a 2a 2a 20 6d 69 6c   least ms.** mil
7840: 6c 69 73 65 63 6f 6e 64 73 2e 20 20 54 68 69 73  liseconds.  This
7850: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
7860: 6f 20 74 68 65 20 57 69 6e 33 32 20 53 6c 65 65  o the Win32 Slee
7870: 70 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  p() interface..*
7880: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
7890: 57 49 4e 52 54 0a 73 74 61 74 69 63 20 48 41 4e  WINRT.static HAN
78a0: 44 4c 45 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e  DLE sleepObj = N
78b0: 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 76 6f 69  ULL;.#endif..voi
78c0: 64 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  d sqlite3_win32_
78d0: 73 6c 65 65 70 28 44 57 4f 52 44 20 6d 69 6c 6c  sleep(DWORD mill
78e0: 69 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 53  iseconds){.#if S
78f0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
7900: 20 69 66 20 28 20 73 6c 65 65 70 4f 62 6a 3d 3d   if ( sleepObj==
7910: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 73 6c 65 65  NULL ){.    slee
7920: 70 4f 62 6a 20 3d 20 6f 73 43 72 65 61 74 65 45  pObj = osCreateE
7930: 76 65 6e 74 45 78 57 28 4e 55 4c 4c 2c 20 4e 55  ventExW(NULL, NU
7940: 4c 4c 2c 20 43 52 45 41 54 45 5f 45 56 45 4e 54  LL, CREATE_EVENT
7950: 5f 4d 41 4e 55 41 4c 5f 52 45 53 45 54 2c 0a 20  _MANUAL_RESET,. 
7960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
7980: 59 4e 43 48 52 4f 4e 49 5a 45 29 3b 0a 20 20 7d  YNCHRONIZE);.  }
7990: 0a 20 20 61 73 73 65 72 74 28 20 73 6c 65 65 70  .  assert( sleep
79a0: 4f 62 6a 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 6f  Obj!=NULL );.  o
79b0: 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  sWaitForSingleOb
79c0: 6a 65 63 74 45 78 28 73 6c 65 65 70 4f 62 6a 2c  jectEx(sleepObj,
79d0: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 46   milliseconds, F
79e0: 41 4c 53 45 29 3b 0a 23 65 6c 73 65 0a 20 20 6f  ALSE);.#else.  o
79f0: 73 53 6c 65 65 70 28 6d 69 6c 6c 69 73 65 63 6f  sSleep(milliseco
7a00: 6e 64 73 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  nds);.#endif.}..
7a10: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
7a20: 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20  e (non-zero) if 
7a30: 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 75  we are running u
7a40: 6e 64 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32  nder WinNT, Win2
7a50: 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20  K, WinXP,.** or 
7a60: 57 69 6e 43 45 2e 20 20 52 65 74 75 72 6e 20 66  WinCE.  Return f
7a70: 61 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 20  alse (zero) for 
7a80: 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72  Win95, Win98, or
7a90: 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65   WinME..**.** He
7aa0: 72 65 20 69 73 20 61 6e 20 69 6e 74 65 72 65 73  re is an interes
7ab0: 74 69 6e 67 20 6f 62 73 65 72 76 61 74 69 6f 6e  ting observation
7ac0: 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c  :  Win95, Win98,
7ad0: 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a   and WinME lack.
7ae0: 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45  ** the LockFileE
7af0: 78 28 29 20 41 50 49 2e 20 20 42 75 74 20 77 65  x() API.  But we
7b00: 20 63 61 6e 20 73 74 69 6c 6c 20 73 74 61 74 69   can still stati
7b10: 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e  cally link again
7b20: 73 74 20 74 68 61 74 0a 2a 2a 20 41 50 49 20 61  st that.** API a
7b30: 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e  s long as we don
7b40: 27 74 20 63 61 6c 6c 20 69 74 20 77 68 65 6e 20  't call it when 
7b50: 72 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38  running Win95/98
7b60: 2f 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a  /ME.  A call to.
7b70: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
7b80: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
7b90: 6d 69 6e 65 20 69 66 20 74 68 65 20 68 6f 73 74  mine if the host
7ba0: 20 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20   is Win95/98/ME 
7bb0: 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58  or.** WinNT/2K/X
7bc0: 50 20 73 6f 20 74 68 61 74 20 77 65 20 77 69 6c  P so that we wil
7bd0: 6c 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f  l know whether o
7be0: 72 20 6e 6f 74 20 77 65 20 63 61 6e 20 73 61 66  r not we can saf
7bf0: 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20  ely call.** the 
7c00: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49  LockFileEx() API
7c10: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
7c20: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49  OS_WINCE || SQLI
7c30: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 23 20 64 65  TE_OS_WINRT.# de
7c40: 66 69 6e 65 20 69 73 4e 54 28 29 20 20 28 31 29  fine isNT()  (1)
7c50: 0a 23 65 6c 73 65 0a 20 20 73 74 61 74 69 63 20  .#else.  static 
7c60: 69 6e 74 20 69 73 4e 54 28 76 6f 69 64 29 7b 0a  int isNT(void){.
7c70: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
7c80: 6f 73 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20  os_type==0 ){.  
7c90: 20 20 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46      OSVERSIONINF
7ca0: 4f 41 20 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20  OA sInfo;.      
7cb0: 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f  sInfo.dwOSVersio
7cc0: 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65  nInfoSize = size
7cd0: 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20 20  of(sInfo);.     
7ce0: 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41   osGetVersionExA
7cf0: 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (&sInfo);.      
7d00: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20  sqlite3_os_type 
7d10: 3d 20 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f  = sInfo.dwPlatfo
7d20: 72 6d 49 64 3d 3d 56 45 52 5f 50 4c 41 54 46 4f  rmId==VER_PLATFO
7d30: 52 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f 20 32 20  RM_WIN32_NT ? 2 
7d40: 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  : 1;.    }.    r
7d50: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6f 73  eturn sqlite3_os
7d60: 5f 74 79 70 65 3d 3d 32 3b 0a 20 20 7d 0a 23 65  _type==2;.  }.#e
7d70: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
7d80: 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 23 69 66 64  S_WINCE */..#ifd
7d90: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
7da0: 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c  MALLOC./*.** All
7db0: 6f 63 61 74 65 20 6e 42 79 74 65 73 20 6f 66 20  ocate nBytes of 
7dc0: 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
7dd0: 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61  c void *winMemMa
7de0: 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73 29  lloc(int nBytes)
7df0: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  {.  HANDLE hHeap
7e00: 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20  ;.  void *p;..  
7e10: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
7e20: 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77  c();.  hHeap = w
7e30: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a  inMemGetHeap();.
7e40: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
7e50: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
7e60: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
7e70: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
7e80: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
7e90: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
7ea0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
7eb0: 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61  OC_VALIDATE).  a
7ec0: 73 73 65 72 74 20 28 20 6f 73 48 65 61 70 56 61  ssert ( osHeapVa
7ed0: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
7ee0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
7ef0: 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a  FLAGS, NULL) );.
7f00: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
7f10: 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20   nBytes>=0 );.  
7f20: 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28  p = osHeapAlloc(
7f30: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
7f40: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
7f50: 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b  (SIZE_T)nBytes);
7f60: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
7f70: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
7f80: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
7f90: 65 64 20 74 6f 20 48 65 61 70 41 6c 6c 6f 63 20  ed to HeapAlloc 
7fa0: 25 75 20 62 79 74 65 73 20 28 25 64 29 2c 20 68  %u bytes (%d), h
7fb0: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
7fc0: 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 73 2c           nBytes,
7fd0: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
7fe0: 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29  ), (void*)hHeap)
7ff0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
8000: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
8010: 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
8020: 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65  c void winMemFre
8030: 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 7b  e(void *pPrior){
8040: 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b  .  HANDLE hHeap;
8050: 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ..  winMemAssert
8060: 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70  Magic();.  hHeap
8070: 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70   = winMemGetHeap
8080: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48  ();.  assert( hH
8090: 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  eap!=0 );.  asse
80a0: 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c  rt( hHeap!=INVAL
80b0: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
80c0: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
80d0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
80e0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
80f0: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
8100: 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73 48 65  .  assert ( osHe
8110: 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70  apValidate(hHeap
8120: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
8130: 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f  EAP_FLAGS, pPrio
8140: 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  r) );.#endif.  i
8150: 66 28 20 21 70 50 72 69 6f 72 20 29 20 72 65 74  f( !pPrior ) ret
8160: 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69 6e 67 20  urn; /* Passing 
8170: 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46 72 65 65  NULL to HeapFree
8180: 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 2a   is undefined. *
8190: 2f 0a 20 20 69 66 28 20 21 6f 73 48 65 61 70 46  /.  if( !osHeapF
81a0: 72 65 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ree(hHeap, SQLIT
81b0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
81c0: 47 53 2c 20 70 50 72 69 6f 72 29 20 29 7b 0a 20  GS, pPrior) ){. 
81d0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
81e0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61  QLITE_NOMEM, "fa
81f0: 69 6c 65 64 20 74 6f 20 48 65 61 70 46 72 65 65  iled to HeapFree
8200: 20 62 6c 6f 63 6b 20 25 70 20 28 25 64 29 2c 20   block %p (%d), 
8210: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
8220: 20 20 20 20 20 20 20 20 20 20 70 50 72 69 6f 72            pPrior
8230: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
8240: 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70  (), (void*)hHeap
8250: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
8260: 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20  Change the size 
8270: 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6d  of an existing m
8280: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
8290: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
82a0: 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76  *winMemRealloc(v
82b0: 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74  oid *pPrior, int
82c0: 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44   nBytes){.  HAND
82d0: 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64  LE hHeap;.  void
82e0: 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73   *p;..  winMemAs
82f0: 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68  sertMagic();.  h
8300: 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74  Heap = winMemGet
8310: 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74  Heap();.  assert
8320: 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20  ( hHeap!=0 );.  
8330: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49  assert( hHeap!=I
8340: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
8350: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
8360: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
8370: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
8380: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
8390: 41 54 45 29 0a 20 20 61 73 73 65 72 74 20 28 20  ATE).  assert ( 
83a0: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68  osHeapValidate(h
83b0: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
83c0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70  32_HEAP_FLAGS, p
83d0: 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66  Prior) );.#endif
83e0: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
83f0: 73 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70  s>=0 );.  if( !p
8400: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 20 3d  Prior ){.    p =
8410: 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65   osHeapAlloc(hHe
8420: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
8430: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49  _HEAP_FLAGS, (SI
8440: 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20  ZE_T)nBytes);.  
8450: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 6f  }else{.    p = o
8460: 73 48 65 61 70 52 65 41 6c 6c 6f 63 28 68 48 65  sHeapReAlloc(hHe
8470: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
8480: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72  _HEAP_FLAGS, pPr
8490: 69 6f 72 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79  ior, (SIZE_T)nBy
84a0: 74 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  tes);.  }.  if( 
84b0: 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  !p ){.    sqlite
84c0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
84d0: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 25  EM, "failed to %
84e0: 73 20 25 75 20 62 79 74 65 73 20 28 25 64 29 2c  s %u bytes (%d),
84f0: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
8500: 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69 6f             pPrio
8510: 72 20 3f 20 22 48 65 61 70 52 65 41 6c 6c 6f 63  r ? "HeapReAlloc
8520: 22 20 3a 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c  " : "HeapAlloc",
8530: 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74 4c 61   nBytes, osGetLa
8540: 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
8550: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
8560: 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20  *)hHeap);.  }.  
8570: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
8580: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
8590: 7a 65 20 6f 66 20 61 6e 20 6f 75 74 73 74 61 6e  ze of an outstan
85a0: 64 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c  ding allocation,
85b0: 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74   in bytes..*/.st
85c0: 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53  atic int winMemS
85d0: 69 7a 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20  ize(void *p){.  
85e0: 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20  HANDLE hHeap;.  
85f0: 53 49 5a 45 5f 54 20 6e 3b 0a 0a 20 20 77 69 6e  SIZE_T n;..  win
8600: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29  MemAssertMagic()
8610: 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d  ;.  hHeap = winM
8620: 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61  emGetHeap();.  a
8630: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20  ssert( hHeap!=0 
8640: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
8650: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
8660: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20  LE_VALUE );.#if 
8670: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
8680: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
8690: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
86a0: 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65  VALIDATE).  asse
86b0: 72 74 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64  rt ( osHeapValid
86c0: 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ate(hHeap, SQLIT
86d0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
86e0: 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e  GS, NULL) );.#en
86f0: 64 69 66 0a 20 20 69 66 28 20 21 70 20 29 20 72  dif.  if( !p ) r
8700: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f  eturn 0;.  n = o
8710: 73 48 65 61 70 53 69 7a 65 28 68 48 65 61 70 2c  sHeapSize(hHeap,
8720: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
8730: 41 50 5f 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20  AP_FLAGS, p);.  
8740: 69 66 28 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d  if( n==(SIZE_T)-
8750: 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
8760: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
8770: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  M, "failed to He
8780: 61 70 53 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20  apSize block %p 
8790: 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a  (%d), heap=%p",.
87a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87b0: 70 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  p, osGetLastErro
87c0: 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61  r(), (void*)hHea
87d0: 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  p);.    return 0
87e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
87f0: 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  int)n;.}../*.** 
8800: 52 6f 75 6e 64 20 75 70 20 61 20 72 65 71 75 65  Round up a reque
8810: 73 74 20 73 69 7a 65 20 74 6f 20 74 68 65 20 6e  st size to the n
8820: 65 78 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61  ext valid alloca
8830: 74 69 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  tion size..*/.st
8840: 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52  atic int winMemR
8850: 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20  oundup(int n){. 
8860: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
8870: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
8880: 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73  his module..*/.s
8890: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
88a0: 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44  Init(void *pAppD
88b0: 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61  ata){.  winMemDa
88c0: 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20  ta *pWinMemData 
88d0: 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29  = (winMemData *)
88e0: 70 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28  pAppData;..  if(
88f0: 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20   !pWinMemData ) 
8900: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
8910: 52 4f 52 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ROR;.  assert( p
8920: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69  WinMemData->magi
8930: 63 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20  c==WINMEM_MAGIC 
8940: 29 3b 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  );..#if !SQLITE_
8950: 4f 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c 49  OS_WINRT && SQLI
8960: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52  TE_WIN32_HEAP_CR
8970: 45 41 54 45 0a 20 20 69 66 28 20 21 70 57 69 6e  EATE.  if( !pWin
8980: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29  MemData->hHeap )
8990: 7b 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74  {.    pWinMemDat
89a0: 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 48 65 61  a->hHeap = osHea
89b0: 70 43 72 65 61 74 65 28 53 51 4c 49 54 45 5f 57  pCreate(SQLITE_W
89c0: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
89d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
89e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89f0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49         SQLITE_WI
8a00: 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49  N32_HEAP_INIT_SI
8a10: 5a 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ZE,.            
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a30: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
8a40: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f  _WIN32_HEAP_MAX_
8a50: 53 49 5a 45 29 3b 0a 20 20 20 20 69 66 28 20 21  SIZE);.    if( !
8a60: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
8a70: 61 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ap ){.      sqli
8a80: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
8a90: 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 20 20  OMEM,.          
8aa0: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43  "failed to HeapC
8ab0: 72 65 61 74 65 20 28 25 64 29 2c 20 66 6c 61 67  reate (%d), flag
8ac0: 73 3d 25 75 2c 20 69 6e 69 74 53 69 7a 65 3d 25  s=%u, initSize=%
8ad0: 75 2c 20 6d 61 78 53 69 7a 65 3d 25 75 22 2c 0a  u, maxSize=%u",.
8ae0: 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c            osGetL
8af0: 61 73 74 45 72 72 6f 72 28 29 2c 20 53 51 4c 49  astError(), SQLI
8b00: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
8b10: 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 53  AGS,.          S
8b20: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
8b30: 5f 49 4e 49 54 5f 53 49 5a 45 2c 20 53 51 4c 49  _INIT_SIZE, SQLI
8b40: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41  TE_WIN32_HEAP_MA
8b50: 58 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 72  X_SIZE);.      r
8b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
8b70: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57  EM;.    }.    pW
8b80: 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65  inMemData->bOwne
8b90: 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 61 73  d = TRUE;.    as
8ba0: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
8bb0: 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a 20 20 7d  a->bOwned );.  }
8bc0: 0a 23 65 6c 73 65 0a 20 20 70 57 69 6e 4d 65 6d  .#else.  pWinMem
8bd0: 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73  Data->hHeap = os
8be0: 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 28 29  GetProcessHeap()
8bf0: 3b 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d  ;.  if( !pWinMem
8c00: 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20  Data->hHeap ){. 
8c10: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
8c20: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20  QLITE_NOMEM,.   
8c30: 20 20 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20       "failed to 
8c40: 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 20 28  GetProcessHeap (
8c50: 25 64 29 22 2c 20 6f 73 47 65 74 4c 61 73 74 45  %d)", osGetLastE
8c60: 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 72 65 74  rror());.    ret
8c70: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
8c80: 3b 0a 20 20 7d 0a 20 20 70 57 69 6e 4d 65 6d 44  ;.  }.  pWinMemD
8c90: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46 41  ata->bOwned = FA
8ca0: 4c 53 45 3b 0a 20 20 61 73 73 65 72 74 28 20 21  LSE;.  assert( !
8cb0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
8cc0: 6e 65 64 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ned );.#endif.  
8cd0: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
8ce0: 61 74 61 2d 3e 68 48 65 61 70 21 3d 30 20 29 3b  ata->hHeap!=0 );
8cf0: 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d  .  assert( pWinM
8d00: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 49  emData->hHeap!=I
8d10: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
8d20: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
8d30: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
8d40: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
8d50: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
8d60: 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f  ATE).  assert( o
8d70: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 70 57  sHeapValidate(pW
8d80: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
8d90: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
8da0: 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29  EAP_FLAGS, NULL)
8db0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74   );.#endif.  ret
8dc0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8dd0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74 69 61  ../*.** Deinitia
8de0: 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65  lize this module
8df0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8e00: 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28   winMemShutdown(
8e10: 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b  void *pAppData){
8e20: 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70  .  winMemData *p
8e30: 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77 69  WinMemData = (wi
8e40: 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70 44  nMemData *)pAppD
8e50: 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57 69  ata;..  if( !pWi
8e60: 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75 72  nMemData ) retur
8e70: 6e 3b 0a 20 20 69 66 28 20 70 57 69 6e 4d 65 6d  n;.  if( pWinMem
8e80: 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20  Data->hHeap ){. 
8e90: 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d     assert( pWinM
8ea0: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 49  emData->hHeap!=I
8eb0: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
8ec0: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
8ed0: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
8ee0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
8ef0: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
8f00: 41 54 45 29 0a 20 20 20 20 61 73 73 65 72 74 28  ATE).    assert(
8f10: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
8f20: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
8f30: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
8f40: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c  _HEAP_FLAGS, NUL
8f50: 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  L) );.#endif.   
8f60: 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61   if( pWinMemData
8f70: 2d 3e 62 4f 77 6e 65 64 20 29 7b 0a 20 20 20 20  ->bOwned ){.    
8f80: 20 20 69 66 28 20 21 6f 73 48 65 61 70 44 65 73    if( !osHeapDes
8f90: 74 72 6f 79 28 70 57 69 6e 4d 65 6d 44 61 74 61  troy(pWinMemData
8fa0: 2d 3e 68 48 65 61 70 29 20 29 7b 0a 20 20 20 20  ->hHeap) ){.    
8fb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
8fc0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
8fd0: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 44 65 73  ailed to HeapDes
8fe0: 74 72 6f 79 20 28 25 64 29 2c 20 68 65 61 70 3d  troy (%d), heap=
8ff0: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
9000: 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61           osGetLa
9010: 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64  stError(), (void
9020: 2a 29 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  *)pWinMemData->h
9030: 48 65 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Heap);.      }. 
9040: 20 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61       pWinMemData
9050: 2d 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45  ->bOwned = FALSE
9060: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e  ;.    }.    pWin
9070: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d  MemData->hHeap =
9080: 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   NULL;.  }.}../*
9090: 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65  .** Populate the
90a0: 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72   low-level memor
90b0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e  y allocation fun
90c0: 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69  ction pointers i
90d0: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62  n.** sqlite3Glob
90e0: 61 6c 43 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20  alConfig.m with 
90f0: 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20  pointers to the 
9100: 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69 73  routines in this
9110: 20 66 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72   file. The.** ar
9120: 67 75 6d 65 6e 74 73 20 73 70 65 63 69 66 79 20  guments specify 
9130: 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d  the block of mem
9140: 6f 72 79 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a  ory to manage..*
9150: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9160: 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
9170: 20 62 79 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66   by sqlite3_conf
9180: 69 67 28 29 2c 20 61 6e 64 20 74 68 65 72 65 66  ig(), and theref
9190: 6f 72 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65  ore.** is not re
91a0: 71 75 69 72 65 64 20 74 6f 20 62 65 20 74 68 72  quired to be thr
91b0: 65 61 64 73 61 66 65 20 28 69 74 20 69 73 20 6e  eadsafe (it is n
91c0: 6f 74 29 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71  ot)..*/.const sq
91d0: 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64  lite3_mem_method
91e0: 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74  s *sqlite3MemGet
91f0: 57 69 6e 33 32 28 76 6f 69 64 29 7b 0a 20 20 73  Win32(void){.  s
9200: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
9210: 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20  te3_mem_methods 
9220: 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20  winMemMethods = 
9230: 7b 0a 20 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c  {.    winMemMall
9240: 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72  oc,.    winMemFr
9250: 65 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65  ee,.    winMemRe
9260: 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65  alloc,.    winMe
9270: 6d 53 69 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65  mSize,.    winMe
9280: 6d 52 6f 75 6e 64 75 70 2c 0a 20 20 20 20 77 69  mRoundup,.    wi
9290: 6e 4d 65 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69  nMemInit,.    wi
92a0: 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20  nMemShutdown,.  
92b0: 20 20 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a    &win_mem_data.
92c0: 20 20 7d 3b 0a 20 20 72 65 74 75 72 6e 20 26 77    };.  return &w
92d0: 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a  inMemMethods;.}.
92e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d  .void sqlite3Mem
92f0: 53 65 74 44 65 66 61 75 6c 74 28 76 6f 69 64 29  SetDefault(void)
9300: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66  {.  sqlite3_conf
9310: 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ig(SQLITE_CONFIG
9320: 5f 4d 41 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33  _MALLOC, sqlite3
9330: 4d 65 6d 47 65 74 57 69 6e 33 32 28 29 29 3b 0a  MemGetWin32());.
9340: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
9350: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20  TE_WIN32_MALLOC 
9360: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  */../*.** Conver
9370: 74 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67  t a UTF-8 string
9380: 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e   to Microsoft Un
9390: 69 63 6f 64 65 20 28 55 54 46 2d 31 36 3f 29 2e  icode (UTF-16?).
93a0: 20 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f   .**.** Space to
93b0: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
93c0: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
93d0: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
93e0: 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57  c..*/.static LPW
93f0: 53 54 52 20 75 74 66 38 54 6f 55 6e 69 63 6f 64  STR utf8ToUnicod
9400: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
9410: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ilename){.  int 
9420: 6e 43 68 61 72 3b 0a 20 20 4c 50 57 53 54 52 20  nChar;.  LPWSTR 
9430: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a  zWideFilename;..
9440: 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74    nChar = osMult
9450: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
9460: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c  CP_UTF8, 0, zFil
9470: 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c  ename, -1, NULL,
9480: 20 30 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72   0);.  if( nChar
9490: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
94a0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65  n 0;.  }.  zWide
94b0: 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Filename = sqlit
94c0: 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 43 68 61 72  e3_malloc( nChar
94d0: 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c  *sizeof(zWideFil
94e0: 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69  ename[0]) );.  i
94f0: 66 28 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  f( zWideFilename
9500: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
9510: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68 61 72  n 0;.  }.  nChar
9520: 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f   = osMultiByteTo
9530: 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38  WideChar(CP_UTF8
9540: 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  , 0, zFilename, 
9550: 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  -1, zWideFilenam
9560: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
9570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9580: 20 20 20 6e 43 68 61 72 29 3b 0a 20 20 69 66 28     nChar);.  if(
9590: 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20   nChar==0 ){.   
95a0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
95b0: 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ideFilename);.  
95c0: 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20    zWideFilename 
95d0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
95e0: 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b  n zWideFilename;
95f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
9600: 74 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63  t Microsoft Unic
9610: 6f 64 65 20 74 6f 20 55 54 46 2d 38 2e 20 20 53  ode to UTF-8.  S
9620: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
9630: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
9640: 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20   is.** obtained 
9650: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
9660: 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  loc()..*/.static
9670: 20 63 68 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f   char *unicodeTo
9680: 55 74 66 38 28 4c 50 43 57 53 54 52 20 7a 57 69  Utf8(LPCWSTR zWi
9690: 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69  deFilename){.  i
96a0: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72  nt nByte;.  char
96b0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20   *zFilename;..  
96c0: 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68  nByte = osWideCh
96d0: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50  arToMultiByte(CP
96e0: 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46  _UTF8, 0, zWideF
96f0: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20  ilename, -1, 0, 
9700: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  0, 0, 0);.  if( 
9710: 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20  nByte == 0 ){.  
9720: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
9730: 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71    zFilename = sq
9740: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42  lite3_malloc( nB
9750: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69  yte );.  if( zFi
9760: 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  lename==0 ){.   
9770: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
9780: 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43   nByte = osWideC
9790: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43  harToMultiByte(C
97a0: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65  P_UTF8, 0, zWide
97b0: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46  Filename, -1, zF
97c0: 69 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a  ilename, nByte,.
97d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97f0: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79  0, 0);.  if( nBy
9800: 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73  te == 0 ){.    s
9810: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c  qlite3_free(zFil
9820: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c  ename);.    zFil
9830: 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  ename = 0;.  }. 
9840: 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d   return zFilenam
9850: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  e;.}../*.** Conv
9860: 65 72 74 20 61 6e 20 41 4e 53 49 20 73 74 72 69  ert an ANSI stri
9870: 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20  ng to Microsoft 
9880: 55 6e 69 63 6f 64 65 2c 20 62 61 73 65 64 20 6f  Unicode, based o
9890: 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  n the.** current
98a0: 20 63 6f 64 65 70 61 67 65 20 73 65 74 74 69 6e   codepage settin
98b0: 67 73 20 66 6f 72 20 66 69 6c 65 20 61 70 69 73  gs for file apis
98c0: 2e 0a 2a 2a 20 0a 2a 2a 20 53 70 61 63 65 20 74  ..** .** Space t
98d0: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
98e0: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
98f0: 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73  tained.** from s
9900: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 0a 2a  qlite3_malloc..*
9910: 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52 20  /.static LPWSTR 
9920: 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 63 6f  mbcsToUnicode(co
9930: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
9940: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ame){.  int nByt
9950: 65 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4d 62 63  e;.  LPWSTR zMbc
9960: 73 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74  sFilename;.  int
9970: 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73 41 72   codepage = osAr
9980: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20  eFileApisANSI() 
9990: 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45  ? CP_ACP : CP_OE
99a0: 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20  MCP;..  nByte = 
99b0: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  osMultiByteToWid
99c0: 65 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20  eChar(codepage, 
99d0: 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  0, zFilename, -1
99e0: 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  , NULL,.        
99f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a00: 20 20 20 20 20 20 20 20 30 29 2a 73 69 7a 65 6f          0)*sizeo
9a10: 66 28 57 43 48 41 52 29 3b 0a 20 20 69 66 28 20  f(WCHAR);.  if( 
9a20: 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
9a30: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
9a40: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20  zMbcsFilename = 
9a50: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
9a60: 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62  nByte*sizeof(zMb
9a70: 63 73 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29  csFilename[0]) )
9a80: 3b 0a 20 20 69 66 28 20 7a 4d 62 63 73 46 69 6c  ;.  if( zMbcsFil
9a90: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ename==0 ){.    
9aa0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
9ab0: 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42  nByte = osMultiB
9ac0: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f  yteToWideChar(co
9ad0: 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65  depage, 0, zFile
9ae0: 6e 61 6d 65 2c 20 2d 31 2c 20 7a 4d 62 63 73 46  name, -1, zMbcsF
9af0: 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
9b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b10: 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 29 3b           nByte);
9b20: 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20  .  if( nByte==0 
9b30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
9b40: 72 65 65 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  ree(zMbcsFilenam
9b50: 65 29 3b 0a 20 20 20 20 7a 4d 62 63 73 46 69 6c  e);.    zMbcsFil
9b60: 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  ename = 0;.  }. 
9b70: 20 72 65 74 75 72 6e 20 7a 4d 62 63 73 46 69 6c   return zMbcsFil
9b80: 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
9b90: 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f 66  Convert Microsof
9ba0: 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 6d 75 6c  t Unicode to mul
9bb0: 74 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65  ti-byte characte
9bc0: 72 20 73 74 72 69 6e 67 2c 20 62 61 73 65 64 20  r string, based 
9bd0: 6f 6e 20 74 68 65 0a 2a 2a 20 75 73 65 72 27 73  on the.** user's
9be0: 20 41 4e 53 49 20 63 6f 64 65 70 61 67 65 2e 0a   ANSI codepage..
9bf0: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
9c00: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
9c10: 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69   string is obtai
9c20: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  ned from.** sqli
9c30: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  te3_malloc()..*/
9c40: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 6e  .static char *un
9c50: 69 63 6f 64 65 54 6f 4d 62 63 73 28 4c 50 43 57  icodeToMbcs(LPCW
9c60: 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  STR zWideFilenam
9c70: 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  e){.  int nByte;
9c80: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
9c90: 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61  me;.  int codepa
9ca0: 67 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70  ge = osAreFileAp
9cb0: 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43  isANSI() ? CP_AC
9cc0: 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20  P : CP_OEMCP;.. 
9cd0: 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43   nByte = osWideC
9ce0: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63  harToMultiByte(c
9cf0: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64  odepage, 0, zWid
9d00: 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30  eFilename, -1, 0
9d10: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  , 0, 0, 0);.  if
9d20: 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a  ( nByte == 0 ){.
9d30: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
9d40: 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  }.  zFilename = 
9d50: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
9d60: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a  nByte );.  if( z
9d70: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
9d80: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
9d90: 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64  .  nByte = osWid
9da0: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
9db0: 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57  (codepage, 0, zW
9dc0: 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  ideFilename, -1,
9dd0: 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
9de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9df0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74              nByt
9e00: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  e, 0, 0);.  if( 
9e10: 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20  nByte == 0 ){.  
9e20: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
9e30: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Filename);.    z
9e40: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
9e50: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65  }.  return zFile
9e60: 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  name;.}../*.** C
9e70: 6f 6e 76 65 72 74 20 6d 75 6c 74 69 62 79 74 65  onvert multibyte
9e80: 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e   character strin
9e90: 67 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61  g to UTF-8.  Spa
9ea0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a  ce to hold the.*
9eb0: 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  * returned strin
9ec0: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
9ed0: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
9ee0: 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  c()..*/.char *sq
9ef0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
9f00: 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73 74 20 63  _to_utf8(const c
9f10: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
9f20: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
9f30: 6d 65 55 74 66 38 3b 0a 20 20 4c 50 57 53 54 52  meUtf8;.  LPWSTR
9f40: 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54   zTmpWide;..  zT
9f50: 6d 70 57 69 64 65 20 3d 20 6d 62 63 73 54 6f 55  mpWide = mbcsToU
9f60: 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65  nicode(zFilename
9f70: 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64  );.  if( zTmpWid
9f80: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
9f90: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c  rn 0;.  }.  zFil
9fa0: 65 6e 61 6d 65 55 74 66 38 20 3d 20 75 6e 69 63  enameUtf8 = unic
9fb0: 6f 64 65 54 6f 55 74 66 38 28 7a 54 6d 70 57 69  odeToUtf8(zTmpWi
9fc0: 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  de);.  sqlite3_f
9fd0: 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20  ree(zTmpWide);. 
9fe0: 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d   return zFilenam
9ff0: 65 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eUtf8;.}../*.** 
a000: 43 6f 6e 76 65 72 74 20 55 54 46 2d 38 20 74 6f  Convert UTF-8 to
a010: 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72 61   multibyte chara
a020: 63 74 65 72 20 73 74 72 69 6e 67 2e 20 20 53 70  cter string.  Sp
a030: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
a040: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72  .** returned str
a050: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ing is obtained 
a060: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
a070: 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a  loc()..*/.char *
a080: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74  sqlite3_win32_ut
a090: 66 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74  f8_to_mbcs(const
a0a0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
a0b0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  ){.  char *zFile
a0c0: 6e 61 6d 65 4d 62 63 73 3b 0a 20 20 4c 50 57 53  nameMbcs;.  LPWS
a0d0: 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20  TR zTmpWide;..  
a0e0: 7a 54 6d 70 57 69 64 65 20 3d 20 75 74 66 38 54  zTmpWide = utf8T
a0f0: 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
a100: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57  me);.  if( zTmpW
a110: 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ide==0 ){.    re
a120: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46  turn 0;.  }.  zF
a130: 69 6c 65 6e 61 6d 65 4d 62 63 73 20 3d 20 75 6e  ilenameMbcs = un
a140: 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54 6d 70  icodeToMbcs(zTmp
a150: 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Wide);.  sqlite3
a160: 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b  _free(zTmpWide);
a170: 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e  .  return zFilen
a180: 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  ameMbcs;.}../*.*
a190: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
a1a0: 73 65 74 73 20 74 68 65 20 64 61 74 61 20 64 69  sets the data di
a1b0: 72 65 63 74 6f 72 79 20 6f 72 20 74 68 65 20 74  rectory or the t
a1c0: 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
a1d0: 72 79 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74  ry based on.** t
a1e0: 68 65 20 70 72 6f 76 69 64 65 64 20 61 72 67 75  he provided argu
a1f0: 6d 65 6e 74 73 2e 20 20 54 68 65 20 74 79 70 65  ments.  The type
a200: 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62   argument must b
a210: 65 20 31 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  e 1 in order to 
a220: 73 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 20  set the.** data 
a230: 64 69 72 65 63 74 6f 72 79 20 6f 72 20 32 20 69  directory or 2 i
a240: 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20 74  n order to set t
a250: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  he temporary dir
a260: 65 63 74 6f 72 79 2e 20 20 54 68 65 20 7a 56 61  ectory.  The zVa
a270: 6c 75 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  lue.** argument 
a280: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
a290: 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20  he directory to 
a2a0: 75 73 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e  use.  The return
a2b0: 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 0a 2a   value will be.*
a2c0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  * SQLITE_OK if s
a2d0: 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 69 6e  uccessful..*/.in
a2e0: 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  t sqlite3_win32_
a2f0: 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 44 57  set_directory(DW
a300: 4f 52 44 20 74 79 70 65 2c 20 4c 50 43 57 53 54  ORD type, LPCWST
a310: 52 20 7a 56 61 6c 75 65 29 7b 0a 20 20 63 68 61  R zValue){.  cha
a320: 72 20 2a 2a 70 70 44 69 72 65 63 74 6f 72 79 20  r **ppDirectory 
a330: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
a340: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
a350: 54 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  T.  int rc = sql
a360: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
a370: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
a380: 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
a390: 20 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49    if( type==SQLI
a3a0: 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49  TE_WIN32_DATA_DI
a3b0: 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a  RECTORY_TYPE ){.
a3c0: 20 20 20 20 70 70 44 69 72 65 63 74 6f 72 79 20      ppDirectory 
a3d0: 3d 20 26 73 71 6c 69 74 65 33 5f 64 61 74 61 5f  = &sqlite3_data_
a3e0: 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 65 6c  directory;.  }el
a3f0: 73 65 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c  se if( type==SQL
a400: 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44  ITE_WIN32_TEMP_D
a410: 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b  IRECTORY_TYPE ){
a420: 0a 20 20 20 20 70 70 44 69 72 65 63 74 6f 72 79  .    ppDirectory
a430: 20 3d 20 26 73 71 6c 69 74 65 33 5f 74 65 6d 70   = &sqlite3_temp
a440: 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 0a  _directory;.  }.
a450: 20 20 61 73 73 65 72 74 28 20 21 70 70 44 69 72    assert( !ppDir
a460: 65 63 74 6f 72 79 20 7c 7c 20 74 79 70 65 3d 3d  ectory || type==
a470: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54  SQLITE_WIN32_DAT
a480: 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  A_DIRECTORY_TYPE
a490: 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 79  .          || ty
a4a0: 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32  pe==SQLITE_WIN32
a4b0: 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f  _TEMP_DIRECTORY_
a4c0: 54 59 50 45 0a 20 20 29 3b 0a 20 20 61 73 73 65  TYPE.  );.  asse
a4d0: 72 74 28 20 21 70 70 44 69 72 65 63 74 6f 72 79  rt( !ppDirectory
a4e0: 20 7c 7c 20 73 71 6c 69 74 65 33 4d 65 6d 64 65   || sqlite3Memde
a4f0: 62 75 67 48 61 73 54 79 70 65 28 2a 70 70 44 69  bugHasType(*ppDi
a500: 72 65 63 74 6f 72 79 2c 20 4d 45 4d 54 59 50 45  rectory, MEMTYPE
a510: 5f 48 45 41 50 29 20 29 3b 0a 20 20 69 66 28 20  _HEAP) );.  if( 
a520: 70 70 44 69 72 65 63 74 6f 72 79 20 29 7b 0a 20  ppDirectory ){. 
a530: 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 55     char *zValueU
a540: 74 66 38 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  tf8 = 0;.    if(
a550: 20 7a 56 61 6c 75 65 20 26 26 20 7a 56 61 6c 75   zValue && zValu
a560: 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 56  e[0] ){.      zV
a570: 61 6c 75 65 55 74 66 38 20 3d 20 75 6e 69 63 6f  alueUtf8 = unico
a580: 64 65 54 6f 55 74 66 38 28 7a 56 61 6c 75 65 29  deToUtf8(zValue)
a590: 3b 0a 20 20 20 20 20 20 69 66 20 28 20 7a 56 61  ;.      if ( zVa
a5a0: 6c 75 65 55 74 66 38 3d 3d 30 20 29 7b 0a 20 20  lueUtf8==0 ){.  
a5b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a5c0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
a5d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
a5e0: 69 74 65 33 5f 66 72 65 65 28 2a 70 70 44 69 72  ite3_free(*ppDir
a5f0: 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 2a 70 70  ectory);.    *pp
a600: 44 69 72 65 63 74 6f 72 79 20 3d 20 7a 56 61 6c  Directory = zVal
a610: 75 65 55 74 66 38 3b 0a 20 20 20 20 72 65 74 75  ueUtf8;.    retu
a620: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
a630: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
a640: 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  E_ERROR;.}../*.*
a650: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
a660: 75 65 20 6f 66 20 67 65 74 4c 61 73 74 45 72 72  ue of getLastErr
a670: 6f 72 4d 73 67 0a 2a 2a 20 69 73 20 7a 65 72 6f  orMsg.** is zero
a680: 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   if the error me
a690: 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74 68  ssage fits in th
a6a0: 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e  e buffer, or non
a6b0: 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69  -zero.** otherwi
a6c0: 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73 61  se (if the messa
a6d0: 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  ge was truncated
a6e0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
a6f0: 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67   getLastErrorMsg
a700: 28 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f  (DWORD lastErrno
a710: 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
a720: 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f   *zBuf){.  /* Fo
a730: 72 6d 61 74 4d 65 73 73 61 67 65 20 72 65 74 75  rmatMessage retu
a740: 72 6e 73 20 30 20 6f 6e 20 66 61 69 6c 75 72 65  rns 0 on failure
a750: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 69 74 0a  .  Otherwise it.
a760: 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65    ** returns the
a770: 20 6e 75 6d 62 65 72 20 6f 66 20 54 43 48 41 52   number of TCHAR
a780: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
a790: 20 6f 75 74 70 75 74 0a 20 20 2a 2a 20 62 75 66   output.  ** buf
a7a0: 66 65 72 2c 20 65 78 63 6c 75 64 69 6e 67 20 74  fer, excluding t
a7b0: 68 65 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e  he terminating n
a7c0: 75 6c 6c 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20  ull char..  */. 
a7d0: 20 44 57 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30   DWORD dwLen = 0
a7e0: 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d  ;.  char *zOut =
a7f0: 20 30 3b 0a 0a 20 20 69 66 28 20 69 73 4e 54 28   0;..  if( isNT(
a800: 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) ){.#if SQLITE_
a810: 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 57 43 48  OS_WINRT.    WCH
a820: 41 52 20 7a 54 65 6d 70 57 69 64 65 5b 4d 41 58  AR zTempWide[MAX
a830: 5f 50 41 54 48 2b 31 5d 3b 20 2f 2a 20 4e 4f 54  _PATH+1]; /* NOT
a840: 45 3a 20 53 6f 6d 65 77 68 61 74 20 61 72 62 69  E: Somewhat arbi
a850: 74 72 61 72 79 2e 20 2a 2f 0a 20 20 20 20 64 77  trary. */.    dw
a860: 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65  Len = osFormatMe
a870: 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45  ssageW(FORMAT_ME
a880: 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45  SSAGE_FROM_SYSTE
a890: 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  M |.            
a8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8b0: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
a8c0: 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a  IGNORE_INSERTS,.
a8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c               NUL
a8f0: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
a900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a910: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
a920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a930: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
a940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a950: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 57 69 64          zTempWid
a960: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
a970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a980: 4d 41 58 5f 50 41 54 48 2c 0a 20 20 20 20 20 20  MAX_PATH,.      
a990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9a0: 20 20 20 20 20 20 20 30 29 3b 0a 23 65 6c 73 65         0);.#else
a9b0: 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d  .    LPWSTR zTem
a9c0: 70 57 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  pWide = NULL;.  
a9d0: 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d    dwLen = osForm
a9e0: 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41  atMessageW(FORMA
a9f0: 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41  T_MESSAGE_ALLOCA
aa00: 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20  TE_BUFFER |.    
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f           FORMAT_
aa30: 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53  MESSAGE_FROM_SYS
aa40: 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEM |.          
aa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa60: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
aa70: 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53  E_IGNORE_INSERTS
aa80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
aaa0: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aac0: 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20    lastErrno,.   
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aae0: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
aaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab00: 20 20 20 20 20 20 20 20 20 20 28 4c 50 57 53 54            (LPWST
ab10: 52 29 20 26 7a 54 65 6d 70 57 69 64 65 2c 0a 20  R) &zTempWide,. 
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab30: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
ab40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab50: 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a              0);.
ab60: 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 64  #endif.    if( d
ab70: 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20  wLen > 0 ){.    
ab80: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20    /* allocate a 
ab90: 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65  buffer and conve
aba0: 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20  rt to UTF8 */.  
abb0: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
abc0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
abd0: 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 75 6e 69        zOut = uni
abe0: 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70  codeToUtf8(zTemp
abf0: 57 69 64 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Wide);.      sql
ac00: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
ac10: 6c 6f 63 28 29 3b 0a 23 69 66 20 21 53 51 4c 49  loc();.#if !SQLI
ac20: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
ac30: 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79    /* free the sy
ac40: 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f  stem buffer allo
ac50: 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d  cated by FormatM
ac60: 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  essage */.      
ac70: 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d  osLocalFree(zTem
ac80: 70 57 69 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20  pWide);.#endif. 
ac90: 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20     }.  }.#ifdef 
aca0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
acb0: 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
acc0: 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 20 3d 20    char *zTemp = 
acd0: 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20  NULL;.    dwLen 
ace0: 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  = osFormatMessag
acf0: 65 41 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47  eA(FORMAT_MESSAG
ad00: 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45  E_ALLOCATE_BUFFE
ad10: 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  R |.            
ad20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad30: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
ad40: 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20  FROM_SYSTEM |.  
ad50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad60: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
ad70: 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45  T_MESSAGE_IGNORE
ad80: 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20  _INSERTS,.      
ad90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ada0: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20         NULL,.   
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adc0: 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 45 72            lastEr
add0: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
ade0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adf0: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae10: 20 20 28 4c 50 53 54 52 29 20 26 7a 54 65 6d 70    (LPSTR) &zTemp
ae20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ae30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
ae40: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
ae60: 29 3b 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e  );.    if( dwLen
ae70: 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a   > 0 ){.      /*
ae80: 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66   allocate a buff
ae90: 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74  er and convert t
aea0: 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20  o UTF8 */.      
aeb0: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
aec0: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
aed0: 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33    zOut = sqlite3
aee0: 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75  _win32_mbcs_to_u
aef0: 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  tf8(zTemp);.    
af00: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
af10: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
af20: 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79    /* free the sy
af30: 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f  stem buffer allo
af40: 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d  cated by FormatM
af50: 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  essage */.      
af60: 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d  osLocalFree(zTem
af70: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  p);.    }.  }.#e
af80: 6e 64 69 66 0a 20 20 69 66 28 20 30 20 3d 3d 20  ndif.  if( 0 == 
af90: 64 77 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  dwLen ){.    sql
afa0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
afb0: 75 66 2c 20 7a 42 75 66 2c 20 22 4f 73 45 72 72  uf, zBuf, "OsErr
afc0: 6f 72 20 30 78 25 78 20 28 25 75 29 22 2c 20 6c  or 0x%x (%u)", l
afd0: 61 73 74 45 72 72 6e 6f 2c 20 6c 61 73 74 45 72  astErrno, lastEr
afe0: 72 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rno);.  }else{. 
aff0: 20 20 20 2f 2a 20 63 6f 70 79 20 61 20 6d 61 78     /* copy a max
b000: 69 6d 75 6d 20 6f 66 20 6e 42 75 66 20 63 68 61  imum of nBuf cha
b010: 72 73 20 74 6f 20 6f 75 74 70 75 74 20 62 75 66  rs to output buf
b020: 66 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  fer */.    sqlit
b030: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
b040: 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 4f  , zBuf, "%s", zO
b050: 75 74 29 3b 0a 20 20 20 20 2f 2a 20 66 72 65 65  ut);.    /* free
b060: 20 74 68 65 20 55 54 46 38 20 62 75 66 66 65 72   the UTF8 buffer
b070: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
b080: 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a  free(zOut);.  }.
b090: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
b0a0: 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  *.**.** This fun
b0b0: 63 74 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45 72  ction - winLogEr
b0c0: 72 6f 72 41 74 4c 69 6e 65 28 29 20 2d 20 69 73  rorAtLine() - is
b0d0: 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65   only ever calle
b0e0: 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a  d via the macro.
b0f0: 2a 2a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 29  ** winLogError()
b100: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
b110: 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  tine is invoked 
b120: 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f  after an error o
b130: 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66  ccurs in an OS f
b140: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c  unction..** It l
b150: 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75 73  ogs a message us
b160: 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ing sqlite3_log(
b170: 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  ) containing the
b180: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
b190: 66 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  f.** error code 
b1a0: 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65  and, if possible
b1b0: 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64  , the human-read
b1c0: 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20  able equivalent 
b1d0: 66 72 6f 6d 20 0a 2a 2a 20 46 6f 72 6d 61 74 4d  from .** FormatM
b1e0: 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  essage..**.** Th
b1f0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
b200: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d   passed to the m
b210: 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74  acro should be t
b220: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68  he error code th
b230: 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65  at.** will be re
b240: 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65  turned to SQLite
b250: 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f   (e.g. SQLITE_IO
b260: 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49  ERR_DELETE, SQLI
b270: 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a  TE_CANTOPEN). .*
b280: 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73 65 71  * The two subseq
b290: 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73  uent arguments s
b2a0: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d  hould be the nam
b2b0: 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63  e of the OS func
b2c0: 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69  tion that.** fai
b2d0: 6c 65 64 20 61 6e 64 20 74 68 65 20 61 73 73 6f  led and the asso
b2e0: 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74  ciated file-syst
b2f0: 65 6d 20 70 61 74 68 2c 20 69 66 20 61 6e 79 2e  em path, if any.
b300: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c  .*/.#define winL
b310: 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29  ogError(a,b,c,d)
b320: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74     winLogErrorAt
b330: 4c 69 6e 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c  Line(a,b,c,d,__L
b340: 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e  INE__).static in
b350: 74 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c  t winLogErrorAtL
b360: 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f  ine(.  int errco
b370: 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
b380: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65         /* SQLite
b390: 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
b3a0: 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
b3b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b3c0: 20 2f 2a 20 57 69 6e 33 32 20 6c 61 73 74 20 65   /* Win32 last e
b3d0: 72 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rror */.  const 
b3e0: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20  char *zFunc,    
b3f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
b400: 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e  e of OS function
b410: 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a   that failed */.
b420: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
b430: 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
b440: 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61    /* File path a
b450: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
b460: 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  rror */.  int iL
b470: 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ine             
b480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75            /* Sou
b490: 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  rce line number 
b4a0: 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75  where error occu
b4b0: 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  rred */.){.  cha
b4c0: 72 20 7a 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20  r zMsg[500];    
b4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b4e0: 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 65  Human readable e
b4f0: 72 72 6f 72 20 74 65 78 74 20 2a 2f 0a 20 20 69  rror text */.  i
b500: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
b510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b520: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
b530: 2f 0a 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30  /..  zMsg[0] = 0
b540: 3b 0a 20 20 67 65 74 4c 61 73 74 45 72 72 6f 72  ;.  getLastError
b550: 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73  Msg(lastErrno, s
b560: 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73  izeof(zMsg), zMs
b570: 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 72  g);.  assert( er
b580: 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rcode!=SQLITE_OK
b590: 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d   );.  if( zPath=
b5a0: 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b  =0 ) zPath = "";
b5b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67  .  for(i=0; zMsg
b5c0: 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d  [i] && zMsg[i]!=
b5d0: 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21  '\r' && zMsg[i]!
b5e0: 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\n'; i++){}.  
b5f0: 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73  zMsg[i] = 0;.  s
b600: 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f  qlite3_log(errco
b610: 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77 69  de,.      "os_wi
b620: 6e 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28  n.c:%d: (%d) %s(
b630: 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20  %s) - %s",.     
b640: 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e   iLine, lastErrn
b650: 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c  o, zFunc, zPath,
b660: 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65   zMsg.  );..  re
b670: 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a  turn errcode;.}.
b680: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65  ./*.** The numbe
b690: 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20  r of times that 
b6a0: 61 20 52 65 61 64 46 69 6c 65 28 29 2c 20 57 72  a ReadFile(), Wr
b6b0: 69 74 65 46 69 6c 65 28 29 2c 20 61 6e 64 20 44  iteFile(), and D
b6c0: 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77  eleteFile().** w
b6d0: 69 6c 6c 20 62 65 20 72 65 74 72 69 65 64 20 66  ill be retried f
b6e0: 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69  ollowing a locki
b6f0: 6e 67 20 65 72 72 6f 72 20 2d 20 70 72 6f 62 61  ng error - proba
b700: 62 6c 79 20 63 61 75 73 65 64 20 62 79 20 0a 2a  bly caused by .*
b710: 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f 66 74  * antivirus soft
b720: 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68 65 20  ware.  Also the 
b730: 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20 62 65  initial delay be
b740: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 72  fore the first r
b750: 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c  etry..** The del
b760: 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c 69 6e  ay increases lin
b770: 65 61 72 6c 79 20 77 69 74 68 20 65 61 63 68 20  early with each 
b780: 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65  retry..*/.#ifnde
b790: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  f SQLITE_WIN32_I
b7a0: 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64 65 66  OERR_RETRY.# def
b7b0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
b7c0: 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31 30 0a  _IOERR_RETRY 10.
b7d0: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
b7e0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
b7f0: 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a 23 20  R_RETRY_DELAY.# 
b800: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
b810: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
b820: 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69 66 0a  DELAY 25.#endif.
b830: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32  static int win32
b840: 49 6f 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c  IoerrRetry = SQL
b850: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
b860: 52 45 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e  RETRY;.static in
b870: 74 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72  t win32IoerrRetr
b880: 79 44 65 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f  yDelay = SQLITE_
b890: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
b8a0: 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20  Y_DELAY;../*.** 
b8b0: 49 66 20 61 20 52 65 61 64 46 69 6c 65 28 29 20  If a ReadFile() 
b8c0: 6f 72 20 57 72 69 74 65 46 69 6c 65 28 29 20 65  or WriteFile() e
b8d0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 69 6e 76  rror occurs, inv
b8e0: 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oke this routine
b8f0: 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 69 74  .** to see if it
b900: 20 73 68 6f 75 6c 64 20 62 65 20 72 65 74 72 69   should be retri
b910: 65 64 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ed.  Return TRUE
b920: 20 74 6f 20 72 65 74 72 79 2e 20 20 52 65 74 75   to retry.  Retu
b930: 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 74 6f 20 67  rn FALSE.** to g
b940: 69 76 65 20 75 70 20 77 69 74 68 20 61 6e 20 65  ive up with an e
b950: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
b960: 69 6e 74 20 72 65 74 72 79 49 6f 65 72 72 28 69  int retryIoerr(i
b970: 6e 74 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f  nt *pnRetry, DWO
b980: 52 44 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44  RD *pError){.  D
b990: 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61  WORD e = osGetLa
b9a0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28  stError();.  if(
b9b0: 20 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e 33 32   *pnRetry>=win32
b9c0: 49 6f 65 72 72 52 65 74 72 79 20 29 7b 0a 20 20  IoerrRetry ){.  
b9d0: 20 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a    if( pError ){.
b9e0: 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20        *pError = 
b9f0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  e;.    }.    ret
ba00: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
ba10: 20 65 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53 53   e==ERROR_ACCESS
ba20: 5f 44 45 4e 49 45 44 20 7c 7c 0a 20 20 20 20 20  _DENIED ||.     
ba30: 20 65 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56   e==ERROR_LOCK_V
ba40: 49 4f 4c 41 54 49 4f 4e 20 7c 7c 0a 20 20 20 20  IOLATION ||.    
ba50: 20 20 65 3d 3d 45 52 52 4f 52 5f 53 48 41 52 49    e==ERROR_SHARI
ba60: 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 20 29 7b 0a  NG_VIOLATION ){.
ba70: 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33      sqlite3_win3
ba80: 32 5f 73 6c 65 65 70 28 77 69 6e 33 32 49 6f 65  2_sleep(win32Ioe
ba90: 72 72 52 65 74 72 79 44 65 6c 61 79 2a 28 31 2b  rrRetryDelay*(1+
baa0: 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20 20 20 20  *pnRetry));.    
bab0: 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20 20  ++*pnRetry;.    
bac0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
bad0: 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20  if( pError ){.  
bae0: 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20    *pError = e;. 
baf0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
bb00: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20 61 20 49 2f  ../*.** Log a I/
bb10: 4f 20 65 72 72 6f 72 20 72 65 74 72 79 20 65 70  O error retry ep
bb20: 69 73 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  isode..*/.static
bb30: 20 76 6f 69 64 20 6c 6f 67 49 6f 65 72 72 28 69   void logIoerr(i
bb40: 6e 74 20 6e 52 65 74 72 79 29 7b 0a 20 20 69 66  nt nRetry){.  if
bb50: 28 20 6e 52 65 74 72 79 20 29 7b 0a 20 20 20 20  ( nRetry ){.    
bb60: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
bb70: 54 45 5f 49 4f 45 52 52 2c 20 0a 20 20 20 20 20  TE_IOERR, .     
bb80: 20 22 64 65 6c 61 79 65 64 20 25 64 6d 73 20 66   "delayed %dms f
bb90: 6f 72 20 6c 6f 63 6b 2f 73 68 61 72 69 6e 67 20  or lock/sharing 
bba0: 63 6f 6e 66 6c 69 63 74 22 2c 0a 20 20 20 20 20  conflict",.     
bbb0: 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79   win32IoerrRetry
bbc0: 44 65 6c 61 79 2a 6e 52 65 74 72 79 2a 28 6e 52  Delay*nRetry*(nR
bbd0: 65 74 72 79 2b 31 29 2f 32 0a 20 20 20 20 29 3b  etry+1)/2.    );
bbe0: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  .  }.}..#if SQLI
bbf0: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 2f 2a 2a 2a  TE_OS_WINCE./***
bc00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bc10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bc20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bc30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bc40: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  ******.** This s
bc50: 65 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  ection contains 
bc60: 63 6f 64 65 20 66 6f 72 20 57 69 6e 43 45 20 6f  code for WinCE o
bc70: 6e 6c 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 57 69  nly..*/./*.** Wi
bc80: 6e 64 6f 77 73 20 43 45 20 64 6f 65 73 20 6e 6f  ndows CE does no
bc90: 74 20 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69  t have a localti
bca0: 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  me() function.  
bcb0: 53 6f 20 63 72 65 61 74 65 20 61 0a 2a 2a 20 73  So create a.** s
bcc0: 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69  ubstitute..*/.#i
bcd0: 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a  nclude <time.h>.
bce0: 73 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65  struct tm *__cde
bcf0: 63 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e  cl localtime(con
bd00: 73 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a  st time_t *t).{.
bd10: 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
bd20: 74 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45  tm y;.  FILETIME
bd30: 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53   uTm, lTm;.  SYS
bd40: 54 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73  TEMTIME pTm;.  s
bd50: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34  qlite3_int64 t64
bd60: 3b 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20  ;.  t64 = *t;.  
bd70: 74 36 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36  t64 = (t64 + 116
bd80: 34 34 34 37 33 36 30 30 29 2a 31 30 30 30 30 30  44473600)*100000
bd90: 30 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44  00;.  uTm.dwLowD
bda0: 61 74 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44  ateTime = (DWORD
bdb0: 29 28 74 36 34 20 26 20 30 78 46 46 46 46 46 46  )(t64 & 0xFFFFFF
bdc0: 46 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67  FF);.  uTm.dwHig
bdd0: 68 44 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52  hDateTime= (DWOR
bde0: 44 29 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20  D)(t64 >> 32);. 
bdf0: 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63   osFileTimeToLoc
be00: 61 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c  alFileTime(&uTm,
be10: 26 6c 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54  &lTm);.  osFileT
be20: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28  imeToSystemTime(
be30: 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e  &lTm,&pTm);.  y.
be40: 74 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59  tm_year = pTm.wY
be50: 65 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e  ear - 1900;.  y.
be60: 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f  tm_mon = pTm.wMo
be70: 6e 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f  nth - 1;.  y.tm_
be80: 77 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f  wday = pTm.wDayO
be90: 66 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64  fWeek;.  y.tm_md
bea0: 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20  ay = pTm.wDay;. 
beb0: 20 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d   y.tm_hour = pTm
bec0: 2e 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d  .wHour;.  y.tm_m
bed0: 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65  in = pTm.wMinute
bee0: 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70  ;.  y.tm_sec = p
bef0: 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65  Tm.wSecond;.  re
bf00: 74 75 72 6e 20 26 79 3b 0a 7d 0a 0a 23 64 65 66  turn &y;.}..#def
bf10: 69 6e 65 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49  ine HANDLE_TO_WI
bf20: 4e 46 49 4c 45 28 61 29 20 28 77 69 6e 46 69 6c  NFILE(a) (winFil
bf30: 65 2a 29 26 28 28 63 68 61 72 2a 29 61 29 5b 2d  e*)&((char*)a)[-
bf40: 28 69 6e 74 29 6f 66 66 73 65 74 6f 66 28 77 69  (int)offsetof(wi
bf50: 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a  nFile,h)]../*.**
bf60: 20 41 63 71 75 69 72 65 20 61 20 6c 6f 63 6b 20   Acquire a lock 
bf70: 6f 6e 20 74 68 65 20 68 61 6e 64 6c 65 20 68 0a  on the handle h.
bf80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
bf90: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
bfa0: 28 48 41 4e 44 4c 45 20 68 29 7b 0a 20 20 20 44  (HANDLE h){.   D
bfb0: 57 4f 52 44 20 64 77 45 72 72 3b 0a 20 20 20 64  WORD dwErr;.   d
bfc0: 6f 20 7b 0a 20 20 20 20 20 64 77 45 72 72 20 3d  o {.     dwErr =
bfd0: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
bfe0: 4f 62 6a 65 63 74 28 68 2c 20 49 4e 46 49 4e 49  Object(h, INFINI
bff0: 54 45 29 3b 0a 20 20 20 7d 20 77 68 69 6c 65 20  TE);.   } while 
c000: 28 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 4f  (dwErr != WAIT_O
c010: 42 4a 45 43 54 5f 30 20 26 26 20 64 77 45 72 72  BJECT_0 && dwErr
c020: 20 21 3d 20 57 41 49 54 5f 41 42 41 4e 44 4f 4e   != WAIT_ABANDON
c030: 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c  ED);.}./*.** Rel
c040: 65 61 73 65 20 61 20 6c 6f 63 6b 20 61 63 71 75  ease a lock acqu
c050: 69 72 65 64 20 62 79 20 77 69 6e 63 65 4d 75 74  ired by winceMut
c060: 65 78 41 63 71 75 69 72 65 28 29 0a 2a 2f 0a 23  exAcquire().*/.#
c070: 64 65 66 69 6e 65 20 77 69 6e 63 65 4d 75 74 65  define winceMute
c080: 78 52 65 6c 65 61 73 65 28 68 29 20 52 65 6c 65  xRelease(h) Rele
c090: 61 73 65 4d 75 74 65 78 28 68 29 0a 0a 2f 2a 0a  aseMutex(h)../*.
c0a0: 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 6d 75  ** Create the mu
c0b0: 74 65 78 20 61 6e 64 20 73 68 61 72 65 64 20 6d  tex and shared m
c0c0: 65 6d 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c  emory used for l
c0d0: 6f 63 6b 69 6e 67 20 69 6e 20 74 68 65 20 66 69  ocking in the fi
c0e0: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
c0f0: 20 70 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63   pFile.*/.static
c100: 20 42 4f 4f 4c 20 77 69 6e 63 65 43 72 65 61 74   BOOL winceCreat
c110: 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61 72  eLock(const char
c120: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 77 69 6e   *zFilename, win
c130: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
c140: 4c 50 57 53 54 52 20 7a 54 6f 6b 3b 0a 20 20 4c  LPWSTR zTok;.  L
c150: 50 57 53 54 52 20 7a 4e 61 6d 65 3b 0a 20 20 42  PWSTR zName;.  B
c160: 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45  OOL bInit = TRUE
c170: 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 75 74 66  ;..  zName = utf
c180: 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  8ToUnicode(zFile
c190: 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  name);.  if( zNa
c1a0: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  me==0 ){.    /* 
c1b0: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f  out of memory */
c1c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41 4c 53  .    return FALS
c1d0: 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  E;.  }..  /* Ini
c1e0: 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61  tialize the loca
c1f0: 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20  l lockdata */.  
c200: 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e 6c  memset(&pFile->l
c210: 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ocal, 0, sizeof(
c220: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a  pFile->local));.
c230: 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68  .  /* Replace th
c240: 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72  e backslashes fr
c250: 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  om the filename 
c260: 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74  and lowercase it
c270: 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20  .  ** to derive 
c280: 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f  a mutex name. */
c290: 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61 72  .  zTok = osChar
c2a0: 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20  LowerW(zName);. 
c2b0: 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f   for (;*zTok;zTo
c2c0: 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a  k++){.    if (*z
c2d0: 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54  Tok == '\\') *zT
c2e0: 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20  ok = '_';.  }.. 
c2f0: 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20   /* Create/open 
c300: 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20  the named mutex 
c310: 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74  */.  pFile->hMut
c320: 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d 75 74  ex = osCreateMut
c330: 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c  exW(NULL, FALSE,
c340: 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 21   zName);.  if (!
c350: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a  pFile->hMutex){.
c360: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
c370: 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
c380: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e  Error();.    win
c390: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
c3a0: 45 52 52 4f 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  ERROR, pFile->la
c3b0: 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 63 65 43  stErrno, "winceC
c3c0: 72 65 61 74 65 4c 6f 63 6b 31 22 2c 20 7a 46 69  reateLock1", zFi
c3d0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  lename);.    sql
c3e0: 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29  ite3_free(zName)
c3f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41 4c  ;.    return FAL
c400: 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63  SE;.  }..  /* Ac
c410: 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20  quire the mutex 
c420: 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e  before continuin
c430: 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75 74 65  g */.  winceMute
c440: 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
c450: 68 4d 75 74 65 78 29 3b 0a 20 20 0a 20 20 2f 2a  hMutex);.  .  /*
c460: 20 53 69 6e 63 65 20 74 68 65 20 6e 61 6d 65 73   Since the names
c470: 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65 78 65   of named mutexe
c480: 73 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c 20 66  s, semaphores, f
c490: 69 6c 65 20 6d 61 70 70 69 6e 67 73 20 65 74 63  ile mappings etc
c4a0: 20 61 72 65 20 0a 20 20 2a 2a 20 63 61 73 65 2d   are .  ** case-
c4b0: 73 65 6e 73 69 74 69 76 65 2c 20 74 61 6b 65 20  sensitive, take 
c4c0: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 61  advantage of tha
c4d0: 74 20 62 79 20 75 70 70 65 72 63 61 73 69 6e 67  t by uppercasing
c4e0: 20 74 68 65 20 6d 75 74 65 78 20 6e 61 6d 65 0a   the mutex name.
c4f0: 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e 67 20 74    ** and using t
c500: 68 61 74 20 61 73 20 74 68 65 20 73 68 61 72 65  hat as the share
c510: 64 20 66 69 6c 65 6d 61 70 70 69 6e 67 20 6e 61  d filemapping na
c520: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 6f 73 43 68 61  me..  */.  osCha
c530: 72 55 70 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a  rUpperW(zName);.
c540: 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64    pFile->hShared
c550: 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
c560: 61 70 70 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f  appingW(INVALID_
c570: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55  HANDLE_VALUE, NU
c580: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
c590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5a0: 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
c5b0: 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20 73  _READWRITE, 0, s
c5c0: 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29  izeof(winceLock)
c5d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5f0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 29            zName)
c600: 3b 20 20 0a 0a 20 20 2f 2a 20 53 65 74 20 61 20  ;  ..  /* Set a 
c610: 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63 61  flag that indica
c620: 74 65 73 20 77 65 27 72 65 20 74 68 65 20 66 69  tes we're the fi
c630: 72 73 74 20 74 6f 20 63 72 65 61 74 65 20 74 68  rst to create th
c640: 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74 20 0a  e memory so it .
c650: 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a 65 72    ** must be zer
c660: 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  o-initialized */
c670: 0a 20 20 69 66 20 28 6f 73 47 65 74 4c 61 73 74  .  if (osGetLast
c680: 45 72 72 6f 72 28 29 20 3d 3d 20 45 52 52 4f 52  Error() == ERROR
c690: 5f 41 4c 52 45 41 44 59 5f 45 58 49 53 54 53 29  _ALREADY_EXISTS)
c6a0: 7b 0a 20 20 20 20 62 49 6e 69 74 20 3d 20 46 41  {.    bInit = FA
c6b0: 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  LSE;.  }..  sqli
c6c0: 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b  te3_free(zName);
c6d0: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 73 75 63  ..  /* If we suc
c6e0: 63 65 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67  ceeded in making
c6f0: 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
c700: 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69  ry handle, map i
c710: 74 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c  t. */.  if (pFil
c720: 65 2d 3e 68 53 68 61 72 65 64 29 7b 0a 20 20 20  e->hShared){.   
c730: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d   pFile->shared =
c740: 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d   (winceLock*)osM
c750: 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  apViewOfFile(pFi
c760: 6c 65 2d 3e 68 53 68 61 72 65 64 2c 20 0a 20 20  le->hShared, .  
c770: 20 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f             FILE_
c780: 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41  MAP_READ|FILE_MA
c790: 50 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 73  P_WRITE, 0, 0, s
c7a0: 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29  izeof(winceLock)
c7b0: 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 70  );.    /* If map
c7c0: 70 69 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f  ping failed, clo
c7d0: 73 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  se the shared me
c7e0: 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 20  mory handle and 
c7f0: 65 72 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 20  erase it */.    
c800: 69 66 20 28 21 70 46 69 6c 65 2d 3e 73 68 61 72  if (!pFile->shar
c810: 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ed){.      pFile
c820: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
c830: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
c840: 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f        winLogErro
c850: 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  r(SQLITE_ERROR, 
c860: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
c870: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c880: 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63   "winceCreateLoc
c890: 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  k2", zFilename);
c8a0: 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  .      osCloseHa
c8b0: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61  ndle(pFile->hSha
c8c0: 72 65 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  red);.      pFil
c8d0: 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e 55 4c  e->hShared = NUL
c8e0: 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  L;.    }.  }..  
c8f0: 2f 2a 20 49 66 20 73 68 61 72 65 64 20 6d 65 6d  /* If shared mem
c900: 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ory could not be
c910: 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63   created, then c
c920: 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20 61  lose the mutex a
c930: 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20 69 66 20  nd fail */.  if 
c940: 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20  (pFile->hShared 
c950: 3d 3d 20 4e 55 4c 4c 29 7b 0a 20 20 20 20 77 69  == NULL){.    wi
c960: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
c970: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
c980: 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
c990: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
c9a0: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75  ;.    pFile->hMu
c9b0: 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  tex = NULL;.    
c9c0: 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20  return FALSE;.  
c9d0: 7d 0a 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69 61  }.  .  /* Initia
c9e0: 6c 69 7a 65 20 74 68 65 20 73 68 61 72 65 64 20  lize the shared 
c9f0: 6d 65 6d 6f 72 79 20 69 66 20 77 65 27 72 65 20  memory if we're 
ca00: 73 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a 20  supposed to */. 
ca10: 20 69 66 20 28 62 49 6e 69 74 29 20 7b 0a 20 20   if (bInit) {.  
ca20: 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2d 3e    memset(pFile->
ca30: 73 68 61 72 65 64 2c 20 30 2c 20 73 69 7a 65 6f  shared, 0, sizeo
ca40: 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20  f(winceLock));. 
ca50: 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78   }..  winceMutex
ca60: 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
ca70: 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  Mutex);.  return
ca80: 20 54 52 55 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   TRUE;.}../*.** 
ca90: 44 65 73 74 72 6f 79 20 74 68 65 20 70 61 72 74  Destroy the part
caa0: 20 6f 66 20 77 69 6e 46 69 6c 65 20 74 68 61 74   of winFile that
cab0: 20 64 65 61 6c 73 20 77 69 74 68 20 77 69 6e 63   deals with winc
cac0: 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74 69  e locks.*/.stati
cad0: 63 20 76 6f 69 64 20 77 69 6e 63 65 44 65 73 74  c void winceDest
cae0: 72 6f 79 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20  royLock(winFile 
caf0: 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66 20 28 70  *pFile){.  if (p
cb00: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20  File->hMutex){. 
cb10: 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68     /* Acquire th
cb20: 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77  e mutex */.    w
cb30: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
cb40: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
cb50: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c  ..    /* The fol
cb60: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20 73 68  lowing blocks sh
cb70: 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 61 73  ould probably as
cb80: 73 65 72 74 20 69 6e 20 64 65 62 75 67 20 6d 6f  sert in debug mo
cb90: 64 65 2c 20 62 75 74 20 74 68 65 79 0a 20 20 20  de, but they.   
cba0: 20 20 20 20 61 72 65 20 74 6f 20 63 6c 65 61 6e      are to clean
cbb0: 75 70 20 69 6e 20 63 61 73 65 20 61 6e 79 20 6c  up in case any l
cbc0: 6f 63 6b 73 20 72 65 6d 61 69 6e 65 64 20 6f 70  ocks remained op
cbd0: 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46  en */.    if (pF
cbe0: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
cbf0: 65 72 73 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ers){.      pFil
cc00: 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64  e->shared->nRead
cc10: 65 72 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  ers --;.    }.  
cc20: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
cc30: 61 6c 2e 62 52 65 73 65 72 76 65 64 29 7b 0a 20  al.bReserved){. 
cc40: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
cc50: 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20  ed->bReserved = 
cc60: 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20  FALSE;.    }.   
cc70: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
cc80: 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20  l.bPending){.   
cc90: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
cca0: 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c  ->bPending = FAL
ccb0: 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  SE;.    }.    if
ccc0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
ccd0: 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20  Exclusive){.    
cce0: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
ccf0: 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41  >bExclusive = FA
cd00: 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  LSE;.    }..    
cd10: 2f 2a 20 44 65 2d 72 65 66 65 72 65 6e 63 65 20  /* De-reference 
cd20: 61 6e 64 20 63 6c 6f 73 65 20 6f 75 72 20 63 6f  and close our co
cd30: 70 79 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  py of the shared
cd40: 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 2a   memory handle *
cd50: 2f 0a 20 20 20 20 6f 73 55 6e 6d 61 70 56 69 65  /.    osUnmapVie
cd60: 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73  wOfFile(pFile->s
cd70: 68 61 72 65 64 29 3b 0a 20 20 20 20 6f 73 43 6c  hared);.    osCl
cd80: 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
cd90: 3e 68 53 68 61 72 65 64 29 3b 0a 0a 20 20 20 20  >hShared);..    
cda0: 2f 2a 20 44 6f 6e 65 20 77 69 74 68 20 74 68 65  /* Done with the
cdb0: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69   mutex */.    wi
cdc0: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
cdd0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 20  pFile->hMutex); 
cde0: 20 20 20 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48     .    osCloseH
cdf0: 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75  andle(pFile->hMu
ce00: 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  tex);.    pFile-
ce10: 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a  >hMutex = NULL;.
ce20: 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e    }.}../* .** An
ce30: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
ce40: 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 28  of the LockFile(
ce50: 29 20 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73  ) API of Windows
ce60: 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69   for CE.*/.stati
ce70: 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b  c BOOL winceLock
ce80: 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45  File(.  LPHANDLE
ce90: 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44   phFile,.  DWORD
cea0: 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77   dwFileOffsetLow
ceb0: 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65  ,.  DWORD dwFile
cec0: 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  OffsetHigh,.  DW
ced0: 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
cee0: 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44  esToLockLow,.  D
cef0: 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
cf00: 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b  tesToLockHigh.){
cf10: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
cf20: 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49  e = HANDLE_TO_WI
cf30: 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20  NFILE(phFile);. 
cf40: 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20   BOOL bReturn = 
cf50: 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44  FALSE;..  UNUSED
cf60: 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c  _PARAMETER(dwFil
cf70: 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20  eOffsetHigh);.  
cf80: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
cf90: 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54  (nNumberOfBytesT
cfa0: 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69  oLockHigh);..  i
cfb0: 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65  f (!pFile->hMute
cfc0: 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a  x) return TRUE;.
cfd0: 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
cfe0: 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
cff0: 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74 69 6e  x);..  /* Wantin
d000: 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  g an exclusive l
d010: 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20 28 64 77  ock? */.  if (dw
d020: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
d030: 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46   (DWORD)SHARED_F
d040: 49 52 53 54 0a 20 20 20 20 20 20 20 26 26 20 6e  IRST.       && n
d050: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
d060: 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  ockLow == (DWORD
d070: 29 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20  )SHARED_SIZE){. 
d080: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68     if (pFile->sh
d090: 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 3d  ared->nReaders =
d0a0: 3d 20 30 20 26 26 20 70 46 69 6c 65 2d 3e 73 68  = 0 && pFile->sh
d0b0: 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65  ared->bExclusive
d0c0: 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 20 70   == 0){.       p
d0d0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45  File->shared->bE
d0e0: 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b  xclusive = TRUE;
d0f0: 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  .       pFile->l
d100: 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20  ocal.bExclusive 
d110: 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 62  = TRUE;.       b
d120: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
d130: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
d140: 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  ant a read-only 
d150: 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20  lock? */.  else 
d160: 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
d170: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
d180: 41 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20 20  ARED_FIRST &&.  
d190: 20 20 20 20 20 20 20 20 20 6e 4e 75 6d 62 65 72           nNumber
d1a0: 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
d1b0: 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28   == 1){.    if (
d1c0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
d1d0: 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b  Exclusive == 0){
d1e0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
d1f0: 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b 2b 3b  cal.nReaders ++;
d200: 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65  .      if (pFile
d210: 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
d220: 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20 20 20   == 1){.        
d230: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e  pFile->shared->n
d240: 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20  Readers ++;.    
d250: 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72    }.      bRetur
d260: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
d270: 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61    }..  /* Want a
d280: 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20 2a   pending lock? *
d290: 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
d2a0: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
d2b0: 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42  (DWORD)PENDING_B
d2c0: 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66  YTE && nNumberOf
d2d0: 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d  BytesToLockLow =
d2e0: 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  = 1){.    /* If 
d2f0: 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20  no pending lock 
d300: 68 61 73 20 62 65 65 6e 20 61 63 71 75 69 72 65  has been acquire
d310: 64 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  d, then acquire 
d320: 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46  it */.    if (pF
d330: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65  ile->shared->bPe
d340: 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20  nding == 0) {.  
d350: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
d360: 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52  d->bPending = TR
d370: 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  UE;.      pFile-
d380: 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20  >local.bPending 
d390: 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52  = TRUE;.      bR
d3a0: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
d3b0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
d3c0: 6e 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  nt a reserved lo
d3d0: 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ck? */.  else if
d3e0: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
d3f0: 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45  w == (DWORD)RESE
d400: 52 56 45 44 5f 42 59 54 45 20 26 26 20 6e 4e 75  RVED_BYTE && nNu
d410: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
d420: 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
d430: 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
d440: 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 3d 20  d->bReserved == 
d450: 30 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  0) {.      pFile
d460: 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72  ->shared->bReser
d470: 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ved = TRUE;.    
d480: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
d490: 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b  Reserved = TRUE;
d4a0: 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
d4b0: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
d4c0: 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65  ..  winceMutexRe
d4d0: 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75  lease(pFile->hMu
d4e0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  tex);.  return b
d4f0: 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Return;.}../*.**
d500: 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   An implementati
d510: 6f 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63 6b  on of the Unlock
d520: 46 69 6c 65 20 41 50 49 20 6f 66 20 57 69 6e 64  File API of Wind
d530: 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74  ows for CE.*/.st
d540: 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 55  atic BOOL winceU
d550: 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48  nlockFile(.  LPH
d560: 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20  ANDLE phFile,.  
d570: 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
d580: 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64  etLow,.  DWORD d
d590: 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c  wFileOffsetHigh,
d5a0: 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
d5b0: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
d5c0: 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d  ow,.  DWORD nNum
d5d0: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
d5e0: 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46  ckHigh.){.  winF
d5f0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e  ile *pFile = HAN
d600: 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70  DLE_TO_WINFILE(p
d610: 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62  hFile);.  BOOL b
d620: 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a  Return = FALSE;.
d630: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
d640: 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74  TER(dwFileOffset
d650: 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f  High);.  UNUSED_
d660: 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65  PARAMETER(nNumbe
d670: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
d680: 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70  High);..  if (!p
d690: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65  File->hMutex) re
d6a0: 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e  turn TRUE;.  win
d6b0: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
d6c0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a  File->hMutex);..
d6d0: 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61    /* Releasing a
d6e0: 20 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20   reader lock or 
d6f0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
d700: 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c  k */.  if (dwFil
d710: 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44  eOffsetLow == (D
d720: 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53  WORD)SHARED_FIRS
d730: 54 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20 77  T){.    /* Did w
d740: 65 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  e have an exclus
d750: 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20  ive lock? */.   
d760: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
d770: 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20  l.bExclusive){. 
d780: 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d       assert(nNum
d790: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
d7a0: 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  ckLow == (DWORD)
d7b0: 53 48 41 52 45 44 5f 53 49 5a 45 29 3b 0a 20 20  SHARED_SIZE);.  
d7c0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
d7d0: 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41  .bExclusive = FA
d7e0: 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  LSE;.      pFile
d7f0: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
d800: 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20  sive = FALSE;.  
d810: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
d820: 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  UE;.    }..    /
d830: 2a 20 44 69 64 20 77 65 20 6a 75 73 74 20 68 61  * Did we just ha
d840: 76 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b  ve a reader lock
d850: 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  ? */.    else if
d860: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
d870: 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20  Readers){.      
d880: 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66  assert(nNumberOf
d890: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
d8a0: 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
d8b0: 44 5f 53 49 5a 45 20 7c 7c 20 6e 4e 75 6d 62 65  D_SIZE || nNumbe
d8c0: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
d8d0: 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20  Low == 1);.     
d8e0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52   pFile->local.nR
d8f0: 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20  eaders --;.     
d900: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
d910: 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 29  l.nReaders == 0)
d920: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
d930: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
d940: 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20  nReaders --;.   
d950: 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75     }.      bRetu
d960: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
d970: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  .  }..  /* Relea
d980: 73 69 6e 67 20 61 20 70 65 6e 64 69 6e 67 20 6c  sing a pending l
d990: 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ock */.  else if
d9a0: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
d9b0: 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44  w == (DWORD)PEND
d9c0: 49 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d  ING_BYTE && nNum
d9d0: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
d9e0: 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
d9f0: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
da00: 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20  l.bPending){.   
da10: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
da20: 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45  bPending = FALSE
da30: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  ;.      pFile->s
da40: 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
da50: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62  = FALSE;.      b
da60: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
da70: 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65     }.  }.  /* Re
da80: 6c 65 61 73 69 6e 67 20 61 20 72 65 73 65 72 76  leasing a reserv
da90: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73  ed lock */.  els
daa0: 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
dab0: 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
dac0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 26 26  RESERVED_BYTE &&
dad0: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
dae0: 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  oUnlockLow == 1)
daf0: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
db00: 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
db10: 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
db20: 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
db30: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
db40: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
db50: 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45  Reserved = FALSE
db60: 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  ;.      bReturn 
db70: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
db80: 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52  }..  winceMutexR
db90: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
dba0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
dbb0: 62 52 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a  bReturn;.}./*.**
dbc0: 20 45 6e 64 20 6f 66 20 74 68 65 20 73 70 65 63   End of the spec
dbd0: 69 61 6c 20 63 6f 64 65 20 66 6f 72 20 77 69 6e  ial code for win
dbe0: 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ce.*************
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dc30: 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  /.#endif /* SQLI
dc40: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a  TE_OS_WINCE */..
dc50: 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66 69 6c  /*.** Lock a fil
dc60: 65 20 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  e region..*/.sta
dc70: 74 69 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b  tic BOOL winLock
dc80: 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45  File(.  LPHANDLE
dc90: 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44   phFile,.  DWORD
dca0: 20 66 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44 20   flags,.  DWORD 
dcb0: 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f  offsetLow,.  DWO
dcc0: 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20  RD offsetHigh,. 
dcd0: 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c   DWORD numBytesL
dce0: 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42  ow,.  DWORD numB
dcf0: 79 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20  ytesHigh.){.#if 
dd00: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
dd10: 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20    /*.  ** NOTE: 
dd20: 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61  Windows CE is ha
dd30: 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c  ndled differentl
dd40: 79 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c  y here due its l
dd50: 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32  ack of the Win32
dd60: 0a 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20  .  **       API 
dd70: 4c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20  LockFile..  */. 
dd80: 20 72 65 74 75 72 6e 20 77 69 6e 63 65 4c 6f 63   return winceLoc
dd90: 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66  kFile(phFile, of
dda0: 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48  fsetLow, offsetH
ddb0: 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  igh,.           
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42              numB
ddd0: 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65  ytesLow, numByte
dde0: 73 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20  sHigh);.#else.  
ddf0: 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
de00: 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c    OVERLAPPED ovl
de10: 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f  p;.    memset(&o
de20: 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f  vlp, 0, sizeof(O
de30: 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20  VERLAPPED));.   
de40: 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f   ovlp.Offset = o
de50: 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76  ffsetLow;.    ov
de60: 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20  lp.OffsetHigh = 
de70: 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20  offsetHigh;.    
de80: 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c  return osLockFil
de90: 65 45 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c 61  eEx(*phFile, fla
dea0: 67 73 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c  gs, 0, numBytesL
deb0: 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ow, numBytesHigh
dec0: 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73  , &ovlp);.  }els
ded0: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  e{.    return os
dee0: 4c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65  LockFile(*phFile
def0: 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66  , offsetLow, off
df00: 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65  setHigh, numByte
df10: 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  sLow,.          
df20: 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42              numB
df30: 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23  ytesHigh);.  }.#
df40: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  endif.}../*.** U
df50: 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67  nlock a file reg
df60: 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ion.. */.static 
df70: 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  BOOL winUnlockFi
df80: 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
df90: 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 6f  hFile,.  DWORD o
dfa0: 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52  ffsetLow,.  DWOR
dfb0: 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20  D offsetHigh,.  
dfc0: 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f  DWORD numBytesLo
dfd0: 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79  w,.  DWORD numBy
dfe0: 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53  tesHigh.){.#if S
dff0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
e000: 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57   /*.  ** NOTE: W
e010: 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e  indows CE is han
e020: 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  dled differently
e030: 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61   here due its la
e040: 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a  ck of the Win32.
e050: 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 55    **       API U
e060: 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a  nlockFile..  */.
e070: 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 55 6e    return winceUn
e080: 6c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c  lockFile(phFile,
e090: 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73   offsetLow, offs
e0a0: 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20  etHigh,.        
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0c0: 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75   numBytesLow, nu
e0d0: 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c  mBytesHigh);.#el
e0e0: 73 65 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  se.  if( isNT() 
e0f0: 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45  ){.    OVERLAPPE
e100: 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73  D ovlp;.    mems
e110: 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a  et(&ovlp, 0, siz
e120: 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
e130: 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
e140: 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20  t = offsetLow;. 
e150: 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69     ovlp.OffsetHi
e160: 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b  gh = offsetHigh;
e170: 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e  .    return osUn
e180: 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68 46 69  lockFileEx(*phFi
e190: 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c  le, 0, numBytesL
e1a0: 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ow, numBytesHigh
e1b0: 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73  , &ovlp);.  }els
e1c0: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  e{.    return os
e1d0: 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69  UnlockFile(*phFi
e1e0: 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f  le, offsetLow, o
e1f0: 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79  ffsetHigh, numBy
e200: 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20  tesLow,.        
e210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e220: 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20  numBytesHigh);. 
e230: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 2a   }.#endif.}../**
e240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
e290: 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66  he next group of
e2a0: 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d   routines implem
e2b0: 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65 74 68  ent the I/O meth
e2c0: 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  ods specified.**
e2d0: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f   by the sqlite3_
e2e0: 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
e2f0: 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t..*************
e300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e340: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d  */../*.** Some M
e350: 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65  icrosoft compile
e360: 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66  rs lack this def
e370: 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  inition..*/.#ifn
e380: 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f  def INVALID_SET_
e390: 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23 20 64  FILE_POINTER.# d
e3a0: 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 53 45  efine INVALID_SE
e3b0: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 28  T_FILE_POINTER (
e3c0: 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69  (DWORD)-1).#endi
e3d0: 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  f../*.** Move th
e3e0: 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  e current positi
e3f0: 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68  on of the file h
e400: 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
e410: 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72  the first .** ar
e420: 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65 74  gument to offset
e430: 20 69 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20   iOffset within 
e440: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73 75 63  the file. If suc
e450: 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20  cessful, return 
e460: 30 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  0. .** Otherwise
e470: 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61 73  , set pFile->las
e480: 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74 75 72  tErrno and retur
e490: 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73  n non-zero..*/.s
e4a0: 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 57 69  tatic int seekWi
e4b0: 6e 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  nFile(winFile *p
e4c0: 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e  File, sqlite3_in
e4d0: 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a 23 69  t64 iOffset){.#i
e4e0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
e4f0: 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42  RT.  LONG upperB
e500: 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  its;            
e510: 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69 67       /* Most sig
e520: 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77  . 32 bits of new
e530: 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e   offset */.  LON
e540: 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20 20 20  G lowerBits;    
e550: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e560: 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20 62 69  Least sig. 32 bi
e570: 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74  ts of new offset
e580: 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 52 65   */.  DWORD dwRe
e590: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
e5a0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
e5b0: 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46 69  eturned by SetFi
e5c0: 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a 20  lePointer() */. 
e5d0: 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
e5e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e5f0: 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
e600: 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 72  ed by GetLastErr
e610: 6f 72 28 29 20 2a 2f 0a 0a 20 20 75 70 70 65 72  or() */..  upper
e620: 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28 69  Bits = (LONG)((i
e630: 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  Offset>>32) & 0x
e640: 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f 77  7fffffff);.  low
e650: 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28  erBits = (LONG)(
e660: 69 4f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  iOffset & 0xffff
e670: 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50 49  ffff);..  /* API
e680: 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75 63 63   oddity: If succ
e690: 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c 65 50  essful, SetFileP
e6a0: 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72 6e 73  ointer() returns
e6b0: 20 61 20 64 77 6f 72 64 20 0a 20 20 2a 2a 20 63   a dword .  ** c
e6c0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f  ontaining the lo
e6d0: 77 65 72 20 33 32 2d 62 69 74 73 20 6f 66 20 74  wer 32-bits of t
e6e0: 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73  he new file-offs
e6f0: 65 74 2e 20 4f 72 2c 20 69 66 20 69 74 20 66 61  et. Or, if it fa
e700: 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74  ils,.  ** it ret
e710: 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45 54  urns INVALID_SET
e720: 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48  _FILE_POINTER. H
e730: 6f 77 65 76 65 72 20 61 63 63 6f 72 64 69 6e 67  owever according
e740: 20 74 6f 20 4d 53 44 4e 2c 20 0a 20 20 2a 2a 20   to MSDN, .  ** 
e750: 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
e760: 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c 73  _POINTER may als
e770: 6f 20 62 65 20 61 20 76 61 6c 69 64 20 6e 65 77  o be a valid new
e780: 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f 20 64   offset. So to d
e790: 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77  etermine .  ** w
e7a0: 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f 72 20  hether an error 
e7b0: 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f 63 63  has actually occ
e7c0: 75 72 65 64 2c 20 69 74 20 69 73 20 61 6c 73 6f  ured, it is also
e7d0: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 63 61   necessary to ca
e7e0: 6c 6c 20 0a 20 20 2a 2a 20 47 65 74 4c 61 73 74  ll .  ** GetLast
e7f0: 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  Error()..  */.  
e800: 64 77 52 65 74 20 3d 20 6f 73 53 65 74 46 69 6c  dwRet = osSetFil
e810: 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e  ePointer(pFile->
e820: 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26 75  h, lowerBits, &u
e830: 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42  pperBits, FILE_B
e840: 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 20 28 64  EGIN);..  if( (d
e850: 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45  wRet==INVALID_SE
e860: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 20  T_FILE_POINTER. 
e870: 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45 72       && ((lastEr
e880: 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
e890: 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f  rror())!=NO_ERRO
e8a0: 52 29 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  R)) ){.    pFile
e8b0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
e8c0: 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e  stErrno;.    win
e8d0: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
e8e0: 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c  IOERR_SEEK, pFil
e8f0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
e900: 20 20 20 20 20 20 20 20 20 20 20 22 73 65 65 6b             "seek
e910: 57 69 6e 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d  WinFile", pFile-
e920: 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74  >zPath);.    ret
e930: 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65  urn 1;.  }..  re
e940: 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20  turn 0;.#else.  
e950: 2f 2a 0a 20 20 2a 2a 20 53 61 6d 65 20 61 73 20  /*.  ** Same as 
e960: 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68  above, except th
e970: 61 74 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e  at this implemen
e980: 74 61 74 69 6f 6e 20 77 6f 72 6b 73 20 66 6f 72  tation works for
e990: 20 57 69 6e 52 54 2e 0a 20 20 2a 2f 0a 0a 20 20   WinRT..  */..  
e9a0: 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 78 3b  LARGE_INTEGER x;
e9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9c0: 2f 2a 20 54 68 65 20 6e 65 77 20 6f 66 66 73 65  /* The new offse
e9d0: 74 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 74  t */.  BOOL bRet
e9e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e9f0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
ea00: 72 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46  returned by SetF
ea10: 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 29 20 2a  ilePointerEx() *
ea20: 2f 0a 0a 20 20 78 2e 51 75 61 64 50 61 72 74 20  /..  x.QuadPart 
ea30: 3d 20 69 4f 66 66 73 65 74 3b 0a 20 20 62 52 65  = iOffset;.  bRe
ea40: 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f 69  t = osSetFilePoi
ea50: 6e 74 65 72 45 78 28 70 46 69 6c 65 2d 3e 68 2c  nterEx(pFile->h,
ea60: 20 78 2c 20 30 2c 20 46 49 4c 45 5f 42 45 47 49   x, 0, FILE_BEGI
ea70: 4e 29 3b 0a 0a 20 20 69 66 28 21 62 52 65 74 29  N);..  if(!bRet)
ea80: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
ea90: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
eaa0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 77  stError();.    w
eab0: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
eac0: 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46  E_IOERR_SEEK, pF
ead0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
eae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 73 65               "se
eaf0: 65 6b 57 69 6e 46 69 6c 65 22 2c 20 70 46 69 6c  ekWinFile", pFil
eb00: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72  e->zPath);.    r
eb10: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
eb20: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
eb30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
eb40: 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74  a file..**.** It
eb50: 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 68 61   is reported tha
eb60: 74 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  t an attempt to 
eb70: 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6d  close a handle m
eb80: 69 67 68 74 20 73 6f 6d 65 74 69 6d 65 73 0a 2a  ight sometimes.*
eb90: 2a 20 66 61 69 6c 2e 20 20 54 68 69 73 20 69 73  * fail.  This is
eba0: 20 61 20 76 65 72 79 20 75 6e 72 65 61 73 6f 6e   a very unreason
ebb0: 61 62 6c 65 20 72 65 73 75 6c 74 2c 20 62 75 74  able result, but
ebc0: 20 57 69 6e 64 6f 77 73 20 69 73 20 6e 6f 74 6f   Windows is noto
ebd0: 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20 62 65 69  rious.** for bei
ebe0: 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20  ng unreasonable 
ebf0: 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64 6f 75 62  so I do not doub
ec00: 74 20 74 68 61 74 20 69 74 20 6d 69 67 68 74 20  t that it might 
ec10: 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a 2a 20 74  happen.  If.** t
ec20: 68 65 20 63 6c 6f 73 65 20 66 61 69 6c 73 2c 20  he close fails, 
ec30: 77 65 20 70 61 75 73 65 20 66 6f 72 20 31 30 30  we pause for 100
ec40: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e   milliseconds an
ec50: 64 20 74 72 79 20 61 67 61 69 6e 2e 20 20 41 73  d try again.  As
ec60: 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d 58 5f 43  .** many as MX_C
ec70: 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 61 74 74  LOSE_ATTEMPT att
ec80: 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73 65 20 74  empts to close t
ec90: 68 65 20 68 61 6e 64 6c 65 20 61 72 65 20 6d 61  he handle are ma
eca0: 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20 67 69 76  de before.** giv
ecb0: 69 6e 67 20 75 70 20 61 6e 64 20 72 65 74 75 72  ing up and retur
ecc0: 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  ning an error..*
ecd0: 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43 4c 4f  /.#define MX_CLO
ece0: 53 45 5f 41 54 54 45 4d 50 54 20 33 0a 73 74 61  SE_ATTEMPT 3.sta
ecf0: 74 69 63 20 69 6e 74 20 77 69 6e 43 6c 6f 73 65  tic int winClose
ed00: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
ed10: 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 63 6e  d){.  int rc, cn
ed20: 74 20 3d 20 30 3b 0a 20 20 77 69 6e 46 69 6c 65  t = 0;.  winFile
ed30: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
ed40: 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
ed50: 74 28 20 69 64 21 3d 30 20 29 3b 0a 23 69 66 6e  t( id!=0 );.#ifn
ed60: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ed70: 57 41 4c 0a 20 20 61 73 73 65 72 74 28 20 70 46  WAL.  assert( pF
ed80: 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a  ile->pShm==0 );.
ed90: 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45  #endif.  OSTRACE
eda0: 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20  (("CLOSE %d\n", 
edb0: 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 64 6f  pFile->h));.  do
edc0: 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 43 6c 6f  {.    rc = osClo
edd0: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
ede0: 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d 75 6c  h);.    /* Simul
edf0: 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 30  ateIOError( rc=0
ee00: 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41  ; cnt=MX_CLOSE_A
ee10: 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20 20  TTEMPT; ); */.  
ee20: 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20 26 26  }while( rc==0 &&
ee30: 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53   ++cnt < MX_CLOS
ee40: 45 5f 41 54 54 45 4d 50 54 20 26 26 20 28 73 71  E_ATTEMPT && (sq
ee50: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
ee60: 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23 69  p(100), 1) );.#i
ee70: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
ee80: 45 0a 23 64 65 66 69 6e 65 20 57 49 4e 43 45 5f  E.#define WINCE_
ee90: 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54  DELETION_ATTEMPT
eea0: 53 20 33 0a 20 20 77 69 6e 63 65 44 65 73 74 72  S 3.  winceDestr
eeb0: 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  oyLock(pFile);. 
eec0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c   if( pFile->zDel
eed0: 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20  eteOnClose ){.  
eee0: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
eef0: 20 20 20 77 68 69 6c 65 28 0a 20 20 20 20 20 20     while(.      
ef00: 20 20 20 20 20 6f 73 44 65 6c 65 74 65 46 69 6c       osDeleteFil
ef10: 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74  eW(pFile->zDelet
ef20: 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20 20 20  eOnClose)==0.   
ef30: 20 20 20 20 20 26 26 20 6f 73 47 65 74 46 69 6c       && osGetFil
ef40: 65 41 74 74 72 69 62 75 74 65 73 57 28 70 46 69  eAttributesW(pFi
ef50: 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
ef60: 73 65 29 21 3d 30 78 66 66 66 66 66 66 66 66 20  se)!=0xffffffff 
ef70: 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e 74 2b  .        && cnt+
ef80: 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45 54 49  + < WINCE_DELETI
ef90: 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20 20 20  ON_ATTEMPTS.    
efa0: 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  ){.       sqlite
efb0: 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 30  3_win32_sleep(10
efc0: 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61 20 6c  0);  /* Wait a l
efd0: 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74 72 79  ittle before try
efe0: 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20  ing again */.   
eff0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
f000: 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  ree(pFile->zDele
f010: 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a  teOnClose);.  }.
f020: 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45  #endif.  OSTRACE
f030: 28 28 22 43 4c 4f 53 45 20 25 64 20 25 73 5c 6e  (("CLOSE %d %s\n
f040: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 20  ", pFile->h, rc 
f050: 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
f060: 22 29 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  "));.  if( rc ){
f070: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  .    pFile->h = 
f080: 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 70 65 6e  NULL;.  }.  Open
f090: 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 72  Counter(-1);.  r
f0a0: 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54  eturn rc ? SQLIT
f0b0: 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20  E_OK.           
f0c0: 20 3a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   : winLogError(S
f0d0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
f0e0: 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  E, osGetLastErro
f0f0: 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
f100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
f110: 77 69 6e 43 6c 6f 73 65 22 2c 20 70 46 69 6c 65  winClose", pFile
f120: 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a  ->zPath);.}../*.
f130: 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
f140: 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20  m a file into a 
f150: 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20  buffer.  Return 
f160: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
f170: 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72  .** bytes were r
f180: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
f190: 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52   and SQLITE_IOER
f1a0: 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  R if anything go
f1b0: 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a  es.** wrong..*/.
f1c0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65  static int winRe
f1d0: 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ad(.  sqlite3_fi
f1e0: 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
f1f0: 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65 61 64   /* File to read
f200: 20 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64 20   from */.  void 
f210: 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
f220: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63        /* Write c
f230: 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68 69 73  ontent into this
f240: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
f250: 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
f260: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
f270: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65  r of bytes to re
f280: 61 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ad */.  sqlite3_
f290: 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20 20  int64 offset    
f2a0: 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64     /* Begin read
f2b0: 69 6e 67 20 61 74 20 74 68 69 73 20 6f 66 66 73  ing at this offs
f2c0: 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 53 51  et */.){.#if !SQ
f2d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
f2e0: 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c  OVERLAPPED overl
f2f0: 61 70 70 65 64 3b 20 20 20 20 20 20 20 20 20 20  apped;          
f300: 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f  /* The offset fo
f310: 72 20 52 65 61 64 46 69 6c 65 2e 20 2a 2f 0a 23  r ReadFile. */.#
f320: 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20  endif.  winFile 
f330: 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
f340: 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c 65 20  e*)id;  /* file 
f350: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57 4f 52  handle */.  DWOR
f360: 44 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20  D nRead;        
f370: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
f380: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
f390: 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f  ctually read fro
f3a0: 6d 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  m file */.  int 
f3b0: 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20  nRetry = 0;     
f3c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
f3d0: 75 6d 62 65 72 20 6f 66 20 72 65 74 72 79 73 20  umber of retrys 
f3e0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  */..  assert( id
f3f0: 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  !=0 );.  Simulat
f400: 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
f410: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
f420: 44 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  D);.  OSTRACE(("
f430: 52 45 41 44 20 25 64 20 6c 6f 63 6b 3d 25 64 5c  READ %d lock=%d\
f440: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46  n", pFile->h, pF
f450: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b  ile->locktype));
f460: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
f470: 57 49 4e 43 45 0a 20 20 69 66 28 20 73 65 65 6b  WINCE.  if( 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 20 29 7b 0a 20 20 20 20 72 65  ffset) ){.    re
f4a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
f4b0: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 21  ;.  }.  while( !
f4c0: 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65  osReadFile(pFile
f4d0: 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20  ->h, pBuf, amt, 
f4e0: 26 6e 52 65 61 64 2c 20 30 29 20 29 7b 0a 23 65  &nRead, 0) ){.#e
f4f0: 6c 73 65 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76  lse.  memset(&ov
f500: 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73 69 7a  erlapped, 0, siz
f510: 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
f520: 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f  ;.  overlapped.O
f530: 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f  ffset = (LONG)(o
f540: 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66  ffset & 0xffffff
f550: 66 66 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65  ff);.  overlappe
f560: 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28  d.OffsetHigh = (
f570: 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33  LONG)((offset>>3
f580: 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29  2) & 0x7fffffff)
f590: 3b 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52 65  ;.  while( !osRe
f5a0: 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  adFile(pFile->h,
f5b0: 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65   pBuf, amt, &nRe
f5c0: 61 64 2c 20 26 6f 76 65 72 6c 61 70 70 65 64 29  ad, &overlapped)
f5d0: 20 26 26 0a 20 20 20 20 20 20 20 20 20 6f 73 47   &&.         osG
f5e0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21 3d 45  etLastError()!=E
f5f0: 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 45 4f 46 20  RROR_HANDLE_EOF 
f600: 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20 44 57  ){.#endif.    DW
f610: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  ORD lastErrno;. 
f620: 20 20 20 69 66 28 20 72 65 74 72 79 49 6f 65 72     if( retryIoer
f630: 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74  r(&nRetry, &last
f640: 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75  Errno) ) continu
f650: 65 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  e;.    pFile->la
f660: 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
f670: 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rno;.    return 
f680: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
f690: 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c 20 70  TE_IOERR_READ, p
f6a0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
f6b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77  .             "w
f6c0: 69 6e 52 65 61 64 22 2c 20 70 46 69 6c 65 2d 3e  inRead", pFile->
f6d0: 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 6c 6f  zPath);.  }.  lo
f6e0: 67 49 6f 65 72 72 28 6e 52 65 74 72 79 29 3b 0a  gIoerr(nRetry);.
f6f0: 20 20 69 66 28 20 6e 52 65 61 64 3c 28 44 57 4f    if( nRead<(DWO
f700: 52 44 29 61 6d 74 20 29 7b 0a 20 20 20 20 2f 2a  RD)amt ){.    /*
f710: 20 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66   Unread parts of
f720: 20 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74   the buffer must
f730: 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20   be zero-filled 
f740: 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28  */.    memset(&(
f750: 28 63 68 61 72 2a 29 70 42 75 66 29 5b 6e 52 65  (char*)pBuf)[nRe
f760: 61 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52 65 61  ad], 0, amt-nRea
f770: 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  d);.    return S
f780: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
f790: 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 72  T_READ;.  }..  r
f7a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f7b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
f7c0: 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
f7d0: 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20  er into a file. 
f7e0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
f7f0: 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20  K on success.** 
f800: 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
f810: 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c  ror code on fail
f820: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
f830: 6e 74 20 77 69 6e 57 72 69 74 65 28 0a 20 20 73  nt winWrite(.  s
f840: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f860: 2a 20 46 69 6c 65 20 74 6f 20 77 72 69 74 65 20  * File to write 
f870: 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  into */.  const 
f880: 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
f890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
f8a0: 20 62 79 74 65 73 20 74 6f 20 62 65 20 77 72 69   bytes to be wri
f8b0: 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 6d  tten */.  int am
f8c0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
f8d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
f8e0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
f8f0: 77 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74  write */.  sqlit
f900: 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20  e3_int64 offset 
f910: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
f920: 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69  fset into the fi
f930: 6c 65 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74  le to begin writ
f940: 69 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20 69  ing at */.){.  i
f950: 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20  nt rc = 0;      
f960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f970: 2a 20 54 72 75 65 20 69 66 20 65 72 72 6f 72 20  * True if error 
f980: 68 61 73 20 6f 63 63 75 72 65 64 2c 20 65 6c 73  has occured, els
f990: 65 20 66 61 6c 73 65 20 2a 2f 0a 20 20 77 69 6e  e false */.  win
f9a0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
f9b0: 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20  inFile*)id;  /* 
f9c0: 46 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  File handle */. 
f9d0: 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b   int nRetry = 0;
f9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
fa00: 74 72 69 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65  tries */..  asse
fa10: 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61  rt( amt>0 );.  a
fa20: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
fa30: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
fa40: 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
fa50: 49 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a 20 20  IOERR_WRITE);.  
fa60: 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
fa70: 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
fa80: 49 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53  ITE_FULL);..  OS
fa90: 54 52 41 43 45 28 28 22 57 52 49 54 45 20 25 64  TRACE(("WRITE %d
faa0: 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69   lock=%d\n", pFi
fab0: 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
fac0: 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 53  cktype));..#if S
fad0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
fae0: 20 72 63 20 3d 20 73 65 65 6b 57 69 6e 46 69 6c   rc = seekWinFil
faf0: 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 29  e(pFile, offset)
fb00: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
fb10: 0a 23 65 6c 73 65 0a 20 20 7b 0a 23 65 6e 64 69  .#else.  {.#endi
fb20: 66 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  f.#if !SQLITE_OS
fb30: 5f 57 49 4e 43 45 0a 20 20 20 20 4f 56 45 52 4c  _WINCE.    OVERL
fb40: 41 50 50 45 44 20 6f 76 65 72 6c 61 70 70 65 64  APPED overlapped
fb50: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
fb60: 6f 66 66 73 65 74 20 66 6f 72 20 57 72 69 74 65  offset for Write
fb70: 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  File. */.#endif.
fb80: 20 20 20 20 75 38 20 2a 61 52 65 6d 20 3d 20 28      u8 *aRem = (
fb90: 75 38 20 2a 29 70 42 75 66 3b 20 20 20 20 20 20  u8 *)pBuf;      
fba0: 20 20 2f 2a 20 44 61 74 61 20 79 65 74 20 74 6f    /* Data yet to
fbb0: 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20   be written */. 
fbc0: 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 61 6d     int nRem = am
fbd0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
fbe0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
fbf0: 74 65 73 20 79 65 74 20 74 6f 20 62 65 20 77 72  tes yet to be wr
fc00: 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 44 57 4f  itten */.    DWO
fc10: 52 44 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20  RD nWrite;      
fc20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
fc30: 74 65 73 20 77 72 69 74 74 65 6e 20 62 79 20 65  tes written by e
fc40: 61 63 68 20 57 72 69 74 65 46 69 6c 65 28 29 20  ach WriteFile() 
fc50: 63 61 6c 6c 20 2a 2f 0a 20 20 20 20 44 57 4f 52  call */.    DWOR
fc60: 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f  D lastErrno = NO
fc70: 5f 45 52 52 4f 52 3b 20 20 20 2f 2a 20 56 61 6c  _ERROR;   /* Val
fc80: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 47  ue returned by G
fc90: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 2a 2f  etLastError() */
fca0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
fcb0: 5f 57 49 4e 43 45 0a 20 20 20 20 6d 65 6d 73 65  _WINCE.    memse
fcc0: 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c 20 30  t(&overlapped, 0
fcd0: 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50  , sizeof(OVERLAP
fce0: 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 65 72 6c  PED));.    overl
fcf0: 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28  apped.Offset = (
fd00: 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30  LONG)(offset & 0
fd10: 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20  xffffffff);.    
fd20: 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
fd30: 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28  tHigh = (LONG)((
fd40: 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  offset>>32) & 0x
fd50: 37 66 66 66 66 66 66 66 29 3b 0a 23 65 6e 64 69  7fffffff);.#endi
fd60: 66 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 52  f..    while( nR
fd70: 65 6d 3e 30 20 29 7b 0a 23 69 66 20 53 51 4c 49  em>0 ){.#if SQLI
fd80: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  TE_OS_WINCE.    
fd90: 20 20 69 66 28 20 21 6f 73 57 72 69 74 65 46 69    if( !osWriteFi
fda0: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65  le(pFile->h, aRe
fdb0: 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65  m, nRem, &nWrite
fdc0: 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20  , 0) ){.#else.  
fdd0: 20 20 20 20 69 66 28 20 21 6f 73 57 72 69 74 65      if( !osWrite
fde0: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61  File(pFile->h, a
fdf0: 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69  Rem, nRem, &nWri
fe00: 74 65 2c 20 26 6f 76 65 72 6c 61 70 70 65 64 29  te, &overlapped)
fe10: 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   ){.#endif.     
fe20: 20 20 20 69 66 28 20 72 65 74 72 79 49 6f 65 72     if( retryIoer
fe30: 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74  r(&nRetry, &last
fe40: 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75  Errno) ) continu
fe50: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
fe60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fe70: 69 66 28 20 6e 57 72 69 74 65 3c 3d 30 20 29 7b  if( nWrite<=0 ){
fe80: 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72  .        lastErr
fe90: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
fea0: 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 62  ror();.        b
feb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69  reak;.      }.#i
fec0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
fed0: 43 45 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  CE.      offset 
fee0: 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20  += nWrite;.     
fef0: 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73   overlapped.Offs
ff00: 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73  et = (LONG)(offs
ff10: 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29  et & 0xffffffff)
ff20: 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70  ;.      overlapp
ff30: 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20  ed.OffsetHigh = 
ff40: 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e  (LONG)((offset>>
ff50: 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66  32) & 0x7fffffff
ff60: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
ff70: 61 52 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b 0a  aRem += nWrite;.
ff80: 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 57        nRem -= nW
ff90: 72 69 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rite;.    }.    
ffa0: 69 66 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20  if( nRem>0 ){.  
ffb0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
ffc0: 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
ffd0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
ffe0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
fff0: 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 20   rc ){.    if(  
10000 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   ( pFile->lastEr
10010 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 4c  rno==ERROR_HANDL
10020 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20 20  E_DISK_FULL ).  
10030 20 20 20 20 20 7c 7c 20 28 20 70 46 69 6c 65 2d       || ( pFile-
10040 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f  >lastErrno==ERRO
10050 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a  R_DISK_FULL )){.
10060 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
10070 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a  ITE_FULL;.    }.
10080 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
10090 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
100a0 45 52 52 5f 57 52 49 54 45 2c 20 70 46 69 6c 65  ERR_WRITE, pFile
100b0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
100c0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 57 72            "winWr
100d0 69 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ite", pFile->zPa
100e0 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  th);.  }else{.  
100f0 20 20 6c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72    logIoerr(nRetr
10100 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  y);.  }.  return
10110 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
10120 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e  *.** Truncate an
10130 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20   open file to a 
10140 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a  specified size.*
10150 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
10160 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33  Truncate(sqlite3
10170 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74  _file *id, sqlit
10180 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b  e3_int64 nByte){
10190 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
101a0 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
101b0 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c  ;  /* File handl
101c0 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  e object */.  in
101d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
101e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
101f0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 6f 72   Return code for
10200 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
10210 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  /..  assert( pFi
10220 6c 65 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  le );..  OSTRACE
10230 28 28 22 54 52 55 4e 43 41 54 45 20 25 64 20 25  (("TRUNCATE %d %
10240 6c 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  lld\n", pFile->h
10250 2c 20 6e 42 79 74 65 29 29 3b 0a 20 20 53 69 6d  , nByte));.  Sim
10260 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
10270 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
10280 5f 54 52 55 4e 43 41 54 45 29 3b 0a 0a 20 20 2f  _TRUNCATE);..  /
10290 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61  * If the user ha
102a0 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63  s configured a c
102b0 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68  hunk-size for th
102c0 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74  is file, truncat
102d0 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20  e the.  ** file 
102e0 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69  so that it consi
102f0 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65  sts of an intege
10300 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e  r number of chun
10310 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a  ks (i.e. the.  *
10320 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69  * actual file si
10330 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f 70 65  ze after the ope
10340 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61  ration may be la
10350 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  rger than the re
10360 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a  quested.  ** siz
10370 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  e)..  */.  if( p
10380 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20  File->szChunk>0 
10390 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28  ){.    nByte = (
103a0 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e  (nByte + pFile->
103b0 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69  szChunk - 1)/pFi
103c0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70  le->szChunk) * p
103d0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20  File->szChunk;. 
103e0 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 45 6e 64 4f   }..  /* SetEndO
103f0 66 46 69 6c 65 28 29 20 72 65 74 75 72 6e 73 20  fFile() returns 
10400 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 73 75  non-zero when su
10410 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 7a 65 72  ccessful, or zer
10420 6f 20 77 68 65 6e 20 69 74 20 66 61 69 6c 73 2e  o when it fails.
10430 20 2a 2f 0a 20 20 69 66 28 20 73 65 65 6b 57 69   */.  if( seekWi
10440 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79  nFile(pFile, nBy
10450 74 65 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  te) ){.    rc = 
10460 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
10470 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
10480 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  E, pFile->lastEr
10490 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
104a0 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65 31 22    "winTruncate1"
104b0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
104c0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d  .  }else if( 0==
104d0 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 70  osSetEndOfFile(p
104e0 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20 20 20  File->h) ){.    
104f0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
10500 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
10510 72 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69  r();.    rc = wi
10520 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
10530 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c  _IOERR_TRUNCATE,
10540 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
10550 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
10560 22 77 69 6e 54 72 75 6e 63 61 74 65 32 22 2c 20  "winTruncate2", 
10570 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
10580 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
10590 54 52 55 4e 43 41 54 45 20 25 64 20 25 6c 6c 64  TRUNCATE %d %lld
105a0 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %s\n", pFile->h
105b0 2c 20 6e 42 79 74 65 2c 20 72 63 20 3f 20 22 66  , nByte, rc ? "f
105c0 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b  ailed" : "ok"));
105d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
105e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
105f0 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  EST./*.** Count 
10600 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75  the number of fu
10610 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d  llsyncs and norm
10620 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20  al syncs.  This 
10630 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a  is used to test.
10640 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e  ** that syncs an
10650 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20  d fullsyncs are 
10660 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68 65 20  occuring at the 
10670 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a  right times..*/.
10680 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  int sqlite3_sync
10690 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20  _count = 0;.int 
106a0 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
106b0 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
106c0 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  if../*.** Make s
106d0 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74  ure all writes t
106e0 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66  o a particular f
106f0 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65  ile are committe
10700 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74  d to disk..*/.st
10710 61 74 69 63 20 69 6e 74 20 77 69 6e 53 79 6e 63  atic int winSync
10720 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
10730 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 23  d, int flags){.#
10740 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  ifndef SQLITE_NO
10750 5f 53 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a 20  _SYNC.  /*.  ** 
10760 55 73 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 53  Used only when S
10770 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73  QLITE_NO_SYNC is
10780 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e 0a 20 20   not defined..  
10790 20 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a 23   */.  BOOL rc;.#
107a0 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
107b0 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 21 64  ed(NDEBUG) || !d
107c0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f  efined(SQLITE_NO
107d0 5f 53 59 4e 43 29 20 7c 7c 20 5c 0a 20 20 20 20  _SYNC) || \.    
107e0 28 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  (defined(SQLITE_
107f0 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65 64  TEST) && defined
10800 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 29 0a  (SQLITE_DEBUG)).
10810 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20 77    /*.  ** Used w
10820 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  hen SQLITE_NO_SY
10830 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  NC is not define
10840 64 20 61 6e 64 20 62 79 20 74 68 65 20 61 73 73  d and by the ass
10850 65 72 74 28 29 20 61 6e 64 2f 6f 72 0a 20 20 2a  ert() and/or.  *
10860 2a 20 4f 53 54 52 41 43 45 28 29 20 6d 61 63 72  * OSTRACE() macr
10870 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20 77 69 6e 46  os..   */.  winF
10880 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
10890 6e 46 69 6c 65 2a 29 69 64 3b 0a 23 65 6c 73 65  nFile*)id;.#else
108a0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
108b0 54 45 52 28 69 64 29 3b 0a 23 65 6e 64 69 66 0a  TER(id);.#endif.
108c0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
108d0 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   );.  /* Check t
108e0 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54  hat one of SQLIT
108f0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  E_SYNC_NORMAL or
10900 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64   FULL was passed
10910 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c   */.  assert((fl
10920 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
10930 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20  E_SYNC_NORMAL.  
10940 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78      || (flags&0x
10950 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
10960 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 4f 53  _FULL.  );..  OS
10970 54 52 41 43 45 28 28 22 53 59 4e 43 20 25 64 20  TRACE(("SYNC %d 
10980 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c  lock=%d\n", pFil
10990 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
109a0 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 55  ktype));..  /* U
109b0 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20  nix cannot, but 
109c0 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79  some systems may
109d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
109e0 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54  ULL from here. T
109f0 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73  his.  ** line is
10a00 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f   to test that do
10a10 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20  ing so does not 
10a20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65  cause any proble
10a30 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ms..  */.  Simul
10a40 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
10a50 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
10a60 46 55 4c 4c 20 29 3b 0a 0a 23 69 66 6e 64 65 66  FULL );..#ifndef
10a70 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 55   SQLITE_TEST.  U
10a80 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
10a90 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65 0a 20 20  flags);.#else.  
10aa0 69 66 28 20 28 66 6c 61 67 73 26 30 78 30 46 29  if( (flags&0x0F)
10ab0 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
10ac0 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  LL ){.    sqlite
10ad0 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
10ae0 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ++;.  }.  sqlite
10af0 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  3_sync_count++;.
10b00 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
10b10 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  we compiled with
10b20 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   the SQLITE_NO_S
10b30 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73  YNC flag, then s
10b40 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a  yncing is a.  **
10b50 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64   no-op.  */.#ifd
10b60 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
10b70 43 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  C.  return SQLIT
10b80 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 72 63  E_OK;.#else.  rc
10b90 20 3d 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75   = osFlushFileBu
10ba0 66 66 65 72 73 28 70 46 69 6c 65 2d 3e 68 29 3b  ffers(pFile->h);
10bb0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
10bc0 6f 72 28 20 72 63 3d 46 41 4c 53 45 20 29 3b 0a  or( rc=FALSE );.
10bd0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
10be0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10bf0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
10c00 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
10c10 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
10c20 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  ();.    return w
10c30 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
10c40 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 70  E_IOERR_FSYNC, p
10c50 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
10c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77  .             "w
10c70 69 6e 53 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e  inSync", pFile->
10c80 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 65 6e 64  zPath);.  }.#end
10c90 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  if.}../*.** Dete
10ca0 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e  rmine the curren
10cb0 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65  t size of a file
10cc0 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61   in bytes.*/.sta
10cd0 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 53  tic int winFileS
10ce0 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
10cf0 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e   *id, sqlite3_in
10d00 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 77  t64 *pSize){.  w
10d10 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
10d20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
10d30 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
10d40 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  OK;..  assert( i
10d50 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61  d!=0 );.  Simula
10d60 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
10d70 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
10d80 54 41 54 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  TAT);.#if SQLITE
10d90 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a 20 20  _OS_WINRT.  {.  
10da0 20 20 46 49 4c 45 5f 53 54 41 4e 44 41 52 44 5f    FILE_STANDARD_
10db0 49 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20 20 20 69  INFO info;.    i
10dc0 66 28 20 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f  f( osGetFileInfo
10dd0 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45  rmationByHandleE
10de0 78 28 70 46 69 6c 65 2d 3e 68 2c 20 46 69 6c 65  x(pFile->h, File
10df0 53 74 61 6e 64 61 72 64 49 6e 66 6f 2c 0a 20 20  StandardInfo,.  
10e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e20 20 20 20 26 69 6e 66 6f 2c 20 73 69 7a 65 6f 66     &info, sizeof
10e30 28 69 6e 66 6f 29 29 20 29 7b 0a 20 20 20 20 20  (info)) ){.     
10e40 20 2a 70 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 45   *pSize = info.E
10e50 6e 64 4f 66 46 69 6c 65 2e 51 75 61 64 50 61 72  ndOfFile.QuadPar
10e60 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
10e70 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
10e80 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
10e90 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72  Error();.      r
10ea0 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
10eb0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
10ec0 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  AT, pFile->lastE
10ed0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
10ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
10ef0 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c  nFileSize", pFil
10f00 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
10f10 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a 20  .  }.#else.  {. 
10f20 20 20 20 44 57 4f 52 44 20 75 70 70 65 72 42 69     DWORD upperBi
10f30 74 73 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c 6f  ts;.    DWORD lo
10f40 77 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f  werBits;.    DWO
10f50 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20  RD lastErrno;.. 
10f60 20 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 6f     lowerBits = o
10f70 73 47 65 74 46 69 6c 65 53 69 7a 65 28 70 46 69  sGetFileSize(pFi
10f80 6c 65 2d 3e 68 2c 20 26 75 70 70 65 72 42 69 74  le->h, &upperBit
10f90 73 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d  s);.    *pSize =
10fa0 20 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   (((sqlite3_int6
10fb0 34 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33 32  4)upperBits)<<32
10fc0 29 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20  ) + lowerBits;. 
10fd0 20 20 20 69 66 28 20 20 20 28 6c 6f 77 65 72 42     if(   (lowerB
10fe0 69 74 73 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46  its == INVALID_F
10ff0 49 4c 45 5f 53 49 5a 45 29 0a 20 20 20 20 20 20  ILE_SIZE).      
11000 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20   && ((lastErrno 
11010 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
11020 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 20 29  ())!=NO_ERROR) )
11030 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
11040 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
11050 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
11060 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
11070 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c  ITE_IOERR_FSTAT,
11080 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
11090 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
110a0 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70  "winFileSize", p
110b0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
110c0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
110d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
110e0 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  *.** LOCKFILE_FA
110f0 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 69  IL_IMMEDIATELY i
11100 73 20 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73  s undefined on s
11110 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73 79 73 74  ome Windows syst
11120 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ems..*/.#ifndef 
11130 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
11140 4d 45 44 49 41 54 45 4c 59 0a 23 20 64 65 66 69  MEDIATELY.# defi
11150 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ne LOCKFILE_FAIL
11160 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a 23  _IMMEDIATELY 1.#
11170 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4c  endif..#ifndef L
11180 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56  OCKFILE_EXCLUSIV
11190 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20  E_LOCK.# define 
111a0 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49  LOCKFILE_EXCLUSI
111b0 56 45 5f 4c 4f 43 4b 20 32 0a 23 65 6e 64 69 66  VE_LOCK 2.#endif
111c0 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74 6f 72 69 63  ../*.** Historic
111d0 61 6c 6c 79 2c 20 53 51 4c 69 74 65 20 68 61 73  ally, SQLite has
111e0 20 75 73 65 64 20 62 6f 74 68 20 74 68 65 20 4c   used both the L
111f0 6f 63 6b 46 69 6c 65 20 61 6e 64 20 4c 6f 63 6b  ockFile and Lock
11200 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 73  FileEx functions
11210 2e 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 4c 6f  ..** When the Lo
11220 63 6b 46 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20  ckFile function 
11230 77 61 73 20 75 73 65 64 2c 20 69 74 20 77 61 73  was used, it was
11240 20 61 6c 77 61 79 73 20 65 78 70 65 63 74 65 64   always expected
11250 20 74 6f 20 66 61 69 6c 0a 2a 2a 20 69 6d 6d 65   to fail.** imme
11260 64 69 61 74 65 6c 79 20 69 66 20 74 68 65 20 6c  diately if the l
11270 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ock could not be
11280 20 6f 62 74 61 69 6e 65 64 2e 20 20 41 6c 73 6f   obtained.  Also
11290 2c 20 69 74 20 61 6c 77 61 79 73 20 65 78 70 65  , it always expe
112a0 63 74 65 64 20 74 6f 0a 2a 2a 20 6f 62 74 61 69  cted to.** obtai
112b0 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  n an exclusive l
112c0 6f 63 6b 2e 20 20 54 68 65 73 65 20 66 6c 61 67  ock.  These flag
112d0 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 20  s are used with 
112e0 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66  the LockFileEx f
112f0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72  unction.** and r
11300 65 66 6c 65 63 74 20 74 68 6f 73 65 20 65 78 70  eflect those exp
11310 65 63 74 61 74 69 6f 6e 73 3b 20 74 68 65 72 65  ectations; there
11320 66 6f 72 65 2c 20 74 68 65 79 20 73 68 6f 75 6c  fore, they shoul
11330 64 20 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64  d not be changed
11340 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
11350 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41  ITE_LOCKFILE_FLA
11360 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  GS.# define SQLI
11370 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
11380 53 20 20 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41  S   (LOCKFILE_FA
11390 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 7c  IL_IMMEDIATELY |
113a0 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
113b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113c0 20 20 20 20 20 4c 4f 43 4b 46 49 4c 45 5f 45 58       LOCKFILE_EX
113d0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 23 65  CLUSIVE_LOCK).#e
113e0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 72  ndif../*.** Curr
113f0 65 6e 74 6c 79 2c 20 53 51 4c 69 74 65 20 6e 65  ently, SQLite ne
11400 76 65 72 20 63 61 6c 6c 73 20 74 68 65 20 4c 6f  ver calls the Lo
11410 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f  ckFileEx functio
11420 6e 20 77 69 74 68 6f 75 74 20 77 61 6e 74 69 6e  n without wantin
11430 67 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f  g the.** call to
11440 20 66 61 69 6c 20 69 6d 6d 65 64 69 61 74 65 6c   fail immediatel
11450 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 61  y if the lock ca
11460 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64  nnot be obtained
11470 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
11480 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46  ITE_LOCKFILEEX_F
11490 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51  LAGS.# define SQ
114a0 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f  LITE_LOCKFILEEX_
114b0 46 4c 41 47 53 20 28 4c 4f 43 4b 46 49 4c 45 5f  FLAGS (LOCKFILE_
114c0 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
114d0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
114e0 41 63 71 75 69 72 65 20 61 20 72 65 61 64 65 72  Acquire a reader
114f0 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72   lock..** Differ
11500 65 6e 74 20 41 50 49 20 72 6f 75 74 69 6e 65 73  ent API routines
11510 20 61 72 65 20 63 61 6c 6c 65 64 20 64 65 70 65   are called depe
11520 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
11530 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20   or not this.** 
11540 69 73 20 57 69 6e 39 78 20 6f 72 20 57 69 6e 4e  is Win9x or WinN
11550 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T..*/.static int
11560 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 77 69 6e   getReadLock(win
11570 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
11580 69 6e 74 20 72 65 73 3b 0a 20 20 69 66 28 20 69  int res;.  if( i
11590 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c  sNT() ){.#if SQL
115a0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20  ITE_OS_WINCE.   
115b0 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a   /*.    ** NOTE:
115c0 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68   Windows CE is h
115d0 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74  andled different
115e0 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73 20  ly here due its 
115f0 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33  lack of the Win3
11600 32 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41  2.    **       A
11610 50 49 20 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a 20  PI LockFileEx.. 
11620 20 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20     */.    res = 
11630 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26 70  winceLockFile(&p
11640 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
11650 46 49 52 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b  FIRST, 0, 1, 0);
11660 0a 23 65 6c 73 65 0a 20 20 20 20 72 65 73 20 3d  .#else.    res =
11670 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
11680 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
11690 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c  OCKFILEEX_FLAGS,
116a0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
116b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
116c0 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53          SHARED_S
116d0 49 5a 45 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  IZE, 0);.#endif.
116e0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
116f0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
11700 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74  .  else{.    int
11710 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   lk;.    sqlite3
11720 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
11730 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20  of(lk), &lk);.  
11740 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c    pFile->sharedL
11750 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72 74  ockByte = (short
11760 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66  )((lk & 0x7fffff
11770 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45  ff)%(SHARED_SIZE
11780 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73 20   - 1));.    res 
11790 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
117a0 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
117b0 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a  LOCKFILE_FLAGS,.
117c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117d0 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52        SHARED_FIR
117e0 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  ST+pFile->shared
117f0 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20  LockByte, 0, 1, 
11800 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  0);.  }.#endif. 
11810 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29 7b   if( res == 0 ){
11820 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
11830 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
11840 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f 2a  tError();.    /*
11850 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67 20   No need to log 
11860 61 20 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f 63  a failure to loc
11870 6b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  k */.  }.  retur
11880 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
11890 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a  Undo a readlock.
118a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
118b0 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77 69 6e  lockReadLock(win
118c0 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
118d0 69 6e 74 20 72 65 73 3b 0a 20 20 44 57 4f 52 44  int res;.  DWORD
118e0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 69 66   lastErrno;.  if
118f0 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
11900 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46  res = winUnlockF
11910 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
11920 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20  HARED_FIRST, 0, 
11930 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
11940 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
11950 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
11960 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 72 65  I.  else{.    re
11970 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c  s = winUnlockFil
11980 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  e(&pFile->h, SHA
11990 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d  RED_FIRST+pFile-
119a0 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c  >sharedLockByte,
119b0 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23   0, 1, 0);.  }.#
119c0 65 6e 64 69 66 0a 20 20 69 66 28 20 72 65 73 3d  endif.  if( res=
119d0 3d 30 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e  =0 && ((lastErrn
119e0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
119f0 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 4e 4f 54  or())!=ERROR_NOT
11a00 5f 4c 4f 43 4b 45 44 29 20 29 7b 0a 20 20 20 20  _LOCKED) ){.    
11a10 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11a20 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
11a30 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
11a40 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
11a50 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  K, pFile->lastEr
11a60 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
11a70 20 20 22 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63    "unlockReadLoc
11a80 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  k", pFile->zPath
11a90 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
11aa0 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  res;.}../*.** Lo
11ab0 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
11ac0 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
11ad0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
11ae0 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a   locktype - one.
11af0 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
11b00 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
11b10 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
11b20 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
11b30 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
11b40 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
11b50 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
11b60 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
11b70 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
11b80 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
11b90 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
11ba0 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
11bb0 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
11bc0 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
11bd0 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
11be0 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
11bf0 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
11c00 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
11c10 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
11c20 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
11c30 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
11c40 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
11c50 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
11c60 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
11c70 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
11c80 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
11c90 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
11ca0 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
11cb0 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
11cc0 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
11cd0 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
11ce0 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
11cf0 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
11d00 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
11d10 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
11d20 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
11d30 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
11d40 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
11d50 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
11d60 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
11d70 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
11d80 61 20 6c 6f 63 6b 2e 20 20 54 68 65 20 77 69 6e  a lock.  The win
11d90 55 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65  Unlock() routine
11da0 0a 2a 2a 20 65 72 61 73 65 73 20 61 6c 6c 20 6c  .** erases all l
11db0 6f 63 6b 73 20 61 74 20 6f 6e 63 65 20 61 6e 64  ocks at once and
11dc0 20 72 65 74 75 72 6e 73 20 75 73 20 69 6d 6d 65   returns us imme
11dd0 64 69 61 74 65 6c 79 20 74 6f 20 6c 6f 63 6b 69  diately to locki
11de0 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20 49  ng level 0..** I
11df0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
11e00 65 20 74 6f 20 6c 6f 77 65 72 20 74 68 65 20 6c  e to lower the l
11e10 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 65  ocking level one
11e20 20 73 74 65 70 20 61 74 20 61 20 74 69 6d 65 2e   step at a time.
11e30 20 20 59 6f 75 0a 2a 2a 20 6d 75 73 74 20 67 6f    You.** must go
11e40 20 73 74 72 61 69 67 68 74 20 74 6f 20 6c 6f 63   straight to loc
11e50 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f  king level 0..*/
11e60 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c  .static int winL
11e70 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
11e80 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
11e90 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pe){.  int rc = 
11ea0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a  SQLITE_OK;    /*
11eb0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
11ec0 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f  m subroutines */
11ed0 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20  .  int res = 1; 
11ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
11ef0 75 6c 74 20 6f 66 20 61 20 57 69 6e 64 6f 77 73  ult of a Windows
11f00 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20   lock call */.  
11f10 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b  int newLocktype;
11f20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70 46         /* Set pF
11f30 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f  ile->locktype to
11f40 20 74 68 69 73 20 76 61 6c 75 65 20 62 65 66 6f   this value befo
11f50 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20  re exiting */.  
11f60 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f  int gotPendingLo
11f70 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69  ck = 0;/* True i
11f80 66 20 77 65 20 61 63 71 75 69 72 65 64 20 61 20  f we acquired a 
11f90 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69  PENDING lock thi
11fa0 73 20 74 69 6d 65 20 2a 2f 0a 20 20 77 69 6e 46  s time */.  winF
11fb0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
11fc0 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f  nFile*)id;.  DWO
11fd0 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e  RD lastErrno = N
11fe0 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73 73 65  O_ERROR;..  asse
11ff0 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f  rt( id!=0 );.  O
12000 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 64  STRACE(("LOCK %d
12010 20 25 64 20 77 61 73 20 25 64 28 25 64 29 5c 6e   %d was %d(%d)\n
12020 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
12030 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
12040 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
12050 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  e, pFile->shared
12060 4c 6f 63 6b 42 79 74 65 29 29 3b 0a 0a 20 20 2f  LockByte));..  /
12070 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
12080 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
12090 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
120a0 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
120b0 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65   the.  ** OsFile
120c0 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
120d0 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f  n't use the end_
120e0 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c  lock: exit path,
120f0 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   as.  ** sqlite3
12100 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  OsEnterMutex() h
12110 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
12120 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
12130 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
12140 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
12150 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12160 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
12170 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
12180 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
12190 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20   correct.  */.  
121a0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
121b0 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b  ocktype!=NO_LOCK
121c0 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   || locktype==SH
121d0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
121e0 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
121f0 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
12200 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
12210 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype!=RESERVED_LO
12220 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK || pFile->loc
12230 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
12240 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b  CK );..  /* Lock
12250 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   the PENDING_LOC
12260 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e 65 65  K byte if we nee
12270 64 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 50  d to acquire a P
12280 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20  ENDING lock or. 
12290 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63   ** a SHARED loc
122a0 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 63  k.  If we are ac
122b0 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
122c0 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69   lock, the acqui
122d0 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74  sition of.  ** t
122e0 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  he PENDING_LOCK 
122f0 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72  byte is temporar
12300 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63  y..  */.  newLoc
12310 6b 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c  ktype = pFile->l
12320 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 20  ocktype;.  if(  
12330 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
12340 65 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20  e==NO_LOCK).    
12350 20 7c 7c 20 28 20 20 20 28 6c 6f 63 6b 74 79 70   || (   (locktyp
12360 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
12370 4b 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  K).         && (
12380 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
12390 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 29  =RESERVED_LOCK))
123a0 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e  .  ){.    int cn
123b0 74 20 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c 65  t = 3;.    while
123c0 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65  ( cnt-->0 && (re
123d0 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  s = winLockFile(
123e0 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54  &pFile->h, SQLIT
123f0 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
12400 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12420 20 20 20 20 20 20 20 20 20 20 20 50 45 4e 44 49             PENDI
12430 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  NG_BYTE, 0, 1, 0
12440 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ))==0 ){.      /
12450 2a 20 54 72 79 20 33 20 74 69 6d 65 73 20 74 6f  * Try 3 times to
12460 20 67 65 74 20 74 68 65 20 70 65 6e 64 69 6e 67   get the pending
12470 20 6c 6f 63 6b 2e 20 20 54 68 69 73 20 69 73 20   lock.  This is 
12480 6e 65 65 64 65 64 20 74 6f 20 77 6f 72 6b 0a 20  needed to work. 
12490 20 20 20 20 20 2a 2a 20 61 72 6f 75 6e 64 20 70       ** around p
124a0 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62  roblems caused b
124b0 79 20 69 6e 64 65 78 69 6e 67 20 61 6e 64 2f 6f  y indexing and/o
124c0 72 20 61 6e 74 69 2d 76 69 72 75 73 20 73 6f 66  r anti-virus sof
124d0 74 77 61 72 65 20 6f 6e 0a 20 20 20 20 20 20 2a  tware on.      *
124e0 2a 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  * Windows system
124f0 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 79  s..      ** If y
12500 6f 75 20 61 72 65 20 75 73 69 6e 67 20 74 68 69  ou are using thi
12510 73 20 63 6f 64 65 20 61 73 20 61 20 6d 6f 64 65  s code as a mode
12520 6c 20 66 6f 72 20 61 6c 74 65 72 6e 61 74 69 76  l for alternativ
12530 65 20 56 46 53 65 73 2c 20 64 6f 20 6e 6f 74 0a  e VFSes, do not.
12540 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 74 68        ** copy th
12550 69 73 20 72 65 74 72 79 20 6c 6f 67 69 63 2e 20  is retry logic. 
12560 20 49 74 20 69 73 20 61 20 68 61 63 6b 20 69 6e   It is a hack in
12570 74 65 6e 64 65 64 20 66 6f 72 20 57 69 6e 64 6f  tended for Windo
12580 77 73 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a  ws only..      *
12590 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  /.      OSTRACE(
125a0 28 22 63 6f 75 6c 64 20 6e 6f 74 20 67 65 74 20  ("could not get 
125b0 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 20  a PENDING lock. 
125c0 63 6e 74 3d 25 64 5c 6e 22 2c 20 63 6e 74 29 29  cnt=%d\n", cnt))
125d0 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 20  ;.      if( cnt 
125e0 29 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  ) sqlite3_win32_
125f0 73 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a  sleep(1);.    }.
12600 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f      gotPendingLo
12610 63 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20 69 66  ck = res;.    if
12620 28 20 21 72 65 73 20 29 7b 0a 20 20 20 20 20 20  ( !res ){.      
12630 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
12640 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
12650 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63    }.  }..  /* Ac
12660 71 75 69 72 65 20 61 20 73 68 61 72 65 64 20 6c  quire a shared l
12670 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
12680 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
12690 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
126a0 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
126b0 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ->locktype==NO_L
126c0 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  OCK );.    res =
126d0 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69   getReadLock(pFi
126e0 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  le);.    if( res
126f0 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
12700 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c  ktype = SHARED_L
12710 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
12720 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
12730 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
12740 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ();.    }.  }.. 
12750 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45   /* Acquire a RE
12760 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f  SERVED lock.  */
12770 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
12780 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26  =RESERVED_LOCK &
12790 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73  & res ){.    ass
127a0 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
127b0 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
127c0 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77  K );.    res = w
127d0 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
127e0 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
127f0 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52 45 53  KFILE_FLAGS, RES
12800 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31  ERVED_BYTE, 0, 1
12810 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65  , 0);.    if( re
12820 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
12830 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56 45  cktype = RESERVE
12840 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  D_LOCK;.    }els
12850 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72  e{.      lastErr
12860 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
12870 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ror();.    }.  }
12880 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61  ..  /* Acquire a
12890 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20   PENDING lock.  
128a0 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
128b0 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
128c0 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
128d0 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45  newLocktype = PE
128e0 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20  NDING_LOCK;.    
128f0 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d  gotPendingLock =
12900 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63   0;.  }..  /* Ac
12910 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49  quire an EXCLUSI
12920 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  VE lock.  */.  i
12930 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
12940 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72  LUSIVE_LOCK && r
12950 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
12960 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
12970 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e>=SHARED_LOCK )
12980 3b 0a 20 20 20 20 72 65 73 20 3d 20 75 6e 6c 6f  ;.    res = unlo
12990 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  ckReadLock(pFile
129a0 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
129b0 22 75 6e 72 65 61 64 6c 6f 63 6b 20 3d 20 25 64  "unreadlock = %d
129c0 5c 6e 22 2c 20 72 65 73 29 29 3b 0a 20 20 20 20  \n", res));.    
129d0 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c  res = winLockFil
129e0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
129f0 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41  ITE_LOCKFILE_FLA
12a00 47 53 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  GS, SHARED_FIRST
12a10 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
12a20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
12a30 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20  D_SIZE, 0);.    
12a40 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
12a50 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45   newLocktype = E
12a60 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20  XCLUSIVE_LOCK;. 
12a70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12a80 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
12a90 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
12aa0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 65 72      OSTRACE(("er
12ab0 72 6f 72 2d 63 6f 64 65 20 3d 20 25 64 5c 6e 22  ror-code = %d\n"
12ac0 2c 20 6c 61 73 74 45 72 72 6e 6f 29 29 3b 0a 20  , lastErrno));. 
12ad0 20 20 20 20 20 67 65 74 52 65 61 64 4c 6f 63 6b       getReadLock
12ae0 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
12af0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61   }..  /* If we a
12b00 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e  re holding a PEN
12b10 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f  DING lock that o
12b20 75 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61  ught to be relea
12b30 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72  sed, then.  ** r
12b40 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20  elease it now.. 
12b50 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e   */.  if( gotPen
12b60 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b  dingLock && lock
12b70 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
12b80 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f  K ){.    winUnlo
12b90 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
12ba0 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
12bb0 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  0, 1, 0);.  }.. 
12bc0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 73   /* Update the s
12bd0 74 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b  tate of the lock
12be0 20 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65   has held in the
12bf0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
12c00 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72   then.  ** retur
12c10 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
12c20 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20  e result code.. 
12c30 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 29 7b   */.  if( res ){
12c40 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
12c50 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
12c60 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
12c70 20 46 41 49 4c 45 44 20 25 64 20 74 72 79 69 6e   FAILED %d tryin
12c80 67 20 66 6f 72 20 25 64 20 62 75 74 20 67 6f 74  g for %d but got
12c90 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %d\n", pFile->h
12ca0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63  ,.           loc
12cb0 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79  ktype, newLockty
12cc0 70 65 29 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  pe));.    pFile-
12cd0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
12ce0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d  tErrno;.    rc =
12cf0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
12d00 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  }.  pFile->lockt
12d10 79 70 65 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63  ype = (u8)newLoc
12d20 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20  ktype;.  return 
12d30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
12d40 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
12d50 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
12d60 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
12d70 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
12d80 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
12d90 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
12da0 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
12db0 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
12dc0 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
12dd0 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 7a  ero, otherwise z
12de0 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
12df0 6e 74 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72  nt winCheckReser
12e00 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
12e10 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
12e20 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
12e30 63 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  c;.  winFile *pF
12e40 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
12e50 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
12e60 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
12e70 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
12e80 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
12e90 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ;..  assert( id!
12ea0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  =0 );.  if( pFil
12eb0 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53  e->locktype>=RES
12ec0 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
12ed0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 4f 53    rc = 1;.    OS
12ee0 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
12ef0 4c 4f 43 4b 20 25 64 20 25 64 20 28 6c 6f 63 61  LOCK %d %d (loca
12f00 6c 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  l)\n", pFile->h,
12f10 20 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   rc));.  }else{.
12f20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b      rc = winLock
12f30 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
12f40 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f  SQLITE_LOCKFILE_
12f50 46 4c 41 47 53 2c 20 52 45 53 45 52 56 45 44 5f  FLAGS, RESERVED_
12f60 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
12f70 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
12f80 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c      winUnlockFil
12f90 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53  e(&pFile->h, RES
12fa0 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31  ERVED_BYTE, 0, 1
12fb0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
12fc0 72 63 20 3d 20 21 72 63 3b 0a 20 20 20 20 4f 53  rc = !rc;.    OS
12fd0 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
12fe0 4c 4f 43 4b 20 25 64 20 25 64 20 28 72 65 6d 6f  LOCK %d %d (remo
12ff0 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  te)\n", pFile->h
13000 2c 20 72 63 29 29 3b 0a 20 20 7d 0a 20 20 2a 70  , rc));.  }.  *p
13010 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 72  ResOut = rc;.  r
13020 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13030 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
13040 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
13050 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
13060 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74  ptor id to lockt
13070 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a  ype.  locktype.*
13080 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
13090 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
130a0 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
130b0 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
130c0 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
130d0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
130e0 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
130f0 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
13100 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
13110 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
13120 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
13130 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
13140 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75  ble for this rou
13150 74 69 6e 65 20 74 6f 20 66 61 69 6c 20 69 66 20  tine to fail if 
13160 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
13170 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43  ent.** is NO_LOC
13180 4b 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  K.  If the secon
13190 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 48  d argument is SH
131a0 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74  ARED_LOCK then t
131b0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d  his routine.** m
131c0 69 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49  ight return SQLI
131d0 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61  TE_IOERR;.*/.sta
131e0 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63  tic int winUnloc
131f0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
13200 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
13210 29 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20  ){.  int type;. 
13220 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
13230 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
13240 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13250 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
13260 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73  pFile!=0 );.  as
13270 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d  sert( locktype<=
13280 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
13290 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
132a0 4b 20 25 64 20 74 6f 20 25 64 20 77 61 73 20 25  K %d to %d was %
132b0 64 28 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  d(%d)\n", pFile-
132c0 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20  >h, locktype,.  
132d0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
132e0 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e  ocktype, pFile->
132f0 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 29 29  sharedLockByte))
13300 3b 0a 20 20 74 79 70 65 20 3d 20 70 46 69 6c 65  ;.  type = pFile
13310 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66  ->locktype;.  if
13320 28 20 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56  ( type>=EXCLUSIV
13330 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69  E_LOCK ){.    wi
13340 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
13350 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
13360 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53  RST, 0, SHARED_S
13370 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  IZE, 0);.    if(
13380 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
13390 44 5f 4c 4f 43 4b 20 26 26 20 21 67 65 74 52 65  D_LOCK && !getRe
133a0 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 20 29 7b  adLock(pFile) ){
133b0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73  .      /* This s
133c0 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70  hould never happ
133d0 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c 64 20 61  en.  We should a
133e0 6c 77 61 79 73 20 62 65 20 61 62 6c 65 20 74 6f  lways be able to
133f0 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 63 71 75  .      ** reacqu
13400 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
13410 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  k */.      rc = 
13420 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
13430 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c  TE_IOERR_UNLOCK,
13440 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
13450 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
13460 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70    "winUnlock", p
13470 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
13480 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74 79    }.  }.  if( ty
13490 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe>=RESERVED_LOC
134a0 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f  K ){.    winUnlo
134b0 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
134c0 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
134d0 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 1, 0);.  }. 
134e0 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e   if( locktype==N
134f0 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d  O_LOCK && type>=
13500 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
13510 20 20 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63     unlockReadLoc
13520 6b 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20  k(pFile);.  }.  
13530 69 66 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e  if( type>=PENDIN
13540 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69  G_LOCK ){.    wi
13550 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
13560 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42  le->h, PENDING_B
13570 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
13580 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   }.  pFile->lock
13590 74 79 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74  type = (u8)lockt
135a0 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ype;.  return rc
135b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70  ;.}../*.** If *p
135c0 41 72 67 20 69 73 20 69 6e 69 74 69 74 69 61 6c  Arg is inititial
135d0 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e  ly negative then
135e0 20 74 68 69 73 20 69 73 20 61 20 71 75 65 72 79   this is a query
135f0 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a  .  Set *pArg to.
13600 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64  ** 1 or 0 depend
13610 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
13620 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f  r not bit mask o
13630 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  f pFile->ctrlFla
13640 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a  gs is set..**.**
13650 20 49 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f   If *pArg is 0 o
13660 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20  r 1, then clear 
13670 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20  or set the mask 
13680 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74  bit of pFile->ct
13690 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74  rlFlags..*/.stat
136a0 69 63 20 76 6f 69 64 20 77 69 6e 4d 6f 64 65 42  ic void winModeB
136b0 69 74 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  it(winFile *pFil
136c0 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
136d0 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67   mask, int *pArg
136e0 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30  ){.  if( *pArg<0
136f0 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20   ){.    *pArg = 
13700 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67  (pFile->ctrlFlag
13710 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20  s & mask)!=0;.  
13720 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67  }else if( (*pArg
13730 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  )==0 ){.    pFil
13740 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20  e->ctrlFlags &= 
13750 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ~mask;.  }else{.
13760 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
13770 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  lags |= mask;.  
13780 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72  }.}../*.** Contr
13790 6f 6c 20 61 6e 64 20 71 75 65 72 79 20 6f 66 20  ol and query of 
137a0 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 68 61  the open file ha
137b0 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
137c0 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72  int winFileContr
137d0 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ol(sqlite3_file 
137e0 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69  *id, int op, voi
137f0 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 69 6e 46  d *pArg){.  winF
13800 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
13810 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69  nFile*)id;.  swi
13820 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
13830 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
13840 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20  _LOCKSTATE: {.  
13850 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
13860 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  = pFile->locktyp
13870 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e;.      return 
13880 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
13890 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
138a0 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20  _LAST_ERRNO: {. 
138b0 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
138c0 20 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e 6c   = (int)pFile->l
138d0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
138e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
138f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
13900 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48   SQLITE_FCNTL_CH
13910 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  UNK_SIZE: {.    
13920 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b    pFile->szChunk
13930 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b   = *(int *)pArg;
13940 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
13950 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
13960 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
13970 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20  CNTL_SIZE_HINT: 
13980 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69 6c  {.      if( pFil
13990 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a  e->szChunk>0 ){.
139a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
139b0 69 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a 20 20 20  int64 oldSz;.   
139c0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69       int rc = wi
139d0 6e 46 69 6c 65 53 69 7a 65 28 69 64 2c 20 26 6f  nFileSize(id, &o
139e0 6c 64 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69  ldSz);.        i
139f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13a00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
13a10 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 65 77 53  lite3_int64 newS
13a20 7a 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f 69 6e  z = *(sqlite3_in
13a30 74 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  t64*)pArg;.     
13a40 20 20 20 20 20 69 66 28 20 6e 65 77 53 7a 3e 6f       if( newSz>o
13a50 6c 64 53 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  ldSz ){.        
13a60 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
13a70 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
13a80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
13a90 69 6e 54 72 75 6e 63 61 74 65 28 69 64 2c 20 6e  inTruncate(id, n
13aa0 65 77 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 20  ewSz);.         
13ab0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
13ac0 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
13ad0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13ae0 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   }.        retur
13af0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
13b00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13b10 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
13b20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
13b30 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b  L_PERSIST_WAL: {
13b40 0a 20 20 20 20 20 20 69 6e 74 20 62 50 65 72 73  .      int bPers
13b50 69 73 74 20 3d 20 2a 28 69 6e 74 2a 29 70 41 72  ist = *(int*)pAr
13b60 67 3b 0a 20 20 20 20 20 20 69 66 28 20 62 50 65  g;.      if( bPe
13b70 72 73 69 73 74 3c 30 20 29 7b 0a 20 20 20 20 20  rsist<0 ){.     
13b80 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
13b90 20 70 46 69 6c 65 2d 3e 62 50 65 72 73 69 73 74   pFile->bPersist
13ba0 57 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Wal;.      }else
13bb0 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
13bc0 3e 62 50 65 72 73 69 73 74 57 61 6c 20 3d 20 62  >bPersistWal = b
13bd0 50 65 72 73 69 73 74 21 3d 30 3b 0a 20 20 20 20  Persist!=0;.    
13be0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
13bf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
13c00 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
13c10 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f  E_FCNTL_PERSIST_
13c20 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e  WAL: {.      win
13c30 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57  ModeBit(pFile, W
13c40 49 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57  INFILE_PERSIST_W
13c50 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b  AL, (int*)pArg);
13c60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
13c70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
13c80 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
13c90 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f  CNTL_POWERSAFE_O
13ca0 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20  VERWRITE: {.    
13cb0 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69    winModeBit(pFi
13cc0 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57  le, WINFILE_PSOW
13cd0 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20  , (int*)pArg);. 
13ce0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
13cf0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
13d00 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
13d10 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20  TL_VFSNAME: {.  
13d20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72      *(char**)pAr
13d30 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
13d40 6e 74 66 28 22 77 69 6e 33 32 22 29 3b 0a 20 20  ntf("win32");.  
13d50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13d60 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
13d70 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
13d80 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59  L_WIN32_AV_RETRY
13d90 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61  : {.      int *a
13da0 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20   = (int*)pArg;. 
13db0 20 20 20 20 20 69 66 28 20 61 5b 30 5d 3e 30 20       if( a[0]>0 
13dc0 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 33 32  ){.        win32
13dd0 49 6f 65 72 72 52 65 74 72 79 20 3d 20 61 5b 30  IoerrRetry = a[0
13de0 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ];.      }else{.
13df0 20 20 20 20 20 20 20 20 61 5b 30 5d 20 3d 20 77          a[0] = w
13e00 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 3b 0a  in32IoerrRetry;.
13e10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
13e20 28 20 61 5b 31 5d 3e 30 20 29 7b 0a 20 20 20 20  ( a[1]>0 ){.    
13e30 20 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52 65      win32IoerrRe
13e40 74 72 79 44 65 6c 61 79 20 3d 20 61 5b 31 5d 3b  tryDelay = a[1];
13e50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13e60 20 20 20 20 20 20 61 5b 31 5d 20 3d 20 77 69 6e        a[1] = win
13e70 33 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  32IoerrRetryDela
13e80 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  y;.      }.     
13e90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13ea0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
13eb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
13ec0 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  FOUND;.}../*.** 
13ed0 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f  Return the secto
13ee0 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  r size in bytes 
13ef0 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
13f00 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66  g block device f
13f10 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66  or.** the specif
13f20 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69  ied file. This i
13f30 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20  s almost always 
13f40 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d  512 bytes, but m
13f50 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20  ay be.** larger 
13f60 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73  for some devices
13f70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63  ..**.** SQLite c
13f80 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73  ode assumes this
13f90 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74   function cannot
13fa0 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61   fail. It also a
13fb0 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69  ssumes that.** i
13fc0 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20  f two files are 
13fd0 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73  created in the s
13fe0 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ame file-system 
13ff0 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a  directory (i.e..
14000 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e  ** a database an
14010 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  d its journal fi
14020 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63  le) that the sec
14030 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
14040 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72   the.** same for
14050 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63   both..*/.static
14060 20 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53 69   int winSectorSi
14070 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
14080 2a 69 64 29 7b 0a 20 20 28 76 6f 69 64 29 69 64  *id){.  (void)id
14090 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
140a0 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52  E_DEFAULT_SECTOR
140b0 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _SIZE;.}../*.** 
140c0 52 65 74 75 72 6e 20 61 20 76 65 63 74 6f 72 20  Return a vector 
140d0 6f 66 20 64 65 76 69 63 65 20 63 68 61 72 61 63  of device charac
140e0 74 65 72 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74  teristics..*/.st
140f0 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 76 69  atic int winDevi
14100 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
14110 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
14120 69 64 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  id){.  winFile *
14130 70 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  p = (winFile*)id
14140 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
14150 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41  E_IOCAP_UNDELETA
14160 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a  BLE_WHEN_OPEN |.
14170 20 20 20 20 20 20 20 20 20 28 28 70 2d 3e 63 74           ((p->ct
14180 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c  rlFlags & WINFIL
14190 45 5f 50 53 4f 57 29 3f 53 51 4c 49 54 45 5f 49  E_PSOW)?SQLITE_I
141a0 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
141b0 56 45 52 57 52 49 54 45 3a 30 29 3b 0a 7d 0a 0a  VERWRITE:0);.}..
141c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
141d0 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 20 0a 2a 2a 20  MIT_WAL../* .** 
141e0 57 69 6e 64 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c  Windows will onl
141f0 79 20 6c 65 74 20 79 6f 75 20 63 72 65 61 74 65  y let you create
14200 20 66 69 6c 65 20 76 69 65 77 20 6d 61 70 70 69   file view mappi
14210 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61  ngs.** on alloca
14220 74 69 6f 6e 20 73 69 7a 65 20 67 72 61 6e 75 6c  tion size granul
14230 61 72 69 74 79 20 62 6f 75 6e 64 61 72 69 65 73  arity boundaries
14240 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 73 71 6c 69  ..** During sqli
14250 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 65  te3_os_init() we
14260 20 64 6f 20 61 20 47 65 74 53 79 73 74 65 6d 49   do a GetSystemI
14270 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20 67 65 74 20  nfo().** to get 
14280 74 68 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20  the granularity 
14290 73 69 7a 65 2e 0a 2a 2f 0a 53 59 53 54 45 4d 5f  size..*/.SYSTEM_
142a0 49 4e 46 4f 20 77 69 6e 53 79 73 49 6e 66 6f 3b  INFO winSysInfo;
142b0 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66  ../*.** Helper f
142c0 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61  unctions to obta
142d0 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73  in and relinquis
142e0 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74  h the global mut
142f0 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61  ex. The.** globa
14300 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20  l mutex is used 
14310 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 77  to protect the w
14320 69 6e 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63  inLockInfo objec
14330 74 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74  ts used by .** t
14340 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66  his file, all of
14350 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 73 68   which may be sh
14360 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65  ared by multiple
14370 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20   threads..**.** 
14380 46 75 6e 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d  Function winShmM
14390 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73  utexHeld() is us
143a0 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  ed to assert() t
143b0 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  hat the global m
143c0 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64  utex .** is held
143d0 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20   when required. 
143e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
143f0 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61   only used as pa
14400 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a  rt of assert() .
14410 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65  ** statements. e
14420 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53  .g..**.**   winS
14430 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a  hmEnterMutex().*
14440 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 77 69  *     assert( wi
14450 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
14460 29 3b 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 4c 65  );.**   winShmLe
14470 61 76 65 4d 75 74 65 78 28 29 0a 2a 2f 0a 73 74  aveMutex().*/.st
14480 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d  atic void winShm
14490 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29  EnterMutex(void)
144a0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
144b0 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d  x_enter(sqlite3M
144c0 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
144d0 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
144e0 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63  STER));.}.static
144f0 20 76 6f 69 64 20 77 69 6e 53 68 6d 4c 65 61 76   void winShmLeav
14500 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20  eMutex(void){.  
14510 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
14520 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78  ave(sqlite3Mutex
14530 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
14540 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
14550 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c  ));.}.#ifdef SQL
14560 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
14570 20 69 6e 74 20 77 69 6e 53 68 6d 4d 75 74 65 78   int winShmMutex
14580 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72  Held(void) {.  r
14590 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75  eturn sqlite3_mu
145a0 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33  tex_held(sqlite3
145b0 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
145c0 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
145d0 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69  ASTER));.}.#endi
145e0 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20  f../*.** Object 
145f0 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
14600 74 20 61 20 73 69 6e 67 6c 65 20 66 69 6c 65 20  t a single file 
14610 6f 70 65 6e 65 64 20 61 6e 64 20 6d 6d 61 70 70  opened and mmapp
14620 65 64 20 74 6f 20 70 72 6f 76 69 64 65 0a 2a 2a  ed to provide.**
14630 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20   shared memory. 
14640 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74   When multiple t
14650 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72  hreads all refer
14660 65 6e 63 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a  ence the same.**
14670 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c 20 65 61   log-summary, ea
14680 63 68 20 74 68 72 65 61 64 20 68 61 73 20 69 74  ch thread has it
14690 73 20 6f 77 6e 20 77 69 6e 46 69 6c 65 20 6f 62  s own winFile ob
146a0 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79 20 61  ject, but they a
146b0 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61  ll.** point to a
146c0 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65   single instance
146d0 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 2e   of this object.
146e0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
146f0 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75  , each.** log-su
14700 6d 6d 61 72 79 20 69 73 20 6f 70 65 6e 65 64 20  mmary is opened 
14710 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72  only once per pr
14720 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e  ocess..**.** win
14730 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d  ShmMutexHeld() m
14740 75 73 74 20 62 65 20 74 72 75 65 20 77 68 65 6e  ust be true when
14750 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73   creating or des
14760 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20  troying.** this 
14770 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20  object or while 
14780 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
14790 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
147a0 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20   fields:.**.**  
147b0 20 20 20 20 6e 52 65 66 0a 2a 2a 20 20 20 20 20      nRef.**     
147c0 20 70 4e 65 78 74 20 0a 2a 2a 0a 2a 2a 20 54 68   pNext .**.** Th
147d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
147e0 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79  ds are read-only
147f0 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63   after the objec
14800 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a  t is created:.**
14810 20 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a   .**      fid.**
14820 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a        zFilename.
14830 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 77 69 6e  **.** Either win
14840 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75  ShmNode.mutex mu
14850 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20 77 69  st be held or wi
14860 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30  nShmNode.nRef==0
14870 20 61 6e 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75   and.** winShmMu
14880 74 65 78 48 65 6c 64 28 29 20 69 73 20 74 72 75  texHeld() is tru
14890 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f  e when reading o
148a0 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74  r writing any ot
148b0 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20  her field.** in 
148c0 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a  this structure..
148d0 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e  **.*/.struct win
148e0 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 73 71 6c 69  ShmNode {.  sqli
148f0 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
14900 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20  ;      /* Mutex 
14910 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f  to access this o
14920 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20  bject */.  char 
14930 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
14940 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
14950 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 77   the file */.  w
14960 69 6e 46 69 6c 65 20 68 46 69 6c 65 3b 20 20 20  inFile hFile;   
14970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
14980 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 77 69  e handle from wi
14990 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20  nOpen */..  int 
149a0 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  szRegion;       
149b0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
149c0 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  f shared-memory 
149d0 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  regions */.  int
149e0 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20   nRegion;       
149f0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
14a00 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69 6f  of array apRegio
14a10 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 68  n */.  struct Sh
14a20 6d 52 65 67 69 6f 6e 20 7b 0a 20 20 20 20 48 41  mRegion {.    HA
14a30 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20  NDLE hMap;      
14a40 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68         /* File h
14a50 61 6e 64 6c 65 20 66 72 6f 6d 20 43 72 65 61 74  andle from Creat
14a60 65 46 69 6c 65 4d 61 70 70 69 6e 67 20 2a 2f 0a  eFileMapping */.
14a70 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 3b 0a      void *pMap;.
14a80 20 20 7d 20 2a 61 52 65 67 69 6f 6e 3b 0a 20 20    } *aRegion;.  
14a90 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
14aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
14ab0 65 20 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20  e Windows errno 
14ac0 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f  from the last I/
14ad0 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e  O error */..  in
14ae0 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
14af0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
14b00 65 72 20 6f 66 20 77 69 6e 53 68 6d 20 6f 62 6a  er of winShm obj
14b10 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ects pointing to
14b20 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68   this */.  winSh
14b30 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  m *pFirst;      
14b40 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 77 69 6e        /* All win
14b50 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
14b60 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
14b70 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e    winShmNode *pN
14b80 65 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ext;         /* 
14b90 4e 65 78 74 20 69 6e 20 6c 69 73 74 20 6f 66 20  Next in list of 
14ba0 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f  all winShmNode o
14bb0 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66 64 65 66  bjects */.#ifdef
14bc0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
14bd0 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20  u8 nextShmId;   
14be0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
14bf0 78 74 20 61 76 61 69 6c 61 62 6c 65 20 77 69 6e  xt available win
14c00 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a  Shm.id value */.
14c10 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
14c20 20 41 20 67 6c 6f 62 61 6c 20 61 72 72 61 79 20   A global array 
14c30 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64  of all winShmNod
14c40 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a  e objects..**.**
14c50 20 54 68 65 20 77 69 6e 53 68 6d 4d 75 74 65 78   The winShmMutex
14c60 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74  Held() must be t
14c70 72 75 65 20 77 68 69 6c 65 20 72 65 61 64 69 6e  rue while readin
14c80 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 69  g or writing thi
14c90 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  s list..*/.stati
14ca0 63 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 77 69  c winShmNode *wi
14cb0 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 30  nShmNodeList = 0
14cc0 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75  ;../*.** Structu
14cd0 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  re used internal
14ce0 6c 79 20 62 79 20 74 68 69 73 20 56 46 53 20 74  ly by this VFS t
14cf0 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61  o record the sta
14d00 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e  te of an.** open
14d10 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63   shared memory c
14d20 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  onnection..**.**
14d30 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
14d40 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61  ields are initia
14d50 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20  lized when this 
14d60 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
14d70 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61  d and.** are rea
14d80 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65  d-only thereafte
14d90 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 77 69 6e 53  r:.**.**    winS
14da0 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20  hm.pShmNode.**  
14db0 20 20 77 69 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a    winShm.id.**.*
14dc0 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c  * All other fiel
14dd0 64 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74  ds are read/writ
14de0 65 2e 20 20 54 68 65 20 77 69 6e 53 68 6d 2e 70  e.  The winShm.p
14df0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 6d  ShmNode->mutex m
14e00 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
14e10 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61  hile accessing a
14e20 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20 66 69  ny read/write fi
14e30 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  elds..*/.struct 
14e40 77 69 6e 53 68 6d 20 7b 0a 20 20 77 69 6e 53 68  winShm {.  winSh
14e50 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
14e60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
14e70 65 72 6c 79 69 6e 67 20 77 69 6e 53 68 6d 4e 6f  erlying winShmNo
14e80 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 77  de object */.  w
14e90 69 6e 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20  inShm *pNext;   
14ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
14eb0 74 20 77 69 6e 53 68 6d 20 77 69 74 68 20 74 68  t winShm with th
14ec0 65 20 73 61 6d 65 20 77 69 6e 53 68 6d 4e 6f 64  e same winShmNod
14ed0 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74  e */.  u8 hasMut
14ee0 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
14ef0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c    /* True if hol
14f00 64 69 6e 67 20 74 68 65 20 77 69 6e 53 68 6d 4e  ding the winShmN
14f10 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75  ode mutex */.  u
14f20 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  16 sharedMask;  
14f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
14f40 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b  k of shared lock
14f50 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20  s held */.  u16 
14f60 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20  exclMask;       
14f70 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
14f80 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  f exclusive lock
14f90 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66  s held */.#ifdef
14fa0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
14fb0 75 38 20 69 64 3b 20 20 20 20 20 20 20 20 20 20  u8 id;          
14fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64             /* Id
14fd0 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   of this connect
14fe0 69 6f 6e 20 77 69 74 68 20 69 74 73 20 77 69 6e  ion with its win
14ff0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69  ShmNode */.#endi
15000 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  f.};../*.** Cons
15010 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c  tants used for l
15020 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e  ocking.*/.#defin
15030 65 20 57 49 4e 5f 53 48 4d 5f 42 41 53 45 20 20  e WIN_SHM_BASE  
15040 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d   ((22+SQLITE_SHM
15050 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20  _NLOCK)*4)      
15060 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20    /* first lock 
15070 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  byte */.#define 
15080 57 49 4e 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28  WIN_SHM_DMS    (
15090 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c  WIN_SHM_BASE+SQL
150a0 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20  ITE_SHM_NLOCK)  
150b0 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63  /* deadman switc
150c0 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c  h */../*.** Appl
150d0 79 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  y advisory locks
150e0 20 66 6f 72 20 61 6c 6c 20 6e 20 62 79 74 65 73   for all n bytes
150f0 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 6f 66   beginning at of
15100 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 5f  st..*/.#define _
15110 53 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23 64 65  SHM_UNLCK  1.#de
15120 66 69 6e 65 20 5f 53 48 4d 5f 52 44 4c 43 4b 20  fine _SHM_RDLCK 
15130 20 32 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f   2.#define _SHM_
15140 57 52 4c 43 4b 20 20 33 0a 73 74 61 74 69 63 20  WRLCK  3.static 
15150 69 6e 74 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  int winShmSystem
15160 4c 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e 6f  Lock(.  winShmNo
15170 64 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a  de *pFile,    /*
15180 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20   Apply locks to 
15190 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64  this open shared
151a0 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20  -memory segment 
151b0 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70  */.  int lockTyp
151c0 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 5f 53  e,         /* _S
151d0 48 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52  HM_UNLCK, _SHM_R
151e0 44 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57 52  DLCK, or _SHM_WR
151f0 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  LCK */.  int ofs
15200 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
15210 2a 20 4f 66 66 73 65 74 20 74 6f 20 66 69 72 73  * Offset to firs
15220 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63  t byte to be loc
15230 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a  ked/unlocked */.
15240 20 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20 20    int nByte     
15250 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
15260 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
15270 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a  ck or unlock */.
15280 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
15290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
152a0 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c  sult code form L
152b0 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78  ock/UnlockFileEx
152c0 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65  () */..  /* Acce
152d0 73 73 20 74 6f 20 74 68 65 20 77 69 6e 53 68 6d  ss to the winShm
152e0 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73  Node object is s
152f0 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65  erialized by the
15300 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73   caller */.  ass
15310 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
15320 65 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d  ex_held(pFile->m
15330 75 74 65 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e  utex) || pFile->
15340 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nRef==0 );..  /*
15350 20 52 65 6c 65 61 73 65 2f 41 63 71 75 69 72 65   Release/Acquire
15360 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65   the system-leve
15370 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  l lock */.  if( 
15380 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55  lockType==_SHM_U
15390 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  NLCK ){.    rc =
153a0 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
153b0 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  pFile->hFile.h, 
153c0 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20  ofst, 0, nByte, 
153d0 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
153e0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
153f0 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d  he locking param
15400 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 44 57 4f  eters */.    DWO
15410 52 44 20 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43  RD dwFlags = LOC
15420 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
15430 49 41 54 45 4c 59 3b 0a 20 20 20 20 69 66 28 20  IATELY;.    if( 
15440 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d  lockType == _SHM
15450 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c 61 67 73  _WRLCK ) dwFlags
15460 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43   |= LOCKFILE_EXC
15470 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20  LUSIVE_LOCK;.   
15480 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c   rc = winLockFil
15490 65 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e  e(&pFile->hFile.
154a0 68 2c 20 64 77 46 6c 61 67 73 2c 20 6f 66 73 74  h, dwFlags, ofst
154b0 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a  , 0, nByte, 0);.
154c0 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 21    }.  .  if( rc!
154d0 3d 20 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  = 0 ){.    rc = 
154e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
154f0 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  se{.    pFile->l
15500 61 73 74 45 72 72 6e 6f 20 3d 20 20 6f 73 47 65  astErrno =  osGe
15510 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
15520 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
15530 53 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41  SY;.  }..  OSTRA
15540 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 25 64  CE(("SHM-LOCK %d
15550 20 25 73 20 25 73 20 30 78 25 30 38 6c 78 5c 6e   %s %s 0x%08lx\n
15560 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70  ", .           p
15570 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20  File->hFile.h,. 
15580 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51            rc==SQ
15590 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
155a0 20 22 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 20   "failed",.     
155b0 20 20 20 20 20 20 6c 6f 63 6b 54 79 70 65 3d 3d        lockType==
155c0 5f 53 48 4d 5f 55 4e 4c 43 4b 20 3f 20 22 55 6e  _SHM_UNLCK ? "Un
155d0 6c 6f 63 6b 46 69 6c 65 45 78 22 20 3a 20 22 4c  lockFileEx" : "L
155e0 6f 63 6b 46 69 6c 65 45 78 22 2c 0a 20 20 20 20  ockFileEx",.    
155f0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
15600 73 74 45 72 72 6e 6f 29 29 3b 0a 0a 20 20 72 65  stErrno));..  re
15610 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
15620 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
15630 73 20 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73  s to VFS methods
15640 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77   */.static int w
15650 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  inOpen(sqlite3_v
15660 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  fs*,const char*,
15670 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e  sqlite3_file*,in
15680 74 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20  t,int*);.static 
15690 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 73 71  int winDelete(sq
156a0 6c 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73  lite3_vfs *,cons
156b0 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f  t char*,int);../
156c0 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 77  *.** Purge the w
156d0 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69  inShmNodeList li
156e0 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65  st of all entrie
156f0 73 20 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64  s with winShmNod
15700 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a  e.nRef==0..**.**
15710 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56   This is not a V
15720 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
15730 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61   method; it is a
15740 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f   utility functio
15750 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56  n called.** by V
15760 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
15770 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61   methods..*/.sta
15780 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 50  tic void winShmP
15790 75 72 67 65 28 73 71 6c 69 74 65 33 5f 76 66 73  urge(sqlite3_vfs
157a0 20 2a 70 56 66 73 2c 20 69 6e 74 20 64 65 6c 65   *pVfs, int dele
157b0 74 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68  teFlag){.  winSh
157c0 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69  mNode **pp;.  wi
157d0 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 42  nShmNode *p;.  B
157e0 4f 4f 4c 20 62 52 63 3b 0a 20 20 61 73 73 65 72  OOL bRc;.  asser
157f0 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  t( winShmMutexHe
15800 6c 64 28 29 20 29 3b 0a 20 20 70 70 20 3d 20 26  ld() );.  pp = &
15810 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a  winShmNodeList;.
15820 20 20 77 68 69 6c 65 28 20 28 70 20 3d 20 2a 70    while( (p = *p
15830 70 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  p)!=0 ){.    if(
15840 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20   p->nRef==0 ){. 
15850 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
15860 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20 29    if( p->mutex )
15870 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
15880 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20  ree(p->mutex);. 
15890 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
158a0 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29  p->nRegion; i++)
158b0 7b 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d 20  {.        bRc = 
158c0 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
158d0 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e  e(p->aRegion[i].
158e0 70 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f  pMap);.        O
158f0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52  STRACE(("SHM-PUR
15900 47 45 20 70 69 64 2d 25 64 20 75 6e 6d 61 70 20  GE pid-%d unmap 
15910 72 65 67 69 6f 6e 3d 25 64 20 25 73 5c 6e 22 2c  region=%d %s\n",
15920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15930 20 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72    (int)osGetCurr
15940 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
15950 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i,.             
15960 20 20 20 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a      bRc ? "ok" :
15970 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
15980 20 20 20 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f       bRc = osClo
15990 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67  seHandle(p->aReg
159a0 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20  ion[i].hMap);.  
159b0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
159c0 53 48 4d 2d 50 55 52 47 45 20 70 69 64 2d 25 64  SHM-PURGE pid-%d
159d0 20 63 6c 6f 73 65 20 72 65 67 69 6f 6e 3d 25 64   close region=%d
159e0 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
159f0 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73           (int)os
15a00 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
15a10 73 49 64 28 29 2c 20 69 2c 0a 20 20 20 20 20 20  sId(), i,.      
15a20 20 20 20 20 20 20 20 20 20 20 20 62 52 63 20 3f             bRc ?
15a30 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
15a40 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
15a50 20 20 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68    if( p->hFile.h
15a60 20 21 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44   != INVALID_HAND
15a70 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20  LE_VALUE ){.    
15a80 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
15a90 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
15aa0 20 20 20 20 20 20 77 69 6e 43 6c 6f 73 65 28 28        winClose((
15ab0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
15ac0 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 20 20 20 20  p->hFile);.     
15ad0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
15ae0 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
15af0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64     }.      if( d
15b00 65 6c 65 74 65 46 6c 61 67 20 29 7b 0a 20 20 20  eleteFlag ){.   
15b10 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
15b20 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
15b30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
15b40 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
15b50 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 44 65  );.        winDe
15b60 6c 65 74 65 28 70 56 66 73 2c 20 70 2d 3e 7a 46  lete(pVfs, p->zF
15b70 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ilename, 0);.   
15b80 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
15b90 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
15ba0 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
15bb0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
15bc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
15bd0 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  pp = p->pNext;. 
15be0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
15bf0 65 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a 20  e(p->aRegion);. 
15c00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
15c10 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e(p);.    }else{
15c20 0a 20 20 20 20 20 20 70 70 20 3d 20 26 70 2d 3e  .      pp = &p->
15c30 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
15c40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
15c50 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
15c60 20 61 72 65 61 20 61 73 73 6f 63 69 61 74 65 64   area associated
15c70 20 77 69 74 68 20 64 61 74 61 62 61 73 65 20 66   with database f
15c80 69 6c 65 20 70 44 62 46 64 2e 0a 2a 2a 0a 2a 2a  ile pDbFd..**.**
15c90 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   When opening a 
15ca0 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  new shared-memor
15cb0 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74  y file, if no ot
15cc0 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  her instances of
15cd0 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72   that.** file ar
15ce0 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  e currently open
15cf0 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  , in this proces
15d00 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72  s or in other pr
15d10 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a  ocesses, then.**
15d20 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62   the file must b
15d30 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  e truncated to z
15d40 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61  ero length or ha
15d50 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63 6c  ve its header cl
15d60 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eared..*/.static
15d70 20 69 6e 74 20 77 69 6e 4f 70 65 6e 53 68 61 72   int winOpenShar
15d80 65 64 4d 65 6d 6f 72 79 28 77 69 6e 46 69 6c 65  edMemory(winFile
15d90 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75   *pDbFd){.  stru
15da0 63 74 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20  ct winShm *p;   
15db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15dc0 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
15dd0 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
15de0 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  .  struct winShm
15df0 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d  Node *pShmNode =
15e00 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64   0;   /* The und
15e10 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20  erlying mmapped 
15e20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  file */.  int rc
15e30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15e50 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
15e60 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f   struct winShmNo
15e70 64 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  de *pNew;       
15e80 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c      /* Newly all
15e90 6f 63 61 74 65 64 20 77 69 6e 53 68 6d 4e 6f 64  ocated winShmNod
15ea0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  e */.  int nName
15eb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
15ed0 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20 62 79  e of zName in by
15ee0 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  tes */..  assert
15ef0 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30  ( pDbFd->pShm==0
15f00 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 70 72   );    /* Not pr
15f10 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20  eviously opened 
15f20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
15f30 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
15f40 6e 65 77 20 73 71 6c 69 74 65 33 5f 73 68 6d 20  new sqlite3_shm 
15f50 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20 73 70  object.  Also sp
15f60 65 63 75 6c 61 74 69 76 65 6c 79 0a 20 20 2a 2a  eculatively.  **
15f70 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
15f80 66 6f 72 20 61 20 6e 65 77 20 77 69 6e 53 68 6d  for a new winShm
15f90 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e 61 6d  Node and filenam
15fa0 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71  e..  */.  p = sq
15fb0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
15fc0 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
15fd0 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
15fe0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
15ff0 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  EM;.  memset(p, 
16000 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
16010 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
16020 33 53 74 72 6c 65 6e 33 30 28 70 44 62 46 64 2d  3Strlen30(pDbFd-
16030 3e 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65 77 20  >zPath);.  pNew 
16040 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
16050 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f  ( sizeof(*pShmNo
16060 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 37  de) + nName + 17
16070 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
16080 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
16090 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 72 65  _free(p);.    re
160a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
160b0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d  R_NOMEM;.  }.  m
160c0 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
160d0 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 6e  izeof(*pNew) + n
160e0 4e 61 6d 65 20 2b 20 31 37 29 3b 0a 20 20 70 4e  Name + 17);.  pN
160f0 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  ew->zFilename = 
16100 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b  (char*)&pNew[1];
16110 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
16120 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e  ntf(nName+15, pN
16130 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  ew->zFilename, "
16140 25 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e  %s-shm", pDbFd->
16150 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c 69 74 65  zPath);.  sqlite
16160 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62  3FileSuffix3(pDb
16170 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e 65 77 2d  Fd->zPath, pNew-
16180 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 20 0a 0a 20  >zFilename); .. 
16190 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20   /* Look to see 
161a0 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 65  if there is an e
161b0 78 69 73 74 69 6e 67 20 77 69 6e 53 68 6d 4e 6f  xisting winShmNo
161c0 64 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  de that can be u
161d0 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20  sed..  ** If no 
161e0 6d 61 74 63 68 69 6e 67 20 77 69 6e 53 68 6d 4e  matching winShmN
161f0 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ode currently ex
16200 69 73 74 73 2c 20 63 72 65 61 74 65 20 61 20 6e  ists, create a n
16210 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77  ew one..  */.  w
16220 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
16230 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d 4e 6f 64  );.  for(pShmNod
16240 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69  e = winShmNodeLi
16250 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b 20 70 53  st; pShmNode; pS
16260 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64 65 2d  hmNode=pShmNode-
16270 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20  >pNext){.    /* 
16280 54 42 44 20 6e 65 65 64 20 74 6f 20 63 6f 6d 65  TBD need to come
16290 20 75 70 20 77 69 74 68 20 62 65 74 74 65 72 20   up with better 
162a0 6d 61 74 63 68 20 68 65 72 65 2e 20 20 50 65 72  match here.  Per
162b0 68 61 70 73 0a 20 20 20 20 2a 2a 20 75 73 65 20  haps.    ** use 
162c0 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f 44 49 52  FILE_ID_BOTH_DIR
162d0 5f 49 4e 46 4f 20 53 74 72 75 63 74 75 72 65 2e  _INFO Structure.
162e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
162f0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
16300 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
16310 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e  me, pNew->zFilen
16320 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
16330 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e  .  }.  if( pShmN
16340 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ode ){.    sqlit
16350 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
16360 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 68 6d   }else{.    pShm
16370 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Node = pNew;.   
16380 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 28   pNew = 0;.    (
16390 28 77 69 6e 46 69 6c 65 2a 29 28 26 70 53 68 6d  (winFile*)(&pShm
163a0 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29 2d 3e 68  Node->hFile))->h
163b0 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c   = INVALID_HANDL
163c0 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20 70 53 68  E_VALUE;.    pSh
163d0 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 77  mNode->pNext = w
163e0 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20  inShmNodeList;. 
163f0 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73     winShmNodeLis
16400 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20  t = pShmNode;.. 
16410 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74     pShmNode->mut
16420 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
16430 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
16440 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
16450 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d   if( pShmNode->m
16460 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
16470 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
16480 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
16490 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
164a0 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  r;.    }..    rc
164b0 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62 46 64   = winOpen(pDbFd
164c0 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20 20 20 20  ->pVfs,.        
164d0 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
164e0 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  e->zFilename,   
164f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
16500 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55  e of the file (U
16510 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20 20 20 20  TF-8) */.       
16520 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
16530 65 33 5f 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f  e3_file*)&pShmNo
16540 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 46  de->hFile,  /* F
16550 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20  ile handle here 
16560 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
16570 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
16580 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  WAL | SQLITE_OPE
16590 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
165a0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
165b0 2c 20 2f 2a 20 4d 6f 64 65 20 66 6c 61 67 73 20  , /* Mode flags 
165c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
165d0 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20      0);.    if( 
165e0 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
165f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
16600 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
16610 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
16620 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20   see if another 
16630 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
16640 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20  ng the dead-man 
16650 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49  switch..    ** I
16660 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20  f not, truncate 
16670 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  the file to zero
16680 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f   length. .    */
16690 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68 6d 53  .    if( winShmS
166a0 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
166b0 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20  de, _SHM_WRLCK, 
166c0 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d  WIN_SHM_DMS, 1)=
166d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
166e0 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e      rc = winTrun
166f0 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69  cate((sqlite3_fi
16700 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  le *)&pShmNode->
16710 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  hFile, 0);.     
16720 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16730 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
16740 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
16750 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f  QLITE_IOERR_SHMO
16760 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  PEN, osGetLastEr
16770 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
16780 20 20 20 20 20 20 20 20 22 77 69 6e 4f 70 65 6e          "winOpen
16790 53 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  Shm", pDbFd->zPa
167a0 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  th);.      }.   
167b0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
167c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
167d0 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f    winShmSystemLo
167e0 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
167f0 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d  M_UNLCK, WIN_SHM
16800 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20  _DMS, 1);.      
16810 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
16820 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
16830 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f  _SHM_RDLCK, WIN_
16840 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20  SHM_DMS, 1);.   
16850 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20   }.    if( rc ) 
16860 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
16870 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  r;.  }..  /* Mak
16880 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63  e the new connec
16890 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20  tion a child of 
168a0 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  the winShmNode *
168b0 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20  /.  p->pShmNode 
168c0 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64  = pShmNode;.#ifd
168d0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
168e0 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f    p->id = pShmNo
168f0 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b  de->nextShmId++;
16900 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f  .#endif.  pShmNo
16910 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44  de->nRef++;.  pD
16920 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20  bFd->pShm = p;. 
16930 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
16940 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72  x();..  /* The r
16950 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
16960 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61  n pShmNode has a
16970 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
16980 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20  emented under.  
16990 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20  ** the cover of 
169a0 74 68 65 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  the winShmEnterM
169b0 75 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64  utex() mutex and
169c0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f   the pointer fro
169d0 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28  m the.  ** new (
169e0 73 74 72 75 63 74 20 77 69 6e 53 68 6d 29 20 6f  struct winShm) o
169f0 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53 68  bject to the pSh
16a00 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73  mNode has been s
16a10 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a  et. All that is.
16a20 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20    ** left to do 
16a30 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e  is to link the n
16a40 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74  ew object into t
16a50 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
16a60 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20  tarting.  ** at 
16a70 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
16a80 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64  . This must be d
16a90 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e  one while holdin
16aa0 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e  g the pShmNode->
16ab0 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65  mutex .  ** mute
16ac0 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  x..  */.  sqlite
16ad0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
16ae0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
16af0 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68    p->pNext = pSh
16b00 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20  mNode->pFirst;. 
16b10 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
16b20 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33  t = p;.  sqlite3
16b30 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
16b40 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
16b50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16b60 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  K;..  /* Jump he
16b70 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20  re on any error 
16b80 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a  */.shm_open_err:
16b90 0a 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c  .  winShmSystemL
16ba0 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
16bb0 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48  HM_UNLCK, WIN_SH
16bc0 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 77 69 6e  M_DMS, 1);.  win
16bd0 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e  ShmPurge(pDbFd->
16be0 70 56 66 73 2c 20 30 29 3b 20 20 20 20 20 20 2f  pVfs, 0);      /
16bf0 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65  * This call free
16c00 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65  s pShmNode if re
16c10 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69  quired */.  sqli
16c20 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 73  te3_free(p);.  s
16c30 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
16c40 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65  );.  winShmLeave
16c50 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
16c60 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
16c70 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f  lose a connectio
16c80 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f  n to shared-memo
16c90 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20  ry.  Delete the 
16ca0 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73  underlying .** s
16cb0 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74 65  torage if delete
16cc0 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f  Flag is true..*/
16cd0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
16ce0 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74  hmUnmap(.  sqlit
16cf0 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
16d00 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
16d10 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  e holding shared
16d20 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
16d30 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20   deleteFlag     
16d40 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
16d50 65 20 61 66 74 65 72 20 63 6c 6f 73 69 6e 67 20  e after closing 
16d60 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
16d70 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 3b 20  winFile *pDbFd; 
16d80 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
16d90 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  e holding shared
16da0 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e  -memory */.  win
16db0 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Shm *p;         
16dc0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
16dd0 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65  tion to be close
16de0 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  d */.  winShmNod
16df0 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20  e *pShmNode; /* 
16e00 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73  The underlying s
16e10 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
16e20 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 2a  e */.  winShm **
16e30 70 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pp;          /* 
16e40 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
16e50 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
16e60 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44 62 46 64  ions */..  pDbFd
16e70 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b   = (winFile*)fd;
16e80 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  .  p = pDbFd->pS
16e90 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  hm;.  if( p==0 )
16ea0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16eb0 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  K;.  pShmNode = 
16ec0 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20  p->pShmNode;..  
16ed0 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63  /* Remove connec
16ee0 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20  tion p from the 
16ef0 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f  set of connectio
16f00 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  ns associated.  
16f10 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65  ** with pShmNode
16f20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
16f30 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
16f40 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f  de->mutex);.  fo
16f50 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e  r(pp=&pShmNode->
16f60 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70  pFirst; (*pp)!=p
16f70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70  ; pp = &(*pp)->p
16f80 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20  Next){}.  *pp = 
16f90 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20  p->pNext;..  /* 
16fa0 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  Free the connect
16fb0 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74  ion p */.  sqlit
16fc0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44  e3_free(p);.  pD
16fd0 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20  bFd->pShm = 0;. 
16fe0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
16ff0 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
17000 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  utex);..  /* If 
17010 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68  pShmNode->nRef h
17020 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74 68  as reached 0, th
17030 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64  en close the und
17040 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61  erlying.  ** sha
17050 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
17060 20 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53 68 6d   too */.  winShm
17070 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
17080 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
17090 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53  ->nRef>0 );.  pS
170a0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a  hmNode->nRef--;.
170b0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
170c0 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 77  nRef==0 ){.    w
170d0 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  inShmPurge(pDbFd
170e0 2d 3e 70 56 66 73 2c 20 64 65 6c 65 74 65 46 6c  ->pVfs, deleteFl
170f0 61 67 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 53 68  ag);.  }.  winSh
17100 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  mLeaveMutex();..
17110 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17120 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
17130 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  nge the lock sta
17140 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d  te for a shared-
17150 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a  memory segment..
17160 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
17170 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69  nShmLock(.  sqli
17180 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
17190 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
171a0 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20  se file holding 
171b0 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
171c0 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  y */.  int ofst,
171d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171e0 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20    /* First lock 
171f0 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
17200 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lease */.  int n
17210 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17220 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17230 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75  of locks to acqu
17240 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
17250 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
17260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17270 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
17280 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  h the lock */.){
17290 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  .  winFile *pDbF
172a0 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
172b0 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  ;        /* Conn
172c0 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73  ection holding s
172d0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
172e0 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44    winShm *p = pD
172f0 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20  bFd->pShm;      
17300 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
17310 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69  hared memory bei
17320 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 77  ng locked */.  w
17330 69 6e 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20  inShm *pX;      
17340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17350 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
17360 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62  ing over all sib
17370 6c 69 6e 67 73 20 2a 2f 0a 20 20 77 69 6e 53 68  lings */.  winSh
17380 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20  mNode *pShmNode 
17390 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  = p->pShmNode;. 
173a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
173b0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
173c0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
173d0 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d   code */.  u16 m
173e0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
173f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17400 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
17410 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c  s to take or rel
17420 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ease */..  asser
17430 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66  t( ofst>=0 && of
17440 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d  st+n<=SQLITE_SHM
17450 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  _NLOCK );.  asse
17460 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73  rt( n>=1 );.  as
17470 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51  sert( flags==(SQ
17480 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
17490 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
174a0 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  D).       || fla
174b0 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
174c0 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
174d0 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20  M_EXCLUSIVE).   
174e0 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
174f0 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
17500 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   | SQLITE_SHM_SH
17510 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
17520 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
17530 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
17540 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
17550 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
17560 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==1 || (flags & 
17570 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
17580 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a 20 20 6d  SIVE)!=0 );..  m
17590 61 73 6b 20 3d 20 28 75 31 36 29 28 28 31 55 3c  ask = (u16)((1U<
175a0 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 55  <(ofst+n)) - (1U
175b0 3c 3c 6f 66 73 74 29 29 3b 0a 20 20 61 73 73 65  <<ofst));.  asse
175c0 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d  rt( n>1 || mask=
175d0 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20  =(1<<ofst) );.  
175e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
175f0 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
17600 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67  tex);.  if( flag
17610 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s & SQLITE_SHM_U
17620 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36  NLOCK ){.    u16
17630 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a   allMask = 0; /*
17640 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68   Mask of locks h
17650 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20  eld by siblings 
17660 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69  */..    /* See i
17670 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68  f any siblings h
17680 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f  old this same lo
17690 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58  ck */.    for(pX
176a0 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
176b0 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
176c0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
176d0 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65  pX==p ) continue
176e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
176f0 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
17700 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e  (p->exclMask|p->
17710 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20  sharedMask))==0 
17720 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b  );.      allMask
17730 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
17740 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
17750 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73  * Unlock the sys
17760 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20  tem-level locks 
17770 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b  */.    if( (mask
17780 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29   & allMask)==0 )
17790 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
177a0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
177b0 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c  hmNode, _SHM_UNL
177c0 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d  CK, ofst+WIN_SHM
177d0 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d  _BASE, n);.    }
177e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
177f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
17800 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74  }..    /* Undo t
17810 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a  he local locks *
17820 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
17830 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17840 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20   p->exclMask &= 
17850 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e  ~mask;.      p->
17860 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
17870 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65  ask;.    } .  }e
17880 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
17890 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
178a0 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  D ){.    u16 all
178b0 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20  Shared = 0;  /* 
178c0 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68  Union of locks h
178d0 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f  eld by connectio
178e0 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70  ns other than "p
178f0 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  " */..    /* Fin
17900 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72  d out which shar
17910 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72  ed locks are alr
17920 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62  eady held by sib
17930 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
17940 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20  ..    ** If any 
17950 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20  sibling already 
17960 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69  holds an exclusi
17970 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61  ve lock, go ahea
17980 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20  d and return.   
17990 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e   ** SQLITE_BUSY.
179a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
179b0 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
179c0 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
179d0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
179e0 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
179f0 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
17a00 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
17a10 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
17a20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
17a30 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c       allShared |
17a40 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
17a50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
17a60 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  Get shared locks
17a70 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
17a80 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61  evel, if necessa
17a90 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ry */.    if( rc
17aa0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17ab0 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61       if( (allSha
17ac0 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  red & mask)==0 )
17ad0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
17ae0 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
17af0 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52  pShmNode, _SHM_R
17b00 44 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53  DLCK, ofst+WIN_S
17b10 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
17b20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17b30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
17b40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17b50 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
17b60 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63  local shared loc
17b70 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
17b80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17b90 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
17ba0 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
17bb0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
17bc0 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73  * Make sure no s
17bd0 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
17be0 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68  ns hold locks th
17bf0 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68  at will block th
17c00 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20  is.    ** lock. 
17c10 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75   If any do, retu
17c20 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72  rn SQLITE_BUSY r
17c30 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a  ight away..    *
17c40 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
17c50 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
17c60 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
17c70 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
17c80 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
17c90 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61  )!=0 || (pX->sha
17ca0 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  redMask & mask)!
17cb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
17cc0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
17cd0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
17ce0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
17cf0 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65      /* Get the e
17d00 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61  xclusive locks a
17d10 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
17d20 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63  el.  Then if suc
17d30 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61  cessful.    ** a
17d40 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63  lso mark the loc
17d50 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73  al connection as
17d60 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20   being locked.. 
17d70 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
17d80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17d90 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d       rc = winShm
17da0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
17db0 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c  ode, _SHM_WRLCK,
17dc0 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
17dd0 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66  SE, n);.      if
17de0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17df0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
17e00 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73  t( (p->sharedMas
17e10 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a  k & mask)==0 );.
17e20 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d          p->exclM
17e30 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
17e40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
17e50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
17e60 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
17e70 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45  utex);.  OSTRACE
17e80 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69  (("SHM-LOCK shmi
17e90 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74  d-%d, pid-%d got
17ea0 20 25 30 33 78 2c 25 30 33 78 20 25 73 5c 6e 22   %03x,%03x %s\n"
17eb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
17ec0 69 64 2c 20 28 69 6e 74 29 6f 73 47 65 74 43 75  id, (int)osGetCu
17ed0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
17ee0 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c  , p->sharedMask,
17ef0 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c 0a 20 20   p->exclMask,.  
17f00 20 20 20 20 20 20 20 20 20 72 63 20 3f 20 22 66           rc ? "f
17f10 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b  ailed" : "ok"));
17f20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17f30 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
17f40 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65   a memory barrie
17f50 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63  r or memory fenc
17f60 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  e on shared memo
17f70 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ry.  .**.** All 
17f80 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73  loads and stores
17f90 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68   begun before th
17fa0 65 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63  e barrier must c
17fb0 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a  omplete before.*
17fc0 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74  * any load or st
17fd0 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20  ore begun after 
17fe0 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a  the barrier..*/.
17ff0 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
18000 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c  hmBarrier(.  sql
18010 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20  ite3_file *fd   
18020 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
18030 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  se holding the s
18040 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
18050 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
18060 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 2f 2a 20  METER(fd);.  /* 
18070 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b  MemoryBarrier();
18080 20 2f 2f 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   // does not wor
18090 6b 20 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  k -- do not know
180a0 20 77 68 79 20 6e 6f 74 20 2a 2f 0a 20 20 77 69   why not */.  wi
180b0 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
180c0 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  ;.  winShmLeaveM
180d0 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  utex();.}../*.**
180e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
180f0 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
18100 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
18110 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f  region iRegion o
18120 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64  f the .** shared
18130 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74  -memory associat
18140 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
18150 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68  base file fd. Sh
18160 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
18170 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62  ons .** are numb
18180 65 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72  ered starting fr
18190 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68  om zero. Each sh
181a0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
181b0 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a  on is szRegion .
181c0 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
181d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
181e0 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
181f0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
18200 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73  urned and *pp is
18210 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
18220 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
18230 66 20 74 68 65 20 69 73 57 72 69 74 65 20 70 61  f the isWrite pa
18240 72 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64  rameter is 0 and
18250 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
18260 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  hared-memory.** 
18270 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62  region has not b
18280 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62  een allocated (b
18290 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e  y any client, in
182a0 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e  cluding one runn
182b0 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61  ing in a.** sepa
182c0 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74  rate process), t
182d0 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74  hen *pp is set t
182e0 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  o NULL and SQLIT
182f0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
18300 66 20 0a 2a 2a 20 69 73 57 72 69 74 65 20 69 73  f .** isWrite is
18310 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
18320 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
18330 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
18340 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a   has not yet .**
18350 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
18360 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   it is allocated
18370 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
18380 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
18390 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
183a0 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  gion has already
183b0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
183c0 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  or is allocated 
183d0 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  by.** this call 
183e0 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
183f0 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d  ve, then it is m
18400 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
18410 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64  processes .** ad
18420 64 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20  dress space (if 
18430 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
18440 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74  y), *pp is set t
18450 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d  o point to the m
18460 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79  apped .** memory
18470 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
18480 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
18490 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70  ic int winShmMap
184a0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
184b0 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20   *fd,           
184c0 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70      /* Handle op
184d0 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66  en on database f
184e0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ile */.  int iRe
184f0 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
18500 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
18510 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a  on to retrieve *
18520 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  /.  int szRegion
18530 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18540 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
18550 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
18560 69 73 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  isWrite,        
18570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18580 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69  rue to extend fi
18590 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  le if necessary 
185a0 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69  */.  void volati
185b0 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20  le **pp         
185c0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70       /* OUT: Map
185d0 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  ped memory */.){
185e0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  .  winFile *pDbF
185f0 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
18600 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20  ;.  winShm *p = 
18610 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77  pDbFd->pShm;.  w
18620 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
18630 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
18640 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
18650 28 20 21 70 20 29 7b 0a 20 20 20 20 72 63 20 3d  ( !p ){.    rc =
18660 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65   winOpenSharedMe
18670 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20  mory(pDbFd);.   
18680 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18690 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
186a0 20 20 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70      p = pDbFd->p
186b0 53 68 6d 3b 0a 20 20 7d 0a 20 20 70 53 68 6d 4e  Shm;.  }.  pShmN
186c0 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
186d0 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  e;..  sqlite3_mu
186e0 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
186f0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  de->mutex);.  as
18700 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d  sert( szRegion==
18710 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
18720 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e  on || pShmNode->
18730 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20  nRegion==0 );.. 
18740 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
18750 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20  Region<=iRegion 
18760 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 68  ){.    struct Sh
18770 6d 52 65 67 69 6f 6e 20 2a 61 70 4e 65 77 3b 20  mRegion *apNew; 
18780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
18790 20 61 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79   aRegion[] array
187a0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
187b0 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  e = (iRegion+1)*
187c0 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69  szRegion;  /* Mi
187d0 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66  nimum required f
187e0 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
187f0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
18800 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18810 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69     /* Current si
18820 7a 65 20 6f 66 20 77 61 6c 2d 69 6e 64 65 78 20  ze of wal-index 
18830 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 70 53 68  file */..    pSh
18840 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
18850 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20  = szRegion;..   
18860 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
18870 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20  d region is not 
18880 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73  mapped into this
18890 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
188a0 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a  ss space..    **
188b0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
188c0 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c   it has been all
188d0 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20  ocated (i.e. if 
188e0 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69  the wal-index fi
188f0 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72  le is.    ** lar
18900 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e  ge enough to con
18910 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  tain the request
18920 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20  ed region)..    
18930 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46  */.    rc = winF
18940 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33  ileSize((sqlite3
18950 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64  _file *)&pShmNod
18960 65 2d 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a  e->hFile, &sz);.
18970 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18980 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
18990 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
189a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
189b0 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45  SIZE, osGetLastE
189c0 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
189d0 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61         "winShmMa
189e0 70 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  p1", pDbFd->zPat
189f0 68 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  h);.      goto s
18a00 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
18a10 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e 42  }..    if( sz<nB
18a20 79 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  yte ){.      /* 
18a30 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  The requested me
18a40 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73  mory region does
18a50 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 69   not exist. If i
18a60 73 57 72 69 74 65 20 69 73 20 73 65 74 20 74 6f  sWrite is set to
18a70 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20  .      ** zero, 
18a80 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20  exit early. *pp 
18a90 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e  will be set to N
18aa0 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
18ab0 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20  K returned..    
18ac0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c    **.      ** Al
18ad0 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20  ternatively, if 
18ae0 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a  isWrite is non-z
18af0 65 72 6f 2c 20 75 73 65 20 66 74 72 75 6e 63 61  ero, use ftrunca
18b00 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65  te() to allocate
18b10 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65  .      ** the re
18b20 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
18b30 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  egion..      */.
18b40 20 20 20 20 20 20 69 66 28 20 21 69 73 57 72 69        if( !isWri
18b50 74 65 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67  te ) goto shmpag
18b60 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72 63 20  e_out;.      rc 
18b70 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73  = winTruncate((s
18b80 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
18b90 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
18ba0 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66  nByte);.      if
18bb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18bc0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
18bd0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
18be0 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
18bf0 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
18c00 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
18c10 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 32       "winShmMap2
18c20 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
18c30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
18c40 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
18c50 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
18c60 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73  * Map the reques
18c70 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
18c80 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  n into this proc
18c90 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70  esses address sp
18ca0 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65  ace. */.    apNe
18cb0 77 20 3d 20 28 73 74 72 75 63 74 20 53 68 6d 52  w = (struct ShmR
18cc0 65 67 69 6f 6e 20 2a 29 73 71 6c 69 74 65 33 5f  egion *)sqlite3_
18cd0 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  realloc(.       
18ce0 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
18cf0 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  on, (iRegion+1)*
18d00 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b 30 5d 29  sizeof(apNew[0])
18d10 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
18d20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  !apNew ){.      
18d30 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
18d40 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  R_NOMEM;.      g
18d50 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
18d60 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e  .    }.    pShmN
18d70 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 20 3d 20 61  ode->aRegion = a
18d80 70 4e 65 77 3b 0a 0a 20 20 20 20 77 68 69 6c 65  pNew;..    while
18d90 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
18da0 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a  ion<=iRegion ){.
18db0 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61        HANDLE hMa
18dc0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
18dd0 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70 70 69 6e    /* file-mappin
18de0 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  g handle */.    
18df0 20 20 76 6f 69 64 20 2a 70 4d 61 70 20 3d 20 30    void *pMap = 0
18e00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
18e10 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 72   Mapped memory r
18e20 65 67 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 0a 23  egion */.     .#
18e30 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
18e40 52 54 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20  RT.      hMap = 
18e50 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
18e60 69 6e 67 46 72 6f 6d 41 70 70 28 70 53 68 6d 4e  ingFromApp(pShmN
18e70 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20  ode->hFile.h,.  
18e80 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41          NULL, PA
18e90 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 6e 42  GE_READWRITE, nB
18ea0 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20  yte, NULL.      
18eb0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 68  );.#else.      h
18ec0 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69  Map = osCreateFi
18ed0 6c 65 4d 61 70 70 69 6e 67 57 28 70 53 68 6d 4e  leMappingW(pShmN
18ee0 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a 20  ode->hFile.h, . 
18ef0 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50           NULL, P
18f00 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30  AGE_READWRITE, 0
18f10 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20  , nByte, NULL.  
18f20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20      );.#endif.  
18f30 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48      OSTRACE(("SH
18f40 4d 2d 4d 41 50 20 70 69 64 2d 25 64 20 63 72 65  M-MAP pid-%d cre
18f50 61 74 65 20 72 65 67 69 6f 6e 3d 25 64 20 6e 62  ate region=%d nb
18f60 79 74 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20  yte=%d %s\n",.  
18f70 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
18f80 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  t)osGetCurrentPr
18f90 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e  ocessId(), pShmN
18fa0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 6e 42  ode->nRegion, nB
18fb0 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  yte,.           
18fc0 20 20 20 20 68 4d 61 70 20 3f 20 22 6f 6b 22 20      hMap ? "ok" 
18fd0 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
18fe0 20 20 20 20 69 66 28 20 68 4d 61 70 20 29 7b 0a      if( hMap ){.
18ff0 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66          int iOff
19000 73 65 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  set = pShmNode->
19010 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e  nRegion*szRegion
19020 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f  ;.        int iO
19030 66 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66  ffsetShift = iOf
19040 66 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66  fset % winSysInf
19050 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72  o.dwAllocationGr
19060 61 6e 75 6c 61 72 69 74 79 3b 0a 23 69 66 20 53  anularity;.#if S
19070 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
19080 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20 6f 73         pMap = os
19090 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f  MapViewOfFileFro
190a0 6d 41 70 70 28 68 4d 61 70 2c 20 46 49 4c 45 5f  mApp(hMap, FILE_
190b0 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49 4c 45  MAP_WRITE | FILE
190c0 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20 20 20  _MAP_READ,.     
190d0 20 20 20 20 20 20 20 69 4f 66 66 73 65 74 20 2d         iOffset -
190e0 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73   iOffsetShift, s
190f0 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65  zRegion + iOffse
19100 74 53 68 69 66 74 0a 20 20 20 20 20 20 20 20 29  tShift.        )
19110 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20  ;.#else.        
19120 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65 77  pMap = osMapView
19130 4f 66 46 69 6c 65 28 68 4d 61 70 2c 20 46 49 4c  OfFile(hMap, FIL
19140 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49  E_MAP_WRITE | FI
19150 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20  LE_MAP_READ,.   
19160 20 20 20 20 20 20 20 20 20 30 2c 20 69 4f 66 66           0, iOff
19170 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69  set - iOffsetShi
19180 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69  ft, szRegion + i
19190 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20 20 20  OffsetShift.    
191a0 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20      );.#endif.  
191b0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
191c0 53 48 4d 2d 4d 41 50 20 70 69 64 2d 25 64 20 6d  SHM-MAP pid-%d m
191d0 61 70 20 72 65 67 69 6f 6e 3d 25 64 20 6f 66 66  ap region=%d off
191e0 73 65 74 3d 25 64 20 73 69 7a 65 3d 25 64 20 25  set=%d size=%d %
191f0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
19200 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73 47 65         (int)osGe
19210 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
19220 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  d(), pShmNode->n
19230 52 65 67 69 6f 6e 2c 20 69 4f 66 66 73 65 74 2c  Region, iOffset,
19240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19250 20 20 73 7a 52 65 67 69 6f 6e 2c 20 70 4d 61 70    szRegion, pMap
19260 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
19270 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  d"));.      }.  
19280 20 20 20 20 69 66 28 20 21 70 4d 61 70 20 29 7b      if( !pMap ){
19290 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  .        pShmNod
192a0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
192b0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
192c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69  .        rc = wi
192d0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
192e0 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 70  _IOERR_SHMMAP, p
192f0 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72  ShmNode->lastErr
19300 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
19310 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 33       "winShmMap3
19320 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
19330 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 68 4d  ;.        if( hM
19340 61 70 20 29 20 6f 73 43 6c 6f 73 65 48 61 6e 64  ap ) osCloseHand
19350 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20 20 20 20  le(hMap);.      
19360 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
19370 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ut;.      }..   
19380 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65     pShmNode->aRe
19390 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e  gion[pShmNode->n
193a0 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70  Region].pMap = p
193b0 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  Map;.      pShmN
193c0 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68  ode->aRegion[pSh
193d0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e  mNode->nRegion].
193e0 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20  hMap = hMap;.   
193f0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65     pShmNode->nRe
19400 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  gion++;.    }.  
19410 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a  }..shmpage_out:.
19420 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
19430 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20  nRegion>iRegion 
19440 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73  ){.    int iOffs
19450 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a 52  et = iRegion*szR
19460 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69  egion;.    int i
19470 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f  OffsetShift = iO
19480 66 66 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e  ffset % winSysIn
19490 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47  fo.dwAllocationG
194a0 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20 20  ranularity;.    
194b0 63 68 61 72 20 2a 70 20 3d 20 28 63 68 61 72 20  char *p = (char 
194c0 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67  *)pShmNode->aReg
194d0 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d 61  ion[iRegion].pMa
194e0 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28 76 6f  p;.    *pp = (vo
194f0 69 64 20 2a 29 26 70 5b 69 4f 66 66 73 65 74 53  id *)&p[iOffsetS
19500 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  hift];.  }else{.
19510 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d      *pp = 0;.  }
19520 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
19530 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
19540 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
19550 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23  n rc;.}..#else.#
19560 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4d 61   define winShmMa
19570 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  p     0.# define
19580 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 20 30   winShmLock    0
19590 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
195a0 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66 69  Barrier 0.# defi
195b0 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20  ne winShmUnmap  
195c0 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   0.#endif /* #if
195d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
195e0 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48  _WAL */../*.** H
195f0 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70  ere ends the imp
19600 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
19610 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ll sqlite3_file 
19620 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  methods..**.****
19630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19640 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66  ** End sqlite3_f
19650 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a  ile Methods ****
19660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
19680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
196a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
196b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
196c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
196d0 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64  ** This vector d
196e0 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d  efines all the m
196f0 65 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20  ethods that can 
19700 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a  operate on an.**
19710 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f   sqlite3_file fo
19720 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74  r win32..*/.stat
19730 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
19740 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49  _io_methods winI
19750 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 32 2c  oMethod = {.  2,
19760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19780 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77   iVersion */.  w
19790 69 6e 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  inClose,        
197a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
197b0 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69  * xClose */.  wi
197c0 6e 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20  nRead,          
197d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
197e0 20 78 52 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57   xRead */.  winW
197f0 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
19800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
19810 57 72 69 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72  Write */.  winTr
19820 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
19830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54             /* xT
19840 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e  runcate */.  win
19850 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Sync,           
19860 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19870 78 53 79 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69  xSync */.  winFi
19880 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  leSize,         
19890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
198a0 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e  ileSize */.  win
198b0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
198c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
198d0 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e  xLock */.  winUn
198e0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
198f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
19900 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68  nlock */.  winCh
19910 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
19920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
19930 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
19940 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e   */.  winFileCon
19950 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  trol,           
19960 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f        /* xFileCo
19970 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65  ntrol */.  winSe
19980 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20  ctorSize,       
19990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
199a0 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77  ectorSize */.  w
199b0 69 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65  inDeviceCharacte
199c0 72 69 73 74 69 63 73 2c 20 20 20 20 20 20 20 2f  ristics,       /
199d0 2a 20 78 44 65 76 69 63 65 43 68 61 72 61 63 74  * xDeviceCharact
199e0 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 77 69  eristics */.  wi
199f0 6e 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20  nShmMap,        
19a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19a10 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69   xShmMap */.  wi
19a20 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20  nShmLock,       
19a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19a40 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77   xShmLock */.  w
19a50 69 6e 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20  inShmBarrier,   
19a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19a70 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f  * xShmBarrier */
19a80 0a 20 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20  .  winShmUnmap  
19a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19aa0 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20     /* xShmUnmap 
19ab0 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  */.};../********
19ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19b00 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
19b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19b20 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65  * sqlite3_vfs me
19b30 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
19b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19b50 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69  **.**.** This di
19b60 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  vision contains 
19b70 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
19b80 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e  on of methods on
19b90 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   the.** sqlite3_
19ba0 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a  vfs object..*/..
19bb0 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
19bc0 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69  UTF-8 filename i
19bd0 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
19be0 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
19bf0 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79  .** operating sy
19c00 73 74 65 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e  stem wants filen
19c10 61 6d 65 73 20 69 6e 2e 20 20 53 70 61 63 65 20  ames in.  Space 
19c20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75  to hold the resu
19c30 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65  lt.** is obtaine
19c40 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e  d from malloc an
19c50 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
19c60 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  by the calling.*
19c70 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  * function..*/.s
19c80 74 61 74 69 63 20 76 6f 69 64 20 2a 63 6f 6e 76  tatic void *conv
19c90 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
19ca0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
19cb0 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69 64 20 2a  ename){.  void *
19cc0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a  zConverted = 0;.
19cd0 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
19ce0 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
19cf0 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a   utf8ToUnicode(z
19d00 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23  Filename);.  }.#
19d10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
19d20 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
19d30 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74  se{.    zConvert
19d40 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  ed = sqlite3_win
19d50 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28  32_utf8_to_mbcs(
19d60 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zFilename);.  }.
19d70 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c  #endif.  /* call
19d80 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f  er will handle o
19d90 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a  ut of memory */.
19da0 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72    return zConver
19db0 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  ted;.}../*.** Cr
19dc0 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  eate a temporary
19dd0 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42   file name in zB
19de0 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62  uf.  zBuf must b
19df0 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 0a  e big enough to.
19e00 2a 2a 20 68 6f 6c 64 20 61 74 20 70 56 66 73 2d  ** hold at pVfs-
19e10 3e 6d 78 50 61 74 68 6e 61 6d 65 20 63 68 61 72  >mxPathname char
19e20 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  acters..*/.stati
19e30 63 20 69 6e 74 20 67 65 74 54 65 6d 70 6e 61 6d  c int getTempnam
19e40 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  e(int nBuf, char
19e50 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69   *zBuf){.  stati
19e60 63 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20  c char zChars[] 
19e70 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69  =.    "abcdefghi
19e80 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79  jklmnopqrstuvwxy
19e90 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48  z".    "ABCDEFGH
19ea0 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58  IJKLMNOPQRSTUVWX
19eb0 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36  YZ".    "0123456
19ec0 37 38 39 22 3b 0a 20 20 73 69 7a 65 5f 74 20 69  789";.  size_t i
19ed0 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 6d 70  , j;.  int nTemp
19ee0 50 61 74 68 3b 0a 20 20 63 68 61 72 20 7a 54 65  Path;.  char zTe
19ef0 6d 70 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 2b  mpPath[MAX_PATH+
19f00 32 5d 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f  2];..  /* It's o
19f10 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
19f20 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
19f30 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
19f40 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
19f50 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
19f60 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
19f70 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
19f80 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
19f90 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
19fa0 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20  ailing. .  */.  
19fb0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
19fc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
19fd0 4f 45 52 52 20 29 3b 0a 0a 20 20 6d 65 6d 73 65  OERR );..  memse
19fe0 74 28 7a 54 65 6d 70 50 61 74 68 2c 20 30 2c 20  t(zTempPath, 0, 
19ff0 4d 41 58 5f 50 41 54 48 2b 32 29 3b 0a 0a 20 20  MAX_PATH+2);..  
1a000 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 6d 70  if( sqlite3_temp
1a010 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20  _directory ){.  
1a020 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1a030 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20  tf(MAX_PATH-30, 
1a040 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c  zTempPath, "%s",
1a050 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
1a060 72 65 63 74 6f 72 79 29 3b 0a 20 20 7d 0a 23 69  rectory);.  }.#i
1a070 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
1a080 52 54 0a 20 20 65 6c 73 65 20 69 66 28 20 69 73  RT.  else if( is
1a090 4e 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72  NT() ){.    char
1a0a0 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 57 43   *zMulti;.    WC
1a0b0 48 41 52 20 7a 57 69 64 65 50 61 74 68 5b 4d 41  HAR zWidePath[MA
1a0c0 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 6f 73 47  X_PATH];.    osG
1a0d0 65 74 54 65 6d 70 50 61 74 68 57 28 4d 41 58 5f  etTempPathW(MAX_
1a0e0 50 41 54 48 2d 33 30 2c 20 7a 57 69 64 65 50 61  PATH-30, zWidePa
1a0f0 74 68 29 3b 0a 20 20 20 20 7a 4d 75 6c 74 69 20  th);.    zMulti 
1a100 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  = unicodeToUtf8(
1a110 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20  zWidePath);.    
1a120 69 66 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20  if( zMulti ){.  
1a130 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1a140 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30  intf(MAX_PATH-30
1a150 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73  , zTempPath, "%s
1a160 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20  ", zMulti);.    
1a170 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1a180 4d 75 6c 74 69 29 3b 0a 20 20 20 20 7d 65 6c 73  Multi);.    }els
1a190 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
1a1a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
1a1b0 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69  EM;.    }.  }.#i
1a1c0 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
1a1d0 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
1a1e0 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 74  e{.    char *zUt
1a1f0 66 38 3b 0a 20 20 20 20 63 68 61 72 20 7a 4d 62  f8;.    char zMb
1a200 63 73 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d  csPath[MAX_PATH]
1a210 3b 0a 20 20 20 20 6f 73 47 65 74 54 65 6d 70 50  ;.    osGetTempP
1a220 61 74 68 41 28 4d 41 58 5f 50 41 54 48 2d 33 30  athA(MAX_PATH-30
1a230 2c 20 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20  , zMbcsPath);.  
1a240 20 20 7a 55 74 66 38 20 3d 20 73 71 6c 69 74 65    zUtf8 = sqlite
1a250 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
1a260 75 74 66 38 28 7a 4d 62 63 73 50 61 74 68 29 3b  utf8(zMbcsPath);
1a270 0a 20 20 20 20 69 66 28 20 7a 55 74 66 38 20 29  .    if( zUtf8 )
1a280 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1a290 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
1a2a0 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c  H-30, zTempPath,
1a2b0 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20   "%s", zUtf8);. 
1a2c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1a2d0 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d 65  e(zUtf8);.    }e
1a2e0 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
1a2f0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
1a300 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
1a310 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20  #endif.#endif.. 
1a320 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
1a330 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
1a340 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
1a350 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61   for the tempora
1a360 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61  ry file .  ** na
1a370 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  me. If it is not
1a380 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1a390 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 6e 54  ERROR..  */.  nT
1a3a0 65 6d 70 50 61 74 68 20 3d 20 73 71 6c 69 74 65  empPath = sqlite
1a3b0 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 50  3Strlen30(zTempP
1a3c0 61 74 68 29 3b 0a 0a 20 20 69 66 28 20 28 6e 54  ath);..  if( (nT
1a3d0 65 6d 70 50 61 74 68 20 2b 20 73 71 6c 69 74 65  empPath + sqlite
1a3e0 33 53 74 72 6c 65 6e 33 30 28 53 51 4c 49 54 45  3Strlen30(SQLITE
1a3f0 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
1a400 58 29 20 2b 20 31 38 29 20 3e 3d 20 6e 42 75 66  X) + 18) >= nBuf
1a410 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1a420 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
1a430 0a 0a 20 20 66 6f 72 28 69 3d 6e 54 65 6d 70 50  ..  for(i=nTempP
1a440 61 74 68 3b 20 69 3e 30 20 26 26 20 7a 54 65 6d  ath; i>0 && zTem
1a450 70 50 61 74 68 5b 69 2d 31 5d 3d 3d 27 5c 5c 27  pPath[i-1]=='\\'
1a460 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a 54 65 6d 70  ; i--){}.  zTemp
1a470 50 61 74 68 5b 69 5d 20 3d 20 30 3b 0a 0a 20 20  Path[i] = 0;..  
1a480 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1a490 28 6e 42 75 66 2d 31 38 2c 20 7a 42 75 66 2c 20  (nBuf-18, zBuf, 
1a4a0 28 6e 54 65 6d 70 50 61 74 68 20 3e 20 30 29 20  (nTempPath > 0) 
1a4b0 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
1a4c0 20 20 20 20 20 20 20 20 20 22 25 73 5c 5c 22 53           "%s\\"S
1a4d0 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
1a4e0 50 52 45 46 49 58 20 3a 20 53 51 4c 49 54 45 5f  PREFIX : SQLITE_
1a4f0 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
1a500 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a510 20 20 20 20 20 7a 54 65 6d 70 50 61 74 68 29 3b       zTempPath);
1a520 0a 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 53 74  .  j = sqlite3St
1a530 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20  rlen30(zBuf);.  
1a540 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
1a550 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29  ss(15, &zBuf[j])
1a560 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31  ;.  for(i=0; i<1
1a570 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20  5; i++, j++){.  
1a580 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61    zBuf[j] = (cha
1a590 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69  r)zChars[ ((unsi
1a5a0 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a  gned char)zBuf[j
1a5b0 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72  ])%(sizeof(zChar
1a5c0 73 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a  s)-1) ];.  }.  z
1a5d0 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7a 42  Buf[j] = 0;.  zB
1a5e0 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 0a 20 20  uf[j+1] = 0;..  
1a5f0 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 20 46  OSTRACE(("TEMP F
1a600 49 4c 45 4e 41 4d 45 3a 20 25 73 5c 6e 22 2c 20  ILENAME: %s\n", 
1a610 7a 42 75 66 29 29 3b 0a 20 20 72 65 74 75 72 6e  zBuf));.  return
1a620 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a   SQLITE_OK; .}..
1a630 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
1a640 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 66  E if the named f
1a650 69 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ile is really a 
1a660 64 69 72 65 63 74 6f 72 79 2e 20 20 52 65 74 75  directory.  Retu
1a670 72 6e 20 66 61 6c 73 65 20 69 66 0a 2a 2a 20 69  rn false if.** i
1a680 74 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f  t is something o
1a690 74 68 65 72 20 74 68 61 6e 20 61 20 64 69 72 65  ther than a dire
1a6a0 63 74 6f 72 79 2c 20 6f 72 20 69 66 20 74 68 65  ctory, or if the
1a6b0 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f  re is any kind o
1a6c0 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f  f memory.** allo
1a6d0 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  cation failure..
1a6e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1a6f0 6e 49 73 44 69 72 28 63 6f 6e 73 74 20 76 6f 69  nIsDir(const voi
1a700 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 29 7b 0a  d *zConverted){.
1a710 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20    DWORD attr;.  
1a720 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57  int rc = 0;.  DW
1a730 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a  ORD lastErrno;..
1a740 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
1a750 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
1a760 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f  .    WIN32_FILE_
1a770 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73  ATTRIBUTE_DATA s
1a780 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65  AttrData;.    me
1a790 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c  mset(&sAttrData,
1a7a0 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72   0, sizeof(sAttr
1a7b0 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c  Data));.    whil
1a7c0 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46  e( !(rc = osGetF
1a7d0 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
1a7e0 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
1a7f0 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
1a800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a810 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f     GetFileExInfo
1a820 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20  Standard,.      
1a830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a840 20 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74         &sAttrDat
1a850 61 29 29 20 26 26 20 72 65 74 72 79 49 6f 65 72  a)) && retryIoer
1a860 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
1a870 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20  no) ){}.    if( 
1a880 21 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !rc ){.      ret
1a890 75 72 6e 20 30 3b 20 2f 2a 20 49 6e 76 61 6c 69  urn 0; /* Invali
1a8a0 64 20 6e 61 6d 65 3f 20 2a 2f 0a 20 20 20 20 7d  d name? */.    }
1a8b0 0a 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74  .    attr = sAtt
1a8c0 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72  rData.dwFileAttr
1a8d0 69 62 75 74 65 73 3b 0a 23 69 66 20 53 51 4c 49  ibutes;.#if SQLI
1a8e0 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20  TE_OS_WINCE==0. 
1a8f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72   }else{.    attr
1a900 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
1a910 69 62 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a  ibutesA((char*)z
1a920 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64  Converted);.#end
1a930 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  if.  }.  return 
1a940 28 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46  (attr!=INVALID_F
1a950 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 29 20  ILE_ATTRIBUTES) 
1a960 26 26 20 28 61 74 74 72 26 46 49 4c 45 5f 41 54  && (attr&FILE_AT
1a970 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52  TRIBUTE_DIRECTOR
1a980 59 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  Y);.}../*.** Ope
1a990 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  n a file..*/.sta
1a9a0 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28  tic int winOpen(
1a9b0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1a9c0 70 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20  pVfs,        /* 
1a9d0 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f  Not used */.  co
1a9e0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
1a9f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1aa00 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46  of the file (UTF
1aa10 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  -8) */.  sqlite3
1aa20 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20  _file *id,      
1aa30 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
1aa40 53 51 4c 69 74 65 20 66 69 6c 65 20 68 61 6e 64  SQLite file hand
1aa50 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  le here */.  int
1aa60 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
1aa70 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d         /* Open m
1aa80 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69  ode flags */.  i
1aa90 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20  nt *pOutFlags   
1aaa0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
1aab0 75 73 20 72 65 74 75 72 6e 20 66 6c 61 67 73 20  us return flags 
1aac0 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68  */.){.  HANDLE h
1aad0 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
1aae0 72 6e 6f 3b 0a 20 20 44 57 4f 52 44 20 64 77 44  rno;.  DWORD dwD
1aaf0 65 73 69 72 65 64 41 63 63 65 73 73 3b 0a 20 20  esiredAccess;.  
1ab00 44 57 4f 52 44 20 64 77 53 68 61 72 65 4d 6f 64  DWORD dwShareMod
1ab10 65 3b 0a 20 20 44 57 4f 52 44 20 64 77 43 72 65  e;.  DWORD dwCre
1ab20 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
1ab30 3b 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67  ;.  DWORD dwFlag
1ab40 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
1ab50 20 30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   0;.#if SQLITE_O
1ab60 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 69 73  S_WINCE.  int is
1ab70 54 65 6d 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66  Temp = 0;.#endif
1ab80 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
1ab90 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
1aba0 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
1abb0 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  rted;           
1abc0 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69     /* Filename i
1abd0 6e 20 4f 53 20 65 6e 63 6f 64 69 6e 67 20 2a 2f  n OS encoding */
1abe0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1abf0 55 74 66 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  Utf8Name = zName
1ac00 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e  ; /* Filename in
1ac10 20 55 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20   UTF-8 encoding 
1ac20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  */.  int cnt = 0
1ac30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d  ;..  /* If argum
1ac40 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e  ent zPath is a N
1ac50 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69  ULL pointer, thi
1ac60 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  s function is re
1ac70 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20  quired to open. 
1ac80 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20   ** a temporary 
1ac90 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62  file. Use this b
1aca0 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74  uffer to store t
1acb0 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e  he file name in.
1acc0 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d  .  */.  char zTm
1acd0 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 2b 32  pname[MAX_PATH+2
1ace0 5d 3b 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72  ];     /* Buffer
1acf0 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20   used to create 
1ad00 74 65 6d 70 20 66 69 6c 65 6e 61 6d 65 20 2a 2f  temp filename */
1ad10 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ..  int rc = SQL
1ad20 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
1ad30 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52     /* Function R
1ad40 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69  eturn Code */.#i
1ad50 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
1ad60 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  G) || SQLITE_OS_
1ad70 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 54 79 70  WINCE.  int eTyp
1ad80 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46  e = flags&0xFFFF
1ad90 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f  FF00;  /* Type o
1ada0 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  f file to open *
1adb0 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20  /.#endif..  int 
1adc0 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28  isExclusive  = (
1add0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
1ade0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a  PEN_EXCLUSIVE);.
1adf0 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20    int isDelete  
1ae00 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
1ae10 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
1ae20 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20  ONCLOSE);.  int 
1ae30 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28  isCreate     = (
1ae40 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
1ae50 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 23 69 66  PEN_CREATE);.#if
1ae60 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e  ndef NDEBUG.  in
1ae70 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d  t isReadonly   =
1ae80 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1ae90 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
1aea0 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 69 73  .#endif.  int is
1aeb0 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c  ReadWrite  = (fl
1aec0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
1aed0 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 0a 23  N_READWRITE);..#
1aee0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
1aef0 69 6e 74 20 69 73 4f 70 65 6e 4a 6f 75 72 6e 61  int isOpenJourna
1af00 6c 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26  l = (isCreate &&
1af10 20 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65   (.        eType
1af20 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
1af30 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
1af40 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
1af50 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
1af60 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65  URNAL .     || e
1af70 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1af80 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 23 65 6e 64  N_WAL.  ));.#end
1af90 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  if..  /* Check t
1afa0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61  he following sta
1afb0 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65  tements are true
1afc0 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28  : .  **.  **   (
1afd0 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f  a) Exactly one o
1afe0 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45 20  f the READWRITE 
1aff0 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61  and READONLY fla
1b000 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20  gs must be set, 
1b010 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20  and .  **   (b) 
1b020 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65 74  if CREATE is set
1b030 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54 45  , then READWRITE
1b040 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
1b050 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63  t, and.  **   (c
1b060 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20 69  ) if EXCLUSIVE i
1b070 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41  s set, then CREA
1b080 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
1b090 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20  set..  **   (d) 
1b0a0 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  if DELETEONCLOSE
1b0b0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
1b0c0 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
1b0d0 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e set..  */.  as
1b0e0 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79  sert((isReadonly
1b0f0 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
1b100 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61  te==0) && (isRea
1b110 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64  dWrite || isRead
1b120 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74  only));.  assert
1b130 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20  (isCreate==0 || 
1b140 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20  isReadWrite);.  
1b150 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73 69  assert(isExclusi
1b160 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74  ve==0 || isCreat
1b170 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44  e);.  assert(isD
1b180 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72  elete==0 || isCr
1b190 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  eate);..  /* The
1b1a0 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a   main DB, main j
1b1b0 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65  ournal, WAL file
1b1c0 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72   and master jour
1b1d0 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20  nal are never . 
1b1e0 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
1b1f0 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61  y deleted. Nor a
1b200 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d  re they ever tem
1b210 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a  porary files.  *
1b220 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  /.  assert( (!is
1b230 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
1b240 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
1b250 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29  E_OPEN_MAIN_DB )
1b260 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
1b270 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
1b280 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
1b290 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
1b2a0 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
1b2b0 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
1b2c0 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
1b2d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
1b2e0 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  ER_JOURNAL );.  
1b2f0 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
1b300 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
1b310 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
1b320 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20  EN_WAL );..  /* 
1b330 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
1b340 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20  upper layer has 
1b350 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22  set one of the "
1b360 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73  file-type" flags
1b370 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65  . */.  assert( e
1b380 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1b390 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c  N_MAIN_DB      |
1b3a0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
1b3b0 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20  OPEN_TEMP_DB .  
1b3c0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
1b3d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1b3e0 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65  JOURNAL || eType
1b3f0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
1b400 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  MP_JOURNAL .    
1b410 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
1b420 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
1b430 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  NAL   || eType==
1b440 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
1b450 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  ER_JOURNAL .    
1b460 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
1b470 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
1b480 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d  NT_DB || eType==
1b490 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
1b4a0 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20    );..  assert( 
1b4b0 69 64 21 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45  id!=0 );.  UNUSE
1b4c0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
1b4d0 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  );..#if SQLITE_O
1b4e0 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 21 73  S_WINRT.  if( !s
1b4f0 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
1b500 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73 71 6c  ctory ){.    sql
1b510 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
1b520 45 52 52 4f 52 2c 0a 20 20 20 20 20 20 20 20 22  ERROR,.        "
1b530 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
1b540 65 63 74 6f 72 79 20 76 61 72 69 61 62 6c 65 20  ectory variable 
1b550 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 66 6f  should be set fo
1b560 72 20 57 69 6e 52 54 22 29 3b 0a 20 20 7d 0a 23  r WinRT");.  }.#
1b570 65 6e 64 69 66 0a 0a 20 20 70 46 69 6c 65 2d 3e  endif..  pFile->
1b580 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44  h = INVALID_HAND
1b590 4c 45 5f 56 41 4c 55 45 3b 0a 0a 20 20 2f 2a 20  LE_VALUE;..  /* 
1b5a0 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
1b5b0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
1b5c0 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c  unction is NULL,
1b5d0 20 67 65 6e 65 72 61 74 65 20 61 20 0a 20 20 2a   generate a .  *
1b5e0 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  * temporary file
1b5f0 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 0a 20 20   name to use .  
1b600 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e  */.  if( !zUtf8N
1b610 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ame ){.    asser
1b620 74 28 69 73 44 65 6c 65 74 65 20 26 26 20 21 69  t(isDelete && !i
1b630 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  sOpenJournal);. 
1b640 20 20 20 72 63 20 3d 20 67 65 74 54 65 6d 70 6e     rc = getTempn
1b650 61 6d 65 28 4d 41 58 5f 50 41 54 48 2b 32 2c 20  ame(MAX_PATH+2, 
1b660 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69  zTmpname);.    i
1b670 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b680 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1b690 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   rc;.    }.    z
1b6a0 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e  Utf8Name = zTmpn
1b6b0 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ame;.  }..  /* D
1b6c0 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
1b6d0 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72  s are double-zer
1b6e0 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20  o terminated if 
1b6f0 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 2a  they are not.  *
1b700 2a 20 55 52 49 73 20 77 69 74 68 20 70 61 72 61  * URIs with para
1b710 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20  meters.  Hence, 
1b720 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20  they can always 
1b730 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20  be passed into. 
1b740 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f   ** sqlite3_uri_
1b750 70 61 72 61 6d 65 74 65 72 28 29 2e 0a 20 20 2a  parameter()..  *
1b760 2f 0a 20 20 61 73 73 65 72 74 28 20 28 65 54 79  /.  assert( (eTy
1b770 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
1b780 4d 41 49 4e 5f 44 42 29 20 7c 7c 20 28 66 6c 61  MAIN_DB) || (fla
1b790 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
1b7a0 5f 55 52 49 29 20 7c 7c 0a 20 20 20 20 20 20 20  _URI) ||.       
1b7b0 20 7a 55 74 66 38 4e 61 6d 65 5b 73 74 72 6c 65   zUtf8Name[strle
1b7c0 6e 28 7a 55 74 66 38 4e 61 6d 65 29 2b 31 5d 3d  n(zUtf8Name)+1]=
1b7d0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76  =0 );..  /* Conv
1b7e0 65 72 74 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  ert the filename
1b7f0 20 74 6f 20 74 68 65 20 73 79 73 74 65 6d 20 65   to the system e
1b800 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43  ncoding. */.  zC
1b810 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65  onverted = conve
1b820 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  rtUtf8Filename(z
1b830 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66 28  Utf8Name);.  if(
1b840 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
1b850 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1b860 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
1b870 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 69 6e 49  .  }..  if( winI
1b880 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29  sDir(zConverted)
1b890 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1b8a0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
1b8b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1b8c0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44  ITE_CANTOPEN_ISD
1b8d0 49 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69  IR;.  }..  if( i
1b8e0 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20  sReadWrite ){.  
1b8f0 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
1b900 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44  s = GENERIC_READ
1b910 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45   | GENERIC_WRITE
1b920 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
1b930 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20 3d  wDesiredAccess =
1b940 20 47 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20   GENERIC_READ;. 
1b950 20 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f   }..  /* SQLITE_
1b960 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 69  OPEN_EXCLUSIVE i
1b970 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73  s used to make s
1b980 75 72 65 20 74 68 61 74 20 61 20 6e 65 77 20 66  ure that a new f
1b990 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 63 72 65  ile is .  ** cre
1b9a0 61 74 65 64 2e 20 53 51 4c 69 74 65 20 64 6f 65  ated. SQLite doe
1b9b0 73 6e 27 74 20 75 73 65 20 69 74 20 74 6f 20 69  sn't use it to i
1b9c0 6e 64 69 63 61 74 65 20 22 65 78 63 6c 75 73 69  ndicate "exclusi
1b9d0 76 65 20 61 63 63 65 73 73 22 20 0a 20 20 2a 2a  ve access" .  **
1b9e0 20 61 73 20 69 74 20 69 73 20 75 73 75 61 6c 6c   as it is usuall
1b9f0 79 20 75 6e 64 65 72 73 74 6f 6f 64 2e 0a 20 20  y understood..  
1ba00 2a 2f 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75  */.  if( isExclu
1ba10 73 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43  sive ){.    /* C
1ba20 72 65 61 74 65 73 20 61 20 6e 65 77 20 66 69 6c  reates a new fil
1ba30 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 64 6f  e, only if it do
1ba40 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
1ba50 78 69 73 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20  xist. */.    /* 
1ba60 49 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73  If the file exis
1ba70 74 73 2c 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f  ts, it fails. */
1ba80 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44  .    dwCreationD
1ba90 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 43 52 45  isposition = CRE
1baa0 41 54 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73 65  ATE_NEW;.  }else
1bab0 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29 7b   if( isCreate ){
1bac0 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 65 78 69  .    /* Open exi
1bad0 73 74 69 6e 67 20 66 69 6c 65 2c 20 6f 72 20 63  sting file, or c
1bae0 72 65 61 74 65 20 69 66 20 69 74 20 64 6f 65 73  reate if it does
1baf0 6e 27 74 20 65 78 69 73 74 20 2a 2f 0a 20 20 20  n't exist */.   
1bb00 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
1bb10 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c  sition = OPEN_AL
1bb20 57 41 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  WAYS;.  }else{. 
1bb30 20 20 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69     /* Opens a fi
1bb40 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 65  le, only if it e
1bb50 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20 64 77  xists. */.    dw
1bb60 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
1bb70 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54  ion = OPEN_EXIST
1bb80 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20 64 77 53 68  ING;.  }..  dwSh
1bb90 61 72 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53  areMode = FILE_S
1bba0 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45  HARE_READ | FILE
1bbb0 5f 53 48 41 52 45 5f 57 52 49 54 45 3b 0a 0a 20  _SHARE_WRITE;.. 
1bbc0 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b   if( isDelete ){
1bbd0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1bbe0 49 4e 43 45 0a 20 20 20 20 64 77 46 6c 61 67 73  INCE.    dwFlags
1bbf0 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20  AndAttributes = 
1bc00 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48  FILE_ATTRIBUTE_H
1bc10 49 44 44 45 4e 3b 0a 20 20 20 20 69 73 54 65 6d  IDDEN;.    isTem
1bc20 70 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20  p = 1;.#else.   
1bc30 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
1bc40 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54  butes = FILE_ATT
1bc50 52 49 42 55 54 45 5f 54 45 4d 50 4f 52 41 52 59  RIBUTE_TEMPORARY
1bc60 0a 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 20 20 20 20                  
1bc80 7c 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  | FILE_ATTRIBUTE
1bc90 5f 48 49 44 44 45 4e 0a 20 20 20 20 20 20 20 20  _HIDDEN.        
1bca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcb0 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c         | FILE_FL
1bcc0 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f  AG_DELETE_ON_CLO
1bcd0 53 45 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  SE;.#endif.  }el
1bce0 73 65 7b 0a 20 20 20 20 64 77 46 6c 61 67 73 41  se{.    dwFlagsA
1bcf0 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46  ndAttributes = F
1bd00 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f  ILE_ATTRIBUTE_NO
1bd10 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52  RMAL;.  }.  /* R
1bd20 65 70 6f 72 74 73 20 66 72 6f 6d 20 74 68 65 20  eports from the 
1bd30 69 6e 74 65 72 6e 65 74 20 61 72 65 20 74 68 61  internet are tha
1bd40 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 73  t performance is
1bd50 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65 74   always.  ** bet
1bd60 74 65 72 20 69 66 20 46 49 4c 45 5f 46 4c 41 47  ter if FILE_FLAG
1bd70 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69  _RANDOM_ACCESS i
1bd80 73 20 75 73 65 64 2e 20 20 54 69 63 6b 65 74 20  s used.  Ticket 
1bd90 23 32 36 39 39 2e 20 2a 2f 0a 23 69 66 20 53 51  #2699. */.#if SQ
1bda0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
1bdb0 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
1bdc0 75 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41  utes |= FILE_FLA
1bdd0 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b  G_RANDOM_ACCESS;
1bde0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 69  .#endif..  if( i
1bdf0 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c  sNT() ){.#if SQL
1be00 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
1be10 20 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54   CREATEFILE2_EXT
1be20 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53  ENDED_PARAMETERS
1be30 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
1be40 65 72 73 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  ers;.    extende
1be50 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53 69  dParameters.dwSi
1be60 7a 65 20 3d 20 73 69 7a 65 6f 66 28 43 52 45 41  ze = sizeof(CREA
1be70 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44  TEFILE2_EXTENDED
1be80 5f 50 41 52 41 4d 45 54 45 52 53 29 3b 0a 20 20  _PARAMETERS);.  
1be90 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
1bea0 74 65 72 73 2e 64 77 46 69 6c 65 41 74 74 72 69  ters.dwFileAttri
1beb0 62 75 74 65 73 20 3d 0a 20 20 20 20 20 20 20 20  butes =.        
1bec0 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
1bed0 74 72 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f  tributes & FILE_
1bee0 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 3b 0a  ATTRIBUTE_MASK;.
1bef0 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
1bf00 6d 65 74 65 72 73 2e 64 77 46 69 6c 65 46 6c 61  meters.dwFileFla
1bf10 67 73 20 3d 20 64 77 46 6c 61 67 73 41 6e 64 41  gs = dwFlagsAndA
1bf20 74 74 72 69 62 75 74 65 73 20 26 20 46 49 4c 45  ttributes & FILE
1bf30 5f 46 4c 41 47 5f 4d 41 53 4b 3b 0a 20 20 20 20  _FLAG_MASK;.    
1bf40 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
1bf50 72 73 2e 64 77 53 65 63 75 72 69 74 79 51 6f 73  rs.dwSecurityQos
1bf60 46 6c 61 67 73 20 3d 20 53 45 43 55 52 49 54 59  Flags = SECURITY
1bf70 5f 41 4e 4f 4e 59 4d 4f 55 53 3b 0a 20 20 20 20  _ANONYMOUS;.    
1bf80 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
1bf90 72 73 2e 6c 70 53 65 63 75 72 69 74 79 41 74 74  rs.lpSecurityAtt
1bfa0 72 69 62 75 74 65 73 20 3d 20 4e 55 4c 4c 3b 0a  ributes = NULL;.
1bfb0 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
1bfc0 6d 65 74 65 72 73 2e 68 54 65 6d 70 6c 61 74 65  meters.hTemplate
1bfd0 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  File = NULL;.   
1bfe0 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43   while( (h = osC
1bff0 72 65 61 74 65 46 69 6c 65 32 28 28 4c 50 43 57  reateFile2((LPCW
1c000 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  STR)zConverted,.
1c010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
1c030 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20  DesiredAccess,. 
1c040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c050 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53               dwS
1c060 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20 20  hareMode,.      
1c070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c080 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69          dwCreati
1c090 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20  onDisposition,. 
1c0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 65 78               &ex
1c0c0 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
1c0d0 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ))==INVALID_HAND
1c0e0 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20  LE_VALUE &&.    
1c0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c100 20 20 20 20 20 20 20 20 20 20 72 65 74 72 79 49            retryI
1c110 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
1c120 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  Errno) ){.      
1c130 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70           /* Noop
1c140 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a   */.    }.#else.
1c150 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20      while( (h = 
1c160 6f 73 43 72 65 61 74 65 46 69 6c 65 57 28 28 4c  osCreateFileW((L
1c170 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
1c180 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
1c190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1a0 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
1c1b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1d0 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c  dwShareMode, NUL
1c1e0 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
1c1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c200 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
1c210 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  sition,.        
1c220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c230 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64        dwFlagsAnd
1c240 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20  Attributes,.    
1c250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c260 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 29            NULL))
1c270 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
1c280 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20  _VALUE &&.      
1c290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2a0 20 20 20 20 20 20 20 20 72 65 74 72 79 49 6f 65          retryIoe
1c2b0 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
1c2c0 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rno) ){.        
1c2d0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a         /* Noop *
1c2e0 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  /.    }.#endif. 
1c2f0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
1c300 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
1c310 20 20 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c    else{.    whil
1c320 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65  e( (h = osCreate
1c330 46 69 6c 65 41 28 28 4c 50 43 53 54 52 29 7a 43  FileA((LPCSTR)zC
1c340 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
1c350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c360 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65          dwDesire
1c370 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20  dAccess,.       
1c380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c390 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f         dwShareMo
1c3a0 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20  de, NULL,.      
1c3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3c0 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69          dwCreati
1c3d0 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20  onDisposition,. 
1c3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46               dwF
1c400 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
1c410 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
1c420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c430 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44   NULL))==INVALID
1c440 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26  _HANDLE_VALUE &&
1c450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1c470 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
1c480 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20  &lastErrno) ){. 
1c490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c4a0 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 20   Noop */.    }. 
1c4b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 6c 6f 67 49   }.#endif.  logI
1c4c0 6f 65 72 72 28 63 6e 74 29 3b 0a 0a 20 20 4f 53  oerr(cnt);..  OS
1c4d0 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20  TRACE(("OPEN %d 
1c4e0 25 73 20 30 78 25 6c 78 20 25 73 5c 6e 22 2c 20  %s 0x%lx %s\n", 
1c4f0 0a 20 20 20 20 20 20 20 20 20 20 20 68 2c 20 7a  .           h, z
1c500 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64 41  Name, dwDesiredA
1c510 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20 20 20  ccess, .        
1c520 20 20 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41     h==INVALID_HA
1c530 4e 44 4c 45 5f 56 41 4c 55 45 20 3f 20 22 66 61  NDLE_VALUE ? "fa
1c540 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a  iled" : "ok"));.
1c550 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49  .  if( h==INVALI
1c560 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
1c570 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
1c580 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
1c590 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  no;.    winLogEr
1c5a0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
1c5b0 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  PEN, pFile->last
1c5c0 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 65 6e 22  Errno, "winOpen"
1c5d0 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20  , zUtf8Name);.  
1c5e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1c5f0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
1c600 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
1c610 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65 20  && !isExclusive 
1c620 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1c630 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e  winOpen(pVfs, zN
1c640 61 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20 20 20  ame, id, .      
1c650 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53         ((flags|S
1c660 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
1c670 4e 4c 59 29 26 7e 28 53 51 4c 49 54 45 5f 4f 50  NLY)&~(SQLITE_OP
1c680 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45  EN_CREATE|SQLITE
1c690 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
1c6a0 29 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20  ), pOutFlags);. 
1c6b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c6c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
1c6d0 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
1c6e0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f   }.  }..  if( pO
1c6f0 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 69  utFlags ){.    i
1c700 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29  f( isReadWrite )
1c710 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61  {.      *pOutFla
1c720 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
1c730 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20  _READWRITE;.    
1c740 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f  }else{.      *pO
1c750 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  utFlags = SQLITE
1c760 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
1c770 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6d 65 6d      }.  }..  mem
1c780 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69  set(pFile, 0, si
1c790 7a 65 6f 66 28 2a 70 46 69 6c 65 29 29 3b 0a 20  zeof(*pFile));. 
1c7a0 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20   pFile->pMethod 
1c7b0 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a  = &winIoMethod;.
1c7c0 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a    pFile->h = h;.
1c7d0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1c7e0 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20  no = NO_ERROR;. 
1c7f0 20 70 46 69 6c 65 2d 3e 70 56 66 73 20 3d 20 70   pFile->pVfs = p
1c800 56 66 73 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Vfs;.#ifndef SQL
1c810 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 70  ITE_OMIT_WAL.  p
1c820 46 69 6c 65 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a  File->pShm = 0;.
1c830 23 65 6e 64 69 66 0a 20 20 70 46 69 6c 65 2d 3e  #endif.  pFile->
1c840 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zPath = zName;. 
1c850 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69   if( sqlite3_uri
1c860 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20  _boolean(zName, 
1c870 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50  "psow", SQLITE_P
1c880 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1c890 54 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  TE) ){.    pFile
1c8a0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57  ->ctrlFlags |= W
1c8b0 49 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d  INFILE_PSOW;.  }
1c8c0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
1c8d0 57 49 4e 43 45 0a 20 20 69 66 28 20 69 73 52 65  WINCE.  if( isRe
1c8e0 61 64 57 72 69 74 65 20 26 26 20 65 54 79 70 65  adWrite && eType
1c8f0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
1c900 49 4e 5f 44 42 0a 20 20 20 20 20 20 20 26 26 20  IN_DB.       && 
1c910 21 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b  !winceCreateLock
1c920 28 7a 4e 61 6d 65 2c 20 70 46 69 6c 65 29 0a 20  (zName, pFile). 
1c930 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48   ){.    osCloseH
1c940 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20 20 73 71  andle(h);.    sq
1c950 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
1c960 65 72 74 65 64 29 3b 0a 20 20 20 20 72 65 74 75  erted);.    retu
1c970 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
1c980 45 4e 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  EN_BKPT;.  }.  i
1c990 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  f( isTemp ){.   
1c9a0 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f   pFile->zDeleteO
1c9b0 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72  nClose = zConver
1c9c0 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  ted;.  }else.#en
1c9d0 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69  dif.  {.    sqli
1c9e0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
1c9f0 74 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 4f 70 65  ted);.  }..  Ope
1ca00 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20  nCounter(+1);.  
1ca10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ca20 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e  .** Delete the n
1ca30 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  amed file..**.**
1ca40 20 4e 6f 74 65 20 74 68 61 74 20 57 69 6e 64 6f   Note that Windo
1ca50 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f  ws does not allo
1ca60 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65 20 64  w a file to be d
1ca70 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  eleted if some o
1ca80 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20  ther.** process 
1ca90 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f  has it open.  So
1caa0 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75 73 20  metimes a virus 
1cab0 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78  scanner or index
1cac0 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77  ing program.** w
1cad0 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e  ill open a journ
1cae0 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c 79 20  al file shortly 
1caf0 61 66 74 65 72 20 69 74 20 69 73 20 63 72 65 61  after it is crea
1cb00 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ted in order to 
1cb10 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 20 69  do.** whatever i
1cb20 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20 74  t does.  While t
1cb30 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73  his other proces
1cb40 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  s is holding the
1cb50 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77  .** file open, w
1cb60 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65  e will be unable
1cb70 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20   to delete it.  
1cb80 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
1cb90 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20  his.** problem, 
1cba0 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c  we delay 100 mil
1cbb0 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72  liseconds and tr
1cbc0 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69  y to delete agai
1cbd0 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f  n.  Up.** to MX_
1cbe0 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54  DELETION_ATTEMPT
1cbf0 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d  s deletion attem
1cc00 70 74 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f  pts are run befo
1cc10 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20  re giving.** up 
1cc20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  and returning an
1cc30 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
1cc40 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28  c int winDelete(
1cc50 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1cc60 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 2f  pVfs,          /
1cc70 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69  * Not used on wi
1cc80 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  n32 */.  const c
1cc90 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1cca0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1ccb0 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 2a  file to delete *
1ccc0 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20  /.  int syncDir 
1ccd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cce0 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
1ccf0 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  in32 */.){.  int
1cd00 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20   cnt = 0;.  int 
1cd10 72 63 3b 0a 20 20 44 57 4f 52 44 20 61 74 74 72  rc;.  DWORD attr
1cd20 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
1cd30 72 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  rno;.  void *zCo
1cd40 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45  nverted;.  UNUSE
1cd50 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
1cd60 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1cd70 4d 45 54 45 52 28 73 79 6e 63 44 69 72 29 3b 0a  METER(syncDir);.
1cd80 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1cd90 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
1cda0 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a  _IOERR_DELETE);.
1cdb0 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63    zConverted = c
1cdc0 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61  onvertUtf8Filena
1cdd0 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
1cde0 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
1cdf0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1ce00 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
1ce10 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  MEM;.  }.  if( i
1ce20 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 64 6f 20  sNT() ){.    do 
1ce30 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
1ce40 57 49 4e 52 54 0a 20 20 20 20 20 20 57 49 4e 33  WINRT.      WIN3
1ce50 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  2_FILE_ATTRIBUTE
1ce60 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b  _DATA sAttrData;
1ce70 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73  .      memset(&s
1ce80 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a  AttrData, 0, siz
1ce90 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b  eof(sAttrData));
1cea0 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 47 65  .      if ( osGe
1ceb0 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
1cec0 78 57 28 7a 43 6f 6e 76 65 72 74 65 64 2c 20 47  xW(zConverted, G
1ced0 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e  etFileExInfoStan
1cee0 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20  dard,.          
1cef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf00 20 20 20 20 20 20 20 20 26 73 41 74 74 72 44 61          &sAttrDa
1cf10 74 61 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ta) ){.        a
1cf20 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e  ttr = sAttrData.
1cf30 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  dwFileAttributes
1cf40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1cf50 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1cf60 54 45 5f 4f 4b 3b 20 2f 2a 20 41 6c 72 65 61 64  TE_OK; /* Alread
1cf70 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20  y gone? */.     
1cf80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1cf90 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 61 74  }.#else.      at
1cfa0 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  tr = osGetFileAt
1cfb0 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65  tributesW(zConve
1cfc0 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rted);.#endif.  
1cfd0 20 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49      if ( attr==I
1cfe0 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
1cff0 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20  IBUTES ){.      
1d000 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1d010 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e  ; /* Already gon
1d020 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  e? */.        br
1d030 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1d040 20 20 20 69 66 20 28 20 61 74 74 72 26 46 49 4c     if ( attr&FIL
1d050 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45  E_ATTRIBUTE_DIRE
1d060 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20  CTORY ){.       
1d070 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
1d080 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c  OR; /* Files onl
1d090 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  y. */.        br
1d0a0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1d0b0 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65     if ( osDelete
1d0c0 46 69 6c 65 57 28 7a 43 6f 6e 76 65 72 74 65 64  FileW(zConverted
1d0d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
1d0e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20  = SQLITE_OK; /* 
1d0f0 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20  Deleted OK. */. 
1d100 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1d110 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
1d120 20 21 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e   !retryIoerr(&cn
1d130 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
1d140 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1d150 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
1d160 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 73 2e  No more retries.
1d170 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
1d180 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1d190 20 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23   while(1);.  }.#
1d1a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
1d1b0 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
1d1c0 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20  se{.    do {.   
1d1d0 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46     attr = osGetF
1d1e0 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 7a  ileAttributesA(z
1d1f0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
1d200 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56    if ( attr==INV
1d210 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
1d220 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20  UTES ){.        
1d230 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1d240 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f  /* Already gone?
1d250 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
1d260 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1d270 20 69 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f   if ( attr&FILE_
1d280 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54  ATTRIBUTE_DIRECT
1d290 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ORY ){.        r
1d2a0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1d2b0 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e  ; /* Files only.
1d2c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
1d2d0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1d2e0 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69   if ( osDeleteFi
1d2f0 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 20  leA(zConverted) 
1d300 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1d310 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65  SQLITE_OK; /* De
1d320 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20  leted OK. */.   
1d330 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d340 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21    }.      if ( !
1d350 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  retryIoerr(&cnt,
1d360 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a   &lastErrno) ){.
1d370 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1d380 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f  ITE_ERROR; /* No
1d390 20 6d 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a   more retries. *
1d3a0 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
1d3b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77  .      }.    } w
1d3c0 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 65 6e  hile(1);.  }.#en
1d3d0 64 69 66 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  dif.  if( rc ){.
1d3e0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
1d3f0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1d400 52 5f 44 45 4c 45 54 45 2c 20 6c 61 73 74 45 72  R_DELETE, lastEr
1d410 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
1d420 20 20 22 77 69 6e 44 65 6c 65 74 65 22 2c 20 7a    "winDelete", z
1d430 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c  Filename);.  }el
1d440 73 65 7b 0a 20 20 20 20 6c 6f 67 49 6f 65 72 72  se{.    logIoerr
1d450 28 63 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  (cnt);.  }.  sql
1d460 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
1d470 72 74 65 64 29 3b 0a 20 20 4f 53 54 52 41 43 45  rted);.  OSTRACE
1d480 28 28 22 44 45 4c 45 54 45 20 5c 22 25 73 5c 22  (("DELETE \"%s\"
1d490 20 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d   %s\n", zFilenam
1d4a0 65 2c 20 28 72 63 20 3f 20 22 66 61 69 6c 65 64  e, (rc ? "failed
1d4b0 22 20 3a 20 22 6f 6b 22 20 29 29 29 3b 0a 20 20  " : "ok" )));.  
1d4c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1d4d0 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 65 78  .** Check the ex
1d4e0 69 73 74 61 6e 63 65 20 61 6e 64 20 73 74 61 74  istance and stat
1d4f0 75 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f  us of a file..*/
1d500 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 41  .static int winA
1d510 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33  ccess(.  sqlite3
1d520 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
1d530 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20      /* Not used 
1d540 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f  on win32 */.  co
1d550 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1d560 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame,     /* Name
1d570 20 6f 66 20 66 69 6c 65 20 74 6f 20 63 68 65 63   of file to chec
1d580 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  k */.  int flags
1d590 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d5a0 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 73    /* Type of tes
1d5b0 74 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69  t to make on thi
1d5c0 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
1d5d0 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20  *pResOut        
1d5e0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
1d5f0 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57  esult */.){.  DW
1d600 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20  ORD attr;.  int 
1d610 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20  rc = 0;.  DWORD 
1d620 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 76 6f 69  lastErrno;.  voi
1d630 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
1d640 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1d650 52 28 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75  R(pVfs);..  Simu
1d660 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
1d670 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1d680 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 7a 43  _ACCESS; );.  zC
1d690 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65  onverted = conve
1d6a0 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  rtUtf8Filename(z
1d6b0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
1d6c0 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
1d6d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1d6e0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
1d6f0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28  .  }.  if( isNT(
1d700 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74  ) ){.    int cnt
1d710 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f   = 0;.    WIN32_
1d720 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
1d730 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20  ATA sAttrData;. 
1d740 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72     memset(&sAttr
1d750 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Data, 0, sizeof(
1d760 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20  sAttrData));.   
1d770 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f   while( !(rc = o
1d780 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
1d790 65 73 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a  esExW((LPCWSTR)z
1d7a0 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
1d7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7c0 20 20 20 20 20 20 20 20 47 65 74 46 69 6c 65 45          GetFileE
1d7d0 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 20 0a  xInfoStandard, .
1d7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41               &sA
1d800 74 74 72 44 61 74 61 29 29 20 26 26 20 72 65 74  ttrData)) && ret
1d810 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
1d820 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20  astErrno) ){}.  
1d830 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1d840 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49    /* For an SQLI
1d850 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
1d860 20 71 75 65 72 79 2c 20 74 72 65 61 74 20 61 20   query, treat a 
1d870 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65  zero-length file
1d880 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20  .      ** as if 
1d890 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
1d8a0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
1d8b0 20 20 69 66 28 20 20 20 20 66 6c 61 67 73 3d 3d    if(    flags==
1d8c0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
1d8d0 49 53 54 53 0a 20 20 20 20 20 20 20 20 20 20 26  ISTS.          &
1d8e0 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c  & sAttrData.nFil
1d8f0 65 53 69 7a 65 48 69 67 68 3d 3d 30 20 0a 20 20  eSizeHigh==0 .  
1d900 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72          && sAttr
1d910 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f  Data.nFileSizeLo
1d920 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
1d930 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46  attr = INVALID_F
1d940 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a  ILE_ATTRIBUTES;.
1d950 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d960 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74       attr = sAtt
1d970 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72  rData.dwFileAttr
1d980 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a  ibutes;.      }.
1d990 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d9a0 20 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a   logIoerr(cnt);.
1d9b0 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72        if( lastEr
1d9c0 72 6e 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f  rno!=ERROR_FILE_
1d9d0 4e 4f 54 5f 46 4f 55 4e 44 20 26 26 20 6c 61 73  NOT_FOUND && las
1d9e0 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 50 41  tErrno!=ERROR_PA
1d9f0 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a  TH_NOT_FOUND ){.
1da00 20 20 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72          winLogEr
1da10 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1da20 5f 41 43 43 45 53 53 2c 20 6c 61 73 74 45 72 72  _ACCESS, lastErr
1da30 6e 6f 2c 20 22 77 69 6e 41 63 63 65 73 73 22 2c  no, "winAccess",
1da40 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
1da50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1da60 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
1da70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1da80 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
1da90 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  S;.      }else{.
1daa0 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 49          attr = I
1dab0 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
1dac0 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 0a  IBUTES;.      }.
1dad0 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66      }.  }.#ifdef
1dae0 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
1daf0 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
1db00 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46     attr = osGetF
1db10 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 28  ileAttributesA((
1db20 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
1db30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
1db40 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
1db50 6e 76 65 72 74 65 64 29 3b 0a 20 20 73 77 69 74  nverted);.  swit
1db60 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20  ch( flags ){.   
1db70 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
1db80 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 63 61  ESS_READ:.    ca
1db90 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
1dba0 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 72  _EXISTS:.      r
1dbb0 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49  c = attr!=INVALI
1dbc0 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
1dbd0 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  S;.      break;.
1dbe0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1dbf0 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
1dc00 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74 74  :.      rc = att
1dc10 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r!=INVALID_FILE_
1dc20 41 54 54 52 49 42 55 54 45 53 20 26 26 0a 20 20  ATTRIBUTES &&.  
1dc30 20 20 20 20 20 20 20 20 20 20 20 28 61 74 74 72             (attr
1dc40 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   & FILE_ATTRIBUT
1dc50 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a  E_READONLY)==0;.
1dc60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1dc70 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
1dc80 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64  assert(!"Invalid
1dc90 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22   flags argument"
1dca0 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75  );.  }.  *pResOu
1dcb0 74 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e  t = rc;.  return
1dcc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
1dcd0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f  /*.** Returns no
1dce0 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70  n-zero if the sp
1dcf0 65 63 69 66 69 65 64 20 70 61 74 68 20 6e 61 6d  ecified path nam
1dd00 65 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  e should be used
1dd10 20 76 65 72 62 61 74 69 6d 2e 20 20 49 66 0a 2a   verbatim.  If.*
1dd20 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65  * non-zero is re
1dd30 74 75 72 6e 65 64 20 66 72 6f 6d 20 74 68 69 73  turned from this
1dd40 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 20 63   function, the c
1dd50 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
1dd60 6d 75 73 74 20 73 69 6d 70 6c 79 0a 2a 2a 20 75  must simply.** u
1dd70 73 65 20 74 68 65 20 70 72 6f 76 69 64 65 64 20  se the provided 
1dd80 70 61 74 68 20 6e 61 6d 65 20 76 65 72 62 61 74  path name verbat
1dd90 69 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c 76 65 20  im -OR- resolve 
1dda0 69 74 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70  it into a full p
1ddb0 61 74 68 20 6e 61 6d 65 0a 2a 2a 20 75 73 69 6e  ath name.** usin
1ddc0 67 20 74 68 65 20 47 65 74 46 75 6c 6c 50 61 74  g the GetFullPat
1ddd0 68 4e 61 6d 65 20 57 69 6e 33 32 20 41 50 49 20  hName Win32 API 
1dde0 66 75 6e 63 74 69 6f 6e 20 28 69 66 20 61 76 61  function (if ava
1ddf0 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74  ilable)..*/.stat
1de00 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 56 65 72  ic BOOL winIsVer
1de10 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 0a 20  batimPathname(. 
1de20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1de30 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f 2a 0a 20  thname.){.  /*. 
1de40 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68 20   ** If the path 
1de50 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69 74 68  name starts with
1de60 20 61 20 66 6f 72 77 61 72 64 20 73 6c 61 73 68   a forward slash
1de70 20 6f 72 20 61 20 62 61 63 6b 73 6c 61 73 68 2c   or a backslash,
1de80 20 69 74 20 69 73 20 65 69 74 68 65 72 0a 20 20   it is either.  
1de90 2a 2a 20 61 20 6c 65 67 61 6c 20 55 4e 43 20 6e  ** a legal UNC n
1dea0 61 6d 65 2c 20 61 20 76 6f 6c 75 6d 65 20 72 65  ame, a volume re
1deb0 6c 61 74 69 76 65 20 70 61 74 68 2c 20 6f 72 20  lative path, or 
1dec0 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68  an absolute path
1ded0 20 6e 61 6d 65 20 69 6e 20 74 68 65 0a 20 20 2a   name in the.  *
1dee0 2a 20 22 55 6e 69 78 22 20 66 6f 72 6d 61 74 20  * "Unix" format 
1def0 6f 6e 20 57 69 6e 64 6f 77 73 2e 20 20 54 68 65  on Windows.  The
1df00 72 65 20 69 73 20 6e 6f 20 65 61 73 79 20 77 61  re is no easy wa
1df10 79 20 74 6f 20 64 69 66 66 65 72 65 6e 74 69 61  y to differentia
1df20 74 65 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20  te between.  ** 
1df30 74 68 65 20 66 69 6e 61 6c 20 74 77 6f 20 63 61  the final two ca
1df40 73 65 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  ses; therefore, 
1df50 77 65 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  we return the sa
1df60 66 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  fer return value
1df70 20 6f 66 20 54 52 55 45 0a 20 20 2a 2a 20 73 6f   of TRUE.  ** so
1df80 20 74 68 61 74 20 63 61 6c 6c 65 72 73 20 6f 66   that callers of
1df90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
1dfa0 69 6c 6c 20 73 69 6d 70 6c 79 20 75 73 65 20 69  ill simply use i
1dfb0 74 20 76 65 72 62 61 74 69 6d 2e 0a 20 20 2a 2f  t verbatim..  */
1dfc0 0a 20 20 69 66 20 28 20 7a 50 61 74 68 6e 61 6d  .  if ( zPathnam
1dfd0 65 5b 30 5d 3d 3d 27 2f 27 20 7c 7c 20 7a 50 61  e[0]=='/' || zPa
1dfe0 74 68 6e 61 6d 65 5b 30 5d 3d 3d 27 5c 5c 27 20  thname[0]=='\\' 
1dff0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52  ){.    return TR
1e000 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  UE;.  }..  /*.  
1e010 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68 20 6e  ** If the path n
1e020 61 6d 65 20 73 74 61 72 74 73 20 77 69 74 68 20  ame starts with 
1e030 61 20 6c 65 74 74 65 72 20 61 6e 64 20 61 20 63  a letter and a c
1e040 6f 6c 6f 6e 20 69 74 20 69 73 20 65 69 74 68 65  olon it is eithe
1e050 72 20 61 20 76 6f 6c 75 6d 65 0a 20 20 2a 2a 20  r a volume.  ** 
1e060 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6f 72  relative path or
1e070 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74   an absolute pat
1e080 68 2e 20 20 43 61 6c 6c 65 72 73 20 6f 66 20 74  h.  Callers of t
1e090 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  his function mus
1e0a0 74 20 6e 6f 74 0a 20 20 2a 2a 20 61 74 74 65 6d  t not.  ** attem
1e0b0 70 74 20 74 6f 20 74 72 65 61 74 20 69 74 20 61  pt to treat it a
1e0c0 73 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  s a relative pat
1e0d0 68 20 6e 61 6d 65 20 28 69 2e 65 2e 20 74 68 65  h name (i.e. the
1e0e0 79 20 73 68 6f 75 6c 64 20 73 69 6d 70 6c 79 20  y should simply 
1e0f0 75 73 65 0a 20 20 2a 2a 20 69 74 20 76 65 72 62  use.  ** it verb
1e100 61 74 69 6d 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  atim)..  */.  if
1e110 20 28 20 73 71 6c 69 74 65 33 49 73 61 6c 70 68   ( sqlite3Isalph
1e120 61 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20  a(zPathname[0]) 
1e130 26 26 20 7a 50 61 74 68 6e 61 6d 65 5b 31 5d 3d  && zPathname[1]=
1e140 3d 27 3a 27 20 29 7b 0a 20 20 20 20 72 65 74 75  =':' ){.    retu
1e150 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20  rn TRUE;.  }..  
1e160 2f 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 67 65  /*.  ** If we ge
1e170 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  t to this point,
1e180 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73   the path name s
1e190 68 6f 75 6c 64 20 61 6c 6d 6f 73 74 20 63 65 72  hould almost cer
1e1a0 74 61 69 6e 6c 79 20 62 65 20 61 20 70 75 72 65  tainly be a pure
1e1b0 6c 79 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65  ly.  ** relative
1e1c0 20 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20 61   one (i.e. not a
1e1d0 20 55 4e 43 20 6e 61 6d 65 2c 20 6e 6f 74 20 61   UNC name, not a
1e1e0 62 73 6f 6c 75 74 65 2c 20 61 6e 64 20 6e 6f 74  bsolute, and not
1e1f0 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65   volume relative
1e200 29 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  )..  */.  return
1e210 20 46 41 4c 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   FALSE;.}../*.**
1e220 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65   Turn a relative
1e230 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61   pathname into a
1e240 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20   full pathname. 
1e250 20 57 72 69 74 65 20 74 68 65 20 66 75 6c 6c 0a   Write the full.
1e260 2a 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f  ** pathname into
1e270 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d   zOut[].  zOut[]
1e280 20 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61 73   will be at leas
1e290 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  t pVfs->mxPathna
1e2a0 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  me.** bytes in s
1e2b0 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
1e2c0 6e 74 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61  nt winFullPathna
1e2d0 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  me(.  sqlite3_vf
1e2e0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
1e2f0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1e300 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a  o vfs object */.
1e310 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52    const char *zR
1e320 65 6c 61 74 69 76 65 2c 20 20 20 20 20 20 20 20  elative,        
1e330 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61  /* Possibly rela
1e340 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20  tive input path 
1e350 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20  */.  int nFull, 
1e360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e370 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75     /* Size of ou
1e380 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62  tput buffer in b
1e390 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ytes */.  char *
1e3a0 7a 46 75 6c 6c 20 20 20 20 20 20 20 20 20 20 20  zFull           
1e3b0 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
1e3c0 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20  t buffer */.){. 
1e3d0 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f   .#if defined(__
1e3e0 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75  CYGWIN__).  Simu
1e3f0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
1e400 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
1e410 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
1e420 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20  AMETER(nFull);. 
1e430 20 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d   assert( pVfs->m
1e440 78 50 61 74 68 6e 61 6d 65 3e 3d 4d 41 58 5f 50  xPathname>=MAX_P
1e450 41 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ATH );.  assert(
1e460 20 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e 6d 78   nFull>=pVfs->mx
1e470 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 69 66  Pathname );.  if
1e480 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f   ( sqlite3_data_
1e490 64 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69  directory && !wi
1e4a0 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e  nIsVerbatimPathn
1e4b0 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29  ame(zRelative) )
1e4c0 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
1e4d0 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61  NOTE: We are dea
1e4e0 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61  ling with a rela
1e4f0 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61  tive path name a
1e500 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20  nd the data.    
1e510 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f  **       directo
1e520 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  ry has been set.
1e530 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65    Therefore, use
1e540 20 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73   it as the basis
1e550 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f  .    **       fo
1e560 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65  r converting the
1e570 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
1e580 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75  ame to an absolu
1e590 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  te.    **       
1e5a0 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e  one by prependin
1e5b0 67 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63  g the data direc
1e5c0 74 6f 72 79 20 61 6e 64 20 61 20 73 6c 61 73 68  tory and a slash
1e5d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61  ..    */.    cha
1e5e0 72 20 7a 4f 75 74 5b 4d 41 58 5f 50 41 54 48 2b  r zOut[MAX_PATH+
1e5f0 31 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a  1];.    memset(z
1e600 4f 75 74 2c 20 30 2c 20 4d 41 58 5f 50 41 54 48  Out, 0, MAX_PATH
1e610 2b 31 29 3b 0a 20 20 20 20 63 79 67 77 69 6e 5f  +1);.    cygwin_
1e620 63 6f 6e 76 5f 74 6f 5f 77 69 6e 33 32 5f 70 61  conv_to_win32_pa
1e630 74 68 28 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f  th(zRelative, zO
1e640 75 74 29 3b 20 2f 2a 20 50 4f 53 49 58 20 74 6f  ut); /* POSIX to
1e650 20 57 69 6e 33 32 20 2a 2f 0a 20 20 20 20 73 71   Win32 */.    sq
1e660 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
1e670 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
1e680 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
1e690 6c 6c 2c 20 22 25 73 5c 5c 25 73 22 2c 0a 20 20  ll, "%s\\%s",.  
1e6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6b0 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f     sqlite3_data_
1e6c0 64 69 72 65 63 74 6f 72 79 2c 20 7a 4f 75 74 29  directory, zOut)
1e6d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1e6e0 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 54  *.    ** NOTE: T
1e6f0 68 65 20 43 79 67 77 69 6e 20 64 6f 63 73 20 73  he Cygwin docs s
1e700 74 61 74 65 20 74 68 61 74 20 74 68 65 20 6d 61  tate that the ma
1e710 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6e 65 65  ximum length nee
1e720 64 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ded.    **      
1e730 20 66 6f 72 20 74 68 65 20 62 75 66 66 65 72 20   for the buffer 
1e740 70 61 73 73 65 64 20 74 6f 20 63 79 67 77 69 6e  passed to cygwin
1e750 5f 63 6f 6e 76 5f 74 6f 5f 66 75 6c 6c 5f 77 69  _conv_to_full_wi
1e760 6e 33 32 5f 70 61 74 68 0a 20 20 20 20 2a 2a 20  n32_path.    ** 
1e770 20 20 20 20 20 20 69 73 20 4d 41 58 5f 50 41 54        is MAX_PAT
1e780 48 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 79  H..    */.    cy
1e790 67 77 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 66 75 6c  gwin_conv_to_ful
1e7a0 6c 5f 77 69 6e 33 32 5f 70 61 74 68 28 7a 52 65  l_win32_path(zRe
1e7b0 6c 61 74 69 76 65 2c 20 7a 46 75 6c 6c 29 3b 0a  lative, zFull);.
1e7c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1e7d0 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a  ITE_OK;.#endif..
1e7e0 23 69 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f 57  #if (SQLITE_OS_W
1e7f0 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  INCE || SQLITE_O
1e800 53 5f 57 49 4e 52 54 29 20 26 26 20 21 64 65 66  S_WINRT) && !def
1e810 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
1e820 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1e830 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
1e840 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 2f 2a 20  E_ERROR );.  /* 
1e850 57 69 6e 43 45 20 68 61 73 20 6e 6f 20 63 6f 6e  WinCE has no con
1e860 63 65 70 74 20 6f 66 20 61 20 72 65 6c 61 74 69  cept of a relati
1e870 76 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f 72 20  ve pathname, or 
1e880 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f  so I am told. */
1e890 0a 20 20 2f 2a 20 57 69 6e 52 54 20 68 61 73 20  .  /* WinRT has 
1e8a0 6e 6f 20 77 61 79 20 74 6f 20 63 6f 6e 76 65 72  no way to conver
1e8b0 74 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  t a relative pat
1e8c0 68 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65  h to an absolute
1e8d0 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 66 20 28 20   one. */.  if ( 
1e8e0 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
1e8f0 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73  ectory && !winIs
1e900 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65  VerbatimPathname
1e910 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20  (zRelative) ){. 
1e920 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54     /*.    ** NOT
1e930 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e  E: We are dealin
1e940 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76  g with a relativ
1e950 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20  e path name and 
1e960 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20  the data.    ** 
1e970 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
1e980 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54  has been set.  T
1e990 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
1e9a0 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20   as the basis.  
1e9b0 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63    **       for c
1e9c0 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65  onverting the re
1e9d0 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
1e9e0 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a   to an absolute.
1e9f0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65      **       one
1ea00 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74   by prepending t
1ea10 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72  he data director
1ea20 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73  y and a backslas
1ea30 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  h..    */.    sq
1ea40 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
1ea50 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
1ea60 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
1ea70 6c 6c 2c 20 22 25 73 5c 5c 25 73 22 2c 0a 20 20  ll, "%s\\%s",.  
1ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea90 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f     sqlite3_data_
1eaa0 64 69 72 65 63 74 6f 72 79 2c 20 7a 52 65 6c 61  directory, zRela
1eab0 74 69 76 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tive);.  }else{.
1eac0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1ead0 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
1eae0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1eaf0 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20  ), zFull, "%s", 
1eb00 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d 0a  zRelative);.  }.
1eb10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1eb20 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  OK;.#endif..#if 
1eb30 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
1eb40 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
1eb50 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64  INRT && !defined
1eb60 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 69  (__CYGWIN__).  i
1eb70 6e 74 20 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64  nt nByte;.  void
1eb80 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20   *zConverted;.  
1eb90 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a 20 20 2f  char *zOut;..  /
1eba0 2a 20 49 66 20 74 68 69 73 20 70 61 74 68 20 6e  * If this path n
1ebb0 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  ame begins with 
1ebc0 22 2f 58 3a 22 2c 20 77 68 65 72 65 20 22 58 22  "/X:", where "X"
1ebd0 20 69 73 20 61 6e 79 20 61 6c 70 68 61 62 65 74   is any alphabet
1ebe0 69 63 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65  ic.  ** characte
1ebf0 72 2c 20 64 69 73 63 61 72 64 20 74 68 65 20 69  r, discard the i
1ec00 6e 69 74 69 61 6c 20 22 2f 22 20 66 72 6f 6d 20  nitial "/" from 
1ec10 74 68 65 20 70 61 74 68 6e 61 6d 65 2e 0a 20 20  the pathname..  
1ec20 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6c 61 74 69  */.  if( zRelati
1ec30 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 73 71  ve[0]=='/' && sq
1ec40 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a 52 65  lite3Isalpha(zRe
1ec50 6c 61 74 69 76 65 5b 31 5d 29 20 26 26 20 7a 52  lative[1]) && zR
1ec60 65 6c 61 74 69 76 65 5b 32 5d 3d 3d 27 3a 27 20  elative[2]==':' 
1ec70 29 7b 0a 20 20 20 20 7a 52 65 6c 61 74 69 76 65  ){.    zRelative
1ec80 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74  ++;.  }..  /* It
1ec90 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61  's odd to simula
1eca0 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68  te an io-error h
1ecb0 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20  ere, but really 
1ecc0 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a  this is just.  *
1ecd0 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65  * using the io-e
1ece0 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74  rror infrastruct
1ecf0 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  ure to test that
1ed00 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20   SQLite handles 
1ed10 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
1ed20 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73  on failing. This
1ed30 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20   function could 
1ed40 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61  fail if, for exa
1ed50 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63  mple, the.  ** c
1ed60 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64  urrent working d
1ed70 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
1ed80 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f  n unlinked..  */
1ed90 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1eda0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
1edb0 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 20  E_ERROR );.  if 
1edc0 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  ( sqlite3_data_d
1edd0 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e  irectory && !win
1ede0 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61  IsVerbatimPathna
1edf0 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b  me(zRelative) ){
1ee00 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e  .    /*.    ** N
1ee10 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c  OTE: We are deal
1ee20 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74  ing with a relat
1ee30 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e  ive path name an
1ee40 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a  d the data.    *
1ee50 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  *       director
1ee60 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  y has been set. 
1ee70 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   Therefore, use 
1ee80 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a  it as the basis.
1ee90 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72      **       for
1eea0 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20   converting the 
1eeb0 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
1eec0 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74  me to an absolut
1eed0 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f  e.    **       o
1eee0 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67  ne by prepending
1eef0 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74   the data direct
1ef00 6f 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c  ory and a backsl
1ef10 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ash..    */.    
1ef20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1ef30 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73  (MIN(nFull, pVfs
1ef40 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a  ->mxPathname), z
1ef50 46 75 6c 6c 2c 20 22 25 73 5c 5c 25 73 22 2c 0a  Full, "%s\\%s",.
1ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74       sqlite3_dat
1ef80 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 7a 52 65  a_directory, zRe
1ef90 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 72 65 74  lative);.    ret
1efa0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1efb0 20 7d 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20   }.  zConverted 
1efc0 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c  = convertUtf8Fil
1efd0 65 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29  ename(zRelative)
1efe0 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
1eff0 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ed==0 ){.    ret
1f000 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1f010 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
1f020 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
1f030 4c 50 57 53 54 52 20 7a 54 65 6d 70 3b 0a 20 20  LPWSTR zTemp;.  
1f040 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46    nByte = osGetF
1f050 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50  ullPathNameW((LP
1f060 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
1f070 2c 20 30 2c 20 30 2c 20 30 29 20 2b 20 33 3b 0a  , 0, 0, 0) + 3;.
1f080 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69      zTemp = sqli
1f090 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74  te3_malloc( nByt
1f0a0 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30  e*sizeof(zTemp[0
1f0b0 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54  ]) );.    if( zT
1f0c0 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  emp==0 ){.      
1f0d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
1f0e0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
1f0f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1f100 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
1f110 0a 20 20 20 20 6f 73 47 65 74 46 75 6c 6c 50 61  .    osGetFullPa
1f120 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52  thNameW((LPCWSTR
1f130 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79  )zConverted, nBy
1f140 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20  te, zTemp, 0);. 
1f150 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1f160 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
1f170 20 7a 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65 54   zOut = unicodeT
1f180 6f 55 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20  oUtf8(zTemp);.  
1f190 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1f1a0 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 69 66 64 65  Temp);.  }.#ifde
1f1b0 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
1f1c0 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
1f1d0 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 3b      char *zTemp;
1f1e0 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47  .    nByte = osG
1f1f0 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28  etFullPathNameA(
1f200 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
1f210 64 2c 20 30 2c 20 30 2c 20 30 29 20 2b 20 33 3b  d, 0, 0, 0) + 3;
1f220 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c  .    zTemp = sql
1f230 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79  ite3_malloc( nBy
1f240 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b  te*sizeof(zTemp[
1f250 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  0]) );.    if( z
1f260 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Temp==0 ){.     
1f270 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
1f280 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
1f290 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1f2a0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
1f2b0 7d 0a 20 20 20 20 6f 73 47 65 74 46 75 6c 6c 50  }.    osGetFullP
1f2c0 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29  athNameA((char*)
1f2d0 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74  zConverted, nByt
1f2e0 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20  e, zTemp, 0);.  
1f2f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1f300 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
1f310 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77  zOut = sqlite3_w
1f320 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
1f330 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71  8(zTemp);.    sq
1f340 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70  lite3_free(zTemp
1f350 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
1f360 69 66 28 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20  if( zOut ){.    
1f370 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1f380 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73  (MIN(nFull, pVfs
1f390 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a  ->mxPathname), z
1f3a0 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74  Full, "%s", zOut
1f3b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1f3c0 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72  ree(zOut);.    r
1f3d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f3e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
1f3f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1f400 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e  R_NOMEM;.  }.#en
1f410 64 69 66 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  dif.}..#ifndef S
1f420 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
1f430 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20  EXTENSION./*.** 
1f440 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f  Interfaces for o
1f450 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20  pening a shared 
1f460 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67  library, finding
1f470 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a   entry points.**
1f480 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72   within the shar
1f490 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20  ed library, and 
1f4a0 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72  closing the shar
1f4b0 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 2f  ed library..*/./
1f4c0 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20  *.** Interfaces 
1f4d0 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68  for opening a sh
1f4e0 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69  ared library, fi
1f4f0 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e  nding entry poin
1f500 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ts.** within the
1f510 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
1f520 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65   and closing the
1f530 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e   shared library.
1f540 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1f550 2a 77 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69 74  *winDlOpen(sqlit
1f560 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f  e3_vfs *pVfs, co
1f570 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1f580 61 6d 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68  ame){.  HANDLE h
1f590 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
1f5a0 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74  rted = convertUt
1f5b0 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65  f8Filename(zFile
1f5c0 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  name);.  UNUSED_
1f5d0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
1f5e0 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
1f5f0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d==0 ){.    retu
1f600 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
1f610 69 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  isNT() ){.#if SQ
1f620 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
1f630 20 20 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63 6b    h = osLoadPack
1f640 61 67 65 64 4c 69 62 72 61 72 79 28 28 4c 50 43  agedLibrary((LPC
1f650 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
1f660 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68   0);.#else.    h
1f670 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79   = osLoadLibrary
1f680 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
1f690 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  erted);.#endif. 
1f6a0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
1f6b0 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
1f6c0 20 20 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20    else{.    h = 
1f6d0 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28  osLoadLibraryA((
1f6e0 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
1f6f0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
1f700 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
1f710 6e 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75  nverted);.  retu
1f720 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73  rn (void*)h;.}.s
1f730 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c  tatic void winDl
1f740 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
1f750 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
1f760 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74  f, char *zBufOut
1f770 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
1f780 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 67  METER(pVfs);.  g
1f790 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f  etLastErrorMsg(o
1f7a0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
1f7b0 20 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b   nBuf, zBufOut);
1f7c0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28  .}.static void (
1f7d0 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65  *winDlSym(sqlite
1f7e0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69  3_vfs *pVfs, voi
1f7f0 64 20 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e 73  d *pHandle, cons
1f800 74 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c 29  t char *zSymbol)
1f810 29 28 76 6f 69 64 29 7b 0a 20 20 55 4e 55 53 45  )(void){.  UNUSE
1f820 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
1f830 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69  );.  return (voi
1f840 64 28 2a 29 28 76 6f 69 64 29 29 6f 73 47 65 74  d(*)(void))osGet
1f850 50 72 6f 63 41 64 64 72 65 73 73 41 28 28 48 41  ProcAddressA((HA
1f860 4e 44 4c 45 29 70 48 61 6e 64 6c 65 2c 20 7a 53  NDLE)pHandle, zS
1f870 79 6d 62 6f 6c 29 3b 0a 7d 0a 73 74 61 74 69 63  ymbol);.}.static
1f880 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73 65   void winDlClose
1f890 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
1f8a0 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c  fs, void *pHandl
1f8b0 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e){.  UNUSED_PAR
1f8c0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
1f8d0 6f 73 46 72 65 65 4c 69 62 72 61 72 79 28 28 48  osFreeLibrary((H
1f8e0 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a  ANDLE)pHandle);.
1f8f0 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51  }.#else /* if SQ
1f900 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
1f910 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69  XTENSION is defi
1f920 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e  ned: */.  #defin
1f930 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a 20  e winDlOpen  0. 
1f940 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 45 72   #define winDlEr
1f950 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20  ror 0.  #define 
1f960 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20 23  winDlSym   0.  #
1f970 64 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f 73  define winDlClos
1f980 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  e 0.#endif.../*.
1f990 2a 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20 6e  ** Write up to n
1f9a0 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e  Buf bytes of ran
1f9b0 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75  domness into zBu
1f9c0 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
1f9d0 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73   winRandomness(s
1f9e0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1f9f0 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
1fa00 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e 74 20 6e   *zBuf){.  int n
1fa10 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50   = 0;.  UNUSED_P
1fa20 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
1fa30 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1fa40 54 45 5f 54 45 53 54 29 0a 20 20 6e 20 3d 20 6e  TE_TEST).  n = n
1fa50 42 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42  Buf;.  memset(zB
1fa60 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 65  uf, 0, nBuf);.#e
1fa70 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  lse.  if( sizeof
1fa80 28 53 59 53 54 45 4d 54 49 4d 45 29 3c 3d 6e 42  (SYSTEMTIME)<=nB
1fa90 75 66 2d 6e 20 29 7b 0a 20 20 20 20 53 59 53 54  uf-n ){.    SYST
1faa0 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20 6f 73  EMTIME x;.    os
1fab0 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26 78  GetSystemTime(&x
1fac0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
1fad0 42 75 66 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a 65  Buf[n], &x, size
1fae0 6f 66 28 78 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  of(x));.    n +=
1faf0 20 73 69 7a 65 6f 66 28 78 29 3b 0a 20 20 7d 0a   sizeof(x);.  }.
1fb00 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f    if( sizeof(DWO
1fb10 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20  RD)<=nBuf-n ){. 
1fb20 20 20 20 44 57 4f 52 44 20 70 69 64 20 3d 20 6f     DWORD pid = o
1fb30 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1fb40 73 73 49 64 28 29 3b 0a 20 20 20 20 6d 65 6d 63  ssId();.    memc
1fb50 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 70 69  py(&zBuf[n], &pi
1fb60 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b  d, sizeof(pid));
1fb70 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66  .    n += sizeof
1fb80 28 70 69 64 29 3b 0a 20 20 7d 0a 23 69 66 20 53  (pid);.  }.#if S
1fb90 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
1fba0 20 69 66 28 20 73 69 7a 65 6f 66 28 55 4c 4f 4e   if( sizeof(ULON
1fbb0 47 4c 4f 4e 47 29 3c 3d 6e 42 75 66 2d 6e 20 29  GLONG)<=nBuf-n )
1fbc0 7b 0a 20 20 20 20 55 4c 4f 4e 47 4c 4f 4e 47 20  {.    ULONGLONG 
1fbd0 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43  cnt = osGetTickC
1fbe0 6f 75 6e 74 36 34 28 29 3b 0a 20 20 20 20 6d 65  ount64();.    me
1fbf0 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26  mcpy(&zBuf[n], &
1fc00 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29  cnt, sizeof(cnt)
1fc10 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65  );.    n += size
1fc20 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6c  of(cnt);.  }.#el
1fc30 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28  se.  if( sizeof(
1fc40 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29  DWORD)<=nBuf-n )
1fc50 7b 0a 20 20 20 20 44 57 4f 52 44 20 63 6e 74 20  {.    DWORD cnt 
1fc60 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74  = osGetTickCount
1fc70 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ();.    memcpy(&
1fc80 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73  zBuf[n], &cnt, s
1fc90 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20  izeof(cnt));.   
1fca0 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74   n += sizeof(cnt
1fcb0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
1fcc0 69 66 28 20 73 69 7a 65 6f 66 28 4c 41 52 47 45  if( sizeof(LARGE
1fcd0 5f 49 4e 54 45 47 45 52 29 3c 3d 6e 42 75 66 2d  _INTEGER)<=nBuf-
1fce0 6e 20 29 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49  n ){.    LARGE_I
1fcf0 4e 54 45 47 45 52 20 69 3b 0a 20 20 20 20 6f 73  NTEGER i;.    os
1fd00 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65  QueryPerformance
1fd10 43 6f 75 6e 74 65 72 28 26 69 29 3b 0a 20 20 20  Counter(&i);.   
1fd20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d   memcpy(&zBuf[n]
1fd30 2c 20 26 69 2c 20 73 69 7a 65 6f 66 28 69 29 29  , &i, sizeof(i))
1fd40 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
1fd50 66 28 69 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  f(i);.  }.#endif
1fd60 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
1fd70 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72  ./*.** Sleep for
1fd80 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e   a little while.
1fd90 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f    Return the amo
1fda0 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70  unt of time slep
1fdb0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1fdc0 20 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 74 65   winSleep(sqlite
1fdd0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
1fde0 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 73 71   microsec){.  sq
1fdf0 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
1fe00 70 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29  p((microsec+999)
1fe10 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55 53 45 44  /1000);.  UNUSED
1fe20 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
1fe30 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6d 69 63  ;.  return ((mic
1fe40 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29  rosec+999)/1000)
1fe50 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  *1000;.}../*.** 
1fe60 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
1fe70 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74  riable, if set t
1fe80 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
1fe90 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74  ue, is interpret
1fea0 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d  ed as.** the num
1feb0 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73  ber of seconds s
1fec0 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69 73  ince 1970 and is
1fed0 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65   used to set the
1fee0 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71   result of.** sq
1fef0 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69  lite3OsCurrentTi
1ff00 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73 74  me() during test
1ff10 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ing..*/.#ifdef S
1ff20 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
1ff30 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
1ff40 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b  ime = 0;  /* Fak
1ff50 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e  e system time in
1ff60 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
1ff70 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  970. */.#endif..
1ff80 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  /*.** Find the c
1ff90 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20  urrent time (in 
1ffa0 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69  Universal Coordi
1ffb0 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72  nated Time).  Wr
1ffc0 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a  ite into *piNow.
1ffd0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ** the current t
1ffe0 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
1fff0 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
20000 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30  ber times 86_400
20010 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68  _000.  In.** oth
20020 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20  er words, write 
20030 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20  into *piNow the 
20040 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
20050 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65  econds since the
20060 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68   Julian.** epoch
20070 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65   of noon in Gree
20080 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65  nwich on Novembe
20090 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61  r 24, 4714 B.C a
200a0 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a  ccording to the.
200b0 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65  ** proleptic Gre
200c0 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e  gorian calendar.
200d0 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
200e0 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  s, return SQLITE
200f0 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  _OK.  Return SQL
20100 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68 65  ITE_ERROR if the
20110 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 0a   time and date .
20120 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  ** cannot be fou
20130 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
20140 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65  t winCurrentTime
20150 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66  Int64(sqlite3_vf
20160 73 20 2a 70 56 66 73 2c 20 73 71 6c 69 74 65 33  s *pVfs, sqlite3
20170 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a  _int64 *piNow){.
20180 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74    /* FILETIME st
20190 72 75 63 74 75 72 65 20 69 73 20 61 20 36 34 2d  ructure is a 64-
201a0 62 69 74 20 76 61 6c 75 65 20 72 65 70 72 65 73  bit value repres
201b0 65 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  enting the numbe
201c0 72 20 6f 66 20 0a 20 20 20 20 20 31 30 30 2d 6e  r of .     100-n
201d0 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76  anosecond interv
201e0 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72  als since Januar
201f0 79 20 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20  y 1, 1601 (= JD 
20200 32 33 30 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a  2305813.5). .  *
20210 2f 0a 20 20 46 49 4c 45 54 49 4d 45 20 66 74 3b  /.  FILETIME ft;
20220 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
20230 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 77 69  sqlite3_int64 wi
20240 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 3d  nFiletimeEpoch =
20250 20 32 33 30 35 38 31 33 35 2a 28 73 71 6c 69 74   23058135*(sqlit
20260 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30  e3_int64)8640000
20270 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
20280 54 45 53 54 0a 20 20 73 74 61 74 69 63 20 63 6f  TEST.  static co
20290 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  nst sqlite3_int6
202a0 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34  4 unixEpoch = 24
202b0 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f  405875*(sqlite3_
202c0 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23  int64)8640000;.#
202d0 65 6e 64 69 66 0a 20 20 2f 2a 20 32 5e 33 32 20  endif.  /* 2^32 
202e0 2d 20 74 6f 20 61 76 6f 69 64 20 75 73 65 20 6f  - to avoid use o
202f0 66 20 4c 4c 20 61 6e 64 20 77 61 72 6e 69 6e 67  f LL and warning
20300 73 20 69 6e 20 67 63 63 20 2a 2f 0a 20 20 73 74  s in gcc */.  st
20310 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
20320 65 33 5f 69 6e 74 36 34 20 6d 61 78 33 32 42 69  e3_int64 max32Bi
20330 74 56 61 6c 75 65 20 3d 20 0a 20 20 20 20 20 20  tValue = .      
20340 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32  (sqlite3_int64)2
20350 30 30 30 30 30 30 30 30 30 20 2b 20 28 73 71 6c  000000000 + (sql
20360 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30  ite3_int64)20000
20370 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33  00000 + (sqlite3
20380 5f 69 6e 74 36 34 29 32 39 34 39 36 37 32 39 36  _int64)294967296
20390 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ;..#if SQLITE_OS
203a0 5f 57 49 4e 43 45 0a 20 20 53 59 53 54 45 4d 54  _WINCE.  SYSTEMT
203b0 49 4d 45 20 74 69 6d 65 3b 0a 20 20 6f 73 47 65  IME time;.  osGe
203c0 74 53 79 73 74 65 6d 54 69 6d 65 28 26 74 69 6d  tSystemTime(&tim
203d0 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53 79 73 74  e);.  /* if Syst
203e0 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
203f0 28 29 20 66 61 69 6c 73 2c 20 69 74 20 72 65 74  () fails, it ret
20400 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20  urns zero. */.  
20410 69 66 20 28 21 6f 73 53 79 73 74 65 6d 54 69 6d  if (!osSystemTim
20420 65 54 6f 46 69 6c 65 54 69 6d 65 28 26 74 69 6d  eToFileTime(&tim
20430 65 2c 26 66 74 29 29 7b 0a 20 20 20 20 72 65 74  e,&ft)){.    ret
20440 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
20450 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 6f 73  ;.  }.#else.  os
20460 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46  GetSystemTimeAsF
20470 69 6c 65 54 69 6d 65 28 20 26 66 74 20 29 3b 0a  ileTime( &ft );.
20480 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69 4e 6f 77  #endif..  *piNow
20490 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70   = winFiletimeEp
204a0 6f 63 68 20 2b 0a 20 20 20 20 20 20 20 20 20 20  och +.          
204b0 20 20 28 28 28 28 73 71 6c 69 74 65 33 5f 69 6e    ((((sqlite3_in
204c0 74 36 34 29 66 74 2e 64 77 48 69 67 68 44 61 74  t64)ft.dwHighDat
204d0 65 54 69 6d 65 29 2a 6d 61 78 33 32 42 69 74 56  eTime)*max32BitV
204e0 61 6c 75 65 29 20 2b 20 0a 20 20 20 20 20 20 20  alue) + .       
204f0 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
20500 5f 69 6e 74 36 34 29 66 74 2e 64 77 4c 6f 77 44  _int64)ft.dwLowD
20510 61 74 65 54 69 6d 65 29 2f 28 73 71 6c 69 74 65  ateTime)/(sqlite
20520 33 5f 69 6e 74 36 34 29 31 30 30 30 30 3b 0a 0a  3_int64)10000;..
20530 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
20540 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ST.  if( sqlite3
20550 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b  _current_time ){
20560 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30  .    *piNow = 10
20570 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  00*(sqlite3_int6
20580 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  4)sqlite3_curren
20590 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f  t_time + unixEpo
205a0 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ch;.  }.#endif. 
205b0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
205c0 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72  R(pVfs);.  retur
205d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
205e0 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  /*.** Find the c
205f0 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20  urrent time (in 
20600 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69  Universal Coordi
20610 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72  nated Time).  Wr
20620 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65  ite the.** curre
20630 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
20640 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
20650 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72   number into *pr
20660 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  Now and.** retur
20670 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69  n 0.  Return 1 i
20680 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
20690 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  ate cannot be fo
206a0 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  und..*/.static i
206b0 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d  nt winCurrentTim
206c0 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  e(sqlite3_vfs *p
206d0 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e  Vfs, double *prN
206e0 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ow){.  int rc;. 
206f0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
20700 3b 0a 20 20 72 63 20 3d 20 77 69 6e 43 75 72 72  ;.  rc = winCurr
20710 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66  entTimeInt64(pVf
20720 73 2c 20 26 69 29 3b 0a 20 20 69 66 28 20 21 72  s, &i);.  if( !r
20730 63 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20  c ){.    *prNow 
20740 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a  = i/86400000.0;.
20750 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
20760 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 64  .}../*.** The id
20770 65 61 20 69 73 20 74 68 61 74 20 74 68 69 73 20  ea is that this 
20780 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6c  function works l
20790 69 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f  ike a combinatio
207a0 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74 45  n of.** GetLastE
207b0 72 72 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d 61  rror() and Forma
207c0 74 4d 65 73 73 61 67 65 28 29 20 6f 6e 20 57 69  tMessage() on Wi
207d0 6e 64 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f 20  ndows (or errno 
207e0 61 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f  and.** strerror_
207f0 72 28 29 20 6f 6e 20 55 6e 69 78 29 2e 20 41 66  r() on Unix). Af
20800 74 65 72 20 61 6e 20 65 72 72 6f 72 20 69 73 20  ter an error is 
20810 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 4f  returned by an O
20820 53 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 53  S.** function, S
20830 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73  QLite calls this
20840 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 7a   function with z
20850 42 75 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a  Buf pointing to.
20860 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 66 20 6e  ** a buffer of n
20870 42 75 66 20 62 79 74 65 73 2e 20 54 68 65 20 4f  Buf bytes. The O
20880 53 20 6c 61 79 65 72 20 73 68 6f 75 6c 64 20 70  S layer should p
20890 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20 62  opulate the.** b
208a0 75 66 66 65 72 20 77 69 74 68 20 61 20 6e 75 6c  uffer with a nul
208b0 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d  -terminated UTF-
208c0 38 20 65 6e 63 6f 64 65 64 20 65 72 72 6f 72 20  8 encoded error 
208d0 6d 65 73 73 61 67 65 0a 2a 2a 20 64 65 73 63 72  message.** descr
208e0 69 62 69 6e 67 20 74 68 65 20 6c 61 73 74 20 49  ibing the last I
208f0 4f 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20  O error to have 
20900 6f 63 63 75 72 72 65 64 20 77 69 74 68 69 6e 20  occurred within 
20910 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74  the calling.** t
20920 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  hread..**.** If 
20930 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
20940 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 66  e is too large f
20950 6f 72 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  or the supplied 
20960 62 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73 68  buffer,.** it sh
20970 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65  ould be truncate
20980 64 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  d. The return va
20990 6c 75 65 20 6f 66 20 78 47 65 74 4c 61 73 74 45  lue of xGetLastE
209a0 72 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20  rror.** is zero 
209b0 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  if the error mes
209c0 73 61 67 65 20 66 69 74 73 20 69 6e 20 74 68 65  sage fits in the
209d0 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d   buffer, or non-
209e0 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73  zero.** otherwis
209f0 65 20 28 69 66 20 74 68 65 20 6d 65 73 73 61 67  e (if the messag
20a00 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 29  e was truncated)
20a10 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73  . If non-zero is
20a20 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74 68   returned,.** th
20a30 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  en it is not nec
20a40 65 73 73 61 72 79 20 74 6f 20 69 6e 63 6c 75 64  essary to includ
20a50 65 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  e the nul-termin
20a60 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a 2a  ator character.*
20a70 2a 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20  * in the output 
20a80 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  buffer..**.** No
20a90 74 20 73 75 70 70 6c 79 69 6e 67 20 61 6e 20 65  t supplying an e
20aa0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c  rror message wil
20ab0 6c 20 68 61 76 65 20 6e 6f 20 61 64 76 65 72 73  l have no advers
20ac0 65 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20 53  e effect.** on S
20ad0 51 4c 69 74 65 2e 20 49 74 20 69 73 20 66 69 6e  QLite. It is fin
20ae0 65 20 74 6f 20 68 61 76 65 20 61 6e 20 69 6d 70  e to have an imp
20af0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74  lementation that
20b00 20 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75 72 6e   never.** return
20b10 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
20b20 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20  ge:.**.**   int 
20b30 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71  xGetLastError(sq
20b40 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
20b50 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
20b60 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20 61  *zBuf){.**     a
20b70 73 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27  ssert(zBuf[0]=='
20b80 5c 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65 74  \0');.**     ret
20b90 75 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a  urn 0;.**   }.**
20ba0 0a 2a 2a 20 48 6f 77 65 76 65 72 20 69 66 20 61  .** However if a
20bb0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
20bc0 69 73 20 73 75 70 70 6c 69 65 64 2c 20 69 74 20  is supplied, it 
20bd0 77 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72  will be incorpor
20be0 61 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74  ated.** by sqlit
20bf0 65 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72  e into the error
20c00 20 6d 65 73 73 61 67 65 20 61 76 61 69 6c 61 62   message availab
20c10 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 20 75  le to the user u
20c20 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  sing.** sqlite3_
20c30 65 72 72 6d 73 67 28 29 2c 20 70 6f 73 73 69 62  errmsg(), possib
20c40 6c 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72  ly making IO err
20c50 6f 72 73 20 65 61 73 69 65 72 20 74 6f 20 64 65  ors easier to de
20c60 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  bug..*/.static i
20c70 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72  nt winGetLastErr
20c80 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
20c90 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20  pVfs, int nBuf, 
20ca0 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55  char *zBuf){.  U
20cb0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
20cc0 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVfs);.  return 
20cd0 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28  getLastErrorMsg(
20ce0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
20cf0 2c 20 6e 42 75 66 2c 20 7a 42 75 66 29 3b 0a 7d  , nBuf, zBuf);.}
20d00 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
20d10 7a 65 20 61 6e 64 20 64 65 69 6e 69 74 69 61 6c  ze and deinitial
20d20 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e  ize the operatin
20d30 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61  g system interfa
20d40 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ce..*/.int sqlit
20d50 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29  e3_os_init(void)
20d60 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74  {.  static sqlit
20d70 65 33 5f 76 66 73 20 77 69 6e 56 66 73 20 3d 20  e3_vfs winVfs = 
20d80 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20 20  {.    3,        
20d90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
20da0 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69  ersion */.    si
20db0 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20  zeof(winFile),  
20dc0 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a     /* szOsFile *
20dd0 2f 0a 20 20 20 20 4d 41 58 5f 50 41 54 48 2c 20  /.    MAX_PATH, 
20de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78             /* mx
20df0 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Pathname */.    
20e00 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
20e10 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f       /* pNext */
20e20 0a 20 20 20 20 22 77 69 6e 33 32 22 2c 20 20 20  .    "win32",   
20e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61            /* zNa
20e40 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  me */.    0,    
20e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20e60 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20  * pAppData */.  
20e70 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20    winOpen,      
20e80 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20         /* xOpen 
20e90 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65  */.    winDelete
20ea0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
20eb0 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69  Delete */.    wi
20ec0 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20  nAccess,        
20ed0 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f     /* xAccess */
20ee0 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68  .    winFullPath
20ef0 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75  name,     /* xFu
20f00 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  llPathname */.  
20f10 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20    winDlOpen,    
20f20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65         /* xDlOpe
20f30 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72  n */.    winDlEr
20f40 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ror,          /*
20f50 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20   xDlError */.   
20f60 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20   winDlSym,      
20f70 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20        /* xDlSym 
20f80 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73  */.    winDlClos
20f90 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  e,          /* x
20fa0 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77  DlClose */.    w
20fb0 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20  inRandomness,   
20fc0 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65      /* xRandomne
20fd0 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65  ss */.    winSle
20fe0 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ep,            /
20ff0 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20  * xSleep */.    
21000 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20  winCurrentTime, 
21010 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74       /* xCurrent
21020 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47  Time */.    winG
21030 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20  etLastError,    
21040 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f   /* xGetLastErro
21050 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72  r */.    winCurr
21060 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a  entTimeInt64, /*
21070 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74   xCurrentTimeInt
21080 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74  64 */.    winSet
21090 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f  SystemCall,    /
210a0 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  * xSetSystemCall
210b0 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79   */.    winGetSy
210c0 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20  stemCall,    /* 
210d0 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  xGetSystemCall *
210e0 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73  /.    winNextSys
210f0 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e  temCall,   /* xN
21100 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  extSystemCall */
21110 0a 20 20 7d 3b 0a 0a 20 20 2f 2a 20 44 6f 75 62  .  };..  /* Doub
21120 6c 65 2d 63 68 65 63 6b 20 74 68 61 74 20 74 68  le-check that th
21130 65 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72  e aSyscall[] arr
21140 61 79 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 73  ay has been cons
21150 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72  tructed.  ** cor
21160 72 65 63 74 6c 79 2e 20 20 53 65 65 20 74 69 63  rectly.  See tic
21170 6b 65 74 20 5b 62 62 33 61 38 36 65 38 39 30 63  ket [bb3a86e890c
21180 38 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73  8e96ab] */.  ass
21190 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 61  ert( ArraySize(a
211a0 53 79 73 63 61 6c 6c 29 3d 3d 37 33 20 29 3b 0a  Syscall)==73 );.
211b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
211c0 4f 4d 49 54 5f 57 41 4c 0a 20 20 2f 2a 20 67 65  OMIT_WAL.  /* ge
211d0 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61 6c 6c  t memory map all
211e0 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c 61 72  ocation granular
211f0 69 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ity */.  memset(
21200 26 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30 2c 20  &winSysInfo, 0, 
21210 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f 49 4e  sizeof(SYSTEM_IN
21220 46 4f 29 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  FO));.#if SQLITE
21230 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 6f 73 47 65  _OS_WINRT.  osGe
21240 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66  tNativeSystemInf
21250 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a  o(&winSysInfo);.
21260 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73  #else.  osGetSys
21270 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49  temInfo(&winSysI
21280 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  nfo);.#endif.  a
21290 73 73 65 72 74 28 77 69 6e 53 79 73 49 6e 66 6f  ssert(winSysInfo
212a0 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61  .dwAllocationGra
212b0 6e 75 6c 61 72 69 74 79 20 3e 20 30 29 3b 0a 23  nularity > 0);.#
212c0 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
212d0 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 77  _vfs_register(&w
212e0 69 6e 56 66 73 2c 20 31 29 3b 0a 20 20 72 65 74  inVfs, 1);.  ret
212f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a  urn SQLITE_OK; .
21300 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  }..int sqlite3_o
21310 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 23 69  s_end(void){ .#i
21320 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
21330 54 0a 20 20 69 66 28 20 73 6c 65 65 70 4f 62 6a  T.  if( sleepObj
21340 20 21 3d 20 4e 55 4c 4c 20 29 7b 0a 20 20 20 20   != NULL ){.    
21350 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c  osCloseHandle(sl
21360 65 65 70 4f 62 6a 29 3b 0a 20 20 20 20 73 6c 65  eepObj);.    sle
21370 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20  epObj = NULL;.  
21380 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
21390 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
213a0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
213b0 5f 4f 53 5f 57 49 4e 20 2a 2f 0a                 _OS_WIN */.