/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 1cb94dd33d38e01de82d77bef107c7f3323463ec:


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 77 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 4f  liteInt.h".#if O
01d0: 53 5f 57 49 4e 20 20 20 20 20 20 20 20 20 20 20  S_WIN           
01e0: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 69 6c 65      /* This file
01f0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 77 69 6e   is used for win
0200: 64 6f 77 73 20 6f 6e 6c 79 20 2a 2f 0a 0a 23 69  dows only */..#i
0210: 6e 63 6c 75 64 65 20 3c 77 69 6e 62 61 73 65 2e  nclude <winbase.
0220: 68 3e 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59 47  h>..#ifdef __CYG
0230: 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65 20  WIN__.# include 
0240: 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a 23  <sys/cygwin.h>.#
0250: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63  endif../*.** Mac
0260: 72 6f 73 20 75 73 65 64 20 74 6f 20 64 65 74 65  ros used to dete
0270: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
0280: 20 6e 6f 74 20 74 6f 20 75 73 65 20 74 68 72 65   not to use thre
0290: 61 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ads..*/.#if defi
02a0: 6e 65 64 28 54 48 52 45 41 44 53 41 46 45 29 20  ned(THREADSAFE) 
02b0: 26 26 20 54 48 52 45 41 44 53 41 46 45 0a 23 20  && THREADSAFE.# 
02c0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 33  define SQLITE_W3
02d0: 32 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64  2_THREADS 1.#end
02e0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64  if../*.** Includ
02f0: 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63  e code that is c
0300: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f  ommon to all os_
0310: 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e  *.c files.*/.#in
0320: 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e  clude "os_common
0330: 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  .h"../*.** Deter
0340: 6d 69 6e 65 20 69 66 20 77 65 20 61 72 65 20 64  mine if we are d
0350: 65 61 6c 69 6e 67 20 77 69 74 68 20 57 69 6e 64  ealing with Wind
0360: 6f 77 73 43 45 20 2d 20 77 68 69 63 68 20 68 61  owsCE - which ha
0370: 73 20 61 20 6d 75 63 68 0a 2a 2a 20 72 65 64 75  s a much.** redu
0380: 63 65 64 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 20  ced API..*/.#if 
0390: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57  defined(_WIN32_W
03a0: 43 45 29 0a 23 20 64 65 66 69 6e 65 20 4f 53 5f  CE).# define OS_
03b0: 57 49 4e 43 45 20 31 0a 23 20 64 65 66 69 6e 65  WINCE 1.# define
03c0: 20 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49   AreFileApisANSI
03d0: 28 29 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66  () 1.#else.# def
03e0: 69 6e 65 20 4f 53 5f 57 49 4e 43 45 20 30 0a 23  ine OS_WINCE 0.#
03f0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e  endif../*.** Win
0400: 43 45 20 6c 61 63 6b 73 20 6e 61 74 69 76 65 20  CE lacks native 
0410: 73 75 70 70 6f 72 74 20 66 6f 72 20 66 69 6c 65  support for file
0420: 20 6c 6f 63 6b 69 6e 67 20 73 6f 20 77 65 20 68   locking so we h
0430: 61 76 65 20 74 6f 20 66 61 6b 65 20 69 74 0a 2a  ave to fake it.*
0440: 2a 20 77 69 74 68 20 73 6f 6d 65 20 63 6f 64 65  * with some code
0450: 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a   of our own..*/.
0460: 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 74 79 70  #if OS_WINCE.typ
0470: 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 63  edef struct winc
0480: 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e 74 20 6e 52  eLock {.  int nR
0490: 65 61 64 65 72 73 3b 20 20 20 20 20 20 20 2f 2a  eaders;       /*
04a0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 61 64 65   Number of reade
04b0: 72 20 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64  r locks obtained
04c0: 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 50 65 6e 64   */.  BOOL bPend
04d0: 69 6e 67 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64  ing;      /* Ind
04e0: 69 63 61 74 65 73 20 61 20 70 65 6e 64 69 6e 67  icates a pending
04f0: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f   lock has been o
0500: 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f  btained */.  BOO
0510: 4c 20 62 52 65 73 65 72 76 65 64 3b 20 20 20 20  L bReserved;    
0520: 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20   /* Indicates a 
0530: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 68 61  reserved lock ha
0540: 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  s been obtained 
0550: 2a 2f 0a 20 20 42 4f 4f 4c 20 62 45 78 63 6c 75  */.  BOOL bExclu
0560: 73 69 76 65 3b 20 20 20 20 2f 2a 20 49 6e 64 69  sive;    /* Indi
0570: 63 61 74 65 73 20 61 6e 20 65 78 63 6c 75 73 69  cates an exclusi
0580: 76 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  ve lock has been
0590: 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 7d 20 77   obtained */.} w
05a0: 69 6e 63 65 4c 6f 63 6b 3b 0a 23 65 6e 64 69 66  inceLock;.#endif
05b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 46  ../*.** The winF
05c0: 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ile structure is
05d0: 20 61 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73   a subclass of s
05e0: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 20 73 70 65  qlite3_file* spe
05f0: 63 69 66 69 63 20 74 6f 20 74 68 65 20 77 69 6e  cific to the win
0600: 33 32 0a 2a 2a 20 70 6f 72 74 61 62 69 6c 69 74  32.** portabilit
0610: 79 20 6c 61 79 65 72 2e 0a 2a 2f 0a 74 79 70 65  y layer..*/.type
0620: 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 46 69  def struct winFi
0630: 6c 65 20 77 69 6e 46 69 6c 65 3b 0a 73 74 72 75  le winFile;.stru
0640: 63 74 20 77 69 6e 46 69 6c 65 20 7b 0a 20 20 63  ct winFile {.  c
0650: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
0660: 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64  methods *pMethod
0670: 3b 2f 2a 20 4d 75 73 74 20 62 65 20 66 69 72 73  ;/* Must be firs
0680: 74 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b  t */.  HANDLE h;
0690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
06a0: 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61 63 63  * Handle for acc
06b0: 65 73 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20  essing the file 
06c0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
06d0: 61 72 20 6c 6f 63 6b 74 79 70 65 3b 20 2f 2a 20  ar locktype; /* 
06e0: 54 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63 75 72  Type of lock cur
06f0: 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 20 74  rently held on t
0700: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 73 68  his file */.  sh
0710: 6f 72 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  ort sharedLockBy
0720: 74 65 3b 20 20 20 2f 2a 20 52 61 6e 64 6f 6d 6c  te;   /* Randoml
0730: 79 20 63 68 6f 73 65 6e 20 62 79 74 65 20 75 73  y chosen byte us
0740: 65 64 20 61 73 20 61 20 73 68 61 72 65 64 20 6c  ed as a shared l
0750: 6f 63 6b 20 2a 2f 0a 23 69 66 20 4f 53 5f 57 49  ock */.#if OS_WI
0760: 4e 43 45 0a 20 20 57 43 48 41 52 20 2a 7a 44 65  NCE.  WCHAR *zDe
0770: 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20 20 2f 2a  leteOnClose;  /*
0780: 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f   Name of file to
0790: 20 64 65 6c 65 74 65 20 77 68 65 6e 20 63 6c 6f   delete when clo
07a0: 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e 44 4c 45  sing */.  HANDLE
07b0: 20 68 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20   hMutex;        
07c0: 20 20 2f 2a 20 4d 75 74 65 78 20 75 73 65 64 20    /* Mutex used 
07d0: 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73  to control acces
07e0: 73 20 74 6f 20 73 68 61 72 65 64 20 6c 6f 63 6b  s to shared lock
07f0: 20 2a 2f 20 20 0a 20 20 48 41 4e 44 4c 45 20 68   */  .  HANDLE h
0800: 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20 20  Shared;         
0810: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
0820: 20 73 65 67 6d 65 6e 74 20 75 73 65 64 20 66 6f   segment used fo
0830: 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 77  r locking */.  w
0840: 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c 3b 20  inceLock local; 
0850: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 73 20         /* Locks 
0860: 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68 69 73  obtained by this
0870: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 77 69 6e   instance of win
0880: 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 63 65 4c  File */.  winceL
0890: 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20 20 20 20  ock *shared;    
08a0: 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 68 61 72    /* Global shar
08b0: 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79 20 66  ed lock memory f
08c0: 6f 72 20 74 68 65 20 66 69 6c 65 20 20 2a 2f 0a  or the file  */.
08d0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a  #endif.};.../*.*
08e0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
08f0: 76 61 72 69 61 62 6c 65 20 69 73 20 28 6e 6f 72  variable is (nor
0900: 6d 61 6c 6c 79 29 20 73 65 74 20 6f 6e 63 65 20  mally) set once 
0910: 61 6e 64 20 6e 65 76 65 72 20 63 68 61 6e 67 65  and never change
0920: 73 0a 2a 2a 20 74 68 65 72 65 61 66 74 65 72 2e  s.** thereafter.
0930: 20 20 49 74 20 72 65 63 6f 72 64 73 20 77 68 65    It records whe
0940: 74 68 65 72 20 74 68 65 20 6f 70 65 72 61 74 69  ther the operati
0950: 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e  ng system is Win
0960: 39 35 0a 2a 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a  95.** or WinNT..
0970: 2a 2a 0a 2a 2a 20 30 3a 20 20 20 4f 70 65 72 61  **.** 0:   Opera
0980: 74 69 6e 67 20 73 79 73 74 65 6d 20 75 6e 6b 6e  ting system unkn
0990: 6f 77 6e 2e 0a 2a 2a 20 31 3a 20 20 20 4f 70 65  own..** 1:   Ope
09a0: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73  rating system is
09b0: 20 57 69 6e 39 35 2e 0a 2a 2a 20 32 3a 20 20 20   Win95..** 2:   
09c0: 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  Operating system
09d0: 20 69 73 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a   is WinNT..**.**
09e0: 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63   In order to fac
09f0: 69 6c 69 74 61 74 65 20 74 65 73 74 69 6e 67 20  ilitate testing 
0a00: 6f 6e 20 61 20 57 69 6e 4e 54 20 73 79 73 74 65  on a WinNT syste
0a10: 6d 2c 20 74 68 65 20 74 65 73 74 20 66 69 78 74  m, the test fixt
0a20: 75 72 65 0a 2a 2a 20 63 61 6e 20 6d 61 6e 75 61  ure.** can manua
0a30: 6c 6c 79 20 73 65 74 20 74 68 69 73 20 76 61 6c  lly set this val
0a40: 75 65 20 74 6f 20 31 20 74 6f 20 65 6d 75 6c 61  ue to 1 to emula
0a50: 74 65 20 57 69 6e 39 38 20 62 65 68 61 76 69 6f  te Win98 behavio
0a60: 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  r..*/.#ifdef SQL
0a70: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
0a80: 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30  ite3_os_type = 0
0a90: 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 69  ;.#else.static i
0aa0: 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  nt sqlite3_os_ty
0ab0: 70 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  pe = 0;.#endif..
0ac0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
0ad0: 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20  e (non-zero) if 
0ae0: 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 75  we are running u
0af0: 6e 64 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32  nder WinNT, Win2
0b00: 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20  K, WinXP,.** or 
0b10: 57 69 6e 43 45 2e 20 20 52 65 74 75 72 6e 20 66  WinCE.  Return f
0b20: 61 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 20  alse (zero) for 
0b30: 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72  Win95, Win98, or
0b40: 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65   WinME..**.** He
0b50: 72 65 20 69 73 20 61 6e 20 69 6e 74 65 72 65 73  re is an interes
0b60: 74 69 6e 67 20 6f 62 73 65 72 76 61 74 69 6f 6e  ting observation
0b70: 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c  :  Win95, Win98,
0b80: 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a   and WinME lack.
0b90: 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45  ** the LockFileE
0ba0: 78 28 29 20 41 50 49 2e 20 20 42 75 74 20 77 65  x() API.  But we
0bb0: 20 63 61 6e 20 73 74 69 6c 6c 20 73 74 61 74 69   can still stati
0bc0: 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e  cally link again
0bd0: 73 74 20 74 68 61 74 0a 2a 2a 20 41 50 49 20 61  st that.** API a
0be0: 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e  s long as we don
0bf0: 27 74 20 63 61 6c 6c 20 69 74 20 77 69 6e 20 72  't call it win r
0c00: 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f  unning Win95/98/
0c10: 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a  ME.  A call to.*
0c20: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
0c30: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
0c40: 69 6e 65 20 69 66 20 74 68 65 20 68 6f 73 74 20  ine if the host 
0c50: 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f  is Win95/98/ME o
0c60: 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50  r.** WinNT/2K/XP
0c70: 20 73 6f 20 74 68 61 74 20 77 65 20 77 69 6c 6c   so that we will
0c80: 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72   know whether or
0c90: 20 6e 6f 74 20 77 65 20 63 61 6e 20 73 61 66 65   not we can safe
0ca0: 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c  ly call.** the L
0cb0: 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e  ockFileEx() API.
0cc0: 0a 2a 2f 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45  .*/.#if OS_WINCE
0cd0: 0a 23 20 64 65 66 69 6e 65 20 69 73 4e 54 28 29  .# define isNT()
0ce0: 20 20 28 31 29 0a 23 65 6c 73 65 0a 20 20 73 74    (1).#else.  st
0cf0: 61 74 69 63 20 69 6e 74 20 69 73 4e 54 28 76 6f  atic int isNT(vo
0d00: 69 64 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  id){.    if( sql
0d10: 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 30 20  ite3_os_type==0 
0d20: 29 7b 0a 20 20 20 20 20 20 4f 53 56 45 52 53 49  ){.      OSVERSI
0d30: 4f 4e 49 4e 46 4f 20 73 49 6e 66 6f 3b 0a 20 20  ONINFO sInfo;.  
0d40: 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65      sInfo.dwOSVe
0d50: 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20  rsionInfoSize = 
0d60: 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20  sizeof(sInfo);. 
0d70: 20 20 20 20 20 47 65 74 56 65 72 73 69 6f 6e 45       GetVersionE
0d80: 78 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 20  x(&sInfo);.     
0d90: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
0da0: 20 3d 20 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66   = sInfo.dwPlatf
0db0: 6f 72 6d 49 64 3d 3d 56 45 52 5f 50 4c 41 54 46  ormId==VER_PLATF
0dc0: 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f 20 32  ORM_WIN32_NT ? 2
0dd0: 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   : 1;.    }.    
0de0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6f  return sqlite3_o
0df0: 73 5f 74 79 70 65 3d 3d 32 3b 0a 20 20 7d 0a 23  s_type==2;.  }.#
0e00: 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 57 49 4e 43  endif /* OS_WINC
0e10: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  E */../*.** Conv
0e20: 65 72 74 20 61 20 55 54 46 2d 38 20 73 74 72 69  ert a UTF-8 stri
0e30: 6e 67 20 74 6f 20 6d 69 63 72 6f 73 6f 66 74 20  ng to microsoft 
0e40: 75 6e 69 63 6f 64 65 20 28 55 54 46 2d 31 36 3f  unicode (UTF-16?
0e50: 29 2e 20 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  ). .**.** Space 
0e60: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
0e70: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
0e80: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
0e90: 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a  ite3_malloc..*/.
0ea0: 73 74 61 74 69 63 20 57 43 48 41 52 20 2a 75 74  static WCHAR *ut
0eb0: 66 38 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73  f8ToUnicode(cons
0ec0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
0ed0: 65 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b  e){.  int nChar;
0ee0: 0a 20 20 57 43 48 41 52 20 2a 7a 57 69 64 65 46  .  WCHAR *zWideF
0ef0: 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61  ilename;..  nCha
0f00: 72 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f 57  r = MultiByteToW
0f10: 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c  ideChar(CP_UTF8,
0f20: 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d   0, zFilename, -
0f30: 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 7a  1, NULL, 0);.  z
0f40: 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 73  WideFilename = s
0f50: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e  qlite3_malloc( n
0f60: 43 68 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64  Char*sizeof(zWid
0f70: 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b  eFilename[0]) );
0f80: 0a 20 20 69 66 28 20 7a 57 69 64 65 46 69 6c 65  .  if( zWideFile
0f90: 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  name==0 ){.    r
0fa0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
0fb0: 43 68 61 72 20 3d 20 4d 75 6c 74 69 42 79 74 65  Char = MultiByte
0fc0: 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55 54  ToWideChar(CP_UT
0fd0: 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  F8, 0, zFilename
0fe0: 2c 20 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e  , -1, zWideFilen
0ff0: 61 6d 65 2c 20 6e 43 68 61 72 29 3b 0a 20 20 69  ame, nChar);.  i
1000: 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20  f( nChar==0 ){. 
1010: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1020: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a  zWideFilename);.
1030: 20 20 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d      zWideFilenam
1040: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
1050: 75 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  urn zWideFilenam
1060: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  e;.}../*.** Conv
1070: 65 72 74 20 6d 69 63 72 6f 73 6f 66 74 20 75 6e  ert microsoft un
1080: 69 63 6f 64 65 20 74 6f 20 55 54 46 2d 38 2e 20  icode to UTF-8. 
1090: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
10a0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
10b0: 6e 67 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65  ng is.** obtaine
10c0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
10d0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74  alloc()..*/.stat
10e0: 69 63 20 63 68 61 72 20 2a 75 6e 69 63 6f 64 65  ic char *unicode
10f0: 54 6f 55 74 66 38 28 63 6f 6e 73 74 20 57 43 48  ToUtf8(const WCH
1100: 41 52 20 2a 7a 57 69 64 65 46 69 6c 65 6e 61 6d  AR *zWideFilenam
1110: 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  e){.  int nByte;
1120: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
1130: 6d 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 57  me;..  nByte = W
1140: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
1150: 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a  te(CP_UTF8, 0, z
1160: 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  WideFilename, -1
1170: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
1180: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   zFilename = sql
1190: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79  ite3_malloc( nBy
11a0: 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c  te );.  if( zFil
11b0: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ename==0 ){.    
11c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
11d0: 6e 42 79 74 65 20 3d 20 57 69 64 65 43 68 61 72  nByte = WideChar
11e0: 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55  ToMultiByte(CP_U
11f0: 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c  TF8, 0, zWideFil
1200: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65  ename, -1, zFile
1210: 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20  name, nByte,.   
1220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1230: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 29             0, 0)
1240: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
1250: 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   0 ){.    sqlite
1260: 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65  3_free(zFilename
1270: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
1280: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1290: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  rn zFilename;.}.
12a0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
12b0: 6e 20 61 6e 73 69 20 73 74 72 69 6e 67 20 74 6f  n ansi string to
12c0: 20 6d 69 63 72 6f 73 6f 66 74 20 75 6e 69 63 6f   microsoft unico
12d0: 64 65 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65  de, based on the
12e0: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 63 6f 64 65  .** current code
12f0: 70 61 67 65 20 73 65 74 74 69 6e 67 73 20 66 6f  page settings fo
1300: 72 20 66 69 6c 65 20 61 70 69 73 2e 0a 2a 2a 20  r file apis..** 
1310: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
1320: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
1330: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
1340: 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65  d.** from sqlite
1350: 33 5f 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61  3_malloc..*/.sta
1360: 74 69 63 20 57 43 48 41 52 20 2a 6d 62 63 73 54  tic WCHAR *mbcsT
1370: 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63  oUnicode(const c
1380: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
1390: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
13a0: 57 43 48 41 52 20 2a 7a 4d 62 63 73 46 69 6c 65  WCHAR *zMbcsFile
13b0: 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65  name;.  int code
13c0: 70 61 67 65 20 3d 20 41 72 65 46 69 6c 65 41 70  page = AreFileAp
13d0: 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43  isANSI() ? CP_AC
13e0: 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20  P : CP_OEMCP;.. 
13f0: 20 6e 42 79 74 65 20 3d 20 4d 75 6c 74 69 42 79   nByte = MultiBy
1400: 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64  teToWideChar(cod
1410: 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e  epage, 0, zFilen
1420: 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 30 29  ame, -1, NULL,0)
1430: 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a  *sizeof(WCHAR);.
1440: 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20    zMbcsFilename 
1450: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
1460: 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a  ( nByte*sizeof(z
1470: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 5b 30 5d 29  MbcsFilename[0])
1480: 20 29 3b 0a 20 20 69 66 28 20 7a 4d 62 63 73 46   );.  if( zMbcsF
1490: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
14a0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
14b0: 20 20 6e 42 79 74 65 20 3d 20 4d 75 6c 74 69 42    nByte = MultiB
14c0: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f  yteToWideChar(co
14d0: 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65  depage, 0, zFile
14e0: 6e 61 6d 65 2c 20 2d 31 2c 20 7a 4d 62 63 73 46  name, -1, zMbcsF
14f0: 69 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65 29 3b  ilename, nByte);
1500: 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20  .  if( nByte==0 
1510: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
1520: 72 65 65 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  ree(zMbcsFilenam
1530: 65 29 3b 0a 20 20 20 20 7a 4d 62 63 73 46 69 6c  e);.    zMbcsFil
1540: 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  ename = 0;.  }. 
1550: 20 72 65 74 75 72 6e 20 7a 4d 62 63 73 46 69 6c   return zMbcsFil
1560: 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
1570: 43 6f 6e 76 65 72 74 20 6d 69 63 72 6f 73 6f 66  Convert microsof
1580: 74 20 75 6e 69 63 6f 64 65 20 74 6f 20 6d 75 6c  t unicode to mul
1590: 74 69 62 79 74 65 20 63 68 61 72 61 63 74 65 72  tibyte character
15a0: 20 73 74 72 69 6e 67 2c 20 62 61 73 65 64 20 6f   string, based o
15b0: 6e 20 74 68 65 0a 2a 2a 20 75 73 65 72 27 73 20  n the.** user's 
15c0: 41 6e 73 69 20 63 6f 64 65 70 61 67 65 2e 0a 2a  Ansi codepage..*
15d0: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
15e0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
15f0: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
1600: 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
1610: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  e3_malloc()..*/.
1620: 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 6e 69  static char *uni
1630: 63 6f 64 65 54 6f 4d 62 63 73 28 63 6f 6e 73 74  codeToMbcs(const
1640: 20 57 43 48 41 52 20 2a 7a 57 69 64 65 46 69 6c   WCHAR *zWideFil
1650: 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42  ename){.  int nB
1660: 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69  yte;.  char *zFi
1670: 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f  lename;.  int co
1680: 64 65 70 61 67 65 20 3d 20 41 72 65 46 69 6c 65  depage = AreFile
1690: 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f  ApisANSI() ? CP_
16a0: 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a  ACP : CP_OEMCP;.
16b0: 0a 20 20 6e 42 79 74 65 20 3d 20 57 69 64 65 43  .  nByte = WideC
16c0: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63  harToMultiByte(c
16d0: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64  odepage, 0, zWid
16e0: 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30  eFilename, -1, 0
16f0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7a 46  , 0, 0, 0);.  zF
1700: 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ilename = sqlite
1710: 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  3_malloc( nByte 
1720: 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  );.  if( zFilena
1730: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
1740: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
1750: 74 65 20 3d 20 57 69 64 65 43 68 61 72 54 6f 4d  te = WideCharToM
1760: 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67  ultiByte(codepag
1770: 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e  e, 0, zWideFilen
1780: 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61  ame, -1, zFilena
1790: 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20  me, nByte,.     
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b0: 20 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a           0, 0);.
17c0: 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30    if( nByte == 0
17d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
17e0: 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  free(zFilename);
17f0: 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  .    zFilename =
1800: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1810: 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f   zFilename;.}../
1820: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 75 6c  *.** Convert mul
1830: 74 69 62 79 74 65 20 63 68 61 72 61 63 74 65 72  tibyte character
1840: 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46 2d 38   string to UTF-8
1850: 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
1860: 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64   the.** returned
1870: 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69   string is obtai
1880: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
1890: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74  _malloc()..*/.st
18a0: 61 74 69 63 20 63 68 61 72 20 2a 6d 62 63 73 54  atic char *mbcsT
18b0: 6f 55 74 66 38 28 63 6f 6e 73 74 20 63 68 61 72  oUtf8(const char
18c0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
18d0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 55  char *zFilenameU
18e0: 74 66 38 3b 0a 20 20 57 43 48 41 52 20 2a 7a 54  tf8;.  WCHAR *zT
18f0: 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57  mpWide;..  zTmpW
1900: 69 64 65 20 3d 20 6d 62 63 73 54 6f 55 6e 69 63  ide = mbcsToUnic
1910: 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
1920: 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d    if( zTmpWide==
1930: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1940: 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61  0;.  }.  zFilena
1950: 6d 65 55 74 66 38 20 3d 20 75 6e 69 63 6f 64 65  meUtf8 = unicode
1960: 54 6f 55 74 66 38 28 7a 54 6d 70 57 69 64 65 29  ToUtf8(zTmpWide)
1970: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1980: 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65  (zTmpWide);.  re
1990: 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74  turn zFilenameUt
19a0: 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  f8;.}../*.** Con
19b0: 76 65 72 74 20 55 54 46 2d 38 20 74 6f 20 6d 75  vert UTF-8 to mu
19c0: 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74 65  ltibyte characte
19d0: 72 20 73 74 72 69 6e 67 2e 20 20 53 70 61 63 65  r string.  Space
19e0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a   to hold the .**
19f0: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
1a00: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
1a10: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
1a20: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ()..*/.static ch
1a30: 61 72 20 2a 75 74 66 38 54 6f 4d 62 63 73 28 63  ar *utf8ToMbcs(c
1a40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1a50: 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  name){.  char *z
1a60: 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 20 20  FilenameMbcs;.  
1a70: 57 43 48 41 52 20 2a 7a 54 6d 70 57 69 64 65 3b  WCHAR *zTmpWide;
1a80: 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 75  ..  zTmpWide = u
1a90: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
1aa0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
1ab0: 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20  TmpWide==0 ){.  
1ac0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1ad0: 20 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 20    zFilenameMbcs 
1ae0: 3d 20 75 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28  = unicodeToMbcs(
1af0: 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c  zTmpWide);.  sql
1b00: 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69  ite3_free(zTmpWi
1b10: 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46  de);.  return zF
1b20: 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a  ilenameMbcs;.}..
1b30: 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 2f 2a 2a  #if OS_WINCE./**
1b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b80: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20  *******.** This 
1b90: 73 65 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  section contains
1ba0: 20 63 6f 64 65 20 66 6f 72 20 57 69 6e 43 45 20   code for WinCE 
1bb0: 6f 6e 6c 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 57  only..*/./*.** W
1bc0: 69 6e 64 6f 77 73 43 45 20 64 6f 65 73 20 6e 6f  indowsCE does no
1bd0: 74 20 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69  t have a localti
1be0: 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  me() function.  
1bf0: 53 6f 20 63 72 65 61 74 65 20 61 0a 2a 2a 20 73  So create a.** s
1c00: 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69  ubstitute..*/.#i
1c10: 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a  nclude <time.h>.
1c20: 73 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65  struct tm *__cde
1c30: 63 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e  cl localtime(con
1c40: 73 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a  st time_t *t).{.
1c50: 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
1c60: 74 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45  tm y;.  FILETIME
1c70: 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53   uTm, lTm;.  SYS
1c80: 54 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 69  TEMTIME pTm;.  i
1c90: 36 34 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20  64 t64;.  t64 = 
1ca0: 2a 74 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34  *t;.  t64 = (t64
1cb0: 20 2b 20 31 31 36 34 34 34 37 33 36 30 30 29 2a   + 11644473600)*
1cc0: 31 30 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e  10000000;.  uTm.
1cd0: 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20  dwLowDateTime = 
1ce0: 74 36 34 20 26 20 30 78 46 46 46 46 46 46 46 46  t64 & 0xFFFFFFFF
1cf0: 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68 44 61  ;.  uTm.dwHighDa
1d00: 74 65 54 69 6d 65 3d 20 74 36 34 20 3e 3e 20 33  teTime= t64 >> 3
1d10: 32 3b 0a 20 20 46 69 6c 65 54 69 6d 65 54 6f 4c  2;.  FileTimeToL
1d20: 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28 26 75 54  ocalFileTime(&uT
1d30: 6d 2c 26 6c 54 6d 29 3b 0a 20 20 46 69 6c 65 54  m,&lTm);.  FileT
1d40: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28  imeToSystemTime(
1d50: 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e  &lTm,&pTm);.  y.
1d60: 74 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59  tm_year = pTm.wY
1d70: 65 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e  ear - 1900;.  y.
1d80: 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f  tm_mon = pTm.wMo
1d90: 6e 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f  nth - 1;.  y.tm_
1da0: 77 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f  wday = pTm.wDayO
1db0: 66 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64  fWeek;.  y.tm_md
1dc0: 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20  ay = pTm.wDay;. 
1dd0: 20 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d   y.tm_hour = pTm
1de0: 2e 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d  .wHour;.  y.tm_m
1df0: 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65  in = pTm.wMinute
1e00: 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70  ;.  y.tm_sec = p
1e10: 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65  Tm.wSecond;.  re
1e20: 74 75 72 6e 20 26 79 3b 0a 7d 0a 0a 2f 2a 20 54  turn &y;.}../* T
1e30: 68 69 73 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  his will never b
1e40: 65 20 63 61 6c 6c 65 64 2c 20 62 75 74 20 64 65  e called, but de
1e50: 66 69 6e 65 64 20 74 6f 20 6d 61 6b 65 20 74 68  fined to make th
1e60: 65 20 63 6f 64 65 20 63 6f 6d 70 69 6c 65 20 2a  e code compile *
1e70: 2f 0a 23 64 65 66 69 6e 65 20 47 65 74 54 65 6d  /.#define GetTem
1e80: 70 50 61 74 68 41 28 61 2c 62 29 0a 0a 23 64 65  pPathA(a,b)..#de
1e90: 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 28 61 2c  fine LockFile(a,
1ea0: 62 2c 63 2c 64 2c 65 29 20 20 20 20 20 20 20 77  b,c,d,e)       w
1eb0: 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26 61 2c  inceLockFile(&a,
1ec0: 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23 64 65   b, c, d, e).#de
1ed0: 66 69 6e 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 28  fine UnlockFile(
1ee0: 61 2c 62 2c 63 2c 64 2c 65 29 20 20 20 20 20 77  a,b,c,d,e)     w
1ef0: 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 26  inceUnlockFile(&
1f00: 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23  a, b, c, d, e).#
1f10: 64 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 45  define LockFileE
1f20: 78 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 20  x(a,b,c,d,e,f)  
1f30: 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45 78   winceLockFileEx
1f40: 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 2c  (&a, b, c, d, e,
1f50: 20 66 29 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e   f)..#define HAN
1f60: 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61  DLE_TO_WINFILE(a
1f70: 29 20 28 77 69 6e 46 69 6c 65 2a 29 26 28 28 63  ) (winFile*)&((c
1f80: 68 61 72 2a 29 61 29 5b 2d 6f 66 66 73 65 74 6f  har*)a)[-offseto
1f90: 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f  f(winFile,h)]../
1fa0: 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 6c  *.** Acquire a l
1fb0: 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64 6c  ock on the handl
1fc0: 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  e h.*/.static vo
1fd0: 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  id winceMutexAcq
1fe0: 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29 7b 0a  uire(HANDLE h){.
1ff0: 20 20 20 44 57 4f 52 44 20 64 77 45 72 72 3b 0a     DWORD dwErr;.
2000: 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64 77 45     do {.     dwE
2010: 72 72 20 3d 20 57 61 69 74 46 6f 72 53 69 6e 67  rr = WaitForSing
2020: 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e 46 49  leObject(h, INFI
2030: 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77 68 69 6c  NITE);.   } whil
2040: 65 20 28 64 77 45 72 72 20 21 3d 20 57 41 49 54  e (dwErr != WAIT
2050: 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20 64 77 45  _OBJECT_0 && dwE
2060: 72 72 20 21 3d 20 57 41 49 54 5f 41 42 41 4e 44  rr != WAIT_ABAND
2070: 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52  ONED);.}./*.** R
2080: 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20 61 63  elease a lock ac
2090: 71 75 69 72 65 64 20 62 79 20 77 69 6e 63 65 4d  quired by winceM
20a0: 75 74 65 78 41 63 71 75 69 72 65 28 29 0a 2a 2f  utexAcquire().*/
20b0: 0a 23 64 65 66 69 6e 65 20 77 69 6e 63 65 4d 75  .#define winceMu
20c0: 74 65 78 52 65 6c 65 61 73 65 28 68 29 20 52 65  texRelease(h) Re
20d0: 6c 65 61 73 65 4d 75 74 65 78 28 68 29 0a 0a 2f  leaseMutex(h)../
20e0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
20f0: 6d 75 74 65 78 20 61 6e 64 20 73 68 61 72 65 64  mutex and shared
2100: 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 66 6f 72   memory used for
2110: 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 65 20   locking in the 
2120: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
2130: 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74 61 74  or pFile.*/.stat
2140: 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 43 72 65  ic BOOL winceCre
2150: 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68  ateLock(const ch
2160: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 77  ar *zFilename, w
2170: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
2180: 20 20 57 43 48 41 52 20 2a 7a 54 6f 6b 3b 0a 20    WCHAR *zTok;. 
2190: 20 57 43 48 41 52 20 2a 7a 4e 61 6d 65 20 3d 20   WCHAR *zName = 
21a0: 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46  utf8ToUnicode(zF
21b0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 42 4f 4f 4c  ilename);.  BOOL
21c0: 20 62 49 6e 69 74 20 3d 20 54 52 55 45 3b 0a 0a   bInit = TRUE;..
21d0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
21e0: 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61  the local lockda
21f0: 74 61 20 2a 2f 0a 20 20 5a 65 72 6f 4d 65 6d 6f  ta */.  ZeroMemo
2200: 72 79 28 26 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  ry(&pFile->local
2210: 2c 20 73 69 7a 65 6f 66 28 70 46 69 6c 65 2d 3e  , sizeof(pFile->
2220: 6c 6f 63 61 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52  local));..  /* R
2230: 65 70 6c 61 63 65 20 74 68 65 20 62 61 63 6b 73  eplace the backs
2240: 6c 61 73 68 65 73 20 66 72 6f 6d 20 74 68 65 20  lashes from the 
2250: 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 6c 6f 77  filename and low
2260: 65 72 63 61 73 65 20 69 74 0a 20 20 2a 2a 20 74  ercase it.  ** t
2270: 6f 20 64 65 72 69 76 65 20 61 20 6d 75 74 65 78  o derive a mutex
2280: 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b   name. */.  zTok
2290: 20 3d 20 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e   = CharLowerW(zN
22a0: 61 6d 65 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a  ame);.  for (;*z
22b0: 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20  Tok;zTok++){.   
22c0: 20 69 66 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c   if (*zTok == '\
22d0: 5c 27 29 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b  \') *zTok = '_';
22e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74  .  }..  /* Creat
22f0: 65 2f 6f 70 65 6e 20 74 68 65 20 6e 61 6d 65 64  e/open the named
2300: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c   mutex */.  pFil
2310: 65 2d 3e 68 4d 75 74 65 78 20 3d 20 43 72 65 61  e->hMutex = Crea
2320: 74 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46  teMutexW(NULL, F
2330: 41 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ALSE, zName);.  
2340: 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74  if (!pFile->hMut
2350: 65 78 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ex){.    sqlite3
2360: 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  _free(zName);.  
2370: 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a    return FALSE;.
2380: 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
2390: 65 20 74 68 65 20 6d 75 74 65 78 20 62 65 66 6f  e the mutex befo
23a0: 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f  re continuing */
23b0: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
23c0: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
23d0: 65 78 29 3b 0a 20 20 0a 20 20 2f 2a 20 53 69 6e  ex);.  .  /* Sin
23e0: 63 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ce the names of 
23f0: 6e 61 6d 65 64 20 6d 75 74 65 78 65 73 2c 20 73  named mutexes, s
2400: 65 6d 61 70 68 6f 72 65 73 2c 20 66 69 6c 65 20  emaphores, file 
2410: 6d 61 70 70 69 6e 67 73 20 65 74 63 20 61 72 65  mappings etc are
2420: 20 0a 20 20 2a 2a 20 63 61 73 65 2d 73 65 6e 73   .  ** case-sens
2430: 69 74 69 76 65 2c 20 74 61 6b 65 20 61 64 76 61  itive, take adva
2440: 6e 74 61 67 65 20 6f 66 20 74 68 61 74 20 62 79  ntage of that by
2450: 20 75 70 70 65 72 63 61 73 69 6e 67 20 74 68 65   uppercasing the
2460: 20 6d 75 74 65 78 20 6e 61 6d 65 0a 20 20 2a 2a   mutex name.  **
2470: 20 61 6e 64 20 75 73 69 6e 67 20 74 68 61 74 20   and using that 
2480: 61 73 20 74 68 65 20 73 68 61 72 65 64 20 66 69  as the shared fi
2490: 6c 65 6d 61 70 70 69 6e 67 20 6e 61 6d 65 2e 0a  lemapping name..
24a0: 20 20 2a 2f 0a 20 20 43 68 61 72 55 70 70 65 72    */.  CharUpper
24b0: 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c  W(zName);.  pFil
24c0: 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 43 72 65  e->hShared = Cre
24d0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28  ateFileMappingW(
24e0: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
24f0: 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20  ALUE, NULL,.    
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2520: 20 20 20 50 41 47 45 5f 52 45 41 44 57 52 49 54     PAGE_READWRIT
2530: 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e  E, 0, sizeof(win
2540: 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20  ceLock),.       
2550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2570: 7a 4e 61 6d 65 29 3b 20 20 0a 0a 20 20 2f 2a 20  zName);  ..  /* 
2580: 53 65 74 20 61 20 66 6c 61 67 20 74 68 61 74 20  Set a flag that 
2590: 69 6e 64 69 63 61 74 65 73 20 77 65 27 72 65 20  indicates we're 
25a0: 74 68 65 20 66 69 72 73 74 20 74 6f 20 63 72 65  the first to cre
25b0: 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73  ate the memory s
25c0: 6f 20 69 74 20 0a 20 20 2a 2a 20 6d 75 73 74 20  o it .  ** must 
25d0: 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69  be zero-initiali
25e0: 7a 65 64 20 2a 2f 0a 20 20 69 66 20 28 47 65 74  zed */.  if (Get
25f0: 4c 61 73 74 45 72 72 6f 72 28 29 20 3d 3d 20 45  LastError() == E
2600: 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58 49  RROR_ALREADY_EXI
2610: 53 54 53 29 7b 0a 20 20 20 20 62 49 6e 69 74 20  STS){.    bInit 
2620: 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20  = FALSE;.  }..  
2630: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61  sqlite3_free(zNa
2640: 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  me);..  /* If we
2650: 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 6d 61   succeeded in ma
2660: 6b 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  king the shared 
2670: 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20 6d  memory handle, m
2680: 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66 20 28  ap it. */.  if (
2690: 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 7b  pFile->hShared){
26a0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72  .    pFile->shar
26b0: 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a  ed = (winceLock*
26c0: 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  )MapViewOfFile(p
26d0: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 2c 20 0a  File->hShared, .
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 49 4c               FIL
26f0: 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f  E_MAP_READ|FILE_
2700: 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c  MAP_WRITE, 0, 0,
2710: 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63   sizeof(winceLoc
2720: 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d  k));.    /* If m
2730: 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2c 20 63  apping failed, c
2740: 6c 6f 73 65 20 74 68 65 20 73 68 61 72 65 64 20  lose the shared 
2750: 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e  memory handle an
2760: 64 20 65 72 61 73 65 20 69 74 20 2a 2f 0a 20 20  d erase it */.  
2770: 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 73 68    if (!pFile->sh
2780: 61 72 65 64 29 7b 0a 20 20 20 20 20 20 43 6c 6f  ared){.      Clo
2790: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
27a0: 68 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  hShared);.      
27b0: 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d  pFile->hShared =
27c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d   NULL;.    }.  }
27d0: 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61 72 65 64  ..  /* If shared
27e0: 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e 6f   memory could no
27f0: 74 20 62 65 20 63 72 65 61 74 65 64 2c 20 74 68  t be created, th
2800: 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d 75 74  en close the mut
2810: 65 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a 20  ex and fail */. 
2820: 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61   if (pFile->hSha
2830: 72 65 64 20 3d 3d 20 4e 55 4c 4c 29 7b 0a 20 20  red == NULL){.  
2840: 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
2850: 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
2860: 78 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e  x);.    CloseHan
2870: 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  dle(pFile->hMute
2880: 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68  x);.    pFile->h
2890: 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20  Mutex = NULL;.  
28a0: 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a    return FALSE;.
28b0: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 6e 69 74    }.  .  /* Init
28c0: 69 61 6c 69 7a 65 20 74 68 65 20 73 68 61 72 65  ialize the share
28d0: 64 20 6d 65 6d 6f 72 79 20 69 66 20 77 65 27 72  d memory if we'r
28e0: 65 20 73 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f  e supposed to */
28f0: 0a 20 20 69 66 20 28 62 49 6e 69 74 29 20 7b 0a  .  if (bInit) {.
2900: 20 20 20 20 5a 65 72 6f 4d 65 6d 6f 72 79 28 70      ZeroMemory(p
2910: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 73 69  File->shared, si
2920: 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29  zeof(winceLock))
2930: 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75  ;.  }..  winceMu
2940: 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
2950: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74  ->hMutex);.  ret
2960: 75 72 6e 20 54 52 55 45 3b 0a 7d 0a 0a 2f 2a 0a  urn TRUE;.}../*.
2970: 2a 2a 20 44 65 73 74 72 6f 79 20 74 68 65 20 70  ** Destroy the p
2980: 61 72 74 20 6f 66 20 77 69 6e 46 69 6c 65 20 74  art of winFile t
2990: 68 61 74 20 64 65 61 6c 73 20 77 69 74 68 20 77  hat deals with w
29a0: 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74  ince locks.*/.st
29b0: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 44  atic void winceD
29c0: 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46 69  estroyLock(winFi
29d0: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66  le *pFile){.  if
29e0: 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29   (pFile->hMutex)
29f0: 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65  {.    /* Acquire
2a00: 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20   the mutex */.  
2a10: 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
2a20: 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
2a30: 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  x);..    /* The 
2a40: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 73  following blocks
2a50: 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79   should probably
2a60: 20 61 73 73 65 72 74 20 69 6e 20 64 65 62 75 67   assert in debug
2a70: 20 6d 6f 64 65 2c 20 62 75 74 20 74 68 65 79 0a   mode, but they.
2a80: 20 20 20 20 20 20 20 61 72 65 20 74 6f 20 63 6c         are to cl
2a90: 65 61 6e 75 70 20 69 6e 20 63 61 73 65 20 61 6e  eanup in case an
2aa0: 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65 64  y locks remained
2ab0: 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20   open */.    if 
2ac0: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
2ad0: 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 70  eaders){.      p
2ae0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52  File->shared->nR
2af0: 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 7d  eaders --;.    }
2b00: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
2b10: 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29  local.bReserved)
2b20: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
2b30: 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64  hared->bReserved
2b40: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a   = FALSE;.    }.
2b50: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
2b60: 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a  ocal.bPending){.
2b70: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
2b80: 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20  red->bPending = 
2b90: 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20  FALSE;.    }.   
2ba0: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
2bb0: 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20  l.bExclusive){. 
2bc0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
2bd0: 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
2be0: 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a 20   FALSE;.    }.. 
2bf0: 20 20 20 2f 2a 20 44 65 2d 72 65 66 65 72 65 6e     /* De-referen
2c00: 63 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75 72  ce and close our
2c10: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 68 61   copy of the sha
2c20: 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c  red memory handl
2c30: 65 20 2a 2f 0a 20 20 20 20 55 6e 6d 61 70 56 69  e */.    UnmapVi
2c40: 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ewOfFile(pFile->
2c50: 73 68 61 72 65 64 29 3b 0a 20 20 20 20 43 6c 6f  shared);.    Clo
2c60: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
2c70: 68 53 68 61 72 65 64 29 3b 0a 0a 20 20 20 20 69  hShared);..    i
2c80: 66 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74  f( pFile->zDelet
2c90: 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20  eOnClose ){.    
2ca0: 20 20 44 65 6c 65 74 65 46 69 6c 65 57 28 70 46    DeleteFileW(pF
2cb0: 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
2cc0: 6f 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ose);.      sqli
2cd0: 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
2ce0: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b  zDeleteOnClose);
2cf0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44  .      pFile->zD
2d00: 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 30  eleteOnClose = 0
2d10: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2d20: 44 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d 75  Done with the mu
2d30: 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65  tex */.    wince
2d40: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
2d50: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 20 20 20 20  le->hMutex);    
2d60: 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65  .    CloseHandle
2d70: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
2d80: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74  .    pFile->hMut
2d90: 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d  ex = NULL;.  }.}
2da0: 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e 20 69 6d 70 6c  ../* .** An impl
2db0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
2dc0: 65 20 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50 49  e LockFile() API
2dd0: 20 6f 66 20 77 69 6e 64 6f 77 73 20 66 6f 72 20   of windows for 
2de0: 77 69 6e 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20  wince.*/.static 
2df0: 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69  BOOL winceLockFi
2e00: 6c 65 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68  le(.  HANDLE *ph
2e10: 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77  File,.  DWORD dw
2e20: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20  FileOffsetLow,. 
2e30: 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66   DWORD dwFileOff
2e40: 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44  setHigh,.  DWORD
2e50: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
2e60: 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52  oLockLow,.  DWOR
2e70: 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
2e80: 54 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20  ToLockHigh.){.  
2e90: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
2ea0: 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49   HANDLE_TO_WINFI
2eb0: 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f  LE(phFile);.  BO
2ec0: 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c  OL bReturn = FAL
2ed0: 53 45 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c  SE;..  if (!pFil
2ee0: 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72  e->hMutex) retur
2ef0: 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d  n TRUE;.  winceM
2f00: 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c  utexAcquire(pFil
2f10: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f  e->hMutex);..  /
2f20: 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20 65 78 63  * Wanting an exc
2f30: 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a  lusive lock? */.
2f40: 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73    if (dwFileOffs
2f50: 65 74 4c 6f 77 20 3d 3d 20 53 48 41 52 45 44 5f  etLow == SHARED_
2f60: 46 49 52 53 54 0a 20 20 20 20 20 20 20 26 26 20  FIRST.       && 
2f70: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
2f80: 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 53 48 41 52 45  LockLow == SHARE
2f90: 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69 66 20  D_SIZE){.    if 
2fa0: 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e  (pFile->shared->
2fb0: 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 20 26 26  nReaders == 0 &&
2fc0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
2fd0: 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29  bExclusive == 0)
2fe0: 7b 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  {.       pFile->
2ff0: 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
3000: 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ve = TRUE;.     
3010: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
3020: 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45  Exclusive = TRUE
3030: 3b 0a 20 20 20 20 20 20 20 62 52 65 74 75 72 6e  ;.       bReturn
3040: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
3050: 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20   }..  /* Want a 
3060: 72 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20  read-only lock? 
3070: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 28 64  */.  else if ((d
3080: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3e  wFileOffsetLow >
3090: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 26  = SHARED_FIRST &
30a0: 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 77  &.            dw
30b0: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3c 20  FileOffsetLow < 
30c0: 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 53  SHARED_FIRST + S
30d0: 48 41 52 45 44 5f 53 49 5a 45 29 20 26 26 0a 20  HARED_SIZE) &&. 
30e0: 20 20 20 20 20 20 20 20 20 20 20 6e 4e 75 6d 62             nNumb
30f0: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
3100: 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66  ow == 1){.    if
3110: 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
3120: 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30  >bExclusive == 0
3130: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
3140: 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b  local.nReaders +
3150: 2b 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69  +;.      if (pFi
3160: 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
3170: 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20  rs == 1){.      
3180: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
3190: 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20  >nReaders ++;.  
31a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74      }.      bRet
31b0: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
31c0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74  }.  }..  /* Want
31d0: 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f   a pending lock?
31e0: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64   */.  else if (d
31f0: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
3200: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 26  = PENDING_BYTE &
3210: 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
3220: 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  ToLockLow == 1){
3230: 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70 65  .    /* If no pe
3240: 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62  nding lock has b
3250: 65 65 6e 20 61 63 71 75 69 72 65 64 2c 20 74 68  een acquired, th
3260: 65 6e 20 61 63 71 75 69 72 65 20 69 74 20 2a 2f  en acquire it */
3270: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
3280: 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
3290: 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70   == 0) {.      p
32a0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
32b0: 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20  ending = TRUE;. 
32c0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
32d0: 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55  l.bPending = TRU
32e0: 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
32f0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
3300: 20 7d 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 72   }.  /* Want a r
3310: 65 73 65 72 76 65 64 20 6c 6f 63 6b 3f 20 2a 2f  eserved lock? */
3320: 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69  .  else if (dwFi
3330: 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 52  leOffsetLow == R
3340: 45 53 45 52 56 45 44 5f 42 59 54 45 20 26 26 20  ESERVED_BYTE && 
3350: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
3360: 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20  LockLow == 1){. 
3370: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68     if (pFile->sh
3380: 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20  ared->bReserved 
3390: 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46  == 0) {.      pF
33a0: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65  ile->shared->bRe
33b0: 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20  served = TRUE;. 
33c0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
33d0: 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20 54 52  l.bReserved = TR
33e0: 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  UE;.      bRetur
33f0: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
3400: 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65    }..  winceMute
3410: 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e  xRelease(pFile->
3420: 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  hMutex);.  retur
3430: 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  n bReturn;.}../*
3440: 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74  .** An implement
3450: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 55 6e 6c  ation of the Unl
3460: 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f 66 20 77  ockFile API of w
3470: 69 6e 64 6f 77 73 20 66 6f 72 20 77 69 6e 63 65  indows for wince
3480: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
3490: 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28  winceUnlockFile(
34a0: 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69 6c  .  HANDLE *phFil
34b0: 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  e,.  DWORD dwFil
34c0: 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57  eOffsetLow,.  DW
34d0: 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
34e0: 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  High,.  DWORD nN
34f0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
3500: 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  lockLow,.  DWORD
3510: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
3520: 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20  oUnlockHigh.){. 
3530: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
3540: 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46  = HANDLE_TO_WINF
3550: 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42  ILE(phFile);.  B
3560: 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41  OOL bReturn = FA
3570: 4c 53 45 3b 0a 0a 20 20 69 66 20 28 21 70 46 69  LSE;..  if (!pFi
3580: 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75  le->hMutex) retu
3590: 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65  rn TRUE;.  wince
35a0: 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69  MutexAcquire(pFi
35b0: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20  le->hMutex);..  
35c0: 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72  /* Releasing a r
35d0: 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20 61 6e  eader lock or an
35e0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
35f0: 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f  */.  if (dwFileO
3600: 66 66 73 65 74 4c 6f 77 20 3e 3d 20 53 48 41 52  ffsetLow >= SHAR
3610: 45 44 5f 46 49 52 53 54 20 26 26 0a 20 20 20 20  ED_FIRST &&.    
3620: 20 20 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c     dwFileOffsetL
3630: 6f 77 20 3c 20 53 48 41 52 45 44 5f 46 49 52 53  ow < SHARED_FIRS
3640: 54 20 2b 20 53 48 41 52 45 44 5f 53 49 5a 45 29  T + SHARED_SIZE)
3650: 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20  {.    /* Did we 
3660: 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76  have an exclusiv
3670: 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 69  e lock? */.    i
3680: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
3690: 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20  bExclusive){.   
36a0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
36b0: 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c  bExclusive = FAL
36c0: 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  SE;.      pFile-
36d0: 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
36e0: 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ive = FALSE;.   
36f0: 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
3700: 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
3710: 20 44 69 64 20 77 65 20 6a 75 73 74 20 68 61 76   Did we just hav
3720: 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 3f  e a reader lock?
3730: 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 20   */.    else if 
3740: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
3750: 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 70  eaders){.      p
3760: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
3770: 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 69  ders --;.      i
3780: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
3790: 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 29 0a 20  nReaders == 0). 
37a0: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70       {.        p
37b0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52  File->shared->nR
37c0: 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20  eaders --;.     
37d0: 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e   }.      bReturn
37e0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
37f0: 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69   }..  /* Releasi
3800: 6e 67 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63  ng a pending loc
3810: 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  k */.  else if (
3820: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
3830: 3d 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  == PENDING_BYTE 
3840: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
3850: 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
3860: 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  1){.    if (pFil
3870: 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e  e->local.bPendin
3880: 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  g){.      pFile-
3890: 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20  >local.bPending 
38a0: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70  = FALSE;.      p
38b0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
38c0: 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a  ending = FALSE;.
38d0: 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
38e0: 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
38f0: 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61    /* Releasing a
3900: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a   reserved lock *
3910: 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
3920: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
3930: 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 26 26  RESERVED_BYTE &&
3940: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
3950: 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  oUnlockLow == 1)
3960: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
3970: 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
3980: 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
3990: 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
39a0: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
39b0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
39c0: 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45  Reserved = FALSE
39d0: 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  ;.      bReturn 
39e0: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
39f0: 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52  }..  winceMutexR
3a00: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
3a10: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
3a20: 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  bReturn;.}../*.*
3a30: 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  * An implementat
3a40: 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46  ion of the LockF
3a50: 69 6c 65 45 78 28 29 20 41 50 49 20 6f 66 20 77  ileEx() API of w
3a60: 69 6e 64 6f 77 73 20 66 6f 72 20 77 69 6e 63 65  indows for wince
3a70: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
3a80: 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45 78 28  winceLockFileEx(
3a90: 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69 6c  .  HANDLE *phFil
3aa0: 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61  e,.  DWORD dwFla
3ab0: 67 73 2c 0a 20 20 44 57 4f 52 44 20 64 77 52 65  gs,.  DWORD dwRe
3ac0: 73 65 72 76 65 64 2c 0a 20 20 44 57 4f 52 44 20  served,.  DWORD 
3ad0: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
3ae0: 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  LockLow,.  DWORD
3af0: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
3b00: 6f 4c 6f 63 6b 48 69 67 68 2c 0a 20 20 4c 50 4f  oLockHigh,.  LPO
3b10: 56 45 52 4c 41 50 50 45 44 20 6c 70 4f 76 65 72  VERLAPPED lpOver
3b20: 6c 61 70 70 65 64 0a 29 7b 0a 20 20 2f 2a 20 49  lapped.){.  /* I
3b30: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 77 61 6e  f the caller wan
3b40: 74 73 20 61 20 73 68 61 72 65 64 20 72 65 61 64  ts a shared read
3b50: 20 6c 6f 63 6b 2c 20 66 6f 72 77 61 72 64 20 74   lock, forward t
3b60: 68 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f  his call.  ** to
3b70: 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 20 2a   winceLockFile *
3b80: 2f 0a 20 20 69 66 20 28 6c 70 4f 76 65 72 6c 61  /.  if (lpOverla
3b90: 70 70 65 64 2d 3e 4f 66 66 73 65 74 20 3d 3d 20  pped->Offset == 
3ba0: 53 48 41 52 45 44 5f 46 49 52 53 54 20 26 26 0a  SHARED_FIRST &&.
3bb0: 20 20 20 20 20 20 64 77 46 6c 61 67 73 20 3d 3d        dwFlags ==
3bc0: 20 31 20 26 26 0a 20 20 20 20 20 20 6e 4e 75 6d   1 &&.      nNum
3bd0: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
3be0: 4c 6f 77 20 3d 3d 20 53 48 41 52 45 44 5f 53 49  Low == SHARED_SI
3bf0: 5a 45 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ZE){.    return 
3c00: 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70 68  winceLockFile(ph
3c10: 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
3c20: 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  ST, 0, 1, 0);.  
3c30: 7d 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45  }.  return FALSE
3c40: 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66  ;.}./*.** End of
3c50: 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f 64   the special cod
3c60: 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a  e for wince.****
3c70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69  *********/.#endi
3cc0: 66 20 2f 2a 20 4f 53 5f 57 49 4e 43 45 20 2a 2f  f /* OS_WINCE */
3cd0: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
3ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3d10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3d20: 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f  .** The next gro
3d30: 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 69  up of routines i
3d40: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f 4f  mplement the I/O
3d50: 20 6d 65 74 68 6f 64 73 20 73 70 65 63 69 66 69   methods specifi
3d60: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 71 6c  ed.** by the sql
3d70: 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
3d80: 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a  object..********
3d90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3da0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3dc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3dd0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  ******/../*.** C
3de0: 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a  lose a file..**.
3df0: 2a 2a 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  ** It is reporte
3e00: 64 20 74 68 61 74 20 61 6e 20 61 74 74 65 6d 70  d that an attemp
3e10: 74 20 74 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e  t to close a han
3e20: 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65 74 69  dle might someti
3e30: 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68  mes.** fail.  Th
3e40: 69 73 20 69 73 20 61 20 76 65 72 79 20 75 6e 72  is is a very unr
3e50: 65 61 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74  easonable result
3e60: 2c 20 62 75 74 20 77 69 6e 64 6f 77 73 20 69 73  , but windows is
3e70: 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f   notorious.** fo
3e80: 72 20 62 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e  r being unreason
3e90: 61 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74  able so I do not
3ea0: 20 64 6f 75 62 74 20 74 68 61 74 20 69 74 20 6d   doubt that it m
3eb0: 69 67 68 74 20 68 61 70 70 65 6e 2e 20 20 49 66  ight happen.  If
3ec0: 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20 66 61  .** the close fa
3ed0: 69 6c 73 2c 20 77 65 20 70 61 75 73 65 20 66 6f  ils, we pause fo
3ee0: 72 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e  r 100 millisecon
3ef0: 64 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  ds and try again
3f00: 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73  .  As.** many as
3f10: 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50   MX_CLOSE_ATTEMP
3f20: 54 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c  T attempts to cl
3f30: 6f 73 65 20 74 68 65 20 68 61 6e 64 6c 65 20 61  ose the handle a
3f40: 72 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a  re made before.*
3f50: 2a 20 67 69 76 69 6e 67 20 75 70 20 61 6e 64 20  * giving up and 
3f60: 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  returning an err
3f70: 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  or..*/.#define M
3f80: 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
3f90: 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  3.static int win
3fa0: 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
3fb0: 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
3fc0: 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69  c, cnt = 0;.  wi
3fd0: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
3fe0: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 4f  winFile*)id;.  O
3ff0: 53 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25  STRACE2("CLOSE %
4000: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b  d\n", pFile->h);
4010: 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d 20  .  do{.    rc = 
4020: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
4030: 65 2d 3e 68 29 3b 0a 20 20 7d 77 68 69 6c 65 28  e->h);.  }while(
4040: 20 72 63 3d 3d 30 20 26 26 20 63 6e 74 2b 2b 20   rc==0 && cnt++ 
4050: 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  < MX_CLOSE_ATTEM
4060: 50 54 20 26 26 20 28 53 6c 65 65 70 28 31 30 30  PT && (Sleep(100
4070: 29 2c 20 31 29 20 29 3b 0a 23 69 66 20 4f 53 5f  ), 1) );.#if OS_
4080: 57 49 4e 43 45 0a 20 20 77 69 6e 63 65 44 65 73  WINCE.  winceDes
4090: 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  troyLock(pFile);
40a0: 0a 23 65 6e 64 69 66 0a 20 20 4f 70 65 6e 43 6f  .#endif.  OpenCo
40b0: 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 72 65 74  unter(-1);.  ret
40c0: 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f  urn rc ? SQLITE_
40d0: 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52  OK : SQLITE_IOER
40e0: 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  R;.}../*.** Some
40f0: 20 6d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69   microsoft compi
4100: 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64  lers lack this d
4110: 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  efinition..*/.#i
4120: 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45  fndef INVALID_SE
4130: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23  T_FILE_POINTER.#
4140: 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f   define INVALID_
4150: 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
4160: 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e   ((DWORD)-1).#en
4170: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
4180: 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65  data from a file
4190: 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20   into a buffer. 
41a0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
41b0: 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65  K if all.** byte
41c0: 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63  s were read succ
41d0: 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c  essfully and SQL
41e0: 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79  ITE_IOERR if any
41f0: 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
4200: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
4210: 6e 74 20 77 69 6e 52 65 61 64 28 0a 20 20 73 71  nt winRead(.  sq
4220: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
4230: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
4240: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
4250: 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
4260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4270: 20 57 72 69 74 65 20 63 6f 6e 74 65 6e 74 20 69   Write content i
4280: 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
4290: 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20  */.  int amt,   
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
42c0: 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20  es to read */.  
42d0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
42e0: 66 73 65 74 20 20 20 20 20 20 20 2f 2a 20 42 65  fset       /* Be
42f0: 67 69 6e 20 72 65 61 64 69 6e 67 20 61 74 20 74  gin reading at t
4300: 68 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b  his offset */.){
4310: 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74  .  LONG upperBit
4320: 73 20 3d 20 28 6f 66 66 73 65 74 3e 3e 33 32 29  s = (offset>>32)
4330: 20 26 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20   & 0x7fffffff;. 
4340: 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73 20   LONG lowerBits 
4350: 3d 20 6f 66 66 73 65 74 20 26 20 30 78 66 66 66  = offset & 0xfff
4360: 66 66 66 66 66 3b 0a 20 20 44 57 4f 52 44 20 72  fffff;.  DWORD r
4370: 63 3b 0a 20 20 44 57 4f 52 44 20 67 6f 74 3b 0a  c;.  DWORD got;.
4380: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
4390: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
43a0: 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
43b0: 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
43c0: 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
43d0: 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b  ITE_IOERR_READ);
43e0: 0a 20 20 4f 53 54 52 41 43 45 33 28 22 52 45 41  .  OSTRACE3("REA
43f0: 44 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  D %d lock=%d\n",
4400: 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
4410: 2d 3e 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 72  ->locktype);.  r
4420: 63 20 3d 20 53 65 74 46 69 6c 65 50 6f 69 6e 74  c = SetFilePoint
4430: 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77  er(pFile->h, low
4440: 65 72 42 69 74 73 2c 20 26 75 70 70 65 72 42 69  erBits, &upperBi
4450: 74 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b  ts, FILE_BEGIN);
4460: 0a 20 20 69 66 28 20 72 63 3d 3d 49 4e 56 41 4c  .  if( rc==INVAL
4470: 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e  ID_SET_FILE_POIN
4480: 54 45 52 20 26 26 20 47 65 74 4c 61 73 74 45 72  TER && GetLastEr
4490: 72 6f 72 28 29 21 3d 4e 4f 5f 45 52 52 4f 52 20  ror()!=NO_ERROR 
44a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
44b0: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20  LITE_FULL;.  }. 
44c0: 20 69 66 28 20 21 52 65 61 64 46 69 6c 65 28 70   if( !ReadFile(p
44d0: 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61  File->h, pBuf, a
44e0: 6d 74 2c 20 26 67 6f 74 2c 20 30 29 20 29 7b 0a  mt, &got, 0) ){.
44f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4500: 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20  E_IOERR_READ;.  
4510: 7d 0a 20 20 69 66 28 20 67 6f 74 3d 3d 28 44 57  }.  if( got==(DW
4520: 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20 20 20 72  ORD)amt ){.    r
4530: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
4540: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65  .  }else{.    me
4550: 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42  mset(&((char*)pB
4560: 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74  uf)[got], 0, amt
4570: 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75 72  -got);.    retur
4580: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  n SQLITE_IOERR_S
4590: 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d  HORT_READ;.  }.}
45a0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61  ../*.** Write da
45b0: 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
45c0: 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52   into a file.  R
45d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
45e0: 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72  on success.** or
45f0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
4600: 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72  r code on failur
4610: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
4620: 20 77 69 6e 57 72 69 74 65 28 0a 20 20 73 71 6c   winWrite(.  sql
4630: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20  ite3_file *id,  
4640: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74         /* File t
4650: 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a  o write into */.
4660: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42    const void *pB
4670: 75 66 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  uf,         /* T
4680: 68 65 20 62 79 74 65 73 20 74 6f 20 62 65 20 77  he bytes to be w
4690: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  ritten */.  int 
46a0: 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
46b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
46c0: 6f 66 20 62 79 74 65 73 20 74 6f 20 77 72 69 74  of bytes to writ
46d0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
46e0: 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 20  nt64 offset     
46f0: 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
4700: 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67 69  the file to begi
4710: 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a  n writing at */.
4720: 29 7b 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42  ){.  LONG upperB
4730: 69 74 73 20 3d 20 28 6f 66 66 73 65 74 3e 3e 33  its = (offset>>3
4740: 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66 3b  2) & 0x7fffffff;
4750: 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74  .  LONG lowerBit
4760: 73 20 3d 20 6f 66 66 73 65 74 20 26 20 30 78 66  s = offset & 0xf
4770: 66 66 66 66 66 66 66 3b 0a 20 20 44 57 4f 52 44  fffffff;.  DWORD
4780: 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 77 72 6f   rc;.  DWORD wro
4790: 74 65 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  te;.  winFile *p
47a0: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
47b0: 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20 69  )id;.  assert( i
47c0: 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61  d!=0 );.  Simula
47d0: 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
47e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
47f0: 49 54 45 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  ITE);.  Simulate
4800: 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65  DiskfullError(re
4810: 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
4820: 29 3b 0a 20 20 4f 53 54 52 41 43 45 33 28 22 57  );.  OSTRACE3("W
4830: 52 49 54 45 20 25 64 20 6c 6f 63 6b 3d 25 64 5c  RITE %d lock=%d\
4840: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46  n", pFile->h, pF
4850: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 3b 0a  ile->locktype);.
4860: 20 20 72 63 20 3d 20 53 65 74 46 69 6c 65 50 6f    rc = SetFilePo
4870: 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20  inter(pFile->h, 
4880: 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70 70 65  lowerBits, &uppe
4890: 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49  rBits, FILE_BEGI
48a0: 4e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 49 4e  N);.  if( rc==IN
48b0: 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
48c0: 4f 49 4e 54 45 52 20 26 26 20 47 65 74 4c 61 73  OINTER && GetLas
48d0: 74 45 72 72 6f 72 28 29 21 3d 4e 4f 5f 45 52 52  tError()!=NO_ERR
48e0: 4f 52 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OR ){.    return
48f0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
4900: 7d 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e  }.  assert( amt>
4910: 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 0a 20 20  0 );.  while(.  
4920: 20 20 20 61 6d 74 3e 30 0a 20 20 20 20 20 26 26     amt>0.     &&
4930: 20 28 72 63 20 3d 20 57 72 69 74 65 46 69 6c 65   (rc = WriteFile
4940: 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c  (pFile->h, pBuf,
4950: 20 61 6d 74 2c 20 26 77 72 6f 74 65 2c 20 30 29   amt, &wrote, 0)
4960: 29 21 3d 30 0a 20 20 20 20 20 26 26 20 77 72 6f  )!=0.     && wro
4970: 74 65 3e 30 0a 20 20 29 7b 0a 20 20 20 20 61 6d  te>0.  ){.    am
4980: 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20  t -= wrote;.    
4990: 70 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29  pBuf = &((char*)
49a0: 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20  pBuf)[wrote];.  
49b0: 7d 0a 20 20 69 66 28 20 21 72 63 20 7c 7c 20 61  }.  if( !rc || a
49c0: 6d 74 3e 28 69 6e 74 29 77 72 6f 74 65 20 29 7b  mt>(int)wrote ){
49d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
49e0: 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72  TE_FULL;.  }.  r
49f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
4a00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
4a10: 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  te an open file 
4a20: 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73  to a specified s
4a30: 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ize.*/.static in
4a40: 74 20 77 69 6e 54 72 75 6e 63 61 74 65 28 73 71  t winTruncate(sq
4a50: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
4a60: 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 4c 4f  i64 nByte){.  LO
4a70: 4e 47 20 75 70 70 65 72 42 69 74 73 20 3d 20 28  NG upperBits = (
4a80: 6e 42 79 74 65 3e 3e 33 32 29 20 26 20 30 78 37  nByte>>32) & 0x7
4a90: 66 66 66 66 66 66 66 3b 0a 20 20 4c 4f 4e 47 20  fffffff;.  LONG 
4aa0: 6c 6f 77 65 72 42 69 74 73 20 3d 20 6e 42 79 74  lowerBits = nByt
4ab0: 65 20 26 20 30 78 66 66 66 66 66 66 66 66 3b 0a  e & 0xffffffff;.
4ac0: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
4ad0: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
4ae0: 0a 20 20 4f 53 54 52 41 43 45 33 28 22 54 52 55  .  OSTRACE3("TRU
4af0: 4e 43 41 54 45 20 25 64 20 25 6c 6c 64 5c 6e 22  NCATE %d %lld\n"
4b00: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74  , pFile->h, nByt
4b10: 65 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  e);.  SimulateIO
4b20: 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
4b30: 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
4b40: 54 45 29 3b 0a 20 20 53 65 74 46 69 6c 65 50 6f  TE);.  SetFilePo
4b50: 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20  inter(pFile->h, 
4b60: 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70 70 65  lowerBits, &uppe
4b70: 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49  rBits, FILE_BEGI
4b80: 4e 29 3b 0a 20 20 53 65 74 45 6e 64 4f 66 46 69  N);.  SetEndOfFi
4b90: 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  le(pFile->h);.  
4ba0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4bb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
4bc0: 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20  sure all writes 
4bd0: 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  to a particular 
4be0: 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74  file are committ
4bf0: 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73  ed to disk..*/.s
4c00: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 79 6e  tatic int winSyn
4c10: 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  c(sqlite3_file *
4c20: 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  id, int flags){.
4c30: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
4c40: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
4c50: 0a 20 20 4f 53 54 52 41 43 45 33 28 22 53 59 4e  .  OSTRACE3("SYN
4c60: 43 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  C %d lock=%d\n",
4c70: 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
4c80: 2d 3e 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 69  ->locktype);.  i
4c90: 66 28 20 46 6c 75 73 68 46 69 6c 65 42 75 66 66  f( FlushFileBuff
4ca0: 65 72 73 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b  ers(pFile->h) ){
4cb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
4cc0: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
4cd0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4ce0: 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 7d 0a 0a  E_IOERR;.  }.}..
4cf0: 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
4d00: 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
4d10: 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79   of a file in by
4d20: 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  tes.*/.static in
4d30: 74 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 73 71  t winFileSize(sq
4d40: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
4d50: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
4d60: 53 69 7a 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65  Size){.  winFile
4d70: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
4d80: 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20  le*)id;.  DWORD 
4d90: 75 70 70 65 72 42 69 74 73 2c 20 6c 6f 77 65 72  upperBits, lower
4da0: 42 69 74 73 3b 0a 20 20 53 69 6d 75 6c 61 74 65  Bits;.  Simulate
4db0: 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
4dc0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
4dd0: 54 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74 73 20  T);.  lowerBits 
4de0: 3d 20 47 65 74 46 69 6c 65 53 69 7a 65 28 70 46  = GetFileSize(pF
4df0: 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65 72 42 69  ile->h, &upperBi
4e00: 74 73 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20  ts);.  *pSize = 
4e10: 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  (((sqlite3_int64
4e20: 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33 32 29  )upperBits)<<32)
4e30: 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20   + lowerBits;.  
4e40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4e50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46  ;.}../*.** LOCKF
4e60: 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
4e70: 54 45 4c 59 20 69 73 20 75 6e 64 65 66 69 6e 65  TELY is undefine
4e80: 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e 64 6f 77  d on some Window
4e90: 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69  s systems..*/.#i
4ea0: 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 46  fndef LOCKFILE_F
4eb0: 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 0a  AIL_IMMEDIATELY.
4ec0: 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c  # define LOCKFIL
4ed0: 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
4ee0: 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  LY 1.#endif../*.
4ef0: 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 61  ** Acquire a rea
4f00: 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66  der lock..** Dif
4f10: 66 65 72 65 6e 74 20 41 50 49 20 72 6f 75 74 69  ferent API routi
4f20: 6e 65 73 20 61 72 65 20 63 61 6c 6c 65 64 20 64  nes are called d
4f30: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
4f40: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a  her or not this.
4f50: 2a 2a 20 69 73 20 57 69 6e 39 35 20 6f 72 20 57  ** is Win95 or W
4f60: 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inNT..*/.static 
4f70: 69 6e 74 20 67 65 74 52 65 61 64 4c 6f 63 6b 28  int getReadLock(
4f80: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
4f90: 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 66  .  int res;.  if
4fa0: 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
4fb0: 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b  OVERLAPPED ovlp;
4fc0: 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74  .    ovlp.Offset
4fd0: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
4fe0: 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74  .    ovlp.Offset
4ff0: 48 69 67 68 20 3d 20 30 3b 0a 20 20 20 20 6f 76  High = 0;.    ov
5000: 6c 70 2e 68 45 76 65 6e 74 20 3d 20 30 3b 0a 20  lp.hEvent = 0;. 
5010: 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c     res = LockFil
5020: 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  eEx(pFile->h, LO
5030: 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
5040: 44 49 41 54 45 4c 59 2c 0a 20 20 20 20 20 20 20  DIATELY,.       
5050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
5060: 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 2c   SHARED_SIZE, 0,
5070: 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65   &ovlp);.  }else
5080: 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 3b 0a 20 20  {.    int lk;.  
5090: 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e    sqlite3Randomn
50a0: 65 73 73 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20  ess(sizeof(lk), 
50b0: 26 6c 6b 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  &lk);.    pFile-
50c0: 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20  >sharedLockByte 
50d0: 3d 20 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66  = (lk & 0x7fffff
50e0: 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45  ff)%(SHARED_SIZE
50f0: 20 2d 20 31 29 3b 0a 20 20 20 20 72 65 73 20 3d   - 1);.    res =
5100: 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d   LockFile(pFile-
5110: 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
5120: 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f  +pFile->sharedLo
5130: 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29  ckByte, 0, 1, 0)
5140: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5150: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64  es;.}../*.** Und
5160: 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a  o a readlock.*/.
5170: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 6c 6f 63  static int unloc
5180: 6b 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c  kReadLock(winFil
5190: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74  e *pFile){.  int
51a0: 20 72 65 73 3b 0a 20 20 69 66 28 20 69 73 4e 54   res;.  if( isNT
51b0: 28 29 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  () ){.    res = 
51c0: 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65  UnlockFile(pFile
51d0: 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
51e0: 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a  T, 0, SHARED_SIZ
51f0: 45 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  E, 0);.  }else{.
5200: 20 20 20 20 72 65 73 20 3d 20 55 6e 6c 6f 63 6b      res = Unlock
5210: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53  File(pFile->h, S
5220: 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 70 46  HARED_FIRST + pF
5230: 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
5240: 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  yte, 0, 1, 0);. 
5250: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b   }.  return res;
5260: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
5270: 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
5280: 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
5290: 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63  by parameter loc
52a0: 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  ktype - one.** o
52b0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
52c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
52d0: 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
52e0: 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
52f0: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
5300: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
5310: 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
5320: 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
5330: 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
5340: 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
5350: 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
5360: 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
5370: 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
5380: 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
5390: 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
53a0: 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
53b0: 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
53c0: 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
53d0: 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
53e0: 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
53f0: 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
5400: 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
5410: 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
5420: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
5430: 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
5440: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
5450: 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
5460: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
5470: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
5480: 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
5490: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
54a0: 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
54b0: 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
54c0: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
54d0: 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
54e0: 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
54f0: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
5500: 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
5510: 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
5520: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
5530: 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
5540: 63 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f  ck.  The winUnlo
5550: 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  ck() routine.** 
5560: 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73  erases all locks
5570: 20 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65 74   at once and ret
5580: 75 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61 74  urns us immediat
5590: 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c  ely to locking l
55a0: 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73  evel 0..** It is
55b0: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
55c0: 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   lower the locki
55d0: 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65  ng level one ste
55e0: 70 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59 6f  p at a time.  Yo
55f0: 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72  u.** must go str
5600: 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67  aight to locking
5610: 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61   level 0..*/.sta
5620: 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28  tic int winLock(
5630: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
5640: 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
5650: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
5660: 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74  TE_OK;    /* Ret
5670: 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  urn code from su
5680: 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69  broutines */.  i
5690: 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20  nt res = 1;     
56a0: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
56b0: 6f 66 20 61 20 77 69 6e 64 6f 77 73 20 6c 6f 63  of a windows loc
56c0: 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  k call */.  int 
56d0: 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20  newLocktype;    
56e0: 20 20 20 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d     /* Set pFile-
56f0: 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68 69  >locktype to thi
5700: 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 65  s value before e
5710: 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  xiting */.  int 
5720: 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d  gotPendingLock =
5730: 20 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77 65   0;/* True if we
5740: 20 61 63 71 75 69 72 65 64 20 61 20 50 45 4e 44   acquired a PEND
5750: 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74 69  ING lock this ti
5760: 6d 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20  me */.  winFile 
5770: 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
5780: 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74  e*)id;..  assert
5790: 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20  ( pFile!=0 );.  
57a0: 4f 53 54 52 41 43 45 35 28 22 4c 4f 43 4b 20 25  OSTRACE5("LOCK %
57b0: 64 20 25 64 20 77 61 73 20 25 64 28 25 64 29 5c  d %d was %d(%d)\
57c0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 46  n",.          pF
57d0: 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
57e0: 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
57f0: 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  e, pFile->shared
5800: 4c 6f 63 6b 42 79 74 65 29 3b 0a 0a 20 20 2f 2a  LockByte);..  /*
5810: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
5820: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
5830: 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
5840: 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
5850: 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c  the.  ** OsFile,
5860: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
5870: 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c  't use the end_l
5880: 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20  ock: exit path, 
5890: 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f  as.  ** sqlite3O
58a0: 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61  sEnterMutex() ha
58b0: 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64  sn't been called
58c0: 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   yet..  */.  if(
58d0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
58e0: 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
58f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5900: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  OK;.  }..  /* Ma
5910: 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
5920: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
5930: 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61  correct.  */.  a
5940: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
5950: 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20  cktype!=NO_LOCK 
5960: 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  || locktype==SHA
5970: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
5980: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d  sert( locktype!=
5990: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a  PENDING_LOCK );.
59a0: 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
59b0: 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe!=RESERVED_LOC
59c0: 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  K || pFile->lock
59d0: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
59e0: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20  K );..  /* Lock 
59f0: 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  the PENDING_LOCK
5a00: 20 62 79 74 65 20 69 66 20 77 65 20 6e 65 65 64   byte if we need
5a10: 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 50 45   to acquire a PE
5a20: 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20  NDING lock or.  
5a30: 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ** a SHARED lock
5a40: 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 63 71  .  If we are acq
5a50: 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
5a60: 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69 73  lock, the acquis
5a70: 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68  ition of.  ** th
5a80: 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62  e PENDING_LOCK b
5a90: 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72 79  yte is temporary
5aa0: 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b  ..  */.  newLock
5ab0: 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f  type = pFile->lo
5ac0: 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 70 46  cktype;.  if( pF
5ad0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e  ile->locktype==N
5ae0: 4f 5f 4c 4f 43 4b 0a 20 20 20 7c 7c 20 28 6c 6f  O_LOCK.   || (lo
5af0: 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
5b00: 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  E_LOCK && pFile-
5b10: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52  >locktype==RESER
5b20: 56 45 44 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20  VED_LOCK).  ){. 
5b30: 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a     int cnt = 3;.
5b40: 20 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d      while( cnt--
5b50: 3e 30 20 26 26 20 28 72 65 73 20 3d 20 4c 6f 63  >0 && (res = Loc
5b60: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
5b70: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c  PENDING_BYTE, 0,
5b80: 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20   1, 0))==0 ){.  
5b90: 20 20 20 20 2f 2a 20 54 72 79 20 33 20 74 69 6d      /* Try 3 tim
5ba0: 65 73 20 74 6f 20 67 65 74 20 74 68 65 20 70 65  es to get the pe
5bb0: 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68 65  nding lock.  The
5bc0: 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 6d 69   pending lock mi
5bd0: 67 68 74 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  ght be.      ** 
5be0: 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20  held by another 
5bf0: 72 65 61 64 65 72 20 70 72 6f 63 65 73 73 20 77  reader process w
5c00: 68 6f 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  ho will release 
5c10: 69 74 20 6d 6f 6d 65 6e 74 61 72 69 6c 79 2e 0a  it momentarily..
5c20: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4f        */.      O
5c30: 53 54 52 41 43 45 32 28 22 63 6f 75 6c 64 20 6e  STRACE2("could n
5c40: 6f 74 20 67 65 74 20 61 20 50 45 4e 44 49 4e 47  ot get a PENDING
5c50: 20 6c 6f 63 6b 2e 20 63 6e 74 3d 25 64 5c 6e 22   lock. cnt=%d\n"
5c60: 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 53 6c  , cnt);.      Sl
5c70: 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  eep(1);.    }.  
5c80: 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b    gotPendingLock
5c90: 20 3d 20 72 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f   = res;.  }..  /
5ca0: 2a 20 41 63 71 75 69 72 65 20 61 20 73 68 61 72  * Acquire a shar
5cb0: 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  ed lock.  */.  i
5cc0: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
5cd0: 52 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20  RED_LOCK && res 
5ce0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
5cf0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
5d00: 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  NO_LOCK );.    r
5d10: 65 73 20 3d 20 67 65 74 52 65 61 64 4c 6f 63 6b  es = getReadLock
5d20: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28  (pFile);.    if(
5d30: 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65   res ){.      ne
5d40: 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52  wLocktype = SHAR
5d50: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  ED_LOCK;.    }. 
5d60: 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
5d70: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
5d80: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
5d90: 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c  type==RESERVED_L
5da0: 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20  OCK && res ){.  
5db0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
5dc0: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  >locktype==SHARE
5dd0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65  D_LOCK );.    re
5de0: 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69  s = LockFile(pFi
5df0: 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f  le->h, RESERVED_
5e00: 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
5e10: 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20      if( res ){. 
5e20: 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65       newLocktype
5e30: 20 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b   = RESERVED_LOCK
5e40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
5e50: 2a 20 41 63 71 75 69 72 65 20 61 20 50 45 4e 44  * Acquire a PEND
5e60: 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  ING lock.  */.  
5e70: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
5e80: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
5e90: 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c 6f  res ){.    newLo
5ea0: 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47  cktype = PENDING
5eb0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50 65  _LOCK;.    gotPe
5ec0: 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ndingLock = 0;. 
5ed0: 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
5ee0: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
5ef0: 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
5f00: 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
5f10: 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  E_LOCK && res ){
5f20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
5f30: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48  le->locktype>=SH
5f40: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
5f50: 20 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52 65 61   res = unlockRea
5f60: 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
5f70: 20 20 4f 53 54 52 41 43 45 32 28 22 75 6e 72 65    OSTRACE2("unre
5f80: 61 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22 2c 20  adlock = %d\n", 
5f90: 72 65 73 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  res);.    res = 
5fa0: 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e  LockFile(pFile->
5fb0: 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  h, SHARED_FIRST,
5fc0: 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c   0, SHARED_SIZE,
5fd0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73   0);.    if( res
5fe0: 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
5ff0: 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49 56  ktype = EXCLUSIV
6000: 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  E_LOCK;.    }els
6010: 65 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  e{.      OSTRACE
6020: 32 28 22 65 72 72 6f 72 2d 63 6f 64 65 20 3d 20  2("error-code = 
6030: 25 64 5c 6e 22 2c 20 47 65 74 4c 61 73 74 45 72  %d\n", GetLastEr
6040: 72 6f 72 28 29 29 3b 0a 20 20 20 20 20 20 67 65  ror());.      ge
6050: 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  tReadLock(pFile)
6060: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
6070: 2a 20 49 66 20 77 65 20 61 72 65 20 68 6f 6c 64  * If we are hold
6080: 69 6e 67 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ing a PENDING lo
6090: 63 6b 20 74 68 61 74 20 6f 75 67 68 74 20 74 6f  ck that ought to
60a0: 20 62 65 20 72 65 6c 65 61 73 65 64 2c 20 74 68   be released, th
60b0: 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20  en.  ** release 
60c0: 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69  it now..  */.  i
60d0: 66 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63  f( gotPendingLoc
60e0: 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  k && locktype==S
60f0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
6100: 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69    UnlockFile(pFi
6110: 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42  le->h, PENDING_B
6120: 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
6130: 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
6140: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
6150: 20 6c 6f 63 6b 20 68 61 73 20 68 65 6c 64 20 69   lock has held i
6160: 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  n the file descr
6170: 69 70 74 6f 72 20 74 68 65 6e 0a 20 20 2a 2a 20  iptor then.  ** 
6180: 72 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f  return the appro
6190: 70 72 69 61 74 65 20 72 65 73 75 6c 74 20 63 6f  priate result co
61a0: 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  de..  */.  if( r
61b0: 65 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  es ){.    rc = S
61c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
61d0: 65 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 34 28  e{.    OSTRACE4(
61e0: 22 4c 4f 43 4b 20 46 41 49 4c 45 44 20 25 64 20  "LOCK FAILED %d 
61f0: 74 72 79 69 6e 67 20 66 6f 72 20 25 64 20 62 75  trying for %d bu
6200: 74 20 67 6f 74 20 25 64 5c 6e 22 2c 20 70 46 69  t got %d\n", pFi
6210: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
6220: 20 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c    locktype, newL
6230: 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 72 63  ocktype);.    rc
6240: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
6250: 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63    }.  pFile->loc
6260: 6b 74 79 70 65 20 3d 20 6e 65 77 4c 6f 63 6b 74  ktype = newLockt
6270: 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ype;.  return rc
6280: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6290: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
62a0: 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
62b0: 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
62c0: 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
62d0: 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
62e0: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
62f0: 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
6300: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72   lock is held, r
6310: 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
6320: 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65 72  o, otherwise zer
6330: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
6340: 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65   winCheckReserve
6350: 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
6360: 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
6370: 63 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  c;.  winFile *pF
6380: 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
6390: 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46  id;.  assert( pF
63a0: 69 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ile!=0 );.  if( 
63b0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
63c0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
63d0: 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  {.    rc = 1;.  
63e0: 20 20 4f 53 54 52 41 43 45 33 28 22 54 45 53 54    OSTRACE3("TEST
63f0: 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28   WR-LOCK %d %d (
6400: 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65  local)\n", pFile
6410: 2d 3e 68 2c 20 72 63 29 3b 0a 20 20 7d 65 6c 73  ->h, rc);.  }els
6420: 65 7b 0a 20 20 20 20 72 63 20 3d 20 4c 6f 63 6b  e{.    rc = Lock
6430: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52  File(pFile->h, R
6440: 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c  ESERVED_BYTE, 0,
6450: 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   1, 0);.    if( 
6460: 72 63 20 29 7b 0a 20 20 20 20 20 20 55 6e 6c 6f  rc ){.      Unlo
6470: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
6480: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
6490: 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, 1, 0);.    }.
64a0: 20 20 20 20 72 63 20 3d 20 21 72 63 3b 0a 20 20      rc = !rc;.  
64b0: 20 20 4f 53 54 52 41 43 45 33 28 22 54 45 53 54    OSTRACE3("TEST
64c0: 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28   WR-LOCK %d %d (
64d0: 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 70 46 69 6c  remote)\n", pFil
64e0: 65 2d 3e 68 2c 20 72 63 29 3b 0a 20 20 7d 0a 20  e->h, rc);.  }. 
64f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6500: 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
6510: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
6520: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
6530: 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20  id to locktype. 
6540: 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73   locktype.** mus
6550: 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
6560: 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
6570: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
6580: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
6590: 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
65a0: 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
65b0: 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
65c0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
65d0: 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
65e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
65f0: 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  o-op..**.** It i
6600: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
6610: 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  or this routine 
6620: 74 6f 20 66 61 69 6c 20 69 66 20 74 68 65 20 73  to fail if the s
6630: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a  econd argument.*
6640: 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49  * is NO_LOCK.  I
6650: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
6660: 75 6d 65 6e 74 20 69 73 20 53 48 41 52 45 44 5f  ument is SHARED_
6670: 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69 73 20 72  LOCK then this r
6680: 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20  outine.** might 
6690: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
66a0: 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ERR;.*/.static i
66b0: 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c  nt winUnlock(sql
66c0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
66d0: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
66e0: 69 6e 74 20 74 79 70 65 3b 0a 20 20 77 69 6e 46  int type;.  winF
66f0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
6700: 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  nFile*)id;.  int
6710: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
6720: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
6730: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
6740: 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45   locktype<=SHARE
6750: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f 53 54 52  D_LOCK );.  OSTR
6760: 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 25 64 20  ACE5("UNLOCK %d 
6770: 74 6f 20 25 64 20 77 61 73 20 25 64 28 25 64 29  to %d was %d(%d)
6780: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c  \n", pFile->h, l
6790: 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 20  ocktype,.       
67a0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
67b0: 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  pe, pFile->share
67c0: 64 4c 6f 63 6b 42 79 74 65 29 3b 0a 20 20 74 79  dLockByte);.  ty
67d0: 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  pe = pFile->lock
67e0: 74 79 70 65 3b 0a 20 20 69 66 28 20 74 79 70 65  type;.  if( type
67f0: 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  >=EXCLUSIVE_LOCK
6800: 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69   ){.    UnlockFi
6810: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  le(pFile->h, SHA
6820: 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48  RED_FIRST, 0, SH
6830: 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20  ARED_SIZE, 0);. 
6840: 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d     if( locktype=
6850: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
6860: 21 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69  !getReadLock(pFi
6870: 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  le) ){.      /* 
6880: 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65  This should neve
6890: 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20 73 68  r happen.  We sh
68a0: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 61  ould always be a
68b0: 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
68c0: 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65  reacquire the re
68d0: 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ad lock */.     
68e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
68f0: 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 7d  RR_UNLOCK;.    }
6900: 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e  .  }.  if( type>
6910: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
6920: 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65  {.    UnlockFile
6930: 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52  (pFile->h, RESER
6940: 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  VED_BYTE, 0, 1, 
6950: 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f  0);.  }.  if( lo
6960: 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20  cktype==NO_LOCK 
6970: 26 26 20 74 79 70 65 3e 3d 53 48 41 52 45 44 5f  && type>=SHARED_
6980: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 6e 6c 6f  LOCK ){.    unlo
6990: 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  ckReadLock(pFile
69a0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70  );.  }.  if( typ
69b0: 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  e>=PENDING_LOCK 
69c0: 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c  ){.    UnlockFil
69d0: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44  e(pFile->h, PEND
69e0: 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  ING_BYTE, 0, 1, 
69f0: 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  0);.  }.  pFile-
6a00: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
6a10: 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72  type;.  return r
6a20: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 72  c;.}../*.** Curr
6a30: 65 6e 74 6c 79 20 75 6e 69 6d 70 6c 65 6d 65 6e  ently unimplemen
6a40: 74 65 64 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ted.*/.static in
6a50: 74 20 77 69 6e 42 72 65 61 6b 4c 6f 63 6b 28 73  t winBreakLock(s
6a60: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
6a70: 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  {.  return SQLIT
6a80: 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  E_ERROR;.}../*.*
6a90: 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  * Return an inte
6aa0: 67 65 72 20 74 68 61 74 20 69 6e 64 69 63 65 73  ger that indices
6ab0: 20 74 68 65 20 74 79 70 65 20 6f 66 20 6c 6f 63   the type of loc
6ac0: 6b 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64  k currently held
6ad0: 0a 2a 2a 20 62 79 20 74 68 69 73 20 68 61 6e 64  .** by this hand
6ae0: 6c 65 2e 20 20 28 55 73 65 64 20 66 6f 72 20 74  le.  (Used for t
6af0: 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
6b00: 73 69 73 20 6f 6e 6c 79 2e 29 0a 2a 2f 0a 73 74  sis only.).*/.st
6b10: 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b  atic int winLock
6b20: 53 74 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69  State(sqlite3_fi
6b30: 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69 6e 46 69  le *id){.  winFi
6b40: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
6b50: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 72 65 74 75  File*)id;.  retu
6b60: 72 6e 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  rn pFile->lockty
6b70: 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  pe;.}../*.** Ret
6b80: 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73  urn the sector s
6b90: 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
6ba0: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62  the underlying b
6bb0: 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a  lock device for.
6bc0: 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ** the specified
6bd0: 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61   file. This is a
6be0: 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32  lmost always 512
6bf0: 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20   bytes, but may 
6c00: 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72  be.** larger for
6c10: 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a   some devices..*
6c20: 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65  *.** SQLite code
6c30: 20 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75   assumes this fu
6c40: 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61  nction cannot fa
6c50: 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75  il. It also assu
6c60: 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74  mes that.** if t
6c70: 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65  wo files are cre
6c80: 61 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ated in the same
6c90: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72   file-system dir
6ca0: 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20  ectory (i.e..** 
6cb0: 61 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  a database and i
6cc0: 74 27 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  t's journal file
6cd0: 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f  ) that the secto
6ce0: 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74  r size will be t
6cf0: 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62  he.** same for b
6d00: 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  oth..*/.static i
6d10: 6e 74 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65  nt winSectorSize
6d20: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
6d30: 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  d){.  return SQL
6d40: 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
6d50: 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a  OR_SIZE;.}../*.*
6d60: 2a 20 52 65 74 75 72 6e 20 61 20 76 65 63 74 6f  * Return a vecto
6d70: 72 20 6f 66 20 64 65 76 69 63 65 20 63 68 61 72  r of device char
6d80: 61 63 74 65 72 69 73 74 69 63 73 2e 0a 2a 2f 0a  acteristics..*/.
6d90: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65  static int winDe
6da0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
6db0: 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ics(sqlite3_file
6dc0: 20 2a 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20   *id){.  return 
6dd0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
6de0: 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20   vector defines 
6df0: 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20  all the methods 
6e00: 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65  that can operate
6e10: 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65   on an.** sqlite
6e20: 33 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e 33 32  3_file for win32
6e30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
6e40: 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
6e50: 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74 68 6f 64  hods winIoMethod
6e60: 20 3d 20 7b 0a 20 20 31 2c 20 20 20 20 20 20 20   = {.  1,       
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e80: 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
6e90: 20 20 77 69 6e 43 6c 6f 73 65 2c 0a 20 20 77 69    winClose,.  wi
6ea0: 6e 52 65 61 64 2c 0a 20 20 77 69 6e 57 72 69 74  nRead,.  winWrit
6eb0: 65 2c 0a 20 20 77 69 6e 54 72 75 6e 63 61 74 65  e,.  winTruncate
6ec0: 2c 0a 20 20 77 69 6e 53 79 6e 63 2c 0a 20 20 77  ,.  winSync,.  w
6ed0: 69 6e 46 69 6c 65 53 69 7a 65 2c 0a 20 20 77 69  inFileSize,.  wi
6ee0: 6e 4c 6f 63 6b 2c 0a 20 20 77 69 6e 55 6e 6c 6f  nLock,.  winUnlo
6ef0: 63 6b 2c 0a 20 20 77 69 6e 43 68 65 63 6b 52 65  ck,.  winCheckRe
6f00: 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 20 20 77 69  servedLock,.  wi
6f10: 6e 42 72 65 61 6b 4c 6f 63 6b 2c 0a 20 20 77 69  nBreakLock,.  wi
6f20: 6e 4c 6f 63 6b 53 74 61 74 65 2c 0a 20 20 77 69  nLockState,.  wi
6f30: 6e 53 65 63 74 6f 72 53 69 7a 65 2c 0a 20 20 77  nSectorSize,.  w
6f40: 69 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65  inDeviceCharacte
6f50: 72 69 73 74 69 63 73 0a 7d 3b 0a 0a 2f 2a 2a 2a  ristics.};../***
6f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6fa0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 48 65 72 65  ********.** Here
6fb0: 20 65 6e 64 73 20 74 68 65 20 49 2f 4f 20 6d 65   ends the I/O me
6fc0: 74 68 6f 64 73 20 74 68 61 74 20 66 6f 72 6d 20  thods that form 
6fd0: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
6fe0: 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a  ethods object..*
6ff0: 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 62 6c  *.** The next bl
7000: 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 6d 70 6c  ock of code impl
7010: 65 6d 65 6e 74 73 20 74 68 65 20 56 46 53 20 6d  ements the VFS m
7020: 65 74 68 6f 64 73 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a  ethods..********
7030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7070: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  ****/../*.** Con
7080: 76 65 72 74 20 61 20 55 54 46 2d 38 20 66 69 6c  vert a UTF-8 fil
7090: 65 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61 74 65  ename into whate
70a0: 76 65 72 20 66 6f 72 6d 20 74 68 65 20 75 6e 64  ver form the und
70b0: 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  erlying.** opera
70c0: 74 69 6e 67 20 73 79 73 74 65 6d 20 77 61 6e 74  ting system want
70d0: 73 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20  s filenames in. 
70e0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
70f0: 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20  he result.** is 
7100: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
7110: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 20 61 6e 64  lite3_malloc and
7120: 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
7130: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  y the calling.**
7140: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
7150: 61 74 69 63 20 76 6f 69 64 20 2a 63 6f 6e 76 65  atic void *conve
7160: 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63  rtUtf8Filename(c
7170: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
7180: 6e 61 6d 65 29 7b 0a 20 20 76 6f 69 64 20 2a 7a  name){.  void *z
7190: 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20  Converted = 0;. 
71a0: 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20   if( isNT() ){. 
71b0: 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
71c0: 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46  utf8ToUnicode(zF
71d0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73  ilename);.  }els
71e0: 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65  e{.    zConverte
71f0: 64 20 3d 20 75 74 66 38 54 6f 4d 62 63 73 28 7a  d = utf8ToMbcs(z
7200: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  Filename);.  }. 
7210: 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20   /* caller will 
7220: 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65  handle out of me
7230: 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e  mory */.  return
7240: 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a   zConverted;.}..
7250: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c  /*.** Open a fil
7260: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
7270: 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69   winOpen(.  sqli
7280: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
7290: 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65        /* Not use
72a0: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
72b0: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
72c0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
72d0: 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a  file (UTF-8) */.
72e0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
72f0: 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57  id,         /* W
7300: 72 69 74 65 20 74 68 65 20 53 51 4c 69 74 65 20  rite the SQLite 
7310: 66 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65  file handle here
7320: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
7330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7340: 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61  /* Open mode fla
7350: 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75  gs */.  int *pOu
7360: 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  tFlags          
7370: 20 20 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75    /* Status retu
7380: 72 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  rn flags */.){. 
7390: 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f   HANDLE h;.  DWO
73a0: 52 44 20 64 77 44 65 73 69 72 65 64 41 63 63 65  RD dwDesiredAcce
73b0: 73 73 3b 0a 20 20 44 57 4f 52 44 20 64 77 53 68  ss;.  DWORD dwSh
73c0: 61 72 65 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44  areMode;.  DWORD
73d0: 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
73e0: 73 69 74 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20  sition;.  DWORD 
73f0: 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
7400: 75 74 65 73 20 3d 20 30 3b 0a 20 20 77 69 6e 46  utes = 0;.  winF
7410: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
7420: 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69  nFile*)id;.  voi
7430: 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  d *zConverted = 
7440: 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e  convertUtf8Filen
7450: 61 6d 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  ame(zName);.  if
7460: 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
7470: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
7480: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
7490: 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
74a0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
74b0: 52 49 54 45 20 29 7b 0a 20 20 20 20 64 77 44 65  RITE ){.    dwDe
74c0: 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47 45  siredAccess = GE
74d0: 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e  NERIC_READ | GEN
74e0: 45 52 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65  ERIC_WRITE;.  }e
74f0: 6c 73 65 7b 0a 20 20 20 20 64 77 44 65 73 69 72  lse{.    dwDesir
7500: 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52  edAccess = GENER
7510: 49 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 20 20 69  IC_READ;.  }.  i
7520: 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
7530: 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 29 7b  E_OPEN_CREATE ){
7540: 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44  .    dwCreationD
7550: 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45  isposition = OPE
7560: 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d 65 6c 73  N_ALWAYS;.  }els
7570: 65 7b 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f  e{.    dwCreatio
7580: 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f  nDisposition = O
7590: 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20  PEN_EXISTING;.  
75a0: 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  }.  if( flags & 
75b0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
75c0: 5f 44 42 20 29 7b 0a 20 20 20 20 64 77 53 68 61  _DB ){.    dwSha
75d0: 72 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48  reMode = FILE_SH
75e0: 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f  ARE_READ | FILE_
75f0: 53 48 41 52 45 5f 57 52 49 54 45 3b 0a 20 20 7d  SHARE_WRITE;.  }
7600: 65 6c 73 65 7b 0a 20 20 20 20 64 77 53 68 61 72  else{.    dwShar
7610: 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  eMode = 0;.  }. 
7620: 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 53 51   if( flags & (SQ
7630: 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
7640: 42 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  B | SQLITE_OPEN_
7650: 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20  TEMP_JOURNAL.   
7660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7670: 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   | SQLITE_OPEN_S
7680: 55 42 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20  UBJOURNAL) ){.  
7690: 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
76a0: 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54  ibutes = FILE_AT
76b0: 54 52 49 42 55 54 45 5f 54 45 4d 50 4f 52 41 52  TRIBUTE_TEMPORAR
76c0: 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y.              
76d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76e0: 20 7c 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   | FILE_ATTRIBUT
76f0: 45 5f 48 49 44 44 45 4e 0a 20 20 20 20 20 20 20  E_HIDDEN.       
7700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7710: 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 46          | FILE_F
7720: 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c  LAG_DELETE_ON_CL
7730: 4f 53 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OSE;.  }else{.  
7740: 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
7750: 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54  ibutes = FILE_AT
7760: 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a  TRIBUTE_NORMAL;.
7770: 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 20    }.  if( flags 
7780: 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  & (SQLITE_OPEN_M
7790: 41 49 4e 5f 44 42 20 7c 20 53 51 4c 49 54 45 5f  AIN_DB | SQLITE_
77a0: 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 29 20 29 7b  OPEN_TEMP_DB) ){
77b0: 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41  .    dwFlagsAndA
77c0: 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46 49 4c  ttributes |= FIL
77d0: 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43  E_FLAG_RANDOM_AC
77e0: 43 45 53 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  CESS;.  }else{. 
77f0: 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
7800: 72 69 62 75 74 65 73 20 7c 3d 20 46 49 4c 45 5f  ributes |= FILE_
7810: 46 4c 41 47 5f 53 45 51 55 45 4e 54 49 41 4c 5f  FLAG_SEQUENTIAL_
7820: 53 43 41 4e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  SCAN;.  }.  if( 
7830: 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 68 20  isNT() ){.    h 
7840: 3d 20 43 72 65 61 74 65 46 69 6c 65 57 28 28 57  = CreateFileW((W
7850: 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64  CHAR*)zConverted
7860: 2c 0a 20 20 20 20 20 20 20 64 77 44 65 73 69 72  ,.       dwDesir
7870: 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20  edAccess,.      
7880: 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20   dwShareMode,.  
7890: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
78a0: 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
78b0: 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20  osition,.       
78c0: 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
78d0: 75 74 65 73 2c 0a 20 20 20 20 20 20 20 4e 55 4c  utes,.       NUL
78e0: 4c 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65  L.    );.  }else
78f0: 7b 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20  {.#if OS_WINCE. 
7900: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7910: 5f 4e 4f 4d 45 4d 3b 0a 23 65 6c 73 65 0a 20 20  _NOMEM;.#else.  
7920: 20 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65    h = CreateFile
7930: 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
7940: 74 65 64 2c 0a 20 20 20 20 20 20 20 64 77 44 65  ted,.       dwDe
7950: 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20  siredAccess,.   
7960: 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c      dwShareMode,
7970: 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20  .       NULL,.  
7980: 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44       dwCreationD
7990: 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20  isposition,.    
79a0: 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
79b0: 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20  ributes,.       
79c0: 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 23 65 6e 64  NULL.    );.#end
79d0: 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 68 3d 3d  if.  }.  if( h==
79e0: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
79f0: 41 4c 55 45 20 29 7b 0a 20 20 20 20 69 66 28 20  ALUE ){.    if( 
7a00: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
7a10: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 29 7b  PEN_READWRITE ){
7a20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
7a30: 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
7a40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
7a50: 6e 4f 70 65 6e 28 30 2c 20 7a 4e 61 6d 65 2c 20  nOpen(0, zName, 
7a60: 69 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  id, .           
7a70: 20 20 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45    ((flags|SQLITE
7a80: 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 26  _OPEN_READONLY)&
7a90: 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  ~SQLITE_OPEN_REA
7aa0: 44 57 52 49 54 45 29 2c 20 70 4f 75 74 46 6c 61  DWRITE), pOutFla
7ab0: 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  gs);.    }else{.
7ac0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
7ad0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
7ae0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f    }.  }.  if( pO
7af0: 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 69  utFlags ){.    i
7b00: 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
7b10: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
7b20: 20 29 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46   ){.      *pOutF
7b30: 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
7b40: 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20  EN_READWRITE;.  
7b50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
7b60: 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49  pOutFlags = SQLI
7b70: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
7b80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6d 65  ;.    }.  }.  me
7b90: 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73  mset(pFile, 0, s
7ba0: 69 7a 65 6f 66 28 2a 70 46 69 6c 65 29 29 3b 0a  izeof(*pFile));.
7bb0: 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64    pFile->pMethod
7bc0: 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b   = &winIoMethod;
7bd0: 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b  .  pFile->h = h;
7be0: 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20  .#if OS_WINCE.  
7bf0: 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 53 51  if( (flags & (SQ
7c00: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
7c10: 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
7c20: 4d 41 49 4e 5f 44 42 29 29 20 3d 3d 0a 20 20 20  MAIN_DB)) ==.   
7c30: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c              (SQL
7c40: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
7c50: 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  TE|SQLITE_OPEN_M
7c60: 41 49 4e 5f 44 42 29 0a 20 20 20 20 20 20 20 26  AIN_DB).       &
7c70: 26 20 21 77 69 6e 63 65 43 72 65 61 74 65 4c 6f  & !winceCreateLo
7c80: 63 6b 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66  ck(zFilename, &f
7c90: 29 0a 20 20 29 7b 0a 20 20 20 20 43 6c 6f 73 65  ).  ){.    Close
7ca0: 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20 20 73  Handle(h);.    s
7cb0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
7cc0: 76 65 72 74 65 64 29 3b 0a 20 20 20 20 72 65 74  verted);.    ret
7cd0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
7ce0: 50 45 4e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  PEN;.  }.  if( d
7cf0: 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
7d00: 74 65 73 20 26 20 46 49 4c 45 5f 46 4c 41 47 5f  tes & FILE_FLAG_
7d10: 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b  DELETEONCLOSE ){
7d20: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c  .    pFile->zDel
7d30: 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f  eteOnClose = zCo
7d40: 6e 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65  nverted;.  }else
7d50: 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20  .#endif.  {.    
7d60: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
7d70: 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 20 20  nverted);.  }.  
7d80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7d90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
7da0: 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65  e the named file
7db0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
7dc0: 74 20 77 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e  t windows does n
7dd0: 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c 65 20  ot allow a file 
7de0: 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 66  to be deleted if
7df0: 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70   some other.** p
7e00: 72 6f 63 65 73 73 20 68 61 73 20 69 74 20 6f 70  rocess has it op
7e10: 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20 61  en.  Sometimes a
7e20: 20 76 69 72 75 73 20 73 63 61 6e 6e 65 72 20 6f   virus scanner o
7e30: 72 20 69 6e 64 65 78 69 6e 67 20 70 72 6f 67 72  r indexing progr
7e40: 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e 20  am.** will open 
7e50: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  a journal file s
7e60: 68 6f 72 74 6c 79 20 61 66 74 65 72 20 69 74 20  hortly after it 
7e70: 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 6f 72  is created in or
7e80: 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77 68 61  der to do.** wha
7e90: 74 65 76 65 72 20 69 74 20 69 73 20 69 74 20 64  tever it is it d
7ea0: 6f 65 73 2e 20 20 57 68 69 6c 65 20 74 68 69 73  oes.  While this
7eb0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
7ec0: 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a 2a  s holding the.**
7ed0: 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20 77   file open, we w
7ee0: 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20 74 6f  ill be unable to
7ef0: 20 64 65 6c 65 74 65 20 69 74 2e 20 20 54 6f 20   delete it.  To 
7f00: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
7f10: 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20  .** problem, we 
7f20: 64 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c 69 73  delay 100 millis
7f30: 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 74  econds and try t
7f40: 6f 20 64 65 6c 65 74 65 20 61 67 61 69 6e 2e 20  o delete again. 
7f50: 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c   Up.** to MX_DEL
7f60: 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 73 20 64  ETION_ATTEMPTs d
7f70: 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  eletion attempts
7f80: 20 61 72 65 20 72 75 6e 20 62 65 66 6f 72 65 20   are run before 
7f90: 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20 61 6e 64  giving.** up and
7fa0: 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   returning an er
7fb0: 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ror..*/.#define 
7fc0: 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45  MX_DELETION_ATTE
7fd0: 4d 50 54 53 20 33 0a 73 74 61 74 69 63 20 69 6e  MPTS 3.static in
7fe0: 74 20 77 69 6e 44 65 6c 65 74 65 28 0a 20 20 73  t winDelete(.  s
7ff0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
8000: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  ,          /* No
8010: 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20  t used on win32 
8020: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
8030: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20  *zFilename,     
8040: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
8050: 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
8060: 69 6e 74 20 73 79 6e 63 44 69 72 20 20 20 20 20  int syncDir     
8070: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8080: 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32  ot used on win32
8090: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74   */.){.  int cnt
80a0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
80b0: 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
80c0: 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38  ed = convertUtf8
80d0: 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Filename(zFilena
80e0: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  me);.  if( zConv
80f0: 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
8100: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
8110: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c  MEM;.  }.  Simul
8120: 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
8130: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  n SQLITE_IOERR_D
8140: 45 4c 45 54 45 29 3b 0a 20 20 69 66 28 20 69 73  ELETE);.  if( is
8150: 4e 54 28 29 20 29 7b 0a 20 20 20 20 64 6f 7b 0a  NT() ){.    do{.
8160: 20 20 20 20 20 20 72 63 20 3d 20 44 65 6c 65 74        rc = Delet
8170: 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65 72 74 65  eFileW(zConverte
8180: 64 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  d);.    }while( 
8190: 72 63 3d 3d 30 20 26 26 20 47 65 74 46 69 6c 65  rc==0 && GetFile
81a0: 41 74 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e  AttributesW(zCon
81b0: 76 65 72 74 65 64 29 21 3d 30 78 66 66 66 66 66  verted)!=0xfffff
81c0: 66 66 66 20 0a 20 20 20 20 20 20 20 20 20 20 20  fff .           
81d0: 20 26 26 20 63 6e 74 2b 2b 20 3c 20 4d 58 5f 44   && cnt++ < MX_D
81e0: 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53  ELETION_ATTEMPTS
81f0: 20 26 26 20 28 53 6c 65 65 70 28 31 30 30 29 2c   && (Sleep(100),
8200: 20 31 29 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   1) );.  }else{.
8210: 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20 20  #if OS_WINCE.   
8220: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
8230: 4f 4d 45 4d 3b 0a 23 65 6c 73 65 0a 20 20 20 20  OMEM;.#else.    
8240: 64 6f 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 44  do{.      rc = D
8250: 65 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76  eleteFileA(zConv
8260: 65 72 74 65 64 29 3b 0a 20 20 20 20 7d 77 68 69  erted);.    }whi
8270: 6c 65 28 20 72 63 3d 3d 30 20 26 26 20 47 65 74  le( rc==0 && Get
8280: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28  FileAttributesA(
8290: 7a 43 6f 6e 76 65 72 74 65 64 29 21 3d 30 78 66  zConverted)!=0xf
82a0: 66 66 66 66 66 66 66 0a 20 20 20 20 20 20 20 20  fffffff.        
82b0: 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20 4d      && cnt++ < M
82c0: 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d  X_DELETION_ATTEM
82d0: 50 54 53 20 26 26 20 28 53 6c 65 65 70 28 31 30  PTS && (Sleep(10
82e0: 30 29 2c 20 31 29 20 29 3b 0a 23 65 6e 64 69 66  0), 1) );.#endif
82f0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
8300: 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
8310: 0a 20 20 4f 53 54 52 41 43 45 32 28 22 44 45 4c  .  OSTRACE2("DEL
8320: 45 54 45 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a  ETE \"%s\"\n", z
8330: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74  Filename);.  ret
8340: 75 72 6e 20 72 63 21 3d 30 20 3f 20 53 51 4c 49  urn rc!=0 ? SQLI
8350: 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 49  TE_OK : SQLITE_I
8360: 4f 45 52 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  OERR;.}../*.** C
8370: 68 65 63 6b 20 74 68 65 20 65 78 69 73 74 61 6e  heck the existan
8380: 63 65 20 61 6e 64 20 73 74 61 74 75 73 20 6f 66  ce and status of
8390: 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
83a0: 69 63 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73  ic int winAccess
83b0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
83c0: 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f  *pVfs,         /
83d0: 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69  * Not used on wi
83e0: 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  n32 */.  const c
83f0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
8400: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66      /* Name of f
8410: 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
8420: 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8440: 54 79 70 65 20 6f 66 20 74 65 73 74 20 74 6f 20  Type of test to 
8450: 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 66 69 6c  make on this fil
8460: 65 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20  e */.){.  DWORD 
8470: 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  attr;.  int rc;.
8480: 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
8490: 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38  ed = convertUtf8
84a0: 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Filename(zFilena
84b0: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  me);.  if( zConv
84c0: 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
84d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
84e0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  MEM;.  }.  if( i
84f0: 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 61 74 74  sNT() ){.    att
8500: 72 20 3d 20 47 65 74 46 69 6c 65 41 74 74 72 69  r = GetFileAttri
8510: 62 75 74 65 73 57 28 28 57 43 48 41 52 2a 29 7a  butesW((WCHAR*)z
8520: 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 65  Converted);.  }e
8530: 6c 73 65 7b 0a 23 69 66 20 4f 53 5f 57 49 4e 43  lse{.#if OS_WINC
8540: 45 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  E.    return SQL
8550: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 23 65 6c 73 65  ITE_NOMEM;.#else
8560: 0a 20 20 20 20 61 74 74 72 20 3d 20 47 65 74 46  .    attr = GetF
8570: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 28  ileAttributesA((
8580: 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
8590: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
85a0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
85b0: 6e 76 65 72 74 65 64 29 3b 0a 20 20 73 77 69 74  nverted);.  swit
85c0: 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20  ch( flags ){.   
85d0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
85e0: 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20  ESS_EXISTS:.    
85f0: 20 20 72 63 20 3d 20 61 74 74 72 21 3d 30 78 66    rc = attr!=0xf
8600: 66 66 66 66 66 66 66 3b 0a 20 20 20 20 20 20 62  fffffff;.      b
8610: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
8620: 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
8630: 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 72 63  DWRITE:.      rc
8640: 20 3d 20 28 61 74 74 72 20 26 20 46 49 4c 45 5f   = (attr & FILE_
8650: 41 54 54 52 49 42 55 54 45 5f 52 45 41 44 4f 4e  ATTRIBUTE_READON
8660: 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20 20 62 72  LY)==0;.      br
8670: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
8680: 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
8690: 4f 4e 4c 59 3a 0a 20 20 20 20 20 20 72 63 20 3d  ONLY:.      rc =
86a0: 20 28 61 74 74 72 21 3d 30 78 66 66 66 66 66 66   (attr!=0xffffff
86b0: 66 66 29 20 26 26 20 28 28 61 74 74 72 20 26 20  ff) && ((attr & 
86c0: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52  FILE_ATTRIBUTE_R
86d0: 45 41 44 4f 4e 4c 59 29 3d 3d 31 29 3b 0a 20 20  EADONLY)==1);.  
86e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
86f0: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73  efault:.      as
8700: 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66  sert(!"Invalid f
8710: 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b  lags argument");
8720: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
8730: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  ;.}.../*.** Crea
8740: 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  te a temporary f
8750: 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66  ile name in zBuf
8760: 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20  .  zBuf must be 
8770: 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a  big enough to.**
8780: 20 68 6f 6c 64 20 61 74 20 70 56 66 73 2d 3e 6d   hold at pVfs->m
8790: 78 50 61 74 68 6e 61 6d 65 20 63 68 61 72 61 63  xPathname charac
87a0: 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ters..*/.static 
87b0: 69 6e 74 20 77 69 6e 47 65 74 54 65 6d 70 4e 61  int winGetTempNa
87c0: 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  me(sqlite3_vfs *
87d0: 70 56 66 73 2c 20 63 68 61 72 20 2a 7a 42 75 66  pVfs, char *zBuf
87e0: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  ){.  static char
87f0: 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20   zChars[] =.    
8800: 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
8810: 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20  pqrstuvwxyz".   
8820: 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
8830: 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20  OPQRSTUVWXYZ".  
8840: 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a    "0123456789";.
8850: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68    int i, j;.  ch
8860: 61 72 20 7a 54 65 6d 70 50 61 74 68 5b 4d 41 58  ar zTempPath[MAX
8870: 5f 50 41 54 48 2b 31 5d 3b 0a 20 20 69 66 28 20  _PATH+1];.  if( 
8880: 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
8890: 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73 71  ectory ){.    sq
88a0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
88b0: 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d  AX_PATH-30, zTem
88c0: 70 50 61 74 68 2c 20 22 25 73 22 2c 20 73 71 6c  pPath, "%s", sql
88d0: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
88e0: 6f 72 79 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ory);.  }else if
88f0: 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
8900: 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20  char *zMulti;.  
8910: 20 20 57 43 48 41 52 20 7a 57 69 64 65 50 61 74    WCHAR zWidePat
8920: 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20  h[MAX_PATH];.   
8930: 20 47 65 74 54 65 6d 70 50 61 74 68 57 28 4d 41   GetTempPathW(MA
8940: 58 5f 50 41 54 48 2d 33 30 2c 20 7a 57 69 64 65  X_PATH-30, zWide
8950: 50 61 74 68 29 3b 0a 20 20 20 20 7a 4d 75 6c 74  Path);.    zMult
8960: 69 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66  i = unicodeToUtf
8970: 38 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20  8(zWidePath);.  
8980: 20 20 69 66 28 20 7a 4d 75 6c 74 69 20 29 7b 0a    if( zMulti ){.
8990: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
89a0: 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d  printf(MAX_PATH-
89b0: 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22  30, zTempPath, "
89c0: 25 7a 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20  %z", zMulti);.  
89d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
89e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
89f0: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  EM;.    }.  }els
8a00: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 74  e{.    char *zUt
8a10: 66 38 3b 0a 20 20 20 20 63 68 61 72 20 7a 4d 62  f8;.    char zMb
8a20: 63 73 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d  csPath[MAX_PATH]
8a30: 3b 0a 20 20 20 20 47 65 74 54 65 6d 70 50 61 74  ;.    GetTempPat
8a40: 68 41 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20  hA(MAX_PATH-30, 
8a50: 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20  zMbcsPath);.    
8a60: 7a 55 74 66 38 20 3d 20 6d 62 63 73 54 6f 55 74  zUtf8 = mbcsToUt
8a70: 66 38 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20  f8(zMbcsPath);. 
8a80: 20 20 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a     if( zUtf8 ){.
8a90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
8aa0: 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d  printf(MAX_PATH-
8ab0: 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22  30, zTempPath, "
8ac0: 25 7a 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20  %z", zUtf8);.   
8ad0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
8ae0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
8af0: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  M;.    }.  }.  f
8b00: 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a 54 65 6d  or(i=strlen(zTem
8b10: 70 50 61 74 68 29 3b 20 69 3e 30 20 26 26 20 7a  pPath); i>0 && z
8b20: 54 65 6d 70 50 61 74 68 5b 69 2d 31 5d 3d 3d 27  TempPath[i-1]=='
8b30: 5c 5c 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a 54  \\'; i--){}.  zT
8b40: 65 6d 70 50 61 74 68 5b 69 5d 20 3d 20 30 3b 0a  empPath[i] = 0;.
8b50: 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 73    for(;;){.    s
8b60: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
8b70: 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
8b80: 2d 33 30 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20  -30, zBuf,.     
8b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ba0: 22 25 73 5c 5c 22 53 51 4c 49 54 45 5f 54 45 4d  "%s\\"SQLITE_TEM
8bb0: 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a  P_FILE_PREFIX, z
8bc0: 54 65 6d 70 50 61 74 68 29 3b 0a 20 20 20 20 6a  TempPath);.    j
8bd0: 20 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b   = strlen(zBuf);
8be0: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e 64  .    sqlite3Rand
8bf0: 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66  omness(15, &zBuf
8c00: 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  [j]);.    for(i=
8c10: 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b  0; i<15; i++, j+
8c20: 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a  +){.      zBuf[j
8c30: 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73  ] = (char)zChars
8c40: 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  [ ((unsigned cha
8c50: 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65  r)zBuf[j])%(size
8c60: 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b  of(zChars)-1) ];
8c70: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b  .    }.    zBuf[
8c80: 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  j] = 0;.    if( 
8c90: 21 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73  !sqlite3OsAccess
8ca0: 28 70 56 66 73 2c 20 7a 42 75 66 2c 20 53 51 4c  (pVfs, zBuf, SQL
8cb0: 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
8cc0: 53 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  S) ) break;.  }.
8cd0: 20 20 4f 53 54 52 41 43 45 32 28 22 54 45 4d 50    OSTRACE2("TEMP
8ce0: 20 46 49 4c 45 4e 41 4d 45 3a 20 25 73 5c 6e 22   FILENAME: %s\n"
8cf0: 2c 20 7a 42 75 66 29 3b 0a 20 20 72 65 74 75 72  , zBuf);.  retur
8d00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a  n SQLITE_OK; .}.
8d10: 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65  ./*.** Turn a re
8d20: 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20  lative pathname 
8d30: 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68  into a full path
8d40: 6e 61 6d 65 2e 20 20 57 72 69 74 65 20 74 68 65  name.  Write the
8d50: 20 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d   full.** pathnam
8d60: 65 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20  e into zOut[].  
8d70: 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61  zOut[] will be a
8d80: 74 20 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d 78  t least pVfs->mx
8d90: 50 61 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65  Pathname.** byte
8da0: 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  s in size..*/.st
8db0: 61 74 69 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c  atic int winFull
8dc0: 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69  Pathname(.  sqli
8dd0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
8de0: 20 20 20 20 20 20 20 20 0a 20 20 63 6f 6e 73 74          .  const
8df0: 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76 65   char *zRelative
8e00: 2c 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 0a  ,.  char *zFull.
8e10: 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ){..#if defined(
8e20: 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 63 79  __CYGWIN__).  cy
8e30: 67 77 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 66 75 6c  gwin_conv_to_ful
8e40: 6c 5f 77 69 6e 33 32 5f 70 61 74 68 28 7a 52 65  l_win32_path(zRe
8e50: 6c 61 74 69 76 65 2c 20 7a 46 75 6c 6c 29 3b 0a  lative, zFull);.
8e60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8e70: 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f  OK.#endif..#if O
8e80: 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 20 57 69 6e  S_WINCE.  /* Win
8e90: 43 45 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70  CE has no concep
8ea0: 74 20 6f 66 20 61 20 72 65 6c 61 74 69 76 65 20  t of a relative 
8eb0: 70 61 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20  pathname, or so 
8ec0: 49 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20  I am told. */.  
8ed0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
8ee0: 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  (pVfs->mxPathnam
8ef0: 65 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20  e, zFull, "%s", 
8f00: 7a 52 65 6c 61 74 69 76 65 29 3b 0a 23 65 6e 64  zRelative);.#end
8f10: 69 66 0a 0a 23 69 66 20 21 4f 53 5f 57 49 4e 43  if..#if !OS_WINC
8f20: 45 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  E && !defined(__
8f30: 43 59 47 57 49 4e 5f 5f 29 0a 20 20 69 6e 74 20  CYGWIN__).  int 
8f40: 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a  nByte;.  void *z
8f50: 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 63 68 61  Converted;.  cha
8f60: 72 20 2a 7a 4f 75 74 3b 0a 20 20 7a 43 6f 6e 76  r *zOut;.  zConv
8f70: 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55  erted = convertU
8f80: 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c  tf8Filename(zRel
8f90: 61 74 69 76 65 29 3b 0a 20 20 69 66 28 20 69 73  ative);.  if( is
8fa0: 4e 54 28 29 20 29 7b 0a 20 20 20 20 57 43 48 41  NT() ){.    WCHA
8fb0: 52 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42  R *zTemp;.    nB
8fc0: 79 74 65 20 3d 20 47 65 74 46 75 6c 6c 50 61 74  yte = GetFullPat
8fd0: 68 4e 61 6d 65 57 28 28 57 43 48 41 52 2a 29 7a  hNameW((WCHAR*)z
8fe0: 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c  Converted, 0, 0,
8ff0: 20 30 29 20 2b 20 33 3b 0a 20 20 20 20 7a 54 65   0) + 3;.    zTe
9000: 6d 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  mp = sqlite3_mal
9010: 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f  loc( nByte*sizeo
9020: 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20  f(zTemp[0]) );. 
9030: 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20     if( zTemp==0 
9040: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9050: 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
9060: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
9070: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
9080: 20 20 7d 0a 20 20 20 20 47 65 74 46 75 6c 6c 50    }.    GetFullP
9090: 61 74 68 4e 61 6d 65 57 28 28 57 43 48 41 52 2a  athNameW((WCHAR*
90a0: 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79  )zConverted, nBy
90b0: 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20  te, zTemp, 0);. 
90c0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
90d0: 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
90e0: 20 7a 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65 54   zOut = unicodeT
90f0: 6f 55 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20  oUtf8(zTemp);.  
9100: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
9110: 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Temp);.  }else{.
9120: 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 3b      char *zTemp;
9130: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 47 65 74  .    nByte = Get
9140: 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63  FullPathNameA((c
9150: 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c  har*)zConverted,
9160: 20 30 2c 20 30 2c 20 30 29 20 2b 20 33 3b 0a 20   0, 0, 0) + 3;. 
9170: 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74     zTemp = sqlit
9180: 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65  e3_malloc( nByte
9190: 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d  *sizeof(zTemp[0]
91a0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65  ) );.    if( zTe
91b0: 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  mp==0 ){.      s
91c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
91d0: 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72  verted);.      r
91e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
91f0: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 47 65  EM;.    }.    Ge
9200: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28  tFullPathNameA((
9210: 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
9220: 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20  , nByte, zTemp, 
9230: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
9240: 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
9250: 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 6d 62 63  ;.    zOut = mbc
9260: 73 54 6f 55 74 66 38 28 7a 54 65 6d 70 29 3b 0a  sToUtf8(zTemp);.
9270: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9280: 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 20 20 69  (zTemp);.  }.  i
9290: 66 28 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73  f( zOut ){.    s
92a0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
92b0: 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
92c0: 2c 20 7a 46 75 6c 6c 2c 20 22 25 7a 22 2c 20 7a  , zFull, "%z", z
92d0: 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Out);.    return
92e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
92f0: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
9300: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
9310: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 6e  }.#endif.}..#ifn
9320: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9330: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f  LOAD_EXTENSION./
9340: 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20  *.** Interfaces 
9350: 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68  for opening a sh
9360: 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69  ared library, fi
9370: 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e  nding entry poin
9380: 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ts.** within the
9390: 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
93a0: 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65   and closing the
93b0: 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e   shared library.
93c0: 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  .*/./*.** Interf
93d0: 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67  aces for opening
93e0: 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72   a shared librar
93f0: 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79  y, finding entry
9400: 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69   points.** withi
9410: 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  n the shared lib
9420: 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e  rary, and closin
9430: 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  g the shared lib
9440: 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rary..*/.static 
9450: 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e 28  void *winDlOpen(
9460: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
9470: 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  s, const char *z
9480: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e  Filename){.  HAN
9490: 44 4c 45 20 68 3b 0a 20 20 76 6f 69 64 20 2a 7a  DLE h;.  void *z
94a0: 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
94b0: 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
94c0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
94d0: 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
94e0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
94f0: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28  .  }.  if( isNT(
9500: 29 20 29 7b 0a 20 20 20 20 68 20 3d 20 4c 6f 61  ) ){.    h = Loa
9510: 64 4c 69 62 72 61 72 79 57 28 28 57 43 48 41 52  dLibraryW((WCHAR
9520: 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  *)zConverted);. 
9530: 20 7d 65 6c 73 65 7b 0a 23 69 66 20 4f 53 5f 57   }else{.#if OS_W
9540: 49 4e 43 45 0a 20 20 20 20 72 65 74 75 72 6e 20  INCE.    return 
9550: 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68 20 3d  0;.#else.    h =
9560: 20 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28 63   LoadLibraryA((c
9570: 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29  har*)zConverted)
9580: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73  ;.#endif.  }.  s
9590: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
95a0: 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72  verted);.  retur
95b0: 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74  n (void*)h;.}.st
95c0: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 45  atic void winDlE
95d0: 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
95e0: 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
95f0: 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29  , char *zBufOut)
9600: 7b 0a 20 20 46 6f 72 6d 61 74 4d 65 73 73 61 67  {.  FormatMessag
9610: 65 28 0a 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45  e(.    FORMAT_ME
9620: 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45  SSAGE_FROM_SYSTE
9630: 4d 2c 0a 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20  M,.    NULL,.   
9640: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c   GetLastError(),
9650: 0a 20 20 20 20 30 2c 0a 20 20 20 20 7a 42 75 66  .    0,.    zBuf
9660: 4f 75 74 2c 0a 20 20 20 20 6e 42 75 66 2d 31 2c  Out,.    nBuf-1,
9670: 0a 20 20 20 20 30 0a 20 20 29 3b 0a 7d 0a 76 6f  .    0.  );.}.vo
9680: 69 64 20 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c  id *winDlSym(sql
9690: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
96a0: 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 2c 20 63  void *pHandle, c
96b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 62  onst char *zSymb
96c0: 6f 6c 29 7b 0a 23 69 66 20 4f 53 5f 57 49 4e 43  ol){.#if OS_WINC
96d0: 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74 50 72  E.  /* The GetPr
96e0: 6f 63 41 64 64 72 65 73 73 41 28 29 20 72 6f 75  ocAddressA() rou
96f0: 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76 61  tine is only ava
9700: 69 6c 61 62 6c 65 20 6f 6e 20 77 69 6e 63 65 2e  ilable on wince.
9710: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 47 65 74   */.  return Get
9720: 50 72 6f 63 41 64 64 72 65 73 73 41 28 28 48 41  ProcAddressA((HA
9730: 4e 44 4c 45 29 70 48 61 6e 64 6c 65 2c 20 7a 53  NDLE)pHandle, zS
9740: 79 6d 62 6f 6c 29 3b 0a 23 65 6c 73 65 0a 20 20  ymbol);.#else.  
9750: 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 77 69 6e  /* All other win
9760: 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20 65  dows platforms e
9770: 78 70 65 63 74 20 47 65 74 50 72 6f 63 41 64 64  xpect GetProcAdd
9780: 72 65 73 73 28 29 20 74 6f 20 74 61 6b 65 0a 20  ress() to take. 
9790: 20 2a 2a 20 61 6e 20 41 6e 73 69 20 73 74 72 69   ** an Ansi stri
97a0: 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  ng regardless of
97b0: 20 74 68 65 20 5f 55 4e 49 43 4f 44 45 20 73 65   the _UNICODE se
97c0: 74 74 69 6e 67 20 2a 2f 0a 20 20 72 65 74 75 72  tting */.  retur
97d0: 6e 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  n GetProcAddress
97e0: 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65  ((HANDLE)pHandle
97f0: 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 23 65 6e 64  , zSymbol);.#end
9800: 69 66 0a 7d 0a 76 6f 69 64 20 77 69 6e 44 6c 43  if.}.void winDlC
9810: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lose(sqlite3_vfs
9820: 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48   *pVfs, void *pH
9830: 61 6e 64 6c 65 29 7b 0a 20 20 46 72 65 65 4c 69  andle){.  FreeLi
9840: 62 72 61 72 79 28 28 48 41 4e 44 4c 45 29 70 48  brary((HANDLE)pH
9850: 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20  andle);.}.#else 
9860: 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  /* if SQLITE_OMI
9870: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
9880: 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a   is defined: */.
9890: 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f    #define winDlO
98a0: 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65  pen  0.  #define
98b0: 20 77 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20   winDlError 0.  
98c0: 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d  #define winDlSym
98d0: 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77     0.  #define w
98e0: 69 6e 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64  inDlClose 0.#end
98f0: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  if.../*.** Write
9900: 20 75 70 20 74 6f 20 6e 42 75 66 20 62 79 74 65   up to nBuf byte
9910: 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20  s of randomness 
9920: 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74  into zBuf..*/.st
9930: 61 74 69 63 20 69 6e 74 20 77 69 6e 52 61 6e 64  atic int winRand
9940: 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76  omness(sqlite3_v
9950: 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
9960: 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
9970: 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 50  .  if( sizeof(LP
9980: 53 59 53 54 45 4d 54 49 4d 45 29 3e 3d 6e 42 75  SYSTEMTIME)>=nBu
9990: 66 20 29 7b 0a 20 20 20 20 47 65 74 53 79 73 74  f ){.    GetSyst
99a0: 65 6d 54 69 6d 65 28 28 4c 50 53 59 53 54 45 4d  emTime((LPSYSTEM
99b0: 54 49 4d 45 29 7a 42 75 66 29 3b 0a 20 20 20 20  TIME)zBuf);.    
99c0: 72 65 74 75 72 6e 20 73 69 7a 65 6f 66 28 4c 50  return sizeof(LP
99d0: 53 59 53 54 45 4d 54 49 4d 45 29 3b 0a 20 20 7d  SYSTEMTIME);.  }
99e0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
99f0: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a   0;.  }.}.../*.*
9a00: 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69  * Sleep for a li
9a10: 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74  ttle while.  Ret
9a20: 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  urn the amount o
9a30: 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f  f time slept..*/
9a40: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
9a50: 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73  leep(sqlite3_vfs
9a60: 20 2a 70 56 66 73 2c 20 69 6e 74 20 6d 69 63 72   *pVfs, int micr
9a70: 6f 73 65 63 29 7b 0a 20 20 53 6c 65 65 70 28 28  osec){.  Sleep((
9a80: 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30  microsec+999)/10
9a90: 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  00);.  return ((
9aa0: 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30  microsec+999)/10
9ab0: 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a  00)*1000;.}../*.
9ac0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
9ad0: 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65   variable, if se
9ae0: 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  t to a non-zero 
9af0: 76 61 6c 75 65 2c 20 62 65 63 6f 6d 65 73 20 74  value, becomes t
9b00: 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 72 65 74  he result.** ret
9b10: 75 72 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  urned from sqlit
9b20: 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28  e3OsCurrentTime(
9b30: 29 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  ).  This is used
9b40: 20 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2f   for testing..*/
9b50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
9b60: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
9b70: 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30  current_time = 0
9b80: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
9b90: 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
9ba0: 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
9bb0: 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
9bc0: 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68  Time).  Write th
9bd0: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d  e.** current tim
9be0: 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
9bf0: 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
9c00: 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e  r into *prNow an
9c10: 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20  d.** return 0.  
9c20: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
9c30: 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61  time and date ca
9c40: 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
9c50: 2f 0a 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74  /.int winCurrent
9c60: 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  Time(sqlite3_vfs
9c70: 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a   *pVfs, double *
9c80: 70 72 4e 6f 77 29 7b 0a 20 20 46 49 4c 45 54 49  prNow){.  FILETI
9c90: 4d 45 20 66 74 3b 0a 20 20 2f 2a 20 46 49 4c 45  ME ft;.  /* FILE
9ca0: 54 49 4d 45 20 73 74 72 75 63 74 75 72 65 20 69  TIME structure i
9cb0: 73 20 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65  s a 64-bit value
9cc0: 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
9cd0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20 20  e number of .   
9ce0: 20 20 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64    100-nanosecond
9cf0: 20 69 6e 74 65 72 76 61 6c 73 20 73 69 6e 63 65   intervals since
9d00: 20 4a 61 6e 75 61 72 79 20 31 2c 20 31 36 30 31   January 1, 1601
9d10: 20 28 3d 20 4a 44 20 32 33 30 35 38 31 33 2e 35   (= JD 2305813.5
9d20: 29 2e 20 0a 20 20 2a 2f 0a 20 20 64 6f 75 62 6c  ). .  */.  doubl
9d30: 65 20 6e 6f 77 3b 0a 23 69 66 20 4f 53 5f 57 49  e now;.#if OS_WI
9d40: 4e 43 45 0a 20 20 53 59 53 54 45 4d 54 49 4d 45  NCE.  SYSTEMTIME
9d50: 20 74 69 6d 65 3b 0a 20 20 47 65 74 53 79 73 74   time;.  GetSyst
9d60: 65 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20  emTime(&time);. 
9d70: 20 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c   SystemTimeToFil
9d80: 65 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74 29  eTime(&time,&ft)
9d90: 3b 0a 23 65 6c 73 65 0a 20 20 47 65 74 53 79 73  ;.#else.  GetSys
9da0: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
9db0: 65 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66  e( &ft );.#endif
9dc0: 0a 20 20 6e 6f 77 20 3d 20 28 28 64 6f 75 62 6c  .  now = ((doubl
9dd0: 65 29 66 74 2e 64 77 48 69 67 68 44 61 74 65 54  e)ft.dwHighDateT
9de0: 69 6d 65 29 20 2a 20 34 32 39 34 39 36 37 32 39  ime) * 429496729
9df0: 36 2e 30 3b 20 0a 20 20 2a 70 72 4e 6f 77 20 3d  6.0; .  *prNow =
9e00: 20 28 6e 6f 77 20 2b 20 66 74 2e 64 77 4c 6f 77   (now + ft.dwLow
9e10: 44 61 74 65 54 69 6d 65 29 2f 38 36 34 30 30 30  DateTime)/864000
9e20: 30 30 30 30 30 30 2e 30 20 2b 20 32 33 30 35 38  000000.0 + 23058
9e30: 31 33 2e 35 3b 0a 23 69 66 64 65 66 20 53 51 4c  13.5;.#ifdef SQL
9e40: 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73  ITE_TEST.  if( s
9e50: 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
9e60: 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f  ime ){.    *prNo
9e70: 77 20 3d 20 73 71 6c 69 74 65 33 5f 63 75 72 72  w = sqlite3_curr
9e80: 65 6e 74 5f 74 69 6d 65 2f 38 36 34 30 30 2e 30  ent_time/86400.0
9e90: 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 20 20   + 2440587.5;.  
9ea0: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
9eb0: 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  n 0;.}.../*.** R
9ec0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
9ed0: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 44 65  to the sqlite3De
9ee0: 66 61 75 6c 74 56 66 73 20 73 74 72 75 63 74 75  faultVfs structu
9ef0: 72 65 2e 20 20 20 57 65 20 75 73 65 0a 2a 2a 20  re.   We use.** 
9f00: 61 20 66 75 6e 63 74 69 6f 6e 20 72 61 74 68 65  a function rathe
9f10: 72 20 74 68 61 6e 20 67 69 76 65 20 74 68 65 20  r than give the 
9f20: 73 74 72 75 63 74 75 72 65 20 67 6c 6f 62 61 6c  structure global
9f30: 20 73 63 6f 70 65 20 62 65 63 61 75 73 65 0a 2a   scope because.*
9f40: 2a 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73  * some compilers
9f50: 20 28 4d 53 56 43 29 20 64 6f 20 6e 6f 74 20 61   (MSVC) do not a
9f60: 6c 6c 6f 77 20 66 6f 72 77 61 72 64 20 64 65 63  llow forward dec
9f70: 6c 61 72 61 74 69 6f 6e 73 20 6f 66 0a 2a 2a 20  larations of.** 
9f80: 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74 72 75  initialized stru
9f90: 63 74 75 72 65 73 2e 0a 2a 2f 0a 73 71 6c 69 74  ctures..*/.sqlit
9fa0: 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 4f  e3_vfs *sqlite3O
9fb0: 73 44 65 66 61 75 6c 74 56 66 73 28 76 6f 69 64  sDefaultVfs(void
9fc0: 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  ){.  static sqli
9fd0: 74 65 33 5f 76 66 73 20 77 69 6e 56 66 73 20 3d  te3_vfs winVfs =
9fe0: 20 7b 0a 20 20 20 20 31 2c 20 20 20 20 20 20 20   {.    1,       
9ff0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
a000: 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a  rsion */.    siz
a010: 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20  eof(winFile),   
a020: 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20  /* szOsFile */. 
a030: 20 20 20 4d 41 58 5f 50 41 54 48 2c 20 20 20 20     MAX_PATH,    
a040: 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e        /* mxPathn
a050: 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ame */.    0,   
a060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a070: 20 6e 52 65 66 20 2a 2f 0a 20 20 20 20 30 2c 20   nRef */.    0, 
a080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a090: 2f 2a 20 76 66 73 4d 75 74 65 78 20 2a 2f 0a 20  /* vfsMutex */. 
a0a0: 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
a0b0: 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a        /* pNext *
a0c0: 2f 0a 20 20 20 20 22 77 69 6e 33 32 22 2c 20 20  /.    "win32",  
a0d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d           /* zNam
a0e0: 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
a100: 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 0a 20 20  AppData */.  .  
a110: 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20    winOpen,      
a120: 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f       /* xOpen */
a130: 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20  .    winDelete, 
a140: 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65          /* xDele
a150: 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63  te */.    winAcc
a160: 65 73 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ess,         /* 
a170: 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77  xAccess */.    w
a180: 69 6e 47 65 74 54 65 6d 70 4e 61 6d 65 2c 20 20  inGetTempName,  
a190: 20 20 2f 2a 20 78 47 65 74 54 65 6d 70 4e 61 6d    /* xGetTempNam
a1a0: 65 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c  e */.    winFull
a1b0: 50 61 74 68 6e 61 6d 65 2c 20 20 20 2f 2a 20 78  Pathname,   /* x
a1c0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  FullPathname */.
a1d0: 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20      winDlOpen,  
a1e0: 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65         /* xDlOpe
a1f0: 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72  n */.    winDlEr
a200: 72 6f 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 78  ror,        /* x
a210: 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77  DlError */.    w
a220: 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20  inDlSym,        
a230: 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20    /* xDlSym */. 
a240: 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20     winDlClose,  
a250: 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
a260: 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64  e */.    winRand
a270: 6f 6d 6e 65 73 73 2c 20 20 20 20 20 2f 2a 20 78  omness,     /* x
a280: 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20  Randomness */.  
a290: 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20    winSleep,     
a2a0: 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a       /* xSleep *
a2b0: 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74  /.    winCurrent
a2c0: 54 69 6d 65 20 20 20 20 20 2f 2a 20 78 43 75 72  Time     /* xCur
a2d0: 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 7d 3b  rentTime */.  };
a2e0: 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 26 77 69  .  .  return &wi
a2f0: 6e 56 66 73 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  nVfs;.}..#endif 
a300: 2f 2a 20 4f 53 5f 57 49 4e 20 2a 2f 0a           /* OS_WIN */.