/ Hex Artifact Content
Login

Artifact 0b90d9a1ce18bfd2a5f3c4a6bdb13ec369c805a9:


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 2a 0a 2a 2a 20 24 49 64 3a 20 6f 73 5f 77  .**.** $Id: os_w
01c0: 69 6e 2e 63 2c 76 20 31 2e 31 32 37 20 32 30 30  in.c,v 1.127 200
01d0: 38 2f 30 36 2f 31 33 20 31 38 3a 32 34 3a 32 37  8/06/13 18:24:27
01e0: 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69   drh Exp $.*/.#i
01f0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0200: 74 2e 68 22 0a 23 69 66 20 4f 53 5f 57 49 4e 20  t.h".#if OS_WIN 
0210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0220: 20 54 68 69 73 20 66 69 6c 65 20 69 73 20 75 73   This file is us
0230: 65 64 20 66 6f 72 20 77 69 6e 64 6f 77 73 20 6f  ed for windows o
0240: 6e 6c 79 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 41  nly */.../*.** A
0250: 20 4e 6f 74 65 20 41 62 6f 75 74 20 4d 65 6d 6f   Note About Memo
0260: 72 79 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 0a 2a  ry Allocation:.*
0270: 2a 0a 2a 2a 20 54 68 69 73 20 64 72 69 76 65 72  *.** This driver
0280: 20 75 73 65 73 20 6d 61 6c 6c 6f 63 28 29 2f 66   uses malloc()/f
0290: 72 65 65 28 29 20 64 69 72 65 63 74 6c 79 20 72  ree() directly r
02a0: 61 74 68 65 72 20 74 68 61 6e 20 67 6f 69 6e 67  ather than going
02b0: 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68 65 20   through.** the 
02c0: 53 51 4c 69 74 65 2d 77 72 61 70 70 65 72 73 20  SQLite-wrappers 
02d0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
02e0: 2f 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e  /sqlite3_free().
02f0: 20 20 54 68 6f 73 65 20 77 72 61 70 70 65 72 73    Those wrappers
0300: 0a 2a 2a 20 61 72 65 20 64 65 73 69 67 6e 65 64  .** are designed
0310: 20 66 6f 72 20 75 73 65 20 6f 6e 20 65 6d 62 65   for use on embe
0320: 64 64 65 64 20 73 79 73 74 65 6d 73 20 77 68 65  dded systems whe
0330: 72 65 20 6d 65 6d 6f 72 79 20 69 73 20 73 63 61  re memory is sca
0340: 72 63 65 20 61 6e 64 0a 2a 2a 20 6d 61 6c 6c 6f  rce and.** mallo
0350: 63 20 66 61 69 6c 75 72 65 73 20 68 61 70 70 65  c failures happe
0360: 6e 20 66 72 65 71 75 65 6e 74 6c 79 2e 20 20 57  n frequently.  W
0370: 69 6e 33 32 20 64 6f 65 73 20 6e 6f 74 20 74 79  in32 does not ty
0380: 70 69 63 61 6c 6c 79 20 72 75 6e 20 6f 6e 0a 2a  pically run on.*
0390: 2a 20 65 6d 62 65 64 64 65 64 20 73 79 73 74 65  * embedded syste
03a0: 6d 73 2c 20 61 6e 64 20 77 68 65 6e 20 69 74 20  ms, and when it 
03b0: 64 6f 65 73 20 74 68 65 20 64 65 76 65 6c 6f 70  does the develop
03c0: 65 72 73 20 6e 6f 72 6d 61 6c 6c 79 20 68 61 76  ers normally hav
03d0: 65 20 62 69 67 67 65 72 0a 2a 2a 20 70 72 6f 62  e bigger.** prob
03e0: 6c 65 6d 73 20 74 6f 20 77 6f 72 72 79 20 61 62  lems to worry ab
03f0: 6f 75 74 20 74 68 61 6e 20 72 75 6e 6e 69 6e 67  out than running
0400: 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20   out of memory. 
0410: 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 74   So there is not
0420: 0a 2a 2a 20 61 20 63 6f 6d 70 65 6c 6c 69 6e 67  .** a compelling
0430: 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65   need to use the
0440: 20 77 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a   wrappers..**.**
0450: 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20   But there is a 
0460: 67 6f 6f 64 20 72 65 61 73 6f 6e 20 74 6f 20 6e  good reason to n
0470: 6f 74 20 75 73 65 20 74 68 65 20 77 72 61 70 70  ot use the wrapp
0480: 65 72 73 2e 20 20 49 66 20 77 65 20 75 73 65 20  ers.  If we use 
0490: 74 68 65 0a 2a 2a 20 77 72 61 70 70 65 72 73 20  the.** wrappers 
04a0: 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 67 65 74  then we will get
04b0: 20 73 69 6d 75 6c 61 74 65 64 20 6d 61 6c 6c 6f   simulated mallo
04c0: 63 28 29 20 66 61 69 6c 75 72 65 73 20 77 69 74  c() failures wit
04d0: 68 69 6e 20 74 68 69 73 0a 2a 2a 20 64 72 69 76  hin this.** driv
04e0: 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 63 61  er.  And that ca
04f0: 75 73 65 73 20 61 6c 6c 20 6b 69 6e 64 73 20 6f  uses all kinds o
0500: 66 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f  f problems for o
0510: 75 72 20 74 65 73 74 73 2e 20 20 57 65 0a 2a 2a  ur tests.  We.**
0520: 20 63 6f 75 6c 64 20 65 6e 68 61 6e 63 65 20 53   could enhance S
0530: 51 4c 69 74 65 20 74 6f 20 64 65 61 6c 20 77 69  QLite to deal wi
0540: 74 68 20 73 69 6d 75 6c 61 74 65 64 20 6d 61 6c  th simulated mal
0550: 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 77 69 74  loc failures wit
0560: 68 69 6e 0a 2a 2a 20 74 68 65 20 4f 53 20 64 72  hin.** the OS dr
0570: 69 76 65 72 2c 20 62 75 74 20 74 68 65 20 63 6f  iver, but the co
0580: 64 65 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  de to deal with 
0590: 74 68 6f 73 65 20 66 61 69 6c 75 72 65 20 77 6f  those failure wo
05a0: 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 65 78  uld not.** be ex
05b0: 65 72 63 69 73 65 64 20 6f 6e 20 4c 69 6e 75 78  ercised on Linux
05c0: 20 28 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74   (which does not
05d0: 20 6e 65 65 64 20 74 6f 20 6d 61 6c 6c 6f 63 28   need to malloc(
05e0: 29 20 69 6e 20 74 68 65 20 64 72 69 76 65 72 29  ) in the driver)
05f0: 0a 2a 2a 20 61 6e 64 20 73 6f 20 77 65 20 77 6f  .** and so we wo
0600: 75 6c 64 20 68 61 76 65 20 64 69 66 66 69 63 75  uld have difficu
0610: 6c 74 79 20 77 72 69 74 69 6e 67 20 63 6f 76 65  lty writing cove
0620: 72 61 67 65 20 74 65 73 74 73 20 66 6f 72 20 74  rage tests for t
0630: 68 61 74 0a 2a 2a 20 63 6f 64 65 2e 20 20 42 65  hat.** code.  Be
0640: 74 74 65 72 20 74 6f 20 6c 65 61 76 65 20 74 68  tter to leave th
0650: 65 20 63 6f 64 65 20 6f 75 74 2c 20 77 65 20 74  e code out, we t
0660: 68 69 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hink..**.** The 
0670: 70 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 64 69  point of this di
0680: 73 63 75 73 73 69 6f 6e 20 69 73 20 61 73 20 66  scussion is as f
0690: 6f 6c 6c 6f 77 73 3a 20 20 57 68 65 6e 20 63 72  ollows:  When cr
06a0: 65 61 74 69 6e 67 20 61 20 6e 65 77 0a 2a 2a 20  eating a new.** 
06b0: 4f 53 20 6c 61 79 65 72 20 66 6f 72 20 61 6e 20  OS layer for an 
06c0: 65 6d 62 65 64 64 65 64 20 73 79 73 74 65 6d 2c  embedded system,
06d0: 20 69 66 20 79 6f 75 20 75 73 65 20 74 68 69 73   if you use this
06e0: 20 66 69 6c 65 20 61 73 20 61 6e 20 65 78 61 6d   file as an exam
06f0: 70 6c 65 2c 0a 2a 2a 20 61 76 6f 69 64 20 74 68  ple,.** avoid th
0700: 65 20 75 73 65 20 6f 66 20 6d 61 6c 6c 6f 63 28  e use of malloc(
0710: 29 2f 66 72 65 65 28 29 2e 20 20 54 68 6f 73 65  )/free().  Those
0720: 20 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 20 6f   routines work o
0730: 6b 20 6f 6e 20 77 69 6e 64 6f 77 73 0a 2a 2a 20  k on windows.** 
0740: 64 65 73 6b 74 6f 70 73 20 62 75 74 20 6e 6f 74  desktops but not
0750: 20 73 6f 20 77 65 6c 6c 20 69 6e 20 65 6d 62 65   so well in embe
0760: 64 64 65 64 20 73 79 73 74 65 6d 73 2e 0a 2a 2f  dded systems..*/
0770: 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 77 69 6e 62  ..#include <winb
0780: 61 73 65 2e 68 3e 0a 0a 23 69 66 64 65 66 20 5f  ase.h>..#ifdef _
0790: 5f 43 59 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c  _CYGWIN__.# incl
07a0: 75 64 65 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e  ude <sys/cygwin.
07b0: 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  h>.#endif../*.**
07c0: 20 4d 61 63 72 6f 73 20 75 73 65 64 20 74 6f 20   Macros used to 
07d0: 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
07e0: 72 20 6f 72 20 6e 6f 74 20 74 6f 20 75 73 65 20  r or not to use 
07f0: 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 23 69 66 20  threads..*/.#if 
0800: 64 65 66 69 6e 65 64 28 54 48 52 45 41 44 53 41  defined(THREADSA
0810: 46 45 29 20 26 26 20 54 48 52 45 41 44 53 41 46  FE) && THREADSAF
0820: 45 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  E.# define SQLIT
0830: 45 5f 57 33 32 5f 54 48 52 45 41 44 53 20 31 0a  E_W32_THREADS 1.
0840: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
0850: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
0860: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
0870: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
0880: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
0890: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44  mmon.h"../*.** D
08a0: 65 74 65 72 6d 69 6e 65 20 69 66 20 77 65 20 61  etermine if we a
08b0: 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
08c0: 57 69 6e 64 6f 77 73 43 45 20 2d 20 77 68 69 63  WindowsCE - whic
08d0: 68 20 68 61 73 20 61 20 6d 75 63 68 0a 2a 2a 20  h has a much.** 
08e0: 72 65 64 75 63 65 64 20 41 50 49 2e 0a 2a 2f 0a  reduced API..*/.
08f0: 23 69 66 20 64 65 66 69 6e 65 64 28 4f 53 5f 57  #if defined(OS_W
0900: 49 4e 43 45 29 0a 23 20 64 65 66 69 6e 65 20 41  INCE).# define A
0910: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
0920: 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   1.#endif../*.**
0930: 20 57 69 6e 43 45 20 6c 61 63 6b 73 20 6e 61 74   WinCE lacks nat
0940: 69 76 65 20 73 75 70 70 6f 72 74 20 66 6f 72 20  ive support for 
0950: 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 6f 20  file locking so 
0960: 77 65 20 68 61 76 65 20 74 6f 20 66 61 6b 65 20  we have to fake 
0970: 69 74 0a 2a 2a 20 77 69 74 68 20 73 6f 6d 65 20  it.** with some 
0980: 63 6f 64 65 20 6f 66 20 6f 75 72 20 6f 77 6e 2e  code of our own.
0990: 0a 2a 2f 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45  .*/.#if OS_WINCE
09a0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
09b0: 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  winceLock {.  in
09c0: 74 20 6e 52 65 61 64 65 72 73 3b 20 20 20 20 20  t nReaders;     
09d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
09e0: 65 61 64 65 72 20 6c 6f 63 6b 73 20 6f 62 74 61  eader locks obta
09f0: 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  ined */.  BOOL b
0a00: 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 2f 2a  Pending;      /*
0a10: 20 49 6e 64 69 63 61 74 65 73 20 61 20 70 65 6e   Indicates a pen
0a20: 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62 65  ding lock has be
0a30: 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20  en obtained */. 
0a40: 20 42 4f 4f 4c 20 62 52 65 73 65 72 76 65 64 3b   BOOL bReserved;
0a50: 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65       /* Indicate
0a60: 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  s a reserved loc
0a70: 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69  k has been obtai
0a80: 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 45  ned */.  BOOL bE
0a90: 78 63 6c 75 73 69 76 65 3b 20 20 20 20 2f 2a 20  xclusive;    /* 
0aa0: 49 6e 64 69 63 61 74 65 73 20 61 6e 20 65 78 63  Indicates an exc
0ab0: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 68 61 73 20  lusive lock has 
0ac0: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f  been obtained */
0ad0: 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b 0a 23 65  .} winceLock;.#e
0ae0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
0af0: 77 69 6e 46 69 6c 65 20 73 74 72 75 63 74 75 72  winFile structur
0b00: 65 20 69 73 20 61 20 73 75 62 63 6c 61 73 73 20  e is a subclass 
0b10: 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  of sqlite3_file*
0b20: 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65   specific to the
0b30: 20 77 69 6e 33 32 0a 2a 2a 20 70 6f 72 74 61 62   win32.** portab
0b40: 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a 2f 0a  ility layer..*/.
0b50: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
0b60: 69 6e 46 69 6c 65 20 77 69 6e 46 69 6c 65 3b 0a  inFile winFile;.
0b70: 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20 7b  struct winFile {
0b80: 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
0b90: 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65  _io_methods *pMe
0ba0: 74 68 6f 64 3b 2f 2a 20 4d 75 73 74 20 62 65 20  thod;/* Must be 
0bb0: 66 69 72 73 74 20 2a 2f 0a 20 20 48 41 4e 44 4c  first */.  HANDL
0bc0: 45 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  E h;            
0bd0: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
0be0: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 66   accessing the f
0bf0: 69 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ile */.  unsigne
0c00: 64 20 63 68 61 72 20 6c 6f 63 6b 74 79 70 65 3b  d char locktype;
0c10: 20 2f 2a 20 54 79 70 65 20 6f 66 20 6c 6f 63 6b   /* Type of lock
0c20: 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
0c30: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
0c40: 20 20 73 68 6f 72 74 20 73 68 61 72 65 64 4c 6f    short sharedLo
0c50: 63 6b 42 79 74 65 3b 20 20 20 2f 2a 20 52 61 6e  ckByte;   /* Ran
0c60: 64 6f 6d 6c 79 20 63 68 6f 73 65 6e 20 62 79 74  domly chosen byt
0c70: 65 20 75 73 65 64 20 61 73 20 61 20 73 68 61 72  e used as a shar
0c80: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 69 66 20 4f  ed lock */.#if O
0c90: 53 5f 57 49 4e 43 45 0a 20 20 57 43 48 41 52 20  S_WINCE.  WCHAR 
0ca0: 2a 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b  *zDeleteOnClose;
0cb0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
0cc0: 65 20 74 6f 20 64 65 6c 65 74 65 20 77 68 65 6e  e to delete when
0cd0: 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 41   closing */.  HA
0ce0: 4e 44 4c 45 20 68 4d 75 74 65 78 3b 20 20 20 20  NDLE hMutex;    
0cf0: 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 75        /* Mutex u
0d00: 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61  sed to control a
0d10: 63 63 65 73 73 20 74 6f 20 73 68 61 72 65 64 20  ccess to shared 
0d20: 6c 6f 63 6b 20 2a 2f 20 20 0a 20 20 48 41 4e 44  lock */  .  HAND
0d30: 4c 45 20 68 53 68 61 72 65 64 3b 20 20 20 20 20  LE hShared;     
0d40: 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65      /* Shared me
0d50: 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 75 73 65  mory segment use
0d60: 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f  d for locking */
0d70: 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63  .  winceLock loc
0d80: 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  al;        /* Lo
0d90: 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20  cks obtained by 
0da0: 74 68 69 73 20 69 6e 73 74 61 6e 63 65 20 6f 66  this instance of
0db0: 20 77 69 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69   winFile */.  wi
0dc0: 6e 63 65 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b  nceLock *shared;
0dd0: 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20        /* Global 
0de0: 73 68 61 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f  shared lock memo
0df0: 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20  ry for the file 
0e00: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 0a   */.#endif.};...
0e10: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
0e20: 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69 73 20  ing variable is 
0e30: 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65 74 20 6f  (normally) set o
0e40: 6e 63 65 20 61 6e 64 20 6e 65 76 65 72 20 63 68  nce and never ch
0e50: 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72 65 61 66  anges.** thereaf
0e60: 74 65 72 2e 20 20 49 74 20 72 65 63 6f 72 64 73  ter.  It records
0e70: 20 77 68 65 74 68 65 72 20 74 68 65 20 6f 70 65   whether the ope
0e80: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73  rating system is
0e90: 20 57 69 6e 39 35 0a 2a 2a 20 6f 72 20 57 69 6e   Win95.** or Win
0ea0: 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20 20 4f  NT..**.** 0:   O
0eb0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
0ec0: 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a 20 20  unknown..** 1:  
0ed0: 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   Operating syste
0ee0: 6d 20 69 73 20 57 69 6e 39 35 2e 0a 2a 2a 20 32  m is Win95..** 2
0ef0: 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79  :   Operating sy
0f00: 73 74 65 6d 20 69 73 20 57 69 6e 4e 54 2e 0a 2a  stem is WinNT..*
0f10: 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f  *.** In order to
0f20: 20 66 61 63 69 6c 69 74 61 74 65 20 74 65 73 74   facilitate test
0f30: 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e 54 20 73  ing on a WinNT s
0f40: 79 73 74 65 6d 2c 20 74 68 65 20 74 65 73 74 20  ystem, the test 
0f50: 66 69 78 74 75 72 65 0a 2a 2a 20 63 61 6e 20 6d  fixture.** can m
0f60: 61 6e 75 61 6c 6c 79 20 73 65 74 20 74 68 69 73  anually set this
0f70: 20 76 61 6c 75 65 20 74 6f 20 31 20 74 6f 20 65   value to 1 to e
0f80: 6d 75 6c 61 74 65 20 57 69 6e 39 38 20 62 65 68  mulate Win98 beh
0f90: 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66 64 65 66  avior..*/.#ifdef
0fa0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
0fb0: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
0fc0: 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61 74   = 0;.#else.stat
0fd0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  ic int sqlite3_o
0fe0: 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6e 64  s_type = 0;.#end
0ff0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
1000: 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29   true (non-zero)
1010: 20 69 66 20 77 65 20 61 72 65 20 72 75 6e 6e 69   if we are runni
1020: 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e 54 2c 20  ng under WinNT, 
1030: 57 69 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a  Win2K, WinXP,.**
1040: 20 6f 72 20 57 69 6e 43 45 2e 20 20 52 65 74 75   or WinCE.  Retu
1050: 72 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f 29 20  rn false (zero) 
1060: 66 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e 39 38  for Win95, Win98
1070: 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a  , or WinME..**.*
1080: 2a 20 48 65 72 65 20 69 73 20 61 6e 20 69 6e 74  * Here is an int
1090: 65 72 65 73 74 69 6e 67 20 6f 62 73 65 72 76 61  eresting observa
10a0: 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20 57 69  tion:  Win95, Wi
10b0: 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45 20 6c  n98, and WinME l
10c0: 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46  ack.** the LockF
10d0: 69 6c 65 45 78 28 29 20 41 50 49 2e 20 20 42 75  ileEx() API.  Bu
10e0: 74 20 77 65 20 63 61 6e 20 73 74 69 6c 6c 20 73  t we can still s
10f0: 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 20 61  tatically link a
1100: 67 61 69 6e 73 74 20 74 68 61 74 0a 2a 2a 20 41  gainst that.** A
1110: 50 49 20 61 73 20 6c 6f 6e 67 20 61 73 20 77 65  PI as long as we
1120: 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74 20 77   don't call it w
1130: 69 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e 39 35  in running Win95
1140: 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c 6c 20  /98/ME.  A call 
1150: 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  to.** this routi
1160: 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ne is used to de
1170: 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 68  termine if the h
1180: 6f 73 74 20 69 73 20 57 69 6e 39 35 2f 39 38 2f  ost is Win95/98/
1190: 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32  ME or.** WinNT/2
11a0: 4b 2f 58 50 20 73 6f 20 74 68 61 74 20 77 65 20  K/XP so that we 
11b0: 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74 68 65  will know whethe
11c0: 72 20 6f 72 20 6e 6f 74 20 77 65 20 63 61 6e 20  r or not we can 
11d0: 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74  safely call.** t
11e0: 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20  he LockFileEx() 
11f0: 41 50 49 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 57  API..*/.#if OS_W
1200: 49 4e 43 45 0a 23 20 64 65 66 69 6e 65 20 69 73  INCE.# define is
1210: 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 73 65 0a  NT()  (1).#else.
1220: 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e    static int isN
1230: 54 28 76 6f 69 64 29 7b 0a 20 20 20 20 69 66 28  T(void){.    if(
1240: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
1250: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f 53 56  ==0 ){.      OSV
1260: 45 52 53 49 4f 4e 49 4e 46 4f 20 73 49 6e 66 6f  ERSIONINFO sInfo
1270: 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f 2e 64 77  ;.      sInfo.dw
1280: 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a  OSVersionInfoSiz
1290: 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f  e = sizeof(sInfo
12a0: 29 3b 0a 20 20 20 20 20 20 47 65 74 56 65 72 73  );.      GetVers
12b0: 69 6f 6e 45 78 28 26 73 49 6e 66 6f 29 3b 0a 20  ionEx(&sInfo);. 
12c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f       sqlite3_os_
12d0: 74 79 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77 50  type = sInfo.dwP
12e0: 6c 61 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f 50  latformId==VER_P
12f0: 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54  LATFORM_WIN32_NT
1300: 20 3f 20 32 20 3a 20 31 3b 0a 20 20 20 20 7d 0a   ? 2 : 1;.    }.
1310: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1320: 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 3b 0a 20  e3_os_type==2;. 
1330: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f   }.#endif /* OS_
1340: 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  WINCE */../*.** 
1350: 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20  Convert a UTF-8 
1360: 73 74 72 69 6e 67 20 74 6f 20 6d 69 63 72 6f 73  string to micros
1370: 6f 66 74 20 75 6e 69 63 6f 64 65 20 28 55 54 46  oft unicode (UTF
1380: 2d 31 36 3f 29 2e 20 0a 2a 2a 0a 2a 2a 20 53 70  -16?). .**.** Sp
1390: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
13a0: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
13b0: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
13c0: 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74   malloc..*/.stat
13d0: 69 63 20 57 43 48 41 52 20 2a 75 74 66 38 54 6f  ic WCHAR *utf8To
13e0: 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68  Unicode(const ch
13f0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
1400: 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20 57    int nChar;.  W
1410: 43 48 41 52 20 2a 7a 57 69 64 65 46 69 6c 65 6e  CHAR *zWideFilen
1420: 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20 3d 20  ame;..  nChar = 
1430: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
1440: 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  har(CP_UTF8, 0, 
1450: 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e  zFilename, -1, N
1460: 55 4c 4c 2c 20 30 29 3b 0a 20 20 7a 57 69 64 65  ULL, 0);.  zWide
1470: 46 69 6c 65 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f  Filename = mallo
1480: 63 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28  c( nChar*sizeof(
1490: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d  zWideFilename[0]
14a0: 29 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65  ) );.  if( zWide
14b0: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
14c0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
14d0: 0a 20 20 6e 43 68 61 72 20 3d 20 4d 75 6c 74 69  .  nChar = Multi
14e0: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43  ByteToWideChar(C
14f0: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65  P_UTF8, 0, zFile
1500: 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64 65 46  name, -1, zWideF
1510: 69 6c 65 6e 61 6d 65 2c 20 6e 43 68 61 72 29 3b  ilename, nChar);
1520: 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20  .  if( nChar==0 
1530: 29 7b 0a 20 20 20 20 66 72 65 65 28 7a 57 69 64  ){.    free(zWid
1540: 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  eFilename);.    
1550: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20  zWideFilename = 
1560: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1570: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d  zWideFilename;.}
1580: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
1590: 6d 69 63 72 6f 73 6f 66 74 20 75 6e 69 63 6f 64  microsoft unicod
15a0: 65 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61  e to UTF-8.  Spa
15b0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
15c0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
15d0: 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72  s.** obtained fr
15e0: 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  om malloc()..*/.
15f0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 6e 69  static char *uni
1600: 63 6f 64 65 54 6f 55 74 66 38 28 63 6f 6e 73 74  codeToUtf8(const
1610: 20 57 43 48 41 52 20 2a 7a 57 69 64 65 46 69 6c   WCHAR *zWideFil
1620: 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42  ename){.  int nB
1630: 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69  yte;.  char *zFi
1640: 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42 79 74 65  lename;..  nByte
1650: 20 3d 20 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   = WideCharToMul
1660: 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20  tiByte(CP_UTF8, 
1670: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
1680: 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  , -1, 0, 0, 0, 0
1690: 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  );.  zFilename =
16a0: 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29   malloc( nByte )
16b0: 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  ;.  if( zFilenam
16c0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
16d0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  rn 0;.  }.  nByt
16e0: 65 20 3d 20 57 69 64 65 43 68 61 72 54 6f 4d 75  e = WideCharToMu
16f0: 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c  ltiByte(CP_UTF8,
1700: 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d   0, zWideFilenam
1710: 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65  e, -1, zFilename
1720: 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20  , nByte,.       
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1740: 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20         0, 0);.  
1750: 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29  if( nByte == 0 )
1760: 7b 0a 20 20 20 20 66 72 65 65 28 7a 46 69 6c 65  {.    free(zFile
1770: 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65  name);.    zFile
1780: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  name = 0;.  }.  
1790: 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65  return zFilename
17a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
17b0: 72 74 20 61 6e 20 61 6e 73 69 20 73 74 72 69 6e  rt an ansi strin
17c0: 67 20 74 6f 20 6d 69 63 72 6f 73 6f 66 74 20 75  g to microsoft u
17d0: 6e 69 63 6f 64 65 2c 20 62 61 73 65 64 20 6f 6e  nicode, based on
17e0: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
17f0: 63 6f 64 65 70 61 67 65 20 73 65 74 74 69 6e 67  codepage setting
1800: 73 20 66 6f 72 20 66 69 6c 65 20 61 70 69 73 2e  s for file apis.
1810: 0a 2a 2a 20 0a 2a 2a 20 53 70 61 63 65 20 74 6f  .** .** Space to
1820: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
1830: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
1840: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 6d 61  ained.** from ma
1850: 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lloc..*/.static 
1860: 57 43 48 41 52 20 2a 6d 62 63 73 54 6f 55 6e 69  WCHAR *mbcsToUni
1870: 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20  code(const char 
1880: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69  *zFilename){.  i
1890: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 57 43 48 41  nt nByte;.  WCHA
18a0: 52 20 2a 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  R *zMbcsFilename
18b0: 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65  ;.  int codepage
18c0: 20 3d 20 41 72 65 46 69 6c 65 41 70 69 73 41 4e   = AreFileApisAN
18d0: 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20  SI() ? CP_ACP : 
18e0: 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79  CP_OEMCP;..  nBy
18f0: 74 65 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f  te = MultiByteTo
1900: 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61 67  WideChar(codepag
1910: 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  e, 0, zFilename,
1920: 20 2d 31 2c 20 4e 55 4c 4c 2c 30 29 2a 73 69 7a   -1, NULL,0)*siz
1930: 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 20 7a 4d  eof(WCHAR);.  zM
1940: 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 6d 61  bcsFilename = ma
1950: 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a 65  lloc( nByte*size
1960: 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  of(zMbcsFilename
1970: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 4d  [0]) );.  if( zM
1980: 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  bcsFilename==0 )
1990: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
19a0: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 4d 75    }.  nByte = Mu
19b0: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
19c0: 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a  r(codepage, 0, z
19d0: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 4d  Filename, -1, zM
19e0: 62 63 73 46 69 6c 65 6e 61 6d 65 2c 20 6e 42 79  bcsFilename, nBy
19f0: 74 65 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  te);.  if( nByte
1a00: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 72 65 65 28  ==0 ){.    free(
1a10: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 29 3b 0a  zMbcsFilename);.
1a20: 20 20 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d      zMbcsFilenam
1a30: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
1a40: 75 72 6e 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  urn zMbcsFilenam
1a50: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  e;.}../*.** Conv
1a60: 65 72 74 20 6d 69 63 72 6f 73 6f 66 74 20 75 6e  ert microsoft un
1a70: 69 63 6f 64 65 20 74 6f 20 6d 75 6c 74 69 62 79  icode to multiby
1a80: 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72  te character str
1a90: 69 6e 67 2c 20 62 61 73 65 64 20 6f 6e 20 74 68  ing, based on th
1aa0: 65 0a 2a 2a 20 75 73 65 72 27 73 20 41 6e 73 69  e.** user's Ansi
1ab0: 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   codepage..**.**
1ac0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
1ad0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
1ae0: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
1af0: 72 6f 6d 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 2e  rom.** malloc().
1b00: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1b10: 2a 75 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 63  *unicodeToMbcs(c
1b20: 6f 6e 73 74 20 57 43 48 41 52 20 2a 7a 57 69 64  onst WCHAR *zWid
1b30: 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e  eFilename){.  in
1b40: 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20  t nByte;.  char 
1b50: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e  *zFilename;.  in
1b60: 74 20 63 6f 64 65 70 61 67 65 20 3d 20 41 72 65  t codepage = Are
1b70: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f  FileApisANSI() ?
1b80: 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d   CP_ACP : CP_OEM
1b90: 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 57  CP;..  nByte = W
1ba0: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
1bb0: 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20  te(codepage, 0, 
1bc0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d  zWideFilename, -
1bd0: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  1, 0, 0, 0, 0);.
1be0: 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 6d 61    zFilename = ma
1bf0: 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20  lloc( nByte );. 
1c00: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d   if( zFilename==
1c10: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1c20: 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  0;.  }.  nByte =
1c30: 20 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69   WideCharToMulti
1c40: 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30  Byte(codepage, 0
1c50: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
1c60: 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20   -1, zFilename, 
1c70: 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20  nByte,.         
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c90: 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 69 66       0, 0);.  if
1ca0: 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a  ( nByte == 0 ){.
1cb0: 20 20 20 20 66 72 65 65 28 7a 46 69 6c 65 6e 61      free(zFilena
1cc0: 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  me);.    zFilena
1cd0: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
1ce0: 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  turn zFilename;.
1cf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
1d00: 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72 61   multibyte chara
1d10: 63 74 65 72 20 73 74 72 69 6e 67 20 74 6f 20 55  cter string to U
1d20: 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20  TF-8.  Space to 
1d30: 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74 75  hold the.** retu
1d40: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
1d50: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
1d60: 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  loc()..*/.static
1d70: 20 63 68 61 72 20 2a 6d 62 63 73 54 6f 55 74 66   char *mbcsToUtf
1d80: 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  8(const char *zF
1d90: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72  ilename){.  char
1da0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b   *zFilenameUtf8;
1db0: 0a 20 20 57 43 48 41 52 20 2a 7a 54 6d 70 57 69  .  WCHAR *zTmpWi
1dc0: 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20  de;..  zTmpWide 
1dd0: 3d 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28  = mbcsToUnicode(
1de0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
1df0: 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b  ( zTmpWide==0 ){
1e00: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1e10: 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74   }.  zFilenameUt
1e20: 66 38 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74  f8 = unicodeToUt
1e30: 66 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  f8(zTmpWide);.  
1e40: 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a  free(zTmpWide);.
1e50: 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61    return zFilena
1e60: 6d 65 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  meUtf8;.}../*.**
1e70: 20 43 6f 6e 76 65 72 74 20 55 54 46 2d 38 20 74   Convert UTF-8 t
1e80: 6f 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72  o multibyte char
1e90: 61 63 74 65 72 20 73 74 72 69 6e 67 2e 20 20 53  acter string.  S
1ea0: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
1eb0: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74   .** returned st
1ec0: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
1ed0: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a   from malloc()..
1ee0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
1ef0: 75 74 66 38 54 6f 4d 62 63 73 28 63 6f 6e 73 74  utf8ToMbcs(const
1f00: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1f10: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  ){.  char *zFile
1f20: 6e 61 6d 65 4d 62 63 73 3b 0a 20 20 57 43 48 41  nameMbcs;.  WCHA
1f30: 52 20 2a 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20  R *zTmpWide;..  
1f40: 7a 54 6d 70 57 69 64 65 20 3d 20 75 74 66 38 54  zTmpWide = utf8T
1f50: 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
1f60: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57  me);.  if( zTmpW
1f70: 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ide==0 ){.    re
1f80: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46  turn 0;.  }.  zF
1f90: 69 6c 65 6e 61 6d 65 4d 62 63 73 20 3d 20 75 6e  ilenameMbcs = un
1fa0: 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54 6d 70  icodeToMbcs(zTmp
1fb0: 57 69 64 65 29 3b 0a 20 20 66 72 65 65 28 7a 54  Wide);.  free(zT
1fc0: 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72  mpWide);.  retur
1fd0: 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b  n zFilenameMbcs;
1fe0: 0a 7d 0a 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45  .}..#if OS_WINCE
1ff0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
2000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
2040: 68 69 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e 74  his section cont
2050: 61 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 57 69  ains code for Wi
2060: 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 2f 2a 0a  nCE only..*/./*.
2070: 2a 2a 20 57 69 6e 64 6f 77 73 43 45 20 64 6f 65  ** WindowsCE doe
2080: 73 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f 63  s not have a loc
2090: 61 6c 74 69 6d 65 28 29 20 66 75 6e 63 74 69 6f  altime() functio
20a0: 6e 2e 20 20 53 6f 20 63 72 65 61 74 65 20 61 0a  n.  So create a.
20b0: 2a 2a 20 73 75 62 73 74 69 74 75 74 65 2e 0a 2a  ** substitute..*
20c0: 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65  /.#include <time
20d0: 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a 5f  .h>.struct tm *_
20e0: 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d 65  _cdecl localtime
20f0: 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a 74  (const time_t *t
2100: 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72  ).{.  static str
2110: 75 63 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c 45  uct tm y;.  FILE
2120: 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20  TIME uTm, lTm;. 
2130: 20 53 59 53 54 45 4d 54 49 4d 45 20 70 54 6d 3b   SYSTEMTIME pTm;
2140: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
2150: 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a 74   t64;.  t64 = *t
2160: 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34 20 2b  ;.  t64 = (t64 +
2170: 20 31 31 36 34 34 34 37 33 36 30 30 29 2a 31 30   11644473600)*10
2180: 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64 77  000000;.  uTm.dw
2190: 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20 74 36  LowDateTime = t6
21a0: 34 20 26 20 30 78 46 46 46 46 46 46 46 46 3b 0a  4 & 0xFFFFFFFF;.
21b0: 20 20 75 54 6d 2e 64 77 48 69 67 68 44 61 74 65    uTm.dwHighDate
21c0: 54 69 6d 65 3d 20 74 36 34 20 3e 3e 20 33 32 3b  Time= t64 >> 32;
21d0: 0a 20 20 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63  .  FileTimeToLoc
21e0: 61 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c  alFileTime(&uTm,
21f0: 26 6c 54 6d 29 3b 0a 20 20 46 69 6c 65 54 69 6d  &lTm);.  FileTim
2200: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26 6c  eToSystemTime(&l
2210: 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74 6d  Tm,&pTm);.  y.tm
2220: 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65 61  _year = pTm.wYea
2230: 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74 6d  r - 1900;.  y.tm
2240: 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74  _mon = pTm.wMont
2250: 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77 64  h - 1;.  y.tm_wd
2260: 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66 57  ay = pTm.wDayOfW
2270: 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61 79  eek;.  y.tm_mday
2280: 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20 79   = pTm.wDay;.  y
2290: 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e 77  .tm_hour = pTm.w
22a0: 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e  Hour;.  y.tm_min
22b0: 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a   = pTm.wMinute;.
22c0: 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54 6d    y.tm_sec = pTm
22d0: 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74 75  .wSecond;.  retu
22e0: 72 6e 20 26 79 3b 0a 7d 0a 0a 2f 2a 20 54 68 69  rn &y;.}../* Thi
22f0: 73 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  s will never be 
2300: 63 61 6c 6c 65 64 2c 20 62 75 74 20 64 65 66 69  called, but defi
2310: 6e 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  ned to make the 
2320: 63 6f 64 65 20 63 6f 6d 70 69 6c 65 20 2a 2f 0a  code compile */.
2330: 23 64 65 66 69 6e 65 20 47 65 74 54 65 6d 70 50  #define GetTempP
2340: 61 74 68 41 28 61 2c 62 29 0a 0a 23 64 65 66 69  athA(a,b)..#defi
2350: 6e 65 20 4c 6f 63 6b 46 69 6c 65 28 61 2c 62 2c  ne LockFile(a,b,
2360: 63 2c 64 2c 65 29 20 20 20 20 20 20 20 77 69 6e  c,d,e)       win
2370: 63 65 4c 6f 63 6b 46 69 6c 65 28 26 61 2c 20 62  ceLockFile(&a, b
2380: 2c 20 63 2c 20 64 2c 20 65 29 0a 23 64 65 66 69  , c, d, e).#defi
2390: 6e 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 61 2c  ne UnlockFile(a,
23a0: 62 2c 63 2c 64 2c 65 29 20 20 20 20 20 77 69 6e  b,c,d,e)     win
23b0: 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 61 2c  ceUnlockFile(&a,
23c0: 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23 64 65   b, c, d, e).#de
23d0: 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28  fine LockFileEx(
23e0: 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 20 20 77  a,b,c,d,e,f)   w
23f0: 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45 78 28 26  inceLockFileEx(&
2400: 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 2c 20 66  a, b, c, d, e, f
2410: 29 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c  )..#define HANDL
2420: 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20  E_TO_WINFILE(a) 
2430: 28 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61  (winFile*)&((cha
2440: 72 2a 29 61 29 5b 2d 6f 66 66 73 65 74 6f 66 28  r*)a)[-offsetof(
2450: 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a  winFile,h)]../*.
2460: 2a 2a 20 41 63 71 75 69 72 65 20 61 20 6c 6f 63  ** Acquire a loc
2470: 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64 6c 65 20  k on the handle 
2480: 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  h.*/.static void
2490: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
24a0: 72 65 28 48 41 4e 44 4c 45 20 68 29 7b 0a 20 20  re(HANDLE h){.  
24b0: 20 44 57 4f 52 44 20 64 77 45 72 72 3b 0a 20 20   DWORD dwErr;.  
24c0: 20 64 6f 20 7b 0a 20 20 20 20 20 64 77 45 72 72   do {.     dwErr
24d0: 20 3d 20 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   = WaitForSingle
24e0: 4f 62 6a 65 63 74 28 68 2c 20 49 4e 46 49 4e 49  Object(h, INFINI
24f0: 54 45 29 3b 0a 20 20 20 7d 20 77 68 69 6c 65 20  TE);.   } while 
2500: 28 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 4f  (dwErr != WAIT_O
2510: 42 4a 45 43 54 5f 30 20 26 26 20 64 77 45 72 72  BJECT_0 && dwErr
2520: 20 21 3d 20 57 41 49 54 5f 41 42 41 4e 44 4f 4e   != WAIT_ABANDON
2530: 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c  ED);.}./*.** Rel
2540: 65 61 73 65 20 61 20 6c 6f 63 6b 20 61 63 71 75  ease a lock acqu
2550: 69 72 65 64 20 62 79 20 77 69 6e 63 65 4d 75 74  ired by winceMut
2560: 65 78 41 63 71 75 69 72 65 28 29 0a 2a 2f 0a 23  exAcquire().*/.#
2570: 64 65 66 69 6e 65 20 77 69 6e 63 65 4d 75 74 65  define winceMute
2580: 78 52 65 6c 65 61 73 65 28 68 29 20 52 65 6c 65  xRelease(h) Rele
2590: 61 73 65 4d 75 74 65 78 28 68 29 0a 0a 2f 2a 0a  aseMutex(h)../*.
25a0: 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 6d 75  ** Create the mu
25b0: 74 65 78 20 61 6e 64 20 73 68 61 72 65 64 20 6d  tex and shared m
25c0: 65 6d 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c  emory used for l
25d0: 6f 63 6b 69 6e 67 20 69 6e 20 74 68 65 20 66 69  ocking in the fi
25e0: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
25f0: 20 70 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63   pFile.*/.static
2600: 20 42 4f 4f 4c 20 77 69 6e 63 65 43 72 65 61 74   BOOL winceCreat
2610: 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61 72  eLock(const char
2620: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 77 69 6e   *zFilename, win
2630: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
2640: 57 43 48 41 52 20 2a 7a 54 6f 6b 3b 0a 20 20 57  WCHAR *zTok;.  W
2650: 43 48 41 52 20 2a 7a 4e 61 6d 65 20 3d 20 75 74  CHAR *zName = ut
2660: 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c  f8ToUnicode(zFil
2670: 65 6e 61 6d 65 29 3b 0a 20 20 42 4f 4f 4c 20 62  ename);.  BOOL b
2680: 49 6e 69 74 20 3d 20 54 52 55 45 3b 0a 0a 20 20  Init = TRUE;..  
2690: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
26a0: 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74 61  e local lockdata
26b0: 20 2a 2f 0a 20 20 5a 65 72 6f 4d 65 6d 6f 72 79   */.  ZeroMemory
26c0: 28 26 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2c 20  (&pFile->local, 
26d0: 73 69 7a 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f  sizeof(pFile->lo
26e0: 63 61 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70  cal));..  /* Rep
26f0: 6c 61 63 65 20 74 68 65 20 62 61 63 6b 73 6c 61  lace the backsla
2700: 73 68 65 73 20 66 72 6f 6d 20 74 68 65 20 66 69  shes from the fi
2710: 6c 65 6e 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72  lename and lower
2720: 63 61 73 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20  case it.  ** to 
2730: 64 65 72 69 76 65 20 61 20 6d 75 74 65 78 20 6e  derive a mutex n
2740: 61 6d 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d  ame. */.  zTok =
2750: 20 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d   CharLowerW(zNam
2760: 65 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f  e);.  for (;*zTo
2770: 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69  k;zTok++){.    i
2780: 66 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27  f (*zTok == '\\'
2790: 29 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20  ) *zTok = '_';. 
27a0: 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f   }..  /* Create/
27b0: 6f 70 65 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d  open the named m
27c0: 75 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  utex */.  pFile-
27d0: 3e 68 4d 75 74 65 78 20 3d 20 43 72 65 61 74 65  >hMutex = Create
27e0: 4d 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c  MutexW(NULL, FAL
27f0: 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  SE, zName);.  if
2800: 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78   (!pFile->hMutex
2810: 29 7b 0a 20 20 20 20 66 72 65 65 28 7a 4e 61 6d  ){.    free(zNam
2820: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46  e);.    return F
2830: 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ALSE;.  }..  /* 
2840: 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65  Acquire the mute
2850: 78 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  x before continu
2860: 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75  ing */.  winceMu
2870: 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
2880: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 0a 20 20  ->hMutex);.  .  
2890: 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 6e 61 6d  /* Since the nam
28a0: 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65  es of named mute
28b0: 78 65 73 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c  xes, semaphores,
28c0: 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 73 20 65   file mappings e
28d0: 74 63 20 61 72 65 20 0a 20 20 2a 2a 20 63 61 73  tc are .  ** cas
28e0: 65 2d 73 65 6e 73 69 74 69 76 65 2c 20 74 61 6b  e-sensitive, tak
28f0: 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  e advantage of t
2900: 68 61 74 20 62 79 20 75 70 70 65 72 63 61 73 69  hat by uppercasi
2910: 6e 67 20 74 68 65 20 6d 75 74 65 78 20 6e 61 6d  ng the mutex nam
2920: 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e 67  e.  ** and using
2930: 20 74 68 61 74 20 61 73 20 74 68 65 20 73 68 61   that as the sha
2940: 72 65 64 20 66 69 6c 65 6d 61 70 70 69 6e 67 20  red filemapping 
2950: 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 43 68 61  name..  */.  Cha
2960: 72 55 70 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a  rUpperW(zName);.
2970: 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64    pFile->hShared
2980: 20 3d 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70   = CreateFileMap
2990: 70 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48 41  pingW(INVALID_HA
29a0: 4e 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c  NDLE_VALUE, NULL
29b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 20 20 20 20 20 20 20 20 20 50 41 47 45 5f 52 45           PAGE_RE
29e0: 41 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a 65  ADWRITE, 0, size
29f0: 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20  of(winceLock),. 
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a20: 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b 20 20 0a        zName);  .
2a30: 0a 20 20 2f 2a 20 53 65 74 20 61 20 66 6c 61 67  .  /* Set a flag
2a40: 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20   that indicates 
2a50: 77 65 27 72 65 20 74 68 65 20 66 69 72 73 74 20  we're the first 
2a60: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 6d 65  to create the me
2a70: 6d 6f 72 79 20 73 6f 20 69 74 20 0a 20 20 2a 2a  mory so it .  **
2a80: 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 69 6e   must be zero-in
2a90: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69  itialized */.  i
2aa0: 66 20 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28  f (GetLastError(
2ab0: 29 20 3d 3d 20 45 52 52 4f 52 5f 41 4c 52 45 41  ) == ERROR_ALREA
2ac0: 44 59 5f 45 58 49 53 54 53 29 7b 0a 20 20 20 20  DY_EXISTS){.    
2ad0: 62 49 6e 69 74 20 3d 20 46 41 4c 53 45 3b 0a 20  bInit = FALSE;. 
2ae0: 20 7d 0a 0a 20 20 66 72 65 65 28 7a 4e 61 6d 65   }..  free(zName
2af0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 73  );..  /* If we s
2b00: 75 63 63 65 65 64 65 64 20 69 6e 20 6d 61 6b 69  ucceeded in maki
2b10: 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
2b20: 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70  mory handle, map
2b30: 20 69 74 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46   it. */.  if (pF
2b40: 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 7b 0a 20  ile->hShared){. 
2b50: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
2b60: 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 4d   = (winceLock*)M
2b70: 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  apViewOfFile(pFi
2b80: 6c 65 2d 3e 68 53 68 61 72 65 64 2c 20 0a 20 20  le->hShared, .  
2b90: 20 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f             FILE_
2ba0: 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41  MAP_READ|FILE_MA
2bb0: 50 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 73  P_WRITE, 0, 0, s
2bc0: 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29  izeof(winceLock)
2bd0: 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 70  );.    /* If map
2be0: 70 69 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f  ping failed, clo
2bf0: 73 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  se the shared me
2c00: 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 20  mory handle and 
2c10: 65 72 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 20  erase it */.    
2c20: 69 66 20 28 21 70 46 69 6c 65 2d 3e 73 68 61 72  if (!pFile->shar
2c30: 65 64 29 7b 0a 20 20 20 20 20 20 43 6c 6f 73 65  ed){.      Close
2c40: 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53  Handle(pFile->hS
2c50: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 46  hared);.      pF
2c60: 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e  ile->hShared = N
2c70: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ULL;.    }.  }..
2c80: 20 20 2f 2a 20 49 66 20 73 68 61 72 65 64 20 6d    /* If shared m
2c90: 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20  emory could not 
2ca0: 62 65 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e  be created, then
2cb0: 20 63 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78   close the mutex
2cc0: 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20 69   and fail */.  i
2cd0: 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  f (pFile->hShare
2ce0: 64 20 3d 3d 20 4e 55 4c 4c 29 7b 0a 20 20 20 20  d == NULL){.    
2cf0: 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
2d00: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
2d10: 3b 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c  ;.    CloseHandl
2d20: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
2d30: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75  ;.    pFile->hMu
2d40: 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  tex = NULL;.    
2d50: 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20  return FALSE;.  
2d60: 7d 0a 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69 61  }.  .  /* Initia
2d70: 6c 69 7a 65 20 74 68 65 20 73 68 61 72 65 64 20  lize the shared 
2d80: 6d 65 6d 6f 72 79 20 69 66 20 77 65 27 72 65 20  memory if we're 
2d90: 73 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a 20  supposed to */. 
2da0: 20 69 66 20 28 62 49 6e 69 74 29 20 7b 0a 20 20   if (bInit) {.  
2db0: 20 20 5a 65 72 6f 4d 65 6d 6f 72 79 28 70 46 69    ZeroMemory(pFi
2dc0: 6c 65 2d 3e 73 68 61 72 65 64 2c 20 73 69 7a 65  le->shared, size
2dd0: 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a  of(winceLock));.
2de0: 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65    }..  winceMute
2df0: 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e  xRelease(pFile->
2e00: 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  hMutex);.  retur
2e10: 6e 20 54 52 55 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n TRUE;.}../*.**
2e20: 20 44 65 73 74 72 6f 79 20 74 68 65 20 70 61 72   Destroy the par
2e30: 74 20 6f 66 20 77 69 6e 46 69 6c 65 20 74 68 61  t of winFile tha
2e40: 74 20 64 65 61 6c 73 20 77 69 74 68 20 77 69 6e  t deals with win
2e50: 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74  ce locks.*/.stat
2e60: 69 63 20 76 6f 69 64 20 77 69 6e 63 65 44 65 73  ic void winceDes
2e70: 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46 69 6c 65  troyLock(winFile
2e80: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66 20 28   *pFile){.  if (
2e90: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a  pFile->hMutex){.
2ea0: 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74      /* Acquire t
2eb0: 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20  he mutex */.    
2ec0: 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72  winceMutexAcquir
2ed0: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
2ee0: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  ;..    /* The fo
2ef0: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20 73  llowing blocks s
2f00: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 61  hould probably a
2f10: 73 73 65 72 74 20 69 6e 20 64 65 62 75 67 20 6d  ssert in debug m
2f20: 6f 64 65 2c 20 62 75 74 20 74 68 65 79 0a 20 20  ode, but they.  
2f30: 20 20 20 20 20 61 72 65 20 74 6f 20 63 6c 65 61       are to clea
2f40: 6e 75 70 20 69 6e 20 63 61 73 65 20 61 6e 79 20  nup in case any 
2f50: 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65 64 20 6f  locks remained o
2f60: 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 70  pen */.    if (p
2f70: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
2f80: 64 65 72 73 29 7b 0a 20 20 20 20 20 20 70 46 69  ders){.      pFi
2f90: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61  le->shared->nRea
2fa0: 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20  ders --;.    }. 
2fb0: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
2fc0: 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 7b 0a  cal.bReserved){.
2fd0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
2fe0: 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
2ff0: 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20   FALSE;.    }.  
3000: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
3010: 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20  al.bPending){.  
3020: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
3030: 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41  d->bPending = FA
3040: 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  LSE;.    }.    i
3050: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
3060: 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20  bExclusive){.   
3070: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
3080: 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46  ->bExclusive = F
3090: 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ALSE;.    }..   
30a0: 20 2f 2a 20 44 65 2d 72 65 66 65 72 65 6e 63 65   /* De-reference
30b0: 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75 72 20 63   and close our c
30c0: 6f 70 79 20 6f 66 20 74 68 65 20 73 68 61 72 65  opy of the share
30d0: 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20  d memory handle 
30e0: 2a 2f 0a 20 20 20 20 55 6e 6d 61 70 56 69 65 77  */.    UnmapView
30f0: 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73 68  OfFile(pFile->sh
3100: 61 72 65 64 29 3b 0a 20 20 20 20 43 6c 6f 73 65  ared);.    Close
3110: 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53  Handle(pFile->hS
3120: 68 61 72 65 64 29 3b 0a 0a 20 20 20 20 2f 2a 20  hared);..    /* 
3130: 44 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d 75  Done with the mu
3140: 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65  tex */.    wince
3150: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
3160: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 20 20 20 20  le->hMutex);    
3170: 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65  .    CloseHandle
3180: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
3190: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74  .    pFile->hMut
31a0: 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d  ex = NULL;.  }.}
31b0: 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e 20 69 6d 70 6c  ../* .** An impl
31c0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
31d0: 65 20 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50 49  e LockFile() API
31e0: 20 6f 66 20 77 69 6e 64 6f 77 73 20 66 6f 72 20   of windows for 
31f0: 77 69 6e 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20  wince.*/.static 
3200: 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69  BOOL winceLockFi
3210: 6c 65 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68  le(.  HANDLE *ph
3220: 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77  File,.  DWORD dw
3230: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20  FileOffsetLow,. 
3240: 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66   DWORD dwFileOff
3250: 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44  setHigh,.  DWORD
3260: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
3270: 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52  oLockLow,.  DWOR
3280: 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
3290: 54 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20  ToLockHigh.){.  
32a0: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
32b0: 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49   HANDLE_TO_WINFI
32c0: 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f  LE(phFile);.  BO
32d0: 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c  OL bReturn = FAL
32e0: 53 45 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c  SE;..  if (!pFil
32f0: 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72  e->hMutex) retur
3300: 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d  n TRUE;.  winceM
3310: 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c  utexAcquire(pFil
3320: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f  e->hMutex);..  /
3330: 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20 65 78 63  * Wanting an exc
3340: 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a  lusive lock? */.
3350: 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73    if (dwFileOffs
3360: 65 74 4c 6f 77 20 3d 3d 20 53 48 41 52 45 44 5f  etLow == SHARED_
3370: 46 49 52 53 54 0a 20 20 20 20 20 20 20 26 26 20  FIRST.       && 
3380: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
3390: 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 53 48 41 52 45  LockLow == SHARE
33a0: 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69 66 20  D_SIZE){.    if 
33b0: 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e  (pFile->shared->
33c0: 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 20 26 26  nReaders == 0 &&
33d0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
33e0: 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29  bExclusive == 0)
33f0: 7b 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  {.       pFile->
3400: 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
3410: 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ve = TRUE;.     
3420: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
3430: 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45  Exclusive = TRUE
3440: 3b 0a 20 20 20 20 20 20 20 62 52 65 74 75 72 6e  ;.       bReturn
3450: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
3460: 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20   }..  /* Want a 
3470: 72 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20  read-only lock? 
3480: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 28 64  */.  else if ((d
3490: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3e  wFileOffsetLow >
34a0: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 26  = SHARED_FIRST &
34b0: 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 77  &.            dw
34c0: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3c 20  FileOffsetLow < 
34d0: 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 53  SHARED_FIRST + S
34e0: 48 41 52 45 44 5f 53 49 5a 45 29 20 26 26 0a 20  HARED_SIZE) &&. 
34f0: 20 20 20 20 20 20 20 20 20 20 20 6e 4e 75 6d 62             nNumb
3500: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
3510: 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66  ow == 1){.    if
3520: 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
3530: 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30  >bExclusive == 0
3540: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
3550: 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b  local.nReaders +
3560: 2b 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69  +;.      if (pFi
3570: 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
3580: 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20  rs == 1){.      
3590: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
35a0: 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20  >nReaders ++;.  
35b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74      }.      bRet
35c0: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
35d0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74  }.  }..  /* Want
35e0: 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f   a pending lock?
35f0: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64   */.  else if (d
3600: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
3610: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 26  = PENDING_BYTE &
3620: 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
3630: 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  ToLockLow == 1){
3640: 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70 65  .    /* If no pe
3650: 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62  nding lock has b
3660: 65 65 6e 20 61 63 71 75 69 72 65 64 2c 20 74 68  een acquired, th
3670: 65 6e 20 61 63 71 75 69 72 65 20 69 74 20 2a 2f  en acquire it */
3680: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
3690: 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
36a0: 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70   == 0) {.      p
36b0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
36c0: 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20  ending = TRUE;. 
36d0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
36e0: 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55  l.bPending = TRU
36f0: 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
3700: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
3710: 20 7d 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 72   }.  /* Want a r
3720: 65 73 65 72 76 65 64 20 6c 6f 63 6b 3f 20 2a 2f  eserved lock? */
3730: 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69  .  else if (dwFi
3740: 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 52  leOffsetLow == R
3750: 45 53 45 52 56 45 44 5f 42 59 54 45 20 26 26 20  ESERVED_BYTE && 
3760: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
3770: 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20  LockLow == 1){. 
3780: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68     if (pFile->sh
3790: 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20  ared->bReserved 
37a0: 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46  == 0) {.      pF
37b0: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65  ile->shared->bRe
37c0: 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20  served = TRUE;. 
37d0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
37e0: 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20 54 52  l.bReserved = TR
37f0: 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  UE;.      bRetur
3800: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
3810: 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65    }..  winceMute
3820: 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e  xRelease(pFile->
3830: 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  hMutex);.  retur
3840: 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  n bReturn;.}../*
3850: 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74  .** An implement
3860: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 55 6e 6c  ation of the Unl
3870: 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f 66 20 77  ockFile API of w
3880: 69 6e 64 6f 77 73 20 66 6f 72 20 77 69 6e 63 65  indows for wince
3890: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
38a0: 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28  winceUnlockFile(
38b0: 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69 6c  .  HANDLE *phFil
38c0: 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  e,.  DWORD dwFil
38d0: 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57  eOffsetLow,.  DW
38e0: 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
38f0: 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  High,.  DWORD nN
3900: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
3910: 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  lockLow,.  DWORD
3920: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
3930: 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20  oUnlockHigh.){. 
3940: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
3950: 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46  = HANDLE_TO_WINF
3960: 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42  ILE(phFile);.  B
3970: 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41  OOL bReturn = FA
3980: 4c 53 45 3b 0a 0a 20 20 69 66 20 28 21 70 46 69  LSE;..  if (!pFi
3990: 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75  le->hMutex) retu
39a0: 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65  rn TRUE;.  wince
39b0: 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69  MutexAcquire(pFi
39c0: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20  le->hMutex);..  
39d0: 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72  /* Releasing a r
39e0: 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20 61 6e  eader lock or an
39f0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
3a00: 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f  */.  if (dwFileO
3a10: 66 66 73 65 74 4c 6f 77 20 3e 3d 20 53 48 41 52  ffsetLow >= SHAR
3a20: 45 44 5f 46 49 52 53 54 20 26 26 0a 20 20 20 20  ED_FIRST &&.    
3a30: 20 20 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c     dwFileOffsetL
3a40: 6f 77 20 3c 20 53 48 41 52 45 44 5f 46 49 52 53  ow < SHARED_FIRS
3a50: 54 20 2b 20 53 48 41 52 45 44 5f 53 49 5a 45 29  T + SHARED_SIZE)
3a60: 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20  {.    /* Did we 
3a70: 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76  have an exclusiv
3a80: 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 69  e lock? */.    i
3a90: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
3aa0: 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20  bExclusive){.   
3ab0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
3ac0: 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c  bExclusive = FAL
3ad0: 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  SE;.      pFile-
3ae0: 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
3af0: 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ive = FALSE;.   
3b00: 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
3b10: 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
3b20: 20 44 69 64 20 77 65 20 6a 75 73 74 20 68 61 76   Did we just hav
3b30: 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 3f  e a reader lock?
3b40: 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 20   */.    else if 
3b50: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
3b60: 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 70  eaders){.      p
3b70: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
3b80: 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 69  ders --;.      i
3b90: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
3ba0: 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 29 0a 20  nReaders == 0). 
3bb0: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70       {.        p
3bc0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52  File->shared->nR
3bd0: 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20  eaders --;.     
3be0: 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e   }.      bReturn
3bf0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
3c00: 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69   }..  /* Releasi
3c10: 6e 67 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63  ng a pending loc
3c20: 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  k */.  else if (
3c30: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
3c40: 3d 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  == PENDING_BYTE 
3c50: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
3c60: 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
3c70: 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  1){.    if (pFil
3c80: 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e  e->local.bPendin
3c90: 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  g){.      pFile-
3ca0: 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20  >local.bPending 
3cb0: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70  = FALSE;.      p
3cc0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
3cd0: 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a  ending = FALSE;.
3ce0: 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
3cf0: 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
3d00: 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61    /* Releasing a
3d10: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a   reserved lock *
3d20: 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
3d30: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
3d40: 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 26 26  RESERVED_BYTE &&
3d50: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
3d60: 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  oUnlockLow == 1)
3d70: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
3d80: 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
3d90: 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
3da0: 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
3db0: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
3dc0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
3dd0: 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45  Reserved = FALSE
3de0: 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  ;.      bReturn 
3df0: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
3e00: 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52  }..  winceMutexR
3e10: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
3e20: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
3e30: 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  bReturn;.}../*.*
3e40: 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  * An implementat
3e50: 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46  ion of the LockF
3e60: 69 6c 65 45 78 28 29 20 41 50 49 20 6f 66 20 77  ileEx() API of w
3e70: 69 6e 64 6f 77 73 20 66 6f 72 20 77 69 6e 63 65  indows for wince
3e80: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
3e90: 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45 78 28  winceLockFileEx(
3ea0: 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69 6c  .  HANDLE *phFil
3eb0: 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61  e,.  DWORD dwFla
3ec0: 67 73 2c 0a 20 20 44 57 4f 52 44 20 64 77 52 65  gs,.  DWORD dwRe
3ed0: 73 65 72 76 65 64 2c 0a 20 20 44 57 4f 52 44 20  served,.  DWORD 
3ee0: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
3ef0: 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  LockLow,.  DWORD
3f00: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
3f10: 6f 4c 6f 63 6b 48 69 67 68 2c 0a 20 20 4c 50 4f  oLockHigh,.  LPO
3f20: 56 45 52 4c 41 50 50 45 44 20 6c 70 4f 76 65 72  VERLAPPED lpOver
3f30: 6c 61 70 70 65 64 0a 29 7b 0a 20 20 2f 2a 20 49  lapped.){.  /* I
3f40: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 77 61 6e  f the caller wan
3f50: 74 73 20 61 20 73 68 61 72 65 64 20 72 65 61 64  ts a shared read
3f60: 20 6c 6f 63 6b 2c 20 66 6f 72 77 61 72 64 20 74   lock, forward t
3f70: 68 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f  his call.  ** to
3f80: 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 20 2a   winceLockFile *
3f90: 2f 0a 20 20 69 66 20 28 6c 70 4f 76 65 72 6c 61  /.  if (lpOverla
3fa0: 70 70 65 64 2d 3e 4f 66 66 73 65 74 20 3d 3d 20  pped->Offset == 
3fb0: 53 48 41 52 45 44 5f 46 49 52 53 54 20 26 26 0a  SHARED_FIRST &&.
3fc0: 20 20 20 20 20 20 64 77 46 6c 61 67 73 20 3d 3d        dwFlags ==
3fd0: 20 31 20 26 26 0a 20 20 20 20 20 20 6e 4e 75 6d   1 &&.      nNum
3fe0: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
3ff0: 4c 6f 77 20 3d 3d 20 53 48 41 52 45 44 5f 53 49  Low == SHARED_SI
4000: 5a 45 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ZE){.    return 
4010: 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70 68  winceLockFile(ph
4020: 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
4030: 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  ST, 0, 1, 0);.  
4040: 7d 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45  }.  return FALSE
4050: 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66  ;.}./*.** End of
4060: 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f 64   the special cod
4070: 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a  e for wince.****
4080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
40a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
40b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
40c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69  *********/.#endi
40d0: 66 20 2f 2a 20 4f 53 5f 57 49 4e 43 45 20 2a 2f  f /* OS_WINCE */
40e0: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
40f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4130: 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f  .** The next gro
4140: 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 69  up of routines i
4150: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f 4f  mplement the I/O
4160: 20 6d 65 74 68 6f 64 73 20 73 70 65 63 69 66 69   methods specifi
4170: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 71 6c  ed.** by the sql
4180: 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
4190: 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a  object..********
41a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
41b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
41c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
41d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
41e0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  ******/../*.** C
41f0: 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a  lose a file..**.
4200: 2a 2a 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  ** It is reporte
4210: 64 20 74 68 61 74 20 61 6e 20 61 74 74 65 6d 70  d that an attemp
4220: 74 20 74 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e  t to close a han
4230: 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65 74 69  dle might someti
4240: 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68  mes.** fail.  Th
4250: 69 73 20 69 73 20 61 20 76 65 72 79 20 75 6e 72  is is a very unr
4260: 65 61 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74  easonable result
4270: 2c 20 62 75 74 20 77 69 6e 64 6f 77 73 20 69 73  , but windows is
4280: 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f   notorious.** fo
4290: 72 20 62 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e  r being unreason
42a0: 61 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74  able so I do not
42b0: 20 64 6f 75 62 74 20 74 68 61 74 20 69 74 20 6d   doubt that it m
42c0: 69 67 68 74 20 68 61 70 70 65 6e 2e 20 20 49 66  ight happen.  If
42d0: 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20 66 61  .** the close fa
42e0: 69 6c 73 2c 20 77 65 20 70 61 75 73 65 20 66 6f  ils, we pause fo
42f0: 72 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e  r 100 millisecon
4300: 64 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  ds and try again
4310: 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73  .  As.** many as
4320: 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50   MX_CLOSE_ATTEMP
4330: 54 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c  T attempts to cl
4340: 6f 73 65 20 74 68 65 20 68 61 6e 64 6c 65 20 61  ose the handle a
4350: 72 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a  re made before.*
4360: 2a 20 67 69 76 69 6e 67 20 75 70 20 61 6e 64 20  * giving up and 
4370: 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  returning an err
4380: 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  or..*/.#define M
4390: 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
43a0: 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  3.static int win
43b0: 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
43c0: 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
43d0: 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69  c, cnt = 0;.  wi
43e0: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
43f0: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 4f  winFile*)id;.  O
4400: 53 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25  STRACE2("CLOSE %
4410: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b  d\n", pFile->h);
4420: 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d 20  .  do{.    rc = 
4430: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
4440: 65 2d 3e 68 29 3b 0a 20 20 7d 77 68 69 6c 65 28  e->h);.  }while(
4450: 20 72 63 3d 3d 30 20 26 26 20 63 6e 74 2b 2b 20   rc==0 && cnt++ 
4460: 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  < MX_CLOSE_ATTEM
4470: 50 54 20 26 26 20 28 53 6c 65 65 70 28 31 30 30  PT && (Sleep(100
4480: 29 2c 20 31 29 20 29 3b 0a 23 69 66 20 4f 53 5f  ), 1) );.#if OS_
4490: 57 49 4e 43 45 0a 23 64 65 66 69 6e 65 20 57 49  WINCE.#define WI
44a0: 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54  NCE_DELETION_ATT
44b0: 45 4d 50 54 53 20 33 0a 20 20 77 69 6e 63 65 44  EMPTS 3.  winceD
44c0: 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65  estroyLock(pFile
44d0: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
44e0: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29  zDeleteOnClose )
44f0: 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20  {.    int cnt = 
4500: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 0a 20 20  0;.    while(.  
4510: 20 20 20 20 20 20 20 20 20 44 65 6c 65 74 65 46           DeleteF
4520: 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c  ileW(pFile->zDel
4530: 65 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20  eteOnClose)==0. 
4540: 20 20 20 20 20 20 20 26 26 20 47 65 74 46 69 6c         && GetFil
4550: 65 41 74 74 72 69 62 75 74 65 73 57 28 70 46 69  eAttributesW(pFi
4560: 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
4570: 73 65 29 21 3d 30 78 66 66 66 66 66 66 66 66 20  se)!=0xffffffff 
4580: 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e 74 2b  .        && cnt+
4590: 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45 54 49  + < WINCE_DELETI
45a0: 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20 20 20  ON_ATTEMPTS.    
45b0: 29 7b 0a 20 20 20 20 20 20 20 53 6c 65 65 70 28  ){.       Sleep(
45c0: 31 30 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61  100);  /* Wait a
45d0: 20 6c 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74   little before t
45e0: 72 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20  rying again */. 
45f0: 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 70 46     }.    free(pF
4600: 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
4610: 6f 73 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ose);.  }.#endif
4620: 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d  .  OpenCounter(-
4630: 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20  1);.  return rc 
4640: 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51  ? SQLITE_OK : SQ
4650: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 7d 0a 0a 2f  LITE_IOERR;.}../
4660: 2a 0a 2a 2a 20 53 6f 6d 65 20 6d 69 63 72 6f 73  *.** Some micros
4670: 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61  oft compilers la
4680: 63 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74 69  ck this definiti
4690: 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49  on..*/.#ifndef I
46a0: 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
46b0: 50 4f 49 4e 54 45 52 0a 23 20 64 65 66 69 6e 65  POINTER.# define
46c0: 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c   INVALID_SET_FIL
46d0: 45 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 4f 52  E_POINTER ((DWOR
46e0: 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  D)-1).#endif../*
46f0: 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72  .** Read data fr
4700: 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61  om a file into a
4710: 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e   buffer.  Return
4720: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c   SQLITE_OK if al
4730: 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20  l.** bytes were 
4740: 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
4750: 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45  y and SQLITE_IOE
4760: 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  RR if anything g
4770: 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f  oes.** wrong..*/
4780: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52  .static int winR
4790: 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ead(.  sqlite3_f
47a0: 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20  ile *id,        
47b0: 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65 61    /* File to rea
47c0: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64  d from */.  void
47d0: 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
47e0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
47f0: 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68 69  content into thi
4800: 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  s buffer */.  in
4810: 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20  t amt,          
4820: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4830: 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72  er of bytes to r
4840: 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ead */.  sqlite3
4850: 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20  _int64 offset   
4860: 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61      /* Begin rea
4870: 64 69 6e 67 20 61 74 20 74 68 69 73 20 6f 66 66  ding at this off
4880: 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 4c 4f 4e 47  set */.){.  LONG
4890: 20 75 70 70 65 72 42 69 74 73 20 3d 20 28 6f 66   upperBits = (of
48a0: 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66  fset>>32) & 0x7f
48b0: 66 66 66 66 66 66 3b 0a 20 20 4c 4f 4e 47 20 6c  ffffff;.  LONG l
48c0: 6f 77 65 72 42 69 74 73 20 3d 20 6f 66 66 73 65  owerBits = offse
48d0: 74 20 26 20 30 78 66 66 66 66 66 66 66 66 3b 0a  t & 0xffffffff;.
48e0: 20 20 44 57 4f 52 44 20 72 63 3b 0a 20 20 44 57    DWORD rc;.  DW
48f0: 4f 52 44 20 67 6f 74 3b 0a 20 20 77 69 6e 46 69  ORD got;.  winFi
4900: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
4910: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73 65  File*)id;.  asse
4920: 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53  rt( id!=0 );.  S
4930: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
4940: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
4950: 52 52 5f 52 45 41 44 29 3b 0a 20 20 4f 53 54 52  RR_READ);.  OSTR
4960: 41 43 45 33 28 22 52 45 41 44 20 25 64 20 6c 6f  ACE3("READ %d lo
4970: 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  ck=%d\n", pFile-
4980: 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  >h, pFile->lockt
4990: 79 70 65 29 3b 0a 20 20 72 63 20 3d 20 53 65 74  ype);.  rc = Set
49a0: 46 69 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c  FilePointer(pFil
49b0: 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c  e->h, lowerBits,
49c0: 20 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c   &upperBits, FIL
49d0: 45 5f 42 45 47 49 4e 29 3b 0a 20 20 69 66 28 20  E_BEGIN);.  if( 
49e0: 72 63 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f  rc==INVALID_SET_
49f0: 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 26 26 20  FILE_POINTER && 
4a00: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21 3d  GetLastError()!=
4a10: 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  NO_ERROR ){.    
4a20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
4a30: 4c 4c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 52  LL;.  }.  if( !R
4a40: 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  eadFile(pFile->h
4a50: 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 67 6f  , pBuf, amt, &go
4a60: 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74  t, 0) ){.    ret
4a70: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
4a80: 5f 52 45 41 44 3b 0a 20 20 7d 0a 20 20 69 66 28  _READ;.  }.  if(
4a90: 20 67 6f 74 3d 3d 28 44 57 4f 52 44 29 61 6d 74   got==(DWORD)amt
4aa0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
4ab0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
4ac0: 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28  e{.    memset(&(
4ad0: 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74  (char*)pBuf)[got
4ae0: 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a  ], 0, amt-got);.
4af0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4b00: 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
4b10: 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  AD;.  }.}../*.**
4b20: 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d   Write data from
4b30: 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61   a buffer into a
4b40: 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53   file.  Return S
4b50: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
4b60: 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ess.** or some o
4b70: 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
4b80: 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
4b90: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69  tatic int winWri
4ba0: 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  te(.  sqlite3_fi
4bb0: 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
4bc0: 2f 2a 20 46 69 6c 65 20 74 6f 20 77 72 69 74 65  /* File to write
4bd0: 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74   into */.  const
4be0: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
4bf0: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65       /* The byte
4c00: 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
4c10: 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20  */.  int amt,   
4c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4c30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
4c40: 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  s to write */.  
4c50: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
4c60: 66 73 65 74 20 20 20 20 20 20 2f 2a 20 4f 66 66  fset      /* Off
4c70: 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  set into the fil
4c80: 65 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69  e to begin writi
4c90: 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20 4c 4f  ng at */.){.  LO
4ca0: 4e 47 20 75 70 70 65 72 42 69 74 73 20 3d 20 28  NG upperBits = (
4cb0: 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  offset>>32) & 0x
4cc0: 37 66 66 66 66 66 66 66 3b 0a 20 20 4c 4f 4e 47  7fffffff;.  LONG
4cd0: 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 6f 66 66   lowerBits = off
4ce0: 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66  set & 0xffffffff
4cf0: 3b 0a 20 20 44 57 4f 52 44 20 72 63 3b 0a 20 20  ;.  DWORD rc;.  
4d00: 44 57 4f 52 44 20 77 72 6f 74 65 3b 0a 20 20 77  DWORD wrote;.  w
4d10: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
4d20: 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
4d30: 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
4d40: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
4d50: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
4d60: 5f 49 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a 20  _IOERR_WRITE);. 
4d70: 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
4d80: 6c 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  lError(return SQ
4d90: 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 20 20 4f 53  LITE_FULL);.  OS
4da0: 54 52 41 43 45 33 28 22 57 52 49 54 45 20 25 64  TRACE3("WRITE %d
4db0: 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69   lock=%d\n", pFi
4dc0: 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
4dd0: 63 6b 74 79 70 65 29 3b 0a 20 20 72 63 20 3d 20  cktype);.  rc = 
4de0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 70  SetFilePointer(p
4df0: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69  File->h, lowerBi
4e00: 74 73 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20  ts, &upperBits, 
4e10: 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 20 20 69  FILE_BEGIN);.  i
4e20: 66 28 20 72 63 3d 3d 49 4e 56 41 4c 49 44 5f 53  f( rc==INVALID_S
4e30: 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20  ET_FILE_POINTER 
4e40: 26 26 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28  && GetLastError(
4e50: 29 21 3d 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20  )!=NO_ERROR ){. 
4e60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4e70: 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 61 73 73  _FULL;.  }.  ass
4e80: 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20  ert( amt>0 );.  
4e90: 77 68 69 6c 65 28 0a 20 20 20 20 20 61 6d 74 3e  while(.     amt>
4ea0: 30 0a 20 20 20 20 20 26 26 20 28 72 63 20 3d 20  0.     && (rc = 
4eb0: 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d  WriteFile(pFile-
4ec0: 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26  >h, pBuf, amt, &
4ed0: 77 72 6f 74 65 2c 20 30 29 29 21 3d 30 0a 20 20  wrote, 0))!=0.  
4ee0: 20 20 20 26 26 20 77 72 6f 74 65 3e 30 0a 20 20     && wrote>0.  
4ef0: 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72  ){.    amt -= wr
4f00: 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20  ote;.    pBuf = 
4f10: 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77  &((char*)pBuf)[w
4f20: 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  rote];.  }.  if(
4f30: 20 21 72 63 20 7c 7c 20 61 6d 74 3e 28 69 6e 74   !rc || amt>(int
4f40: 29 77 72 6f 74 65 20 29 7b 0a 20 20 20 20 72 65  )wrote ){.    re
4f50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
4f60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
4f70: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
4f80: 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f  ** Truncate an o
4f90: 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70  pen file to a sp
4fa0: 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a  ecified size.*/.
4fb0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 54 72  static int winTr
4fc0: 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
4fd0: 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33  ile *id, sqlite3
4fe0: 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20  _int64 nByte){. 
4ff0: 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73 20   LONG upperBits 
5000: 3d 20 28 6e 42 79 74 65 3e 3e 33 32 29 20 26 20  = (nByte>>32) & 
5010: 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 4c 4f  0x7fffffff;.  LO
5020: 4e 47 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 6e  NG lowerBits = n
5030: 42 79 74 65 20 26 20 30 78 66 66 66 66 66 66 66  Byte & 0xfffffff
5040: 66 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  f;.  winFile *pF
5050: 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
5060: 69 64 3b 0a 20 20 4f 53 54 52 41 43 45 33 28 22  id;.  OSTRACE3("
5070: 54 52 55 4e 43 41 54 45 20 25 64 20 25 6c 6c 64  TRUNCATE %d %lld
5080: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e  \n", pFile->h, n
5090: 42 79 74 65 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Byte);.  Simulat
50a0: 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
50b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
50c0: 4e 43 41 54 45 29 3b 0a 20 20 53 65 74 46 69 6c  NCATE);.  SetFil
50d0: 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e  ePointer(pFile->
50e0: 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26 75  h, lowerBits, &u
50f0: 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42  pperBits, FILE_B
5100: 45 47 49 4e 29 3b 0a 20 20 53 65 74 45 6e 64 4f  EGIN);.  SetEndO
5110: 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b  fFile(pFile->h);
5120: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5130: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
5140: 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
5150: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
5160: 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61  r of fullsyncs a
5170: 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e  nd normal syncs.
5180: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
5190: 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73  o test.** that s
51a0: 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e  yncs and fullsyn
51b0: 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20  cs are occuring 
51c0: 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d  at the right tim
51d0: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
51e0: 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  e3_sync_count = 
51f0: 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  0;.int sqlite3_f
5200: 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  ullsync_count = 
5210: 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
5220: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
5230: 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
5240: 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
5250: 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
5260: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5270: 77 69 6e 53 79 6e 63 28 73 71 6c 69 74 65 33 5f  winSync(sqlite3_
5280: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c  file *id, int fl
5290: 61 67 73 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  ags){.  winFile 
52a0: 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
52b0: 65 2a 29 69 64 3b 0a 20 20 4f 53 54 52 41 43 45  e*)id;.  OSTRACE
52c0: 33 28 22 53 59 4e 43 20 25 64 20 6c 6f 63 6b 3d  3("SYNC %d lock=
52d0: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
52e0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
52f0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
5300: 5f 54 45 53 54 0a 20 20 69 66 28 20 66 6c 61 67  _TEST.  if( flag
5310: 73 20 26 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s & SQLITE_SYNC_
5320: 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69  FULL ){.    sqli
5330: 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
5340: 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  nt++;.  }.  sqli
5350: 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  te3_sync_count++
5360: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 46  ;.#endif.  if( F
5370: 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 28  lushFileBuffers(
5380: 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20 20  pFile->h) ){.   
5390: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
53a0: 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
53b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
53c0: 45 52 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ERR;.  }.}../*.*
53d0: 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
53e0: 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
53f0: 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a  a file in bytes.
5400: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
5410: 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  nFileSize(sqlite
5420: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69  3_file *id, sqli
5430: 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65  te3_int64 *pSize
5440: 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  ){.  winFile *pF
5450: 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
5460: 69 64 3b 0a 20 20 44 57 4f 52 44 20 75 70 70 65  id;.  DWORD uppe
5470: 72 42 69 74 73 2c 20 6c 6f 77 65 72 42 69 74 73  rBits, lowerBits
5480: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
5490: 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
54a0: 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a  E_IOERR_FSTAT);.
54b0: 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 47 65    lowerBits = Ge
54c0: 74 46 69 6c 65 53 69 7a 65 28 70 46 69 6c 65 2d  tFileSize(pFile-
54d0: 3e 68 2c 20 26 75 70 70 65 72 42 69 74 73 29 3b  >h, &upperBits);
54e0: 0a 20 20 2a 70 53 69 7a 65 20 3d 20 28 28 28 73  .  *pSize = (((s
54f0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 75 70 70  qlite3_int64)upp
5500: 65 72 42 69 74 73 29 3c 3c 33 32 29 20 2b 20 6c  erBits)<<32) + l
5510: 6f 77 65 72 42 69 74 73 3b 0a 20 20 72 65 74 75  owerBits;.  retu
5520: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
5530: 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f  ./*.** LOCKFILE_
5540: 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
5550: 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 6f 6e   is undefined on
5560: 20 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73 79   some Windows sy
5570: 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65  stems..*/.#ifnde
5580: 66 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f  f LOCKFILE_FAIL_
5590: 49 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20 64 65  IMMEDIATELY.# de
55a0: 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  fine LOCKFILE_FA
55b0: 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 31  IL_IMMEDIATELY 1
55c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
55d0: 63 71 75 69 72 65 20 61 20 72 65 61 64 65 72 20  cquire a reader 
55e0: 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72 65  lock..** Differe
55f0: 6e 74 20 41 50 49 20 72 6f 75 74 69 6e 65 73 20  nt API routines 
5600: 61 72 65 20 63 61 6c 6c 65 64 20 64 65 70 65 6e  are called depen
5610: 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
5620: 6f 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20 69  or not this.** i
5630: 73 20 57 69 6e 39 35 20 6f 72 20 57 69 6e 4e 54  s Win95 or WinNT
5640: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5650: 67 65 74 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46  getReadLock(winF
5660: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
5670: 6e 74 20 72 65 73 3b 0a 20 20 69 66 28 20 69 73  nt res;.  if( is
5680: 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52  NT() ){.    OVER
5690: 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20  LAPPED ovlp;.   
56a0: 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 53   ovlp.Offset = S
56b0: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
56c0: 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68   ovlp.OffsetHigh
56d0: 20 3d 20 30 3b 0a 20 20 20 20 6f 76 6c 70 2e 68   = 0;.    ovlp.h
56e0: 45 76 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 72  Event = 0;.    r
56f0: 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 45 78 28  es = LockFileEx(
5700: 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 46 49  pFile->h, LOCKFI
5710: 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
5720: 45 4c 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ELY,.           
5730: 20 20 20 20 20 20 20 20 20 20 30 2c 20 53 48 41            0, SHA
5740: 52 45 44 5f 53 49 5a 45 2c 20 30 2c 20 26 6f 76  RED_SIZE, 0, &ov
5750: 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  lp);.  }else{.  
5760: 20 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71    int lk;.    sq
5770: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
5780: 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b  (sizeof(lk), &lk
5790: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  );.    pFile->sh
57a0: 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28  aredLockByte = (
57b0: 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29  lk & 0x7fffffff)
57c0: 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  %(SHARED_SIZE - 
57d0: 31 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f  1);.    res = Lo
57e0: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
57f0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46   SHARED_FIRST+pF
5800: 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
5810: 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  yte, 0, 1, 0);. 
5820: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b   }.  return res;
5830: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61  .}../*.** Undo a
5840: 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61   readlock.*/.sta
5850: 74 69 63 20 69 6e 74 20 75 6e 6c 6f 63 6b 52 65  tic int unlockRe
5860: 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a  adLock(winFile *
5870: 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65  pFile){.  int re
5880: 73 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  s;.  if( isNT() 
5890: 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 55 6e 6c  ){.    res = Unl
58a0: 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  ockFile(pFile->h
58b0: 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
58c0: 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20  0, SHARED_SIZE, 
58d0: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
58e0: 20 72 65 73 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c   res = UnlockFil
58f0: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  e(pFile->h, SHAR
5900: 45 44 5f 46 49 52 53 54 20 2b 20 70 46 69 6c 65  ED_FIRST + pFile
5910: 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
5920: 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
5930: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
5940: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
5950: 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
5960: 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
5970: 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79  parameter lockty
5980: 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  pe - one.** of t
5990: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
59a0: 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
59b0: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
59c0: 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
59d0: 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
59e0: 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
59f0: 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
5a00: 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
5a10: 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
5a20: 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
5a30: 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
5a40: 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
5a50: 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
5a60: 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
5a70: 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
5a80: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
5a90: 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
5aa0: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
5ab0: 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
5ac0: 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
5ad0: 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
5ae0: 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
5af0: 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
5b00: 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
5b10: 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
5b20: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
5b30: 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
5b40: 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
5b50: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
5b60: 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
5b70: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
5b80: 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
5b90: 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
5ba0: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
5bb0: 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
5bc0: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
5bd0: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
5be0: 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
5bf0: 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
5c00: 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
5c10: 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
5c20: 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28    The winUnlock(
5c30: 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61  ) routine.** era
5c40: 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74  ses all locks at
5c50: 20 6f 6e 63 65 20 61 6e 64 20 72 65 74 75 72 6e   once and return
5c60: 73 20 75 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  s us immediately
5c70: 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65   to locking leve
5c80: 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f  l 0..** It is no
5c90: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f  t possible to lo
5ca0: 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
5cb0: 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65 70 20 61  level one step a
5cc0: 74 20 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a  t a time.  You.*
5cd0: 2a 20 6d 75 73 74 20 67 6f 20 73 74 72 61 69 67  * must go straig
5ce0: 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65  ht to locking le
5cf0: 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  vel 0..*/.static
5d00: 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c   int winLock(sql
5d10: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
5d20: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
5d30: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
5d40: 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  OK;    /* Return
5d50: 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 72 6f   code from subro
5d60: 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20  utines */.  int 
5d70: 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
5d80: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20     /* Result of 
5d90: 61 20 77 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63  a windows lock c
5da0: 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77  all */.  int new
5db0: 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20  Locktype;       
5dc0: 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f  /* Set pFile->lo
5dd0: 63 6b 74 79 70 65 20 74 6f 20 74 68 69 73 20 76  cktype to this v
5de0: 61 6c 75 65 20 62 65 66 6f 72 65 20 65 78 69 74  alue before exit
5df0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74  ing */.  int got
5e00: 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b  PendingLock = 0;
5e10: 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 61 63  /* True if we ac
5e20: 71 75 69 72 65 64 20 61 20 50 45 4e 44 49 4e 47  quired a PENDING
5e30: 20 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d 65 20   lock this time 
5e40: 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  */.  winFile *pF
5e50: 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
5e60: 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  id;..  assert( p
5e70: 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 4f 53 54  File!=0 );.  OST
5e80: 52 41 43 45 35 28 22 4c 4f 43 4b 20 25 64 20 25  RACE5("LOCK %d %
5e90: 64 20 77 61 73 20 25 64 28 25 64 29 5c 6e 22 2c  d was %d(%d)\n",
5ea0: 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
5eb0: 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 70  ->h, locktype, p
5ec0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
5ed0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
5ee0: 6b 42 79 74 65 29 3b 0a 0a 20 20 2f 2a 20 49 66  kByte);..  /* If
5ef0: 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
5f00: 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
5f10: 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
5f20: 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
5f30: 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f  .  ** OsFile, do
5f40: 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20   nothing. Don't 
5f50: 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b  use the end_lock
5f60: 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a  : exit path, as.
5f70: 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e    ** sqlite3OsEn
5f80: 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
5f90: 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
5fa0: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
5fb0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c  ile->locktype>=l
5fc0: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
5fd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5fe0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
5ff0: 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
6000: 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
6010: 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65  rect.  */.  asse
6020: 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
6030: 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ype!=NO_LOCK || 
6040: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
6050: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
6060: 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e  t( locktype!=PEN
6070: 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
6080: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
6090: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
60a0: 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  | pFile->locktyp
60b0: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
60c0: 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65  ;..  /* Lock the
60d0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79   PENDING_LOCK by
60e0: 74 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  te if we need to
60f0: 20 61 63 71 75 69 72 65 20 61 20 50 45 4e 44 49   acquire a PENDI
6100: 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20  NG lock or.  ** 
6110: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20  a SHARED lock.  
6120: 49 66 20 77 65 20 61 72 65 20 61 63 71 75 69 72  If we are acquir
6130: 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
6140: 6b 2c 20 74 68 65 20 61 63 71 75 69 73 69 74 69  k, the acquisiti
6150: 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50  on of.  ** the P
6160: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65  ENDING_LOCK byte
6170: 20 69 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20   is temporary.. 
6180: 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70   */.  newLocktyp
6190: 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  e = pFile->lockt
61a0: 79 70 65 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  ype;.  if( pFile
61b0: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ->locktype==NO_L
61c0: 4f 43 4b 0a 20 20 20 7c 7c 20 28 6c 6f 63 6b 74  OCK.   || (lockt
61d0: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
61e0: 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f  OCK && pFile->lo
61f0: 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44  cktype==RESERVED
6200: 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20  _LOCK).  ){.    
6210: 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20 20 20  int cnt = 3;.   
6220: 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20   while( cnt-->0 
6230: 26 26 20 28 72 65 73 20 3d 20 4c 6f 63 6b 46 69  && (res = LockFi
6240: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e  le(pFile->h, PEN
6250: 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c  DING_BYTE, 0, 1,
6260: 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   0))==0 ){.     
6270: 20 2f 2a 20 54 72 79 20 33 20 74 69 6d 65 73 20   /* Try 3 times 
6280: 74 6f 20 67 65 74 20 74 68 65 20 70 65 6e 64 69  to get the pendi
6290: 6e 67 20 6c 6f 63 6b 2e 20 20 54 68 65 20 70 65  ng lock.  The pe
62a0: 6e 64 69 6e 67 20 6c 6f 63 6b 20 6d 69 67 68 74  nding lock might
62b0: 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 68 65 6c   be.      ** hel
62c0: 64 20 62 79 20 61 6e 6f 74 68 65 72 20 72 65 61  d by another rea
62d0: 64 65 72 20 70 72 6f 63 65 73 73 20 77 68 6f 20  der process who 
62e0: 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 69 74 20  will release it 
62f0: 6d 6f 6d 65 6e 74 61 72 69 6c 79 2e 0a 20 20 20  momentarily..   
6300: 20 20 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52     */.      OSTR
6310: 41 43 45 32 28 22 63 6f 75 6c 64 20 6e 6f 74 20  ACE2("could not 
6320: 67 65 74 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  get a PENDING lo
6330: 63 6b 2e 20 63 6e 74 3d 25 64 5c 6e 22 2c 20 63  ck. cnt=%d\n", c
6340: 6e 74 29 3b 0a 20 20 20 20 20 20 53 6c 65 65 70  nt);.      Sleep
6350: 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67  (1);.    }.    g
6360: 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
6370: 72 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  res;.  }..  /* A
6380: 63 71 75 69 72 65 20 61 20 73 68 61 72 65 64 20  cquire a shared 
6390: 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
63a0: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
63b0: 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
63c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
63d0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  e->locktype==NO_
63e0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20  LOCK );.    res 
63f0: 3d 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46  = getReadLock(pF
6400: 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 65  ile);.    if( re
6410: 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
6420: 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
6430: 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LOCK;.    }.  }.
6440: 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
6450: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20  RESERVED lock.  
6460: 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
6470: 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e==RESERVED_LOCK
6480: 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61   && res ){.    a
6490: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
64a0: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
64b0: 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  OCK );.    res =
64c0: 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d   LockFile(pFile-
64d0: 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  >h, RESERVED_BYT
64e0: 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20  E, 0, 1, 0);.   
64f0: 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
6500: 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
6510: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20  RESERVED_LOCK;. 
6520: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
6530: 63 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47  cquire a PENDING
6540: 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28   lock.  */.  if(
6550: 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
6560: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73  SIVE_LOCK && res
6570: 20 29 7b 0a 20 20 20 20 6e 65 77 4c 6f 63 6b 74   ){.    newLockt
6580: 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ype = PENDING_LO
6590: 43 4b 3b 0a 20 20 20 20 67 6f 74 50 65 6e 64 69  CK;.    gotPendi
65a0: 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a  ngLock = 0;.  }.
65b0: 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e  .  /* Acquire an
65c0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 0a   EXCLUSIVE lock.
65d0: 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
65e0: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
65f0: 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20  OCK && res ){.  
6600: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
6610: 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48 41 52 45  >locktype>=SHARE
6620: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65  D_LOCK );.    re
6630: 73 20 3d 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f  s = unlockReadLo
6640: 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 4f  ck(pFile);.    O
6650: 53 54 52 41 43 45 32 28 22 75 6e 72 65 61 64 6c  STRACE2("unreadl
6660: 6f 63 6b 20 3d 20 25 64 5c 6e 22 2c 20 72 65 73  ock = %d\n", res
6670: 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63  );.    res = Loc
6680: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
6690: 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
66a0: 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
66b0: 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b  ;.    if( res ){
66c0: 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  .      newLockty
66d0: 70 65 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c  pe = EXCLUSIVE_L
66e0: 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
66f0: 20 20 20 20 20 20 4f 53 54 52 41 43 45 32 28 22        OSTRACE2("
6700: 65 72 72 6f 72 2d 63 6f 64 65 20 3d 20 25 64 5c  error-code = %d\
6710: 6e 22 2c 20 47 65 74 4c 61 73 74 45 72 72 6f 72  n", GetLastError
6720: 28 29 29 3b 0a 20 20 20 20 20 20 67 65 74 52 65  ());.      getRe
6730: 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
6740: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
6750: 66 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67  f we are holding
6760: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
6770: 74 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62 65  that ought to be
6780: 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e 0a   released, then.
6790: 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74 20    ** release it 
67a0: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
67b0: 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 26  gotPendingLock &
67c0: 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  & locktype==SHAR
67d0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55  ED_LOCK ){.    U
67e0: 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d  nlockFile(pFile-
67f0: 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  >h, PENDING_BYTE
6800: 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
6810: 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
6820: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 6c 6f   state of the lo
6830: 63 6b 20 68 61 73 20 68 65 6c 64 20 69 6e 20 74  ck has held in t
6840: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
6850: 6f 72 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74  or then.  ** ret
6860: 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  urn the appropri
6870: 61 74 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  ate result code.
6880: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 20  .  */.  if( res 
6890: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
68a0: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
68b0: 20 20 20 20 4f 53 54 52 41 43 45 34 28 22 4c 4f      OSTRACE4("LO
68c0: 43 4b 20 46 41 49 4c 45 44 20 25 64 20 74 72 79  CK FAILED %d try
68d0: 69 6e 67 20 66 6f 72 20 25 64 20 62 75 74 20 67  ing for %d but g
68e0: 6f 74 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  ot %d\n", pFile-
68f0: 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c  >h,.           l
6900: 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b  ocktype, newLock
6910: 74 79 70 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  type);.    rc = 
6920: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
6930: 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
6940: 70 65 20 3d 20 6e 65 77 4c 6f 63 6b 74 79 70 65  pe = newLocktype
6950: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
6960: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
6970: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
6980: 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
6990: 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
69a0: 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
69b0: 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
69c0: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
69d0: 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
69e0: 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75  ck is held, retu
69f0: 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  rn.** non-zero, 
6a00: 6f 74 68 65 72 77 69 73 65 20 7a 65 72 6f 2e 0a  otherwise zero..
6a10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
6a20: 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  nCheckReservedLo
6a30: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
6a40: 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
6a50: 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
6a60: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
6a70: 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
6a80: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d   assert( pFile!=
6a90: 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
6aa0: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45  ->locktype>=RESE
6ab0: 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
6ac0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54   rc = 1;.    OST
6ad0: 52 41 43 45 33 28 22 54 45 53 54 20 57 52 2d 4c  RACE3("TEST WR-L
6ae0: 4f 43 4b 20 25 64 20 25 64 20 28 6c 6f 63 61 6c  OCK %d %d (local
6af0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
6b00: 72 63 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rc);.  }else{.  
6b10: 20 20 72 63 20 3d 20 4c 6f 63 6b 46 69 6c 65 28    rc = LockFile(
6b20: 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56  pFile->h, RESERV
6b30: 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  ED_BYTE, 0, 1, 0
6b40: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
6b50: 0a 20 20 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c  .      UnlockFil
6b60: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45  e(pFile->h, RESE
6b70: 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
6b80: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   0);.    }.    r
6b90: 63 20 3d 20 21 72 63 3b 0a 20 20 20 20 4f 53 54  c = !rc;.    OST
6ba0: 52 41 43 45 33 28 22 54 45 53 54 20 57 52 2d 4c  RACE3("TEST WR-L
6bb0: 4f 43 4b 20 25 64 20 25 64 20 28 72 65 6d 6f 74  OCK %d %d (remot
6bc0: 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  e)\n", pFile->h,
6bd0: 20 72 63 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65   rc);.  }.  *pRe
6be0: 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 72 65 74  sOut = rc;.  ret
6bf0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6c00: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
6c10: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
6c20: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
6c30: 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70  or id to locktyp
6c40: 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20  e.  locktype.** 
6c50: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
6c60: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
6c70: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
6c80: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
6c90: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
6ca0: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
6cb0: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
6cc0: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
6cd0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
6ce0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
6cf0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
6d00: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
6d10: 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69  e for this routi
6d20: 6e 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74 68  ne to fail if th
6d30: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
6d40: 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e  t.** is NO_LOCK.
6d50: 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
6d60: 61 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41 52  argument is SHAR
6d70: 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69  ED_LOCK then thi
6d80: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67  s routine.** mig
6d90: 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ht return SQLITE
6da0: 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69  _IOERR;.*/.stati
6db0: 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28  c int winUnlock(
6dc0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
6dd0: 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
6de0: 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 77  .  int type;.  w
6df0: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
6e00: 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
6e10: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
6e20: 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46  OK;.  assert( pF
6e30: 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ile!=0 );.  asse
6e40: 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
6e50: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f  ARED_LOCK );.  O
6e60: 53 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20  STRACE5("UNLOCK 
6e70: 25 64 20 74 6f 20 25 64 20 77 61 73 20 25 64 28  %d to %d was %d(
6e80: 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  %d)\n", pFile->h
6e90: 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20  , locktype,.    
6ea0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
6eb0: 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68  ktype, pFile->sh
6ec0: 61 72 65 64 4c 6f 63 6b 42 79 74 65 29 3b 0a 20  aredLockByte);. 
6ed0: 20 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c   type = pFile->l
6ee0: 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 74  ocktype;.  if( t
6ef0: 79 70 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype>=EXCLUSIVE_L
6f00: 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63  OCK ){.    Unloc
6f10: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
6f20: 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
6f30: 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
6f40: 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79  ;.    if( lockty
6f50: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
6f60: 26 26 20 21 67 65 74 52 65 61 64 4c 6f 63 6b 28  && !getReadLock(
6f70: 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20  pFile) ){.      
6f80: 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  /* This should n
6f90: 65 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65  ever happen.  We
6fa0: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
6fb0: 65 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  e able to.      
6fc0: 2a 2a 20 72 65 61 63 71 75 69 72 65 20 74 68 65  ** reacquire the
6fd0: 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20   read lock */.  
6fe0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
6ff0: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
7000: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74 79    }.  }.  if( ty
7010: 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe>=RESERVED_LOC
7020: 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46  K ){.    UnlockF
7030: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45  ile(pFile->h, RE
7040: 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
7050: 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  1, 0);.  }.  if(
7060: 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f   locktype==NO_LO
7070: 43 4b 20 26 26 20 74 79 70 65 3e 3d 53 48 41 52  CK && type>=SHAR
7080: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75  ED_LOCK ){.    u
7090: 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46  nlockReadLock(pF
70a0: 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ile);.  }.  if( 
70b0: 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  type>=PENDING_LO
70c0: 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b  CK ){.    Unlock
70d0: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50  File(pFile->h, P
70e0: 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20  ENDING_BYTE, 0, 
70f0: 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69  1, 0);.  }.  pFi
7100: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  le->locktype = l
7110: 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72  ocktype;.  retur
7120: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
7130: 6f 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65 72 79  ontrol and query
7140: 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
7150: 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  e handle..*/.sta
7160: 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 43  tic int winFileC
7170: 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
7180: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c  ile *id, int op,
7190: 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
71a0: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
71b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
71c0: 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b  NTL_LOCKSTATE: {
71d0: 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
71e0: 72 67 20 3d 20 28 28 77 69 6e 46 69 6c 65 2a 29  rg = ((winFile*)
71f0: 69 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  id)->locktype;. 
7200: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
7210: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
7220: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7230: 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _ERROR;.}../*.**
7240: 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74   Return the sect
7250: 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  or size in bytes
7260: 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69   of the underlyi
7270: 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20  ng block device 
7280: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69  for.** the speci
7290: 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20  fied file. This 
72a0: 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  is almost always
72b0: 20 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20   512 bytes, but 
72c0: 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72  may be.** larger
72d0: 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65   for some device
72e0: 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  s..**.** SQLite 
72f0: 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69  code assumes thi
7300: 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f  s function canno
7310: 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20  t fail. It also 
7320: 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20  assumes that.** 
7330: 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65  if two files are
7340: 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
7350: 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d  same file-system
7360: 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
7370: 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61  .** a database a
7380: 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66  nd its journal f
7390: 69 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65  ile) that the se
73a0: 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
73b0: 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f  e the.** same fo
73c0: 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69  r both..*/.stati
73d0: 63 20 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53  c int winSectorS
73e0: 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
73f0: 20 2a 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20   *id){.  return 
7400: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
7410: 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f  ECTOR_SIZE;.}../
7420: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65  *.** Return a ve
7430: 63 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63  ctor of device c
7440: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a  haracteristics..
7450: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
7460: 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  nDeviceCharacter
7470: 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66  istics(sqlite3_f
7480: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65 74 75  ile *id){.  retu
7490: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
74a0: 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e  his vector defin
74b0: 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f  es all the metho
74c0: 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72  ds that can oper
74d0: 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c  ate on an.** sql
74e0: 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77 69  ite3_file for wi
74f0: 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  n32..*/.static c
7500: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
7510: 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74  methods winIoMet
7520: 68 6f 64 20 3d 20 7b 0a 20 20 31 2c 20 20 20 20  hod = {.  1,    
7530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7540: 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
7550: 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 0a 20  */.  winClose,. 
7560: 20 77 69 6e 52 65 61 64 2c 0a 20 20 77 69 6e 57   winRead,.  winW
7570: 72 69 74 65 2c 0a 20 20 77 69 6e 54 72 75 6e 63  rite,.  winTrunc
7580: 61 74 65 2c 0a 20 20 77 69 6e 53 79 6e 63 2c 0a  ate,.  winSync,.
7590: 20 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c 0a 20    winFileSize,. 
75a0: 20 77 69 6e 4c 6f 63 6b 2c 0a 20 20 77 69 6e 55   winLock,.  winU
75b0: 6e 6c 6f 63 6b 2c 0a 20 20 77 69 6e 43 68 65 63  nlock,.  winChec
75c0: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 20  kReservedLock,. 
75d0: 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c   winFileControl,
75e0: 0a 20 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65  .  winSectorSize
75f0: 2c 0a 20 20 77 69 6e 44 65 76 69 63 65 43 68 61  ,.  winDeviceCha
7600: 72 61 63 74 65 72 69 73 74 69 63 73 0a 7d 3b 0a  racteristics.};.
7610: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
7620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
7660: 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 49   Here ends the I
7670: 2f 4f 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20  /O methods that 
7680: 66 6f 72 6d 20 74 68 65 20 73 71 6c 69 74 65 33  form the sqlite3
7690: 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
76a0: 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ct..**.** The ne
76b0: 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  xt block of code
76c0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
76d0: 56 46 53 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 2a  VFS methods..***
76e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
7730: 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d  * Convert a UTF-
7740: 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20  8 filename into 
7750: 77 68 61 74 65 76 65 72 20 66 6f 72 6d 20 74 68  whatever form th
7760: 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20  e underlying.** 
7770: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
7780: 20 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73   wants filenames
7790: 20 69 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68   in.  Space to h
77a0: 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  old the result.*
77b0: 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  * is obtained fr
77c0: 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75  om malloc and mu
77d0: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
77e0: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
77f0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
7800: 63 20 76 6f 69 64 20 2a 63 6f 6e 76 65 72 74 55  c void *convertU
7810: 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73  tf8Filename(cons
7820: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
7830: 65 29 7b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  e){.  void *zCon
7840: 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66  verted = 0;.  if
7850: 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
7860: 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 75 74 66  zConverted = utf
7870: 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  8ToUnicode(zFile
7880: 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  name);.  }else{.
7890: 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
78a0: 20 75 74 66 38 54 6f 4d 62 63 73 28 7a 46 69 6c   utf8ToMbcs(zFil
78b0: 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 2f 2a  ename);.  }.  /*
78c0: 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e   caller will han
78d0: 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  dle out of memor
78e0: 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43  y */.  return zC
78f0: 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a  onverted;.}../*.
7900: 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
7910: 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
7920: 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d  in zBuf.  zBuf m
7930: 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67  ust be big enoug
7940: 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20  h to.** hold at 
7950: 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
7960: 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a   characters..*/.
7970: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 54 65  static int getTe
7980: 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c  mpname(int nBuf,
7990: 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
79a0: 73 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61  static char zCha
79b0: 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64  rs[] =.    "abcd
79c0: 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
79d0: 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43  uvwxyz".    "ABC
79e0: 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
79f0: 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31  TUVWXYZ".    "01
7a00: 32 33 34 35 36 37 38 39 22 3b 0a 20 20 69 6e 74  23456789";.  int
7a10: 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 7a 54   i, j;.  char zT
7a20: 65 6d 70 50 61 74 68 5b 4d 41 58 5f 50 41 54 48  empPath[MAX_PATH
7a30: 2b 31 5d 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  +1];.  if( sqlit
7a40: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
7a50: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
7a60: 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41  _snprintf(MAX_PA
7a70: 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68  TH-30, zTempPath
7a80: 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  , "%s", sqlite3_
7a90: 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b  temp_directory);
7aa0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e  .  }else if( isN
7ab0: 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20  T() ){.    char 
7ac0: 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 57 43 48  *zMulti;.    WCH
7ad0: 41 52 20 7a 57 69 64 65 50 61 74 68 5b 4d 41 58  AR zWidePath[MAX
7ae0: 5f 50 41 54 48 5d 3b 0a 20 20 20 20 47 65 74 54  _PATH];.    GetT
7af0: 65 6d 70 50 61 74 68 57 28 4d 41 58 5f 50 41 54  empPathW(MAX_PAT
7b00: 48 2d 33 30 2c 20 7a 57 69 64 65 50 61 74 68 29  H-30, zWidePath)
7b10: 3b 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20 75  ;.    zMulti = u
7b20: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 57 69  nicodeToUtf8(zWi
7b30: 64 65 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28  dePath);.    if(
7b40: 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20 20   zMulti ){.     
7b50: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7b60: 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a  f(MAX_PATH-30, z
7b70: 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20  TempPath, "%s", 
7b80: 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 66  zMulti);.      f
7b90: 72 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20  ree(zMulti);.   
7ba0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
7bb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
7bc0: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  M;.    }.  }else
7bd0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66  {.    char *zUtf
7be0: 38 3b 0a 20 20 20 20 63 68 61 72 20 7a 4d 62 63  8;.    char zMbc
7bf0: 73 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b  sPath[MAX_PATH];
7c00: 0a 20 20 20 20 47 65 74 54 65 6d 70 50 61 74 68  .    GetTempPath
7c10: 41 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a  A(MAX_PATH-30, z
7c20: 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20 7a  MbcsPath);.    z
7c30: 55 74 66 38 20 3d 20 6d 62 63 73 54 6f 55 74 66  Utf8 = mbcsToUtf
7c40: 38 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20  8(zMbcsPath);.  
7c50: 20 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a 20    if( zUtf8 ){. 
7c60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7c70: 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33  rintf(MAX_PATH-3
7c80: 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25  0, zTempPath, "%
7c90: 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20  s", zUtf8);.    
7ca0: 20 20 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20    free(zUtf8);. 
7cb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7cc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
7cd0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
7ce0: 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a 54   for(i=strlen(zT
7cf0: 65 6d 70 50 61 74 68 29 3b 20 69 3e 30 20 26 26  empPath); i>0 &&
7d00: 20 7a 54 65 6d 70 50 61 74 68 5b 69 2d 31 5d 3d   zTempPath[i-1]=
7d10: 3d 27 5c 5c 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20  ='\\'; i--){}.  
7d20: 7a 54 65 6d 70 50 61 74 68 5b 69 5d 20 3d 20 30  zTempPath[i] = 0
7d30: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
7d40: 69 6e 74 66 28 6e 42 75 66 2d 33 30 2c 20 7a 42  intf(nBuf-30, zB
7d50: 75 66 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  uf,.            
7d60: 20 20 20 20 20 20 20 22 25 73 5c 5c 22 53 51 4c         "%s\\"SQL
7d70: 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
7d80: 45 46 49 58 2c 20 7a 54 65 6d 70 50 61 74 68 29  EFIX, zTempPath)
7d90: 3b 0a 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28 7a  ;.  j = strlen(z
7da0: 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Buf);.  sqlite3_
7db0: 72 61 6e 64 6f 6d 6e 65 73 73 28 32 30 2c 20 26  randomness(20, &
7dc0: 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28  zBuf[j]);.  for(
7dd0: 69 3d 30 3b 20 69 3c 32 30 3b 20 69 2b 2b 2c 20  i=0; i<20; i++, 
7de0: 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a  j++){.    zBuf[j
7df0: 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73  ] = (char)zChars
7e00: 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  [ ((unsigned cha
7e10: 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65  r)zBuf[j])%(size
7e20: 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b  of(zChars)-1) ];
7e30: 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d  .  }.  zBuf[j] =
7e40: 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22   0;.  OSTRACE2("
7e50: 54 45 4d 50 20 46 49 4c 45 4e 41 4d 45 3a 20 25  TEMP FILENAME: %
7e60: 73 5c 6e 22 2c 20 7a 42 75 66 29 3b 0a 20 20 72  s\n", zBuf);.  r
7e70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7e80: 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e   .}.../*.** Open
7e90: 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
7ea0: 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a  ic int winOpen(.
7eb0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
7ec0: 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  Vfs,        /* N
7ed0: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e  ot used */.  con
7ee0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
7ef0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
7f00: 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d  f the file (UTF-
7f10: 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  8) */.  sqlite3_
7f20: 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20  file *id,       
7f30: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 53    /* Write the S
7f40: 51 4c 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c  QLite file handl
7f50: 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
7f60: 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
7f70: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f        /* Open mo
7f80: 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e  de flags */.  in
7f90: 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20  t *pOutFlags    
7fa0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75          /* Statu
7fb0: 73 20 72 65 74 75 72 6e 20 66 6c 61 67 73 20 2a  s return flags *
7fc0: 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b  /.){.  HANDLE h;
7fd0: 0a 20 20 44 57 4f 52 44 20 64 77 44 65 73 69 72  .  DWORD dwDesir
7fe0: 65 64 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52  edAccess;.  DWOR
7ff0: 44 20 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20  D dwShareMode;. 
8000: 20 44 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f   DWORD dwCreatio
8010: 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20  nDisposition;.  
8020: 44 57 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64  DWORD dwFlagsAnd
8030: 41 74 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a  Attributes = 0;.
8040: 20 20 69 6e 74 20 69 73 54 65 6d 70 3b 0a 20 20    int isTemp;.  
8050: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
8060: 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
8070: 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
8080: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
8090: 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69     /* Filename i
80a0: 6e 20 4f 53 20 65 6e 63 6f 64 69 6e 67 20 2a 2f  n OS encoding */
80b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
80c0: 55 74 66 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  Utf8Name = zName
80d0: 3b 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65  ;    /* Filename
80e0: 20 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 69   in UTF-8 encodi
80f0: 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d  ng */.  char zTm
8100: 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 2b 31  pname[MAX_PATH+1
8110: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66  ];        /* Buf
8120: 66 65 72 20 75 73 65 64 20 74 6f 20 63 72 65 61  fer used to crea
8130: 74 65 20 74 65 6d 70 20 66 69 6c 65 6e 61 6d 65  te temp filename
8140: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   */..  /* If the
8150: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
8160: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
8170: 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 65 6e 65 72  n is NULL, gener
8180: 61 74 65 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70  ate a .  ** temp
8190: 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
81a0: 74 6f 20 75 73 65 20 0a 20 20 2a 2f 0a 20 20 69  to use .  */.  i
81b0: 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 29 7b  f( !zUtf8Name ){
81c0: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 67 65  .    int rc = ge
81d0: 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41  tTempname(MAX_PA
81e0: 54 48 2b 31 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b  TH+1, zTmpname);
81f0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
8200: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
8210: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
8220: 0a 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 20 3d  .    zUtf8Name =
8230: 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a   zTmpname;.  }..
8240: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
8250: 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20 74 68 65   filename to the
8260: 20 73 79 73 74 65 6d 20 65 6e 63 6f 64 69 6e 67   system encoding
8270: 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72 74 65  . */.  zConverte
8280: 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46  d = convertUtf8F
8290: 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61 6d  ilename(zUtf8Nam
82a0: 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
82b0: 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rted==0 ){.    r
82c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
82d0: 45 4d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 66  EM;.  }..  if( f
82e0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
82f0: 45 4e 5f 52 45 41 44 57 52 49 54 45 20 29 7b 0a  EN_READWRITE ){.
8300: 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
8310: 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45  ess = GENERIC_RE
8320: 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49  AD | GENERIC_WRI
8330: 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  TE;.  }else{.   
8340: 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
8350: 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 3b   = GENERIC_READ;
8360: 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
8370: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   & SQLITE_OPEN_C
8380: 52 45 41 54 45 20 29 7b 0a 20 20 20 20 64 77 43  REATE ){.    dwC
8390: 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
83a0: 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53  on = OPEN_ALWAYS
83b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
83c0: 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
83d0: 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53  tion = OPEN_EXIS
83e0: 54 49 4e 47 3b 0a 20 20 7d 0a 20 20 69 66 28 20  TING;.  }.  if( 
83f0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
8400: 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20  PEN_MAIN_DB ){. 
8410: 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d     dwShareMode =
8420: 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44   FILE_SHARE_READ
8430: 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52   | FILE_SHARE_WR
8440: 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ITE;.  }else{.  
8450: 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d 20    dwShareMode = 
8460: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  0;.  }.  if( fla
8470: 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
8480: 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29  _DELETEONCLOSE )
8490: 7b 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20  {.#if OS_WINCE. 
84a0: 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
84b0: 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41  ributes = FILE_A
84c0: 54 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 3b  TTRIBUTE_HIDDEN;
84d0: 0a 23 65 6c 73 65 0a 20 20 20 20 64 77 46 6c 61  .#else.    dwFla
84e0: 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
84f0: 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  = FILE_ATTRIBUTE
8500: 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20 20 20 20  _TEMPORARY.     
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8520: 20 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45            | FILE
8530: 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 45  _ATTRIBUTE_HIDDE
8540: 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N.              
8550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8560: 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c   | FILE_FLAG_DEL
8570: 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65  ETE_ON_CLOSE;.#e
8580: 6e 64 69 66 0a 20 20 20 20 69 73 54 65 6d 70 20  ndif.    isTemp 
8590: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
85a0: 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
85b0: 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54  ibutes = FILE_AT
85c0: 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a  TRIBUTE_NORMAL;.
85d0: 20 20 20 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a      isTemp = 0;.
85e0: 20 20 7d 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73    }.  /* Reports
85f0: 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e   from the intern
8600: 65 74 20 61 72 65 20 74 68 61 74 20 70 65 72 66  et are that perf
8610: 6f 72 6d 61 6e 63 65 20 69 73 20 61 6c 77 61 79  ormance is alway
8620: 73 0a 20 20 2a 2a 20 62 65 74 74 65 72 20 69 66  s.  ** better if
8630: 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f   FILE_FLAG_RANDO
8640: 4d 5f 41 43 43 45 53 53 20 69 73 20 75 73 65 64  M_ACCESS is used
8650: 2e 20 20 54 69 63 6b 65 74 20 23 32 36 39 39 2e  .  Ticket #2699.
8660: 20 2a 2f 0a 20 20 64 77 46 6c 61 67 73 41 6e 64   */.  dwFlagsAnd
8670: 41 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46 49  Attributes |= FI
8680: 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
8690: 43 43 45 53 53 3b 0a 20 20 69 66 28 20 69 73 4e  CCESS;.  if( isN
86a0: 54 28 29 20 29 7b 0a 20 20 20 20 68 20 3d 20 43  T() ){.    h = C
86b0: 72 65 61 74 65 46 69 6c 65 57 28 28 57 43 48 41  reateFileW((WCHA
86c0: 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  R*)zConverted,. 
86d0: 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
86e0: 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 64 77  ccess,.       dw
86f0: 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20  ShareMode,.     
8700: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 64    NULL,.       d
8710: 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
8720: 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 64 77 46  tion,.       dwF
8730: 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
8740: 73 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20  s,.       NULL. 
8750: 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23     );.  }else{.#
8760: 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  if OS_WINCE.    
8770: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
8780: 4d 45 4d 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68  MEM;.#else.    h
8790: 20 3d 20 43 72 65 61 74 65 46 69 6c 65 41 28 28   = CreateFileA((
87a0: 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
87b0: 2c 0a 20 20 20 20 20 20 20 64 77 44 65 73 69 72  ,.       dwDesir
87c0: 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20  edAccess,.      
87d0: 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20   dwShareMode,.  
87e0: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
87f0: 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
8800: 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20  osition,.       
8810: 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
8820: 75 74 65 73 2c 0a 20 20 20 20 20 20 20 4e 55 4c  utes,.       NUL
8830: 4c 0a 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a  L.    );.#endif.
8840: 20 20 7d 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56    }.  if( h==INV
8850: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
8860: 45 20 29 7b 0a 20 20 20 20 66 72 65 65 28 7a 43  E ){.    free(zC
8870: 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 69  onverted);.    i
8880: 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
8890: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
88a0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
88b0: 20 77 69 6e 4f 70 65 6e 28 30 2c 20 7a 4e 61 6d   winOpen(0, zNam
88c0: 65 2c 20 69 64 2c 20 0a 20 20 20 20 20 20 20 20  e, id, .        
88d0: 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53 51 4c       ((flags|SQL
88e0: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
88f0: 59 29 26 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  Y)&~SQLITE_OPEN_
8900: 52 45 41 44 57 52 49 54 45 29 2c 20 70 4f 75 74  READWRITE), pOut
8910: 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73  Flags);.    }els
8920: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
8930: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
8940: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
8950: 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20   pOutFlags ){.  
8960: 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
8970: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
8980: 49 54 45 20 29 7b 0a 20 20 20 20 20 20 2a 70 4f  ITE ){.      *pO
8990: 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  utFlags = SQLITE
89a0: 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b  _OPEN_READWRITE;
89b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
89c0: 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53    *pOutFlags = S
89d0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
89e0: 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  NLY;.    }.  }. 
89f0: 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30   memset(pFile, 0
8a00: 2c 20 73 69 7a 65 6f 66 28 2a 70 46 69 6c 65 29  , sizeof(*pFile)
8a10: 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74  );.  pFile->pMet
8a20: 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68  hod = &winIoMeth
8a30: 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d  od;.  pFile->h =
8a40: 20 68 3b 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45   h;.#if OS_WINCE
8a50: 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20  .  if( (flags & 
8a60: 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
8a70: 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
8a80: 45 4e 5f 4d 41 49 4e 5f 44 42 29 29 20 3d 3d 0a  EN_MAIN_DB)) ==.
8a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
8aa0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
8ab0: 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
8ac0: 4e 5f 4d 41 49 4e 5f 44 42 29 0a 20 20 20 20 20  N_MAIN_DB).     
8ad0: 20 20 26 26 20 21 77 69 6e 63 65 43 72 65 61 74    && !winceCreat
8ae0: 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69  eLock(zName, pFi
8af0: 6c 65 29 0a 20 20 29 7b 0a 20 20 20 20 43 6c 6f  le).  ){.    Clo
8b00: 73 65 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20  seHandle(h);.   
8b10: 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64   free(zConverted
8b20: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
8b30: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
8b40: 20 7d 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20   }.  if( isTemp 
8b50: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44  ){.    pFile->zD
8b60: 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a  eleteOnClose = z
8b70: 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c  Converted;.  }el
8b80: 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
8b90: 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65    free(zConverte
8ba0: 64 29 3b 0a 20 20 7d 0a 20 20 4f 70 65 6e 43 6f  d);.  }.  OpenCo
8bb0: 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72 65 74  unter(+1);.  ret
8bc0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8bd0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
8be0: 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a  he named file..*
8bf0: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
8c00: 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20  indows does not 
8c10: 61 6c 6c 6f 77 20 61 20 66 69 6c 65 20 74 6f 20  allow a file to 
8c20: 62 65 20 64 65 6c 65 74 65 64 20 69 66 20 73 6f  be deleted if so
8c30: 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63  me other.** proc
8c40: 65 73 73 20 68 61 73 20 69 74 20 6f 70 65 6e 2e  ess has it open.
8c50: 20 20 53 6f 6d 65 74 69 6d 65 73 20 61 20 76 69    Sometimes a vi
8c60: 72 75 73 20 73 63 61 6e 6e 65 72 20 6f 72 20 69  rus scanner or i
8c70: 6e 64 65 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a  ndexing program.
8c80: 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a  ** will open a j
8c90: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72  ournal file shor
8ca0: 74 6c 79 20 61 66 74 65 72 20 69 74 20 69 73 20  tly after it is 
8cb0: 63 72 65 61 74 65 64 20 69 6e 20 6f 72 64 65 72  created in order
8cc0: 20 74 6f 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76   to do.** whatev
8cd0: 65 72 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20  er does.  While 
8ce0: 74 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65  this other proce
8cf0: 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  ss is holding th
8d00: 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20  e.** file open, 
8d10: 77 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c  we will be unabl
8d20: 65 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20  e to delete it. 
8d30: 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
8d40: 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c  this.** problem,
8d50: 20 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69   we delay 100 mi
8d60: 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74  lliseconds and t
8d70: 72 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61  ry to delete aga
8d80: 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58  in.  Up.** to MX
8d90: 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
8da0: 54 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65  Ts deletion atte
8db0: 6d 70 74 73 20 61 72 65 20 72 75 6e 20 62 65 66  mpts are run bef
8dc0: 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70  ore giving.** up
8dd0: 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
8de0: 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66  n error..*/.#def
8df0: 69 6e 65 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f  ine MX_DELETION_
8e00: 41 54 54 45 4d 50 54 53 20 35 0a 73 74 61 74 69  ATTEMPTS 5.stati
8e10: 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28  c int winDelete(
8e20: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
8e30: 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 2f  pVfs,          /
8e40: 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69  * Not used on wi
8e50: 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  n32 */.  const c
8e60: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
8e70: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
8e80: 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 2a  file to delete *
8e90: 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20  /.  int syncDir 
8ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8eb0: 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
8ec0: 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  in32 */.){.  int
8ed0: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20   cnt = 0;.  int 
8ee0: 72 63 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  rc;.  void *zCon
8ef0: 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74  verted = convert
8f00: 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69  Utf8Filename(zFi
8f10: 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
8f20: 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
8f30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8f40: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 53  E_NOMEM;.  }.  S
8f50: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
8f60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
8f70: 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66  RR_DELETE);.  if
8f80: 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
8f90: 64 6f 7b 0a 20 20 20 20 20 20 44 65 6c 65 74 65  do{.      Delete
8fa0: 46 69 6c 65 57 28 7a 43 6f 6e 76 65 72 74 65 64  FileW(zConverted
8fb0: 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28  );.    }while( (
8fc0: 72 63 20 3d 20 47 65 74 46 69 6c 65 41 74 74 72  rc = GetFileAttr
8fd0: 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74  ibutesW(zConvert
8fe0: 65 64 29 29 21 3d 30 78 66 66 66 66 66 66 66 66  ed))!=0xffffffff
8ff0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26   .            &&
9000: 20 63 6e 74 2b 2b 20 3c 20 4d 58 5f 44 45 4c 45   cnt++ < MX_DELE
9010: 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 26 26  TION_ATTEMPTS &&
9020: 20 28 53 6c 65 65 70 28 31 30 30 29 2c 20 31 29   (Sleep(100), 1)
9030: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66   );.  }else{.#if
9040: 20 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 72 65   OS_WINCE.    re
9050: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
9060: 4d 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 6f 7b  M;.#else.    do{
9070: 0a 20 20 20 20 20 20 44 65 6c 65 74 65 46 69 6c  .      DeleteFil
9080: 65 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  eA(zConverted);.
9090: 20 20 20 20 7d 77 68 69 6c 65 28 20 28 72 63 20      }while( (rc 
90a0: 3d 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  = GetFileAttribu
90b0: 74 65 73 41 28 7a 43 6f 6e 76 65 72 74 65 64 29  tesA(zConverted)
90c0: 29 21 3d 30 78 66 66 66 66 66 66 66 66 0a 20 20  )!=0xffffffff.  
90d0: 20 20 20 20 20 20 20 20 20 20 26 26 20 63 6e 74            && cnt
90e0: 2b 2b 20 3c 20 4d 58 5f 44 45 4c 45 54 49 4f 4e  ++ < MX_DELETION
90f0: 5f 41 54 54 45 4d 50 54 53 20 26 26 20 28 53 6c  _ATTEMPTS && (Sl
9100: 65 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a  eep(100), 1) );.
9110: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 66 72 65  #endif.  }.  fre
9120: 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
9130: 20 4f 53 54 52 41 43 45 32 28 22 44 45 4c 45 54   OSTRACE2("DELET
9140: 45 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69  E \"%s\"\n", zFi
9150: 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  lename);.  retur
9160: 6e 20 72 63 3d 3d 30 78 66 66 66 66 66 66 66 66  n rc==0xffffffff
9170: 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53   ? SQLITE_OK : S
9180: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
9190: 54 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  TE;.}../*.** Che
91a0: 63 6b 20 74 68 65 20 65 78 69 73 74 61 6e 63 65  ck the existance
91b0: 20 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20 61   and status of a
91c0: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
91d0: 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28 0a   int winAccess(.
91e0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
91f0: 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Vfs,         /* 
9200: 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33  Not used on win3
9210: 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  2 */.  const cha
9220: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
9230: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
9240: 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
9250: 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
9260: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
9270: 70 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d 61  pe of test to ma
9280: 6b 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20  ke on this file 
9290: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75  */.  int *pResOu
92a0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
92b0: 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a  /* OUT: Result *
92c0: 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74  /.){.  DWORD att
92d0: 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76  r;.  int rc;.  v
92e0: 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20  oid *zConverted 
92f0: 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c  = convertUtf8Fil
9300: 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  ename(zFilename)
9310: 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
9320: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ed==0 ){.    ret
9330: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
9340: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54  ;.  }.  if( isNT
9350: 28 29 20 29 7b 0a 20 20 20 20 61 74 74 72 20 3d  () ){.    attr =
9360: 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74   GetFileAttribut
9370: 65 73 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e  esW((WCHAR*)zCon
9380: 76 65 72 74 65 64 29 3b 0a 20 20 7d 65 6c 73 65  verted);.  }else
9390: 7b 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20  {.#if OS_WINCE. 
93a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
93b0: 5f 4e 4f 4d 45 4d 3b 0a 23 65 6c 73 65 0a 20 20  _NOMEM;.#else.  
93c0: 20 20 61 74 74 72 20 3d 20 47 65 74 46 69 6c 65    attr = GetFile
93d0: 41 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61  AttributesA((cha
93e0: 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  r*)zConverted);.
93f0: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 66 72 65  #endif.  }.  fre
9400: 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
9410: 20 73 77 69 74 63 68 28 20 66 6c 61 67 73 20 29   switch( flags )
9420: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
9430: 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20  E_ACCESS_READ:. 
9440: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
9450: 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20  CCESS_EXISTS:.  
9460: 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d 30      rc = attr!=0
9470: 78 66 66 66 66 66 66 66 66 3b 0a 20 20 20 20 20  xffffffff;.     
9480: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9490: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
94a0: 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20  EADWRITE:.      
94b0: 72 63 20 3d 20 28 61 74 74 72 20 26 20 46 49 4c  rc = (attr & FIL
94c0: 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45 41 44  E_ATTRIBUTE_READ
94d0: 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ONLY)==0;.      
94e0: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
94f0: 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  lt:.      assert
9500: 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73  (!"Invalid flags
9510: 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d   argument");.  }
9520: 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63  .  *pResOut = rc
9530: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
9540: 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
9550: 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20  Turn a relative 
9560: 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20  pathname into a 
9570: 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20  full pathname.  
9580: 57 72 69 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a  Write the full.*
9590: 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  * pathname into 
95a0: 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20  zOut[].  zOut[] 
95b0: 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61 73 74  will be at least
95c0: 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
95d0: 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69  e.** bytes in si
95e0: 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
95f0: 74 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  t winFullPathnam
9600: 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
9610: 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
9620: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
9630: 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
9640: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65   const char *zRe
9650: 6c 61 74 69 76 65 2c 20 20 20 20 20 20 20 20 2f  lative,        /
9660: 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74  * Possibly relat
9670: 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a  ive input path *
9680: 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20  /.  int nFull,  
9690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96a0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74    /* Size of out
96b0: 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
96c0: 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  tes */.  char *z
96d0: 46 75 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20  Full            
96e0: 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
96f0: 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 23   buffer */.){..#
9700: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  if defined(__CYG
9710: 57 49 4e 5f 5f 29 0a 20 20 63 79 67 77 69 6e 5f  WIN__).  cygwin_
9720: 63 6f 6e 76 5f 74 6f 5f 66 75 6c 6c 5f 77 69 6e  conv_to_full_win
9730: 33 32 5f 70 61 74 68 28 7a 52 65 6c 61 74 69 76  32_path(zRelativ
9740: 65 2c 20 7a 46 75 6c 6c 29 3b 0a 20 20 72 65 74  e, zFull);.  ret
9750: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
9760: 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 57 49  endif..#if OS_WI
9770: 4e 43 45 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68  NCE.  /* WinCE h
9780: 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66  as no concept of
9790: 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
97a0: 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d  name, or so I am
97b0: 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 73 71 6c 69   told. */.  sqli
97c0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 70 56 66  te3_snprintf(pVf
97d0: 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a  s->mxPathname, z
97e0: 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52 65 6c  Full, "%s", zRel
97f0: 61 74 69 76 65 29 3b 0a 20 20 72 65 74 75 72 6e  ative);.  return
9800: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
9810: 69 66 0a 0a 23 69 66 20 21 4f 53 5f 57 49 4e 43  if..#if !OS_WINC
9820: 45 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  E && !defined(__
9830: 43 59 47 57 49 4e 5f 5f 29 0a 20 20 69 6e 74 20  CYGWIN__).  int 
9840: 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a  nByte;.  void *z
9850: 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 63 68 61  Converted;.  cha
9860: 72 20 2a 7a 4f 75 74 3b 0a 20 20 7a 43 6f 6e 76  r *zOut;.  zConv
9870: 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55  erted = convertU
9880: 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c  tf8Filename(zRel
9890: 61 74 69 76 65 29 3b 0a 20 20 69 66 28 20 69 73  ative);.  if( is
98a0: 4e 54 28 29 20 29 7b 0a 20 20 20 20 57 43 48 41  NT() ){.    WCHA
98b0: 52 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42  R *zTemp;.    nB
98c0: 79 74 65 20 3d 20 47 65 74 46 75 6c 6c 50 61 74  yte = GetFullPat
98d0: 68 4e 61 6d 65 57 28 28 57 43 48 41 52 2a 29 7a  hNameW((WCHAR*)z
98e0: 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c  Converted, 0, 0,
98f0: 20 30 29 20 2b 20 33 3b 0a 20 20 20 20 7a 54 65   0) + 3;.    zTe
9900: 6d 70 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79  mp = malloc( nBy
9910: 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b  te*sizeof(zTemp[
9920: 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  0]) );.    if( z
9930: 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Temp==0 ){.     
9940: 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64   free(zConverted
9950: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
9960: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
9970: 20 20 7d 0a 20 20 20 20 47 65 74 46 75 6c 6c 50    }.    GetFullP
9980: 61 74 68 4e 61 6d 65 57 28 28 57 43 48 41 52 2a  athNameW((WCHAR*
9990: 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79  )zConverted, nBy
99a0: 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20  te, zTemp, 0);. 
99b0: 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74     free(zConvert
99c0: 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20  ed);.    zOut = 
99d0: 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54  unicodeToUtf8(zT
99e0: 65 6d 70 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  emp);.    free(z
99f0: 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Temp);.  }else{.
9a00: 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 3b      char *zTemp;
9a10: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 47 65 74  .    nByte = Get
9a20: 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63  FullPathNameA((c
9a30: 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c  har*)zConverted,
9a40: 20 30 2c 20 30 2c 20 30 29 20 2b 20 33 3b 0a 20   0, 0, 0) + 3;. 
9a50: 20 20 20 7a 54 65 6d 70 20 3d 20 6d 61 6c 6c 6f     zTemp = mallo
9a60: 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28  c( nByte*sizeof(
9a70: 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20  zTemp[0]) );.   
9a80: 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b   if( zTemp==0 ){
9a90: 0a 20 20 20 20 20 20 66 72 65 65 28 7a 43 6f 6e  .      free(zCon
9aa0: 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72  verted);.      r
9ab0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
9ac0: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 47 65  EM;.    }.    Ge
9ad0: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28  tFullPathNameA((
9ae0: 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
9af0: 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20  , nByte, zTemp, 
9b00: 30 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f  0);.    free(zCo
9b10: 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f  nverted);.    zO
9b20: 75 74 20 3d 20 6d 62 63 73 54 6f 55 74 66 38 28  ut = mbcsToUtf8(
9b30: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 66 72 65 65  zTemp);.    free
9b40: 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 20 20 69  (zTemp);.  }.  i
9b50: 66 28 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73  f( zOut ){.    s
9b60: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9b70: 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
9b80: 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a  , zFull, "%s", z
9b90: 4f 75 74 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  Out);.    free(z
9ba0: 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Out);.    return
9bb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
9bc0: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
9bd0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
9be0: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 6e  }.#endif.}..#ifn
9bf0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9c00: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f  LOAD_EXTENSION./
9c10: 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20  *.** Interfaces 
9c20: 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68  for opening a sh
9c30: 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69  ared library, fi
9c40: 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e  nding entry poin
9c50: 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ts.** within the
9c60: 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
9c70: 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65   and closing the
9c80: 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e   shared library.
9c90: 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  .*/./*.** Interf
9ca0: 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67  aces for opening
9cb0: 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72   a shared librar
9cc0: 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79  y, finding entry
9cd0: 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69   points.** withi
9ce0: 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  n the shared lib
9cf0: 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e  rary, and closin
9d00: 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  g the shared lib
9d10: 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rary..*/.static 
9d20: 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e 28  void *winDlOpen(
9d30: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
9d40: 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  s, const char *z
9d50: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e  Filename){.  HAN
9d60: 44 4c 45 20 68 3b 0a 20 20 76 6f 69 64 20 2a 7a  DLE h;.  void *z
9d70: 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
9d80: 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
9d90: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
9da0: 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
9db0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
9dc0: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28  .  }.  if( isNT(
9dd0: 29 20 29 7b 0a 20 20 20 20 68 20 3d 20 4c 6f 61  ) ){.    h = Loa
9de0: 64 4c 69 62 72 61 72 79 57 28 28 57 43 48 41 52  dLibraryW((WCHAR
9df0: 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  *)zConverted);. 
9e00: 20 7d 65 6c 73 65 7b 0a 23 69 66 20 4f 53 5f 57   }else{.#if OS_W
9e10: 49 4e 43 45 0a 20 20 20 20 72 65 74 75 72 6e 20  INCE.    return 
9e20: 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68 20 3d  0;.#else.    h =
9e30: 20 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28 63   LoadLibraryA((c
9e40: 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29  har*)zConverted)
9e50: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 66  ;.#endif.  }.  f
9e60: 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
9e70: 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a  .  return (void*
9e80: 29 68 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  )h;.}.static voi
9e90: 64 20 77 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c  d winDlError(sql
9ea0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
9eb0: 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
9ec0: 7a 42 75 66 4f 75 74 29 7b 0a 23 69 66 20 4f 53  zBufOut){.#if OS
9ed0: 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 72 72  _WINCE.  int err
9ee0: 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f  or = GetLastErro
9ef0: 72 28 29 3b 0a 20 20 69 66 28 20 65 72 72 6f 72  r();.  if( error
9f00: 3e 30 78 37 46 46 46 46 46 46 20 29 7b 0a 20 20  >0x7FFFFFF ){.  
9f10: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
9f20: 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74  tf(nBuf, zBufOut
9f30: 2c 20 22 4f 73 45 72 72 6f 72 20 30 78 25 78 22  , "OsError 0x%x"
9f40: 2c 20 65 72 72 6f 72 29 3b 0a 20 20 7d 65 6c 73  , error);.  }els
9f50: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  e{.    sqlite3_s
9f60: 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42  nprintf(nBuf, zB
9f70: 75 66 4f 75 74 2c 20 22 4f 73 45 72 72 6f 72 20  ufOut, "OsError 
9f80: 25 64 22 2c 20 65 72 72 6f 72 29 3b 0a 20 20 7d  %d", error);.  }
9f90: 0a 23 65 6c 73 65 0a 20 20 46 6f 72 6d 61 74 4d  .#else.  FormatM
9fa0: 65 73 73 61 67 65 41 28 0a 20 20 20 20 46 4f 52  essageA(.    FOR
9fb0: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d  MAT_MESSAGE_FROM
9fc0: 5f 53 59 53 54 45 4d 2c 0a 20 20 20 20 4e 55 4c  _SYSTEM,.    NUL
9fd0: 4c 2c 0a 20 20 20 20 47 65 74 4c 61 73 74 45 72  L,.    GetLastEr
9fe0: 72 6f 72 28 29 2c 0a 20 20 20 20 30 2c 0a 20 20  ror(),.    0,.  
9ff0: 20 20 7a 42 75 66 4f 75 74 2c 0a 20 20 20 20 6e    zBufOut,.    n
a000: 42 75 66 2d 31 2c 0a 20 20 20 20 30 0a 20 20 29  Buf-1,.    0.  )
a010: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 76 6f 69 64 20  ;.#endif.}.void 
a020: 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65  *winDlSym(sqlite
a030: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69  3_vfs *pVfs, voi
a040: 64 20 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e 73  d *pHandle, cons
a050: 74 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c 29  t char *zSymbol)
a060: 7b 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20  {.#if OS_WINCE. 
a070: 20 2f 2a 20 54 68 65 20 47 65 74 50 72 6f 63 41   /* The GetProcA
a080: 64 64 72 65 73 73 41 28 29 20 72 6f 75 74 69 6e  ddressA() routin
a090: 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  e is only availa
a0a0: 62 6c 65 20 6f 6e 20 77 69 6e 63 65 2e 20 2a 2f  ble on wince. */
a0b0: 0a 20 20 72 65 74 75 72 6e 20 47 65 74 50 72 6f  .  return GetPro
a0c0: 63 41 64 64 72 65 73 73 41 28 28 48 41 4e 44 4c  cAddressA((HANDL
a0d0: 45 29 70 48 61 6e 64 6c 65 2c 20 7a 53 79 6d 62  E)pHandle, zSymb
a0e0: 6f 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20  ol);.#else.  /* 
a0f0: 41 6c 6c 20 6f 74 68 65 72 20 77 69 6e 64 6f 77  All other window
a100: 73 20 70 6c 61 74 66 6f 72 6d 73 20 65 78 70 65  s platforms expe
a110: 63 74 20 47 65 74 50 72 6f 63 41 64 64 72 65 73  ct GetProcAddres
a120: 73 28 29 20 74 6f 20 74 61 6b 65 0a 20 20 2a 2a  s() to take.  **
a130: 20 61 6e 20 41 6e 73 69 20 73 74 72 69 6e 67 20   an Ansi string 
a140: 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  regardless of th
a150: 65 20 5f 55 4e 49 43 4f 44 45 20 73 65 74 74 69  e _UNICODE setti
a160: 6e 67 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 47  ng */.  return G
a170: 65 74 50 72 6f 63 41 64 64 72 65 73 73 28 28 48  etProcAddress((H
a180: 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 2c 20 7a  ANDLE)pHandle, z
a190: 53 79 6d 62 6f 6c 29 3b 0a 23 65 6e 64 69 66 0a  Symbol);.#endif.
a1a0: 7d 0a 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73  }.void winDlClos
a1b0: 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  e(sqlite3_vfs *p
a1c0: 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  Vfs, void *pHand
a1d0: 6c 65 29 7b 0a 20 20 46 72 65 65 4c 69 62 72 61  le){.  FreeLibra
a1e0: 72 79 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64  ry((HANDLE)pHand
a1f0: 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20  le);.}.#else /* 
a200: 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  if SQLITE_OMIT_L
a210: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73  OAD_EXTENSION is
a220: 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23   defined: */.  #
a230: 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e  define winDlOpen
a240: 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69    0.  #define wi
a250: 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65  nDlError 0.  #de
a260: 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20 20  fine winDlSym   
a270: 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44  0.  #define winD
a280: 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a  lClose 0.#endif.
a290: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70  ../*.** Write up
a2a0: 20 74 6f 20 6e 42 75 66 20 62 79 74 65 73 20 6f   to nBuf bytes o
a2b0: 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74  f randomness int
a2c0: 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69  o zBuf..*/.stati
a2d0: 63 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e  c int winRandomn
a2e0: 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ess(sqlite3_vfs 
a2f0: 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
a300: 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
a310: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 69 66 28  int n = 0;.  if(
a320: 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54 49   sizeof(SYSTEMTI
a330: 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20  ME)<=nBuf-n ){. 
a340: 20 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78 3b     SYSTEMTIME x;
a350: 0a 20 20 20 20 47 65 74 53 79 73 74 65 6d 54 69  .    GetSystemTi
a360: 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d 63  me(&x);.    memc
a370: 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c  py(&zBuf[n], &x,
a380: 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20   sizeof(x));.   
a390: 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29 3b   n += sizeof(x);
a3a0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f  .  }.  if( sizeo
a3b0: 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e  f(DWORD)<=nBuf-n
a3c0: 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 70 69   ){.    DWORD pi
a3d0: 64 20 3d 20 47 65 74 43 75 72 72 65 6e 74 50 72  d = GetCurrentPr
a3e0: 6f 63 65 73 73 49 64 28 29 3b 0a 20 20 20 20 6d  ocessId();.    m
a3f0: 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
a400: 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64  &pid, sizeof(pid
a410: 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ));.    n += siz
a420: 65 6f 66 28 70 69 64 29 3b 0a 20 20 7d 0a 20 20  eof(pid);.  }.  
a430: 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44  if( sizeof(DWORD
a440: 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
a450: 20 44 57 4f 52 44 20 63 6e 74 20 3d 20 47 65 74   DWORD cnt = Get
a460: 54 69 63 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20  TickCount();.   
a470: 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d   memcpy(&zBuf[n]
a480: 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63  , &cnt, sizeof(c
a490: 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  nt));.    n += s
a4a0: 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a  izeof(cnt);.  }.
a4b0: 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 41 52    if( sizeof(LAR
a4c0: 47 45 5f 49 4e 54 45 47 45 52 29 3c 3d 6e 42 75  GE_INTEGER)<=nBu
a4d0: 66 2d 6e 20 29 7b 0a 20 20 20 20 4c 41 52 47 45  f-n ){.    LARGE
a4e0: 5f 49 4e 54 45 47 45 52 20 69 3b 0a 20 20 20 20  _INTEGER i;.    
a4f0: 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65  QueryPerformance
a500: 43 6f 75 6e 74 65 72 28 26 69 29 3b 0a 20 20 20  Counter(&i);.   
a510: 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d   memcpy(&zBuf[n]
a520: 2c 20 26 69 2c 20 73 69 7a 65 6f 66 28 69 29 29  , &i, sizeof(i))
a530: 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
a540: 66 28 69 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  f(i);.  }.  retu
a550: 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn n;.}.../*.** 
a560: 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
a570: 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
a580: 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
a590: 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73  time slept..*/.s
a5a0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 6c 65  tatic int winSle
a5b0: 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ep(sqlite3_vfs *
a5c0: 70 56 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73  pVfs, int micros
a5d0: 65 63 29 7b 0a 20 20 53 6c 65 65 70 28 28 6d 69  ec){.  Sleep((mi
a5e0: 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30  crosec+999)/1000
a5f0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6d 69  );.  return ((mi
a600: 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30  crosec+999)/1000
a610: 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )*1000;.}../*.**
a620: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
a630: 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20  ariable, if set 
a640: 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
a650: 6c 75 65 2c 20 62 65 63 6f 6d 65 73 20 74 68 65  lue, becomes the
a660: 20 72 65 73 75 6c 74 0a 2a 2a 20 72 65 74 75 72   result.** retur
a670: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
a680: 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 2e  OsCurrentTime().
a690: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
a6a0: 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23  or testing..*/.#
a6b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
a6c0: 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75  T.int sqlite3_cu
a6d0: 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 0a  rrent_time = 0;.
a6e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69  #endif../*.** Fi
a6f0: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
a700: 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61  ime (in Universa
a710: 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69  l Coordinated Ti
a720: 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a  me).  Write the.
a730: 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  ** current time 
a740: 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75  and date as a Ju
a750: 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
a760: 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a  into *prNow and.
a770: 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65  ** return 0.  Re
a780: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69  turn 1 if the ti
a790: 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e  me and date cann
a7a0: 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
a7b0: 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69  int winCurrentTi
a7c0: 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  me(sqlite3_vfs *
a7d0: 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72  pVfs, double *pr
a7e0: 4e 6f 77 29 7b 0a 20 20 46 49 4c 45 54 49 4d 45  Now){.  FILETIME
a7f0: 20 66 74 3b 0a 20 20 2f 2a 20 46 49 4c 45 54 49   ft;.  /* FILETI
a800: 4d 45 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ME structure is 
a810: 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20 72  a 64-bit value r
a820: 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
a830: 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20 20 20 20  number of .     
a840: 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69  100-nanosecond i
a850: 6e 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20 4a  ntervals since J
a860: 61 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20 28  anuary 1, 1601 (
a870: 3d 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29 2e  = JD 2305813.5).
a880: 20 0a 20 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20   .  */.  double 
a890: 6e 6f 77 3b 0a 23 69 66 20 4f 53 5f 57 49 4e 43  now;.#if OS_WINC
a8a0: 45 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74  E.  SYSTEMTIME t
a8b0: 69 6d 65 3b 0a 20 20 47 65 74 53 79 73 74 65 6d  ime;.  GetSystem
a8c0: 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20 53  Time(&time);.  S
a8d0: 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
a8e0: 69 6d 65 28 26 74 69 6d 65 2c 26 66 74 29 3b 0a  ime(&time,&ft);.
a8f0: 23 65 6c 73 65 0a 20 20 47 65 74 53 79 73 74 65  #else.  GetSyste
a900: 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 28  mTimeAsFileTime(
a910: 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a 20   &ft );.#endif. 
a920: 20 6e 6f 77 20 3d 20 28 28 64 6f 75 62 6c 65 29   now = ((double)
a930: 66 74 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d  ft.dwHighDateTim
a940: 65 29 20 2a 20 34 32 39 34 39 36 37 32 39 36 2e  e) * 4294967296.
a950: 30 3b 20 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 28  0; .  *prNow = (
a960: 6e 6f 77 20 2b 20 66 74 2e 64 77 4c 6f 77 44 61  now + ft.dwLowDa
a970: 74 65 54 69 6d 65 29 2f 38 36 34 30 30 30 30 30  teTime)/86400000
a980: 30 30 30 30 2e 30 20 2b 20 32 33 30 35 38 31 33  0000.0 + 2305813
a990: 2e 35 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .5;.#ifdef SQLIT
a9a0: 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c  E_TEST.  if( sql
a9b0: 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
a9c0: 65 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20  e ){.    *prNow 
a9d0: 3d 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  = sqlite3_curren
a9e0: 74 5f 74 69 6d 65 2f 38 36 34 30 30 2e 30 20 2b  t_time/86400.0 +
a9f0: 20 32 34 34 30 35 38 37 2e 35 3b 0a 20 20 7d 0a   2440587.5;.  }.
aa00: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
aa10: 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  0;.}..static int
aa20: 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
aa30: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
aa40: 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  fs, int nBuf, ch
aa50: 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 72 65 74  ar *zBuf){.  ret
aa60: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
aa70: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
aa80: 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 44   to the sqlite3D
aa90: 65 66 61 75 6c 74 56 66 73 20 73 74 72 75 63 74  efaultVfs struct
aaa0: 75 72 65 2e 20 20 20 57 65 20 75 73 65 0a 2a 2a  ure.   We use.**
aab0: 20 61 20 66 75 6e 63 74 69 6f 6e 20 72 61 74 68   a function rath
aac0: 65 72 20 74 68 61 6e 20 67 69 76 65 20 74 68 65  er than give the
aad0: 20 73 74 72 75 63 74 75 72 65 20 67 6c 6f 62 61   structure globa
aae0: 6c 20 73 63 6f 70 65 20 62 65 63 61 75 73 65 0a  l scope because.
aaf0: 2a 2a 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72  ** some compiler
ab00: 73 20 28 4d 53 56 43 29 20 64 6f 20 6e 6f 74 20  s (MSVC) do not 
ab10: 61 6c 6c 6f 77 20 66 6f 72 77 61 72 64 20 64 65  allow forward de
ab20: 63 6c 61 72 61 74 69 6f 6e 73 20 6f 66 0a 2a 2a  clarations of.**
ab30: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74 72   initialized str
ab40: 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 73 71 6c 69  uctures..*/.sqli
ab50: 74 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33  te3_vfs *sqlite3
ab60: 4f 73 44 65 66 61 75 6c 74 56 66 73 28 76 6f 69  OsDefaultVfs(voi
ab70: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c  d){.  static sql
ab80: 69 74 65 33 5f 76 66 73 20 77 69 6e 56 66 73 20  ite3_vfs winVfs 
ab90: 3d 20 7b 0a 20 20 20 20 31 2c 20 20 20 20 20 20  = {.    1,      
aba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
abb0: 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69  ersion */.    si
abc0: 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20  zeof(winFile),  
abd0: 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a   /* szOsFile */.
abe0: 20 20 20 20 4d 41 58 5f 50 41 54 48 2c 20 20 20      MAX_PATH,   
abf0: 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68         /* mxPath
ac00: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20  name */.    0,  
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ac20: 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22  * pNext */.    "
ac30: 77 69 6e 33 32 22 2c 20 20 20 20 20 20 20 20 20  win32",         
ac40: 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20    /* zName */.  
ac50: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
ac60: 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61       /* pAppData
ac70: 20 2a 2f 0a 20 0a 20 20 20 20 77 69 6e 4f 70 65   */. .    winOpe
ac80: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n,           /* 
ac90: 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e  xOpen */.    win
aca0: 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20  Delete,         
acb0: 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20  /* xDelete */.  
acc0: 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20    winAccess,    
acd0: 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20       /* xAccess 
ace0: 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61  */.    winFullPa
acf0: 74 68 6e 61 6d 65 2c 20 20 20 2f 2a 20 78 46 75  thname,   /* xFu
ad00: 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  llPathname */.  
ad10: 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20    winDlOpen,    
ad20: 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20       /* xDlOpen 
ad30: 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f  */.    winDlErro
ad40: 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c  r,        /* xDl
ad50: 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e  Error */.    win
ad60: 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20  DlSym,          
ad70: 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20  /* xDlSym */.   
ad80: 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20   winDlClose,    
ad90: 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20      /* xDlClose 
ada0: 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d  */.    winRandom
adb0: 6e 65 73 73 2c 20 20 20 20 20 2f 2a 20 78 52 61  ness,     /* xRa
adc0: 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20  ndomness */.    
add0: 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20  winSleep,       
ade0: 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a     /* xSleep */.
adf0: 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69      winCurrentTi
ae00: 6d 65 2c 20 20 20 20 2f 2a 20 78 43 75 72 72 65  me,    /* xCurre
ae10: 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69  ntTime */.    wi
ae20: 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 20 20 20  nGetLastError   
ae30: 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f   /* xGetLastErro
ae40: 72 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 72 65 74  r */.  };..  ret
ae50: 75 72 6e 20 26 77 69 6e 56 66 73 3b 0a 7d 0a 0a  urn &winVfs;.}..
ae60: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
ae70: 20 61 6e 64 20 64 65 69 6e 69 74 69 61 6c 69 7a   and deinitializ
ae80: 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  e the operating 
ae90: 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65  system interface
aea0: 2e 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 73  ..** These are s
aeb0: 74 75 62 73 20 66 6f 72 20 6e 6f 77 20 2d 20 70  tubs for now - p
aec0: 6f 70 75 6c 61 74 65 20 77 69 74 68 20 72 65 61  opulate with rea
aed0: 6c 20 63 6f 64 65 20 6c 61 74 65 72 2e 2e 2e 0a  l code later....
aee0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
aef0: 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 20 72 65  s_init(void){ re
af00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
af10: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  }.int sqlite3_os
af20: 5f 65 6e 64 28 76 6f 69 64 29 7b 20 72 65 74 75  _end(void){ retu
af30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a  rn SQLITE_OK; }.
af40: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 57 49  .#endif /* OS_WI
af50: 4e 20 2a 2f 0a                                   N */.