/ Hex Artifact Content
Login

Artifact 4f840e97624dbde9cae3d020ce072a4f1d2a11b1:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 77 69 6e 64 6f 77 73 2e  ific to windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 4f  liteInt.h".#if O
01d0: 53 5f 57 49 4e 20 20 20 20 20 20 20 20 20 20 20  S_WIN           
01e0: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 69 6c 65      /* This file
01f0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 77 69 6e   is used for win
0200: 64 6f 77 73 20 6f 6e 6c 79 20 2a 2f 0a 0a 0a 2f  dows only */.../
0210: 2a 0a 2a 2a 20 41 20 4e 6f 74 65 20 41 62 6f 75  *.** A Note Abou
0220: 74 20 4d 65 6d 6f 72 79 20 41 6c 6c 6f 63 61 74  t Memory Allocat
0230: 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion:.**.** This 
0240: 64 72 69 76 65 72 20 75 73 65 73 20 6d 61 6c 6c  driver uses mall
0250: 6f 63 28 29 2f 66 72 65 65 28 29 20 64 69 72 65  oc()/free() dire
0260: 63 74 6c 79 20 72 61 74 68 65 72 20 74 68 61 6e  ctly rather than
0270: 20 67 6f 69 6e 67 20 74 68 72 6f 75 67 68 0a 2a   going through.*
0280: 2a 20 74 68 65 20 53 51 4c 69 74 65 2d 77 72 61  * the SQLite-wra
0290: 70 70 65 72 73 20 73 71 6c 69 74 65 33 5f 6d 61  ppers sqlite3_ma
02a0: 6c 6c 6f 63 28 29 2f 73 71 6c 69 74 65 33 5f 66  lloc()/sqlite3_f
02b0: 72 65 65 28 29 2e 20 20 54 68 6f 73 65 20 77 72  ree().  Those wr
02c0: 61 70 70 65 72 73 0a 2a 2a 20 61 72 65 20 64 65  appers.** are de
02d0: 73 69 67 6e 65 64 20 66 6f 72 20 75 73 65 20 6f  signed for use o
02e0: 6e 20 65 6d 62 65 64 64 65 64 20 73 79 73 74 65  n embedded syste
02f0: 6d 73 20 77 68 65 72 65 20 6d 65 6d 6f 72 79 20  ms where memory 
0300: 69 73 20 73 63 61 72 63 65 20 61 6e 64 0a 2a 2a  is scarce and.**
0310: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73   malloc failures
0320: 20 68 61 70 70 65 6e 20 66 72 65 71 75 65 6e 74   happen frequent
0330: 6c 79 2e 20 20 57 69 6e 33 32 20 64 6f 65 73 20  ly.  Win32 does 
0340: 6e 6f 74 20 74 79 70 69 63 61 6c 6c 79 20 72 75  not typically ru
0350: 6e 20 6f 6e 0a 2a 2a 20 65 6d 62 65 64 64 65 64  n on.** embedded
0360: 20 73 79 73 74 65 6d 73 2c 20 61 6e 64 20 77 68   systems, and wh
0370: 65 6e 20 69 74 20 64 6f 65 73 20 74 68 65 20 64  en it does the d
0380: 65 76 65 6c 6f 70 65 72 73 20 6e 6f 72 6d 61 6c  evelopers normal
0390: 6c 79 20 68 61 76 65 20 62 69 67 67 65 72 0a 2a  ly have bigger.*
03a0: 2a 20 70 72 6f 62 6c 65 6d 73 20 74 6f 20 77 6f  * problems to wo
03b0: 72 72 79 20 61 62 6f 75 74 20 74 68 61 6e 20 72  rry about than r
03c0: 75 6e 6e 69 6e 67 20 6f 75 74 20 6f 66 20 6d 65  unning out of me
03d0: 6d 6f 72 79 2e 20 20 53 6f 20 74 68 65 72 65 20  mory.  So there 
03e0: 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 63 6f 6d 70  is not.** a comp
03f0: 65 6c 6c 69 6e 67 20 6e 65 65 64 20 74 6f 20 75  elling need to u
0400: 73 65 20 74 68 65 20 77 72 61 70 70 65 72 73 2e  se the wrappers.
0410: 0a 2a 2a 0a 2a 2a 20 42 75 74 20 74 68 65 72 65  .**.** But there
0420: 20 69 73 20 61 20 67 6f 6f 64 20 72 65 61 73 6f   is a good reaso
0430: 6e 20 74 6f 20 6e 6f 74 20 75 73 65 20 74 68 65  n to not use the
0440: 20 77 72 61 70 70 65 72 73 2e 20 20 49 66 20 77   wrappers.  If w
0450: 65 20 75 73 65 20 74 68 65 0a 2a 2a 20 77 72 61  e use the.** wra
0460: 70 70 65 72 73 20 74 68 65 6e 20 77 65 20 77 69  ppers then we wi
0470: 6c 6c 20 67 65 74 20 73 69 6d 75 6c 61 74 65 64  ll get simulated
0480: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
0490: 65 73 20 77 69 74 68 69 6e 20 74 68 69 73 0a 2a  es within this.*
04a0: 2a 20 64 72 69 76 65 72 2e 20 20 41 6e 64 20 74  * driver.  And t
04b0: 68 61 74 20 63 61 75 73 65 73 20 61 6c 6c 20 6b  hat causes all k
04c0: 69 6e 64 73 20 6f 66 20 70 72 6f 62 6c 65 6d 73  inds of problems
04d0: 20 66 6f 72 20 6f 75 72 20 74 65 73 74 73 2e 20   for our tests. 
04e0: 20 57 65 0a 2a 2a 20 63 6f 75 6c 64 20 65 6e 68   We.** could enh
04f0: 61 6e 63 65 20 53 51 4c 69 74 65 20 74 6f 20 64  ance SQLite to d
0500: 65 61 6c 20 77 69 74 68 20 73 69 6d 75 6c 61 74  eal with simulat
0510: 65 64 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  ed malloc failur
0520: 65 73 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65  es within.** the
0530: 20 4f 53 20 64 72 69 76 65 72 2c 20 62 75 74 20   OS driver, but 
0540: 74 68 65 20 63 6f 64 65 20 74 6f 20 64 65 61 6c  the code to deal
0550: 20 77 69 74 68 20 74 68 6f 73 65 20 66 61 69 6c   with those fail
0560: 75 72 65 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a  ure would not.**
0570: 20 62 65 20 65 78 65 72 63 69 73 65 64 20 6f 6e   be exercised on
0580: 20 4c 69 6e 75 78 20 28 77 68 69 63 68 20 64 6f   Linux (which do
0590: 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d  es not need to m
05a0: 61 6c 6c 6f 63 28 29 20 69 6e 20 74 68 65 20 64  alloc() in the d
05b0: 72 69 76 65 72 29 0a 2a 2a 20 61 6e 64 20 73 6f  river).** and so
05c0: 20 77 65 20 77 6f 75 6c 64 20 68 61 76 65 20 64   we would have d
05d0: 69 66 66 69 63 75 6c 74 79 20 77 72 69 74 69 6e  ifficulty writin
05e0: 67 20 63 6f 76 65 72 61 67 65 20 74 65 73 74 73  g coverage tests
05f0: 20 66 6f 72 20 74 68 61 74 0a 2a 2a 20 63 6f 64   for that.** cod
0600: 65 2e 20 20 42 65 74 74 65 72 20 74 6f 20 6c 65  e.  Better to le
0610: 61 76 65 20 74 68 65 20 63 6f 64 65 20 6f 75 74  ave the code out
0620: 2c 20 77 65 20 74 68 69 6e 6b 2e 0a 2a 2a 0a 2a  , we think..**.*
0630: 2a 20 54 68 65 20 70 6f 69 6e 74 20 6f 66 20 74  * The point of t
0640: 68 69 73 20 64 69 73 63 75 73 73 69 6f 6e 20 69  his discussion i
0650: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 20 57  s as follows:  W
0660: 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e  hen creating a n
0670: 65 77 0a 2a 2a 20 4f 53 20 6c 61 79 65 72 20 66  ew.** OS layer f
0680: 6f 72 20 61 6e 20 65 6d 62 65 64 64 65 64 20 73  or an embedded s
0690: 79 73 74 65 6d 2c 20 69 66 20 79 6f 75 20 75 73  ystem, if you us
06a0: 65 20 74 68 69 73 20 66 69 6c 65 20 61 73 20 61  e this file as a
06b0: 6e 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61 76  n example,.** av
06c0: 6f 69 64 20 74 68 65 20 75 73 65 20 6f 66 20 6d  oid the use of m
06d0: 61 6c 6c 6f 63 28 29 2f 66 72 65 65 28 29 2e 20  alloc()/free(). 
06e0: 20 54 68 6f 73 65 20 72 6f 75 74 69 6e 65 73 20   Those routines 
06f0: 77 6f 72 6b 20 6f 6b 20 6f 6e 20 77 69 6e 64 6f  work ok on windo
0700: 77 73 0a 2a 2a 20 64 65 73 6b 74 6f 70 73 20 62  ws.** desktops b
0710: 75 74 20 6e 6f 74 20 73 6f 20 77 65 6c 6c 20 69  ut not so well i
0720: 6e 20 65 6d 62 65 64 64 65 64 20 73 79 73 74 65  n embedded syste
0730: 6d 73 2e 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65  ms..*/..#include
0740: 20 3c 77 69 6e 62 61 73 65 2e 68 3e 0a 0a 23 69   <winbase.h>..#i
0750: 66 64 65 66 20 5f 5f 43 59 47 57 49 4e 5f 5f 0a  fdef __CYGWIN__.
0760: 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 63  # include <sys/c
0770: 79 67 77 69 6e 2e 68 3e 0a 23 65 6e 64 69 66 0a  ygwin.h>.#endif.
0780: 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 75 73  ./*.** Macros us
0790: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
07a0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
07b0: 6f 20 75 73 65 20 74 68 72 65 61 64 73 2e 0a 2a  o use threads..*
07c0: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 54 48  /.#if defined(TH
07d0: 52 45 41 44 53 41 46 45 29 20 26 26 20 54 48 52  READSAFE) && THR
07e0: 45 41 44 53 41 46 45 0a 23 20 64 65 66 69 6e 65  EADSAFE.# define
07f0: 20 53 51 4c 49 54 45 5f 57 33 32 5f 54 48 52 45   SQLITE_W32_THRE
0800: 41 44 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ADS 1.#endif../*
0810: 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64 65  .** Include code
0820: 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20   that is common 
0830: 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69  to all os_*.c fi
0840: 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  les.*/.#include 
0850: 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f  "os_common.h"../
0860: 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69  *.** Determine i
0870: 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  f we are dealing
0880: 20 77 69 74 68 20 57 69 6e 64 6f 77 73 43 45 20   with WindowsCE 
0890: 2d 20 77 68 69 63 68 20 68 61 73 20 61 20 6d 75  - which has a mu
08a0: 63 68 0a 2a 2a 20 72 65 64 75 63 65 64 20 41 50  ch.** reduced AP
08b0: 49 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  I..*/.#if define
08c0: 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 23 20  d(_WIN32_WCE).# 
08d0: 64 65 66 69 6e 65 20 4f 53 5f 57 49 4e 43 45 20  define OS_WINCE 
08e0: 31 0a 23 20 64 65 66 69 6e 65 20 41 72 65 46 69  1.# define AreFi
08f0: 6c 65 41 70 69 73 41 4e 53 49 28 29 20 31 0a 23  leApisANSI() 1.#
0900: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4f 53  else.# define OS
0910: 5f 57 49 4e 43 45 20 30 0a 23 65 6e 64 69 66 0a  _WINCE 0.#endif.
0920: 0a 2f 2a 0a 2a 2a 20 57 69 6e 43 45 20 6c 61 63  ./*.** WinCE lac
0930: 6b 73 20 6e 61 74 69 76 65 20 73 75 70 70 6f 72  ks native suppor
0940: 74 20 66 6f 72 20 66 69 6c 65 20 6c 6f 63 6b 69  t for file locki
0950: 6e 67 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f  ng so we have to
0960: 20 66 61 6b 65 20 69 74 0a 2a 2a 20 77 69 74 68   fake it.** with
0970: 20 73 6f 6d 65 20 63 6f 64 65 20 6f 66 20 6f 75   some code of ou
0980: 72 20 6f 77 6e 2e 0a 2a 2f 0a 23 69 66 20 4f 53  r own..*/.#if OS
0990: 5f 57 49 4e 43 45 0a 74 79 70 65 64 65 66 20 73  _WINCE.typedef s
09a0: 74 72 75 63 74 20 77 69 6e 63 65 4c 6f 63 6b 20  truct winceLock 
09b0: 7b 0a 20 20 69 6e 74 20 6e 52 65 61 64 65 72 73  {.  int nReaders
09c0: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
09d0: 72 20 6f 66 20 72 65 61 64 65 72 20 6c 6f 63 6b  r of reader lock
09e0: 73 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20  s obtained */.  
09f0: 42 4f 4f 4c 20 62 50 65 6e 64 69 6e 67 3b 20 20  BOOL bPending;  
0a00: 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73      /* Indicates
0a10: 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20   a pending lock 
0a20: 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  has been obtaine
0a30: 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 73  d */.  BOOL bRes
0a40: 65 72 76 65 64 3b 20 20 20 20 20 2f 2a 20 49 6e  erved;     /* In
0a50: 64 69 63 61 74 65 73 20 61 20 72 65 73 65 72 76  dicates a reserv
0a60: 65 64 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  ed lock has been
0a70: 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42   obtained */.  B
0a80: 4f 4f 4c 20 62 45 78 63 6c 75 73 69 76 65 3b 20  OOL bExclusive; 
0a90: 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20     /* Indicates 
0aa0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
0ab0: 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69  k has been obtai
0ac0: 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e 63 65 4c 6f  ned */.} winceLo
0ad0: 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ck;.#endif../*.*
0ae0: 2a 20 54 68 65 20 77 69 6e 46 69 6c 65 20 73 74  * The winFile st
0af0: 72 75 63 74 75 72 65 20 69 73 20 61 20 73 75 62  ructure is a sub
0b00: 63 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33  class of sqlite3
0b10: 5f 66 69 6c 65 2a 20 73 70 65 63 69 66 69 63 20  _file* specific 
0b20: 74 6f 20 74 68 65 20 77 69 6e 33 32 0a 2a 2a 20  to the win32.** 
0b30: 70 6f 72 74 61 62 69 6c 69 74 79 20 6c 61 79 65  portability laye
0b40: 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  r..*/.typedef st
0b50: 72 75 63 74 20 77 69 6e 46 69 6c 65 20 77 69 6e  ruct winFile win
0b60: 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 77 69 6e  File;.struct win
0b70: 46 69 6c 65 20 7b 0a 20 20 63 6f 6e 73 74 20 73  File {.  const s
0b80: 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
0b90: 73 20 2a 70 4d 65 74 68 6f 64 3b 2f 2a 20 4d 75  s *pMethod;/* Mu
0ba0: 73 74 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20  st be first */. 
0bb0: 20 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20   HANDLE h;      
0bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
0bd0: 6c 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67  le for accessing
0be0: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75   the file */.  u
0bf0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 6f 63  nsigned char loc
0c00: 6b 74 79 70 65 3b 20 2f 2a 20 54 79 70 65 20 6f  ktype; /* Type o
0c10: 66 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79  f lock currently
0c20: 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 69   held on this fi
0c30: 6c 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73 68  le */.  short sh
0c40: 61 72 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20 20  aredLockByte;   
0c50: 2f 2a 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f 73  /* Randomly chos
0c60: 65 6e 20 62 79 74 65 20 75 73 65 64 20 61 73 20  en byte used as 
0c70: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f  a shared lock */
0c80: 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20  .#if OS_WINCE.  
0c90: 57 43 48 41 52 20 2a 7a 44 65 6c 65 74 65 4f 6e  WCHAR *zDeleteOn
0ca0: 43 6c 6f 73 65 3b 20 20 2f 2a 20 4e 61 6d 65 20  Close;  /* Name 
0cb0: 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74  of file to delet
0cc0: 65 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a  e when closing *
0cd0: 2f 0a 20 20 48 41 4e 44 4c 45 20 68 4d 75 74 65  /.  HANDLE hMute
0ce0: 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  x;          /* M
0cf0: 75 74 65 78 20 75 73 65 64 20 74 6f 20 63 6f 6e  utex used to con
0d00: 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 73  trol access to s
0d10: 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 20 20 0a  hared lock */  .
0d20: 20 20 48 41 4e 44 4c 45 20 68 53 68 61 72 65 64    HANDLE hShared
0d30: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61  ;         /* Sha
0d40: 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red memory segme
0d50: 6e 74 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  nt used for lock
0d60: 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f  ing */.  winceLo
0d70: 63 6b 20 6c 6f 63 61 6c 3b 20 20 20 20 20 20 20  ck local;       
0d80: 20 2f 2a 20 4c 6f 63 6b 73 20 6f 62 74 61 69 6e   /* Locks obtain
0d90: 65 64 20 62 79 20 74 68 69 73 20 69 6e 73 74 61  ed by this insta
0da0: 6e 63 65 20 6f 66 20 77 69 6e 46 69 6c 65 20 2a  nce of winFile *
0db0: 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20 2a 73  /.  winceLock *s
0dc0: 68 61 72 65 64 3b 20 20 20 20 20 20 2f 2a 20 47  hared;      /* G
0dd0: 6c 6f 62 61 6c 20 73 68 61 72 65 64 20 6c 6f 63  lobal shared loc
0de0: 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65  k memory for the
0df0: 20 66 69 6c 65 20 20 2a 2f 0a 23 65 6e 64 69 66   file  */.#endif
0e00: 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  .};.../*.** The 
0e10: 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
0e20: 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c 79 29  le is (normally)
0e30: 20 73 65 74 20 6f 6e 63 65 20 61 6e 64 20 6e 65   set once and ne
0e40: 76 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74  ver changes.** t
0e50: 68 65 72 65 61 66 74 65 72 2e 20 20 49 74 20 72  hereafter.  It r
0e60: 65 63 6f 72 64 73 20 77 68 65 74 68 65 72 20 74  ecords whether t
0e70: 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
0e80: 74 65 6d 20 69 73 20 57 69 6e 39 35 0a 2a 2a 20  tem is Win95.** 
0e90: 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20  or WinNT..**.** 
0ea0: 30 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73  0:   Operating s
0eb0: 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a  ystem unknown..*
0ec0: 2a 20 31 3a 20 20 20 4f 70 65 72 61 74 69 6e 67  * 1:   Operating
0ed0: 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39 35   system is Win95
0ee0: 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72 61 74  ..** 2:   Operat
0ef0: 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69  ing system is Wi
0f00: 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72  nNT..**.** In or
0f10: 64 65 72 20 74 6f 20 66 61 63 69 6c 69 74 61 74  der to facilitat
0f20: 65 20 74 65 73 74 69 6e 67 20 6f 6e 20 61 20 57  e testing on a W
0f30: 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74 68 65  inNT system, the
0f40: 20 74 65 73 74 20 66 69 78 74 75 72 65 0a 2a 2a   test fixture.**
0f50: 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20 73 65   can manually se
0f60: 74 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f 20  t this value to 
0f70: 31 20 74 6f 20 65 6d 75 6c 61 74 65 20 57 69 6e  1 to emulate Win
0f80: 39 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a  98 behavior..*/.
0f90: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
0fa0: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  ST.int sqlite3_o
0fb0: 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6c 73  s_type = 0;.#els
0fc0: 65 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  e.static int sql
0fd0: 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30  ite3_os_type = 0
0fe0: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
0ff0: 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e  Return true (non
1000: 2d 7a 65 72 6f 29 20 69 66 20 77 65 20 61 72 65  -zero) if we are
1010: 20 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57   running under W
1020: 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e  inNT, Win2K, Win
1030: 58 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e  XP,.** or WinCE.
1040: 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 28    Return false (
1050: 7a 65 72 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c  zero) for Win95,
1060: 20 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45   Win98, or WinME
1070: 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20  ..**.** Here is 
1080: 61 6e 20 69 6e 74 65 72 65 73 74 69 6e 67 20 6f  an interesting o
1090: 62 73 65 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e  bservation:  Win
10a0: 39 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20 57  95, Win98, and W
10b0: 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65  inME lack.** the
10c0: 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50   LockFileEx() AP
10d0: 49 2e 20 20 42 75 74 20 77 65 20 63 61 6e 20 73  I.  But we can s
10e0: 74 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79 20  till statically 
10f0: 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20 74 68 61  link against tha
1100: 74 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67  t.** API as long
1110: 20 61 73 20 77 65 20 64 6f 6e 27 74 20 63 61 6c   as we don't cal
1120: 6c 20 69 74 20 77 69 6e 20 72 75 6e 6e 69 6e 67  l it win running
1130: 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41   Win95/98/ME.  A
1140: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73   call to.** this
1150: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
1160: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
1170: 20 74 68 65 20 68 6f 73 74 20 69 73 20 57 69 6e   the host is Win
1180: 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57  95/98/ME or.** W
1190: 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68  inNT/2K/XP so th
11a0: 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20  at we will know 
11b0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 77  whether or not w
11c0: 65 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c  e can safely cal
11d0: 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c  l.** the LockFil
11e0: 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 23 69  eEx() API..*/.#i
11f0: 66 20 4f 53 5f 57 49 4e 43 45 0a 23 20 64 65 66  f OS_WINCE.# def
1200: 69 6e 65 20 69 73 4e 54 28 29 20 20 28 31 29 0a  ine isNT()  (1).
1210: 23 65 6c 73 65 0a 20 20 73 74 61 74 69 63 20 69  #else.  static i
1220: 6e 74 20 69 73 4e 54 28 76 6f 69 64 29 7b 0a 20  nt isNT(void){. 
1230: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6f     if( sqlite3_o
1240: 73 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20  s_type==0 ){.   
1250: 20 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f     OSVERSIONINFO
1260: 20 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 49   sInfo;.      sI
1270: 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49  nfo.dwOSVersionI
1280: 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66  nfoSize = sizeof
1290: 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 47  (sInfo);.      G
12a0: 65 74 56 65 72 73 69 6f 6e 45 78 28 26 73 49 6e  etVersionEx(&sIn
12b0: 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
12c0: 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 73 49 6e  e3_os_type = sIn
12d0: 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64 3d  fo.dwPlatformId=
12e0: 3d 56 45 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49  =VER_PLATFORM_WI
12f0: 4e 33 32 5f 4e 54 20 3f 20 32 20 3a 20 31 3b 0a  N32_NT ? 2 : 1;.
1300: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1310: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
1320: 3d 3d 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  ==2;.  }.#endif 
1330: 2f 2a 20 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a  /* OS_WINCE */..
1340: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
1350: 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f 20  UTF-8 string to 
1360: 6d 69 63 72 6f 73 6f 66 74 20 75 6e 69 63 6f 64  microsoft unicod
1370: 65 20 28 55 54 46 2d 31 36 3f 29 2e 20 0a 2a 2a  e (UTF-16?). .**
1380: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
1390: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
13a0: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
13b0: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a  d from malloc..*
13c0: 2f 0a 73 74 61 74 69 63 20 57 43 48 41 52 20 2a  /.static WCHAR *
13d0: 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 63 6f  utf8ToUnicode(co
13e0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
13f0: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61  ame){.  int nCha
1400: 72 3b 0a 20 20 57 43 48 41 52 20 2a 7a 57 69 64  r;.  WCHAR *zWid
1410: 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43  eFilename;..  nC
1420: 68 61 72 20 3d 20 4d 75 6c 74 69 42 79 74 65 54  har = MultiByteT
1430: 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46  oWideChar(CP_UTF
1440: 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  8, 0, zFilename,
1450: 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20   -1, NULL, 0);. 
1460: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d   zWideFilename =
1470: 20 6d 61 6c 6c 6f 63 28 20 6e 43 68 61 72 2a 73   malloc( nChar*s
1480: 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c 65 6e  izeof(zWideFilen
1490: 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ame[0]) );.  if(
14a0: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3d 3d   zWideFilename==
14b0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
14c0: 30 3b 0a 20 20 7d 0a 20 20 6e 43 68 61 72 20 3d  0;.  }.  nChar =
14d0: 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65   MultiByteToWide
14e0: 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c  Char(CP_UTF8, 0,
14f0: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20   zFilename, -1, 
1500: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 6e  zWideFilename, n
1510: 43 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43 68  Char);.  if( nCh
1520: 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 66 72 65  ar==0 ){.    fre
1530: 65 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29  e(zWideFilename)
1540: 3b 0a 20 20 20 20 7a 57 69 64 65 46 69 6c 65 6e  ;.    zWideFilen
1550: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ame = 0;.  }.  r
1560: 65 74 75 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e  eturn zWideFilen
1570: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ame;.}../*.** Co
1580: 6e 76 65 72 74 20 6d 69 63 72 6f 73 6f 66 74 20  nvert microsoft 
1590: 75 6e 69 63 6f 64 65 20 74 6f 20 55 54 46 2d 38  unicode to UTF-8
15a0: 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
15b0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
15c0: 72 69 6e 67 20 69 73 0a 2a 2a 20 6f 62 74 61 69  ring is.** obtai
15d0: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
15e0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  )..*/.static cha
15f0: 72 20 2a 75 6e 69 63 6f 64 65 54 6f 55 74 66 38  r *unicodeToUtf8
1600: 28 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 7a 57  (const WCHAR *zW
1610: 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20  ideFilename){.  
1620: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61  int nByte;.  cha
1630: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20  r *zFilename;.. 
1640: 20 6e 42 79 74 65 20 3d 20 57 69 64 65 43 68 61   nByte = WideCha
1650: 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f  rToMultiByte(CP_
1660: 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46 69  UTF8, 0, zWideFi
1670: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30  lename, -1, 0, 0
1680: 2c 20 30 2c 20 30 29 3b 0a 20 20 7a 46 69 6c 65  , 0, 0);.  zFile
1690: 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  name = malloc( n
16a0: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46  Byte );.  if( zF
16b0: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
16c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
16d0: 20 20 6e 42 79 74 65 20 3d 20 57 69 64 65 43 68    nByte = WideCh
16e0: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50  arToMultiByte(CP
16f0: 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46  _UTF8, 0, zWideF
1700: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69  ilename, -1, zFi
1710: 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a 20  lename, nByte,. 
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
1740: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
1750: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 66 72 65 65  == 0 ){.    free
1760: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
1770: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a   zFilename = 0;.
1780: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69    }.  return zFi
1790: 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
17a0: 20 43 6f 6e 76 65 72 74 20 61 6e 20 61 6e 73 69   Convert an ansi
17b0: 20 73 74 72 69 6e 67 20 74 6f 20 6d 69 63 72 6f   string to micro
17c0: 73 6f 66 74 20 75 6e 69 63 6f 64 65 2c 20 62 61  soft unicode, ba
17d0: 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 75  sed on the.** cu
17e0: 72 72 65 6e 74 20 63 6f 64 65 70 61 67 65 20 73  rrent codepage s
17f0: 65 74 74 69 6e 67 73 20 66 6f 72 20 66 69 6c 65  ettings for file
1800: 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a 20 53 70   apis..** .** Sp
1810: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
1820: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
1830: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66  is obtained.** f
1840: 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73  rom malloc..*/.s
1850: 74 61 74 69 63 20 57 43 48 41 52 20 2a 6d 62 63  tatic WCHAR *mbc
1860: 73 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74  sToUnicode(const
1870: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1880: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ){.  int nByte;.
1890: 20 20 57 43 48 41 52 20 2a 7a 4d 62 63 73 46 69    WCHAR *zMbcsFi
18a0: 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f  lename;.  int co
18b0: 64 65 70 61 67 65 20 3d 20 41 72 65 46 69 6c 65  depage = AreFile
18c0: 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f  ApisANSI() ? CP_
18d0: 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a  ACP : CP_OEMCP;.
18e0: 0a 20 20 6e 42 79 74 65 20 3d 20 4d 75 6c 74 69  .  nByte = Multi
18f0: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 63  ByteToWideChar(c
1900: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c  odepage, 0, zFil
1910: 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c  ename, -1, NULL,
1920: 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29  0)*sizeof(WCHAR)
1930: 3b 0a 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  ;.  zMbcsFilenam
1940: 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74  e = malloc( nByt
1950: 65 2a 73 69 7a 65 6f 66 28 7a 4d 62 63 73 46 69  e*sizeof(zMbcsFi
1960: 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20  lename[0]) );.  
1970: 69 66 28 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  if( zMbcsFilenam
1980: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
1990: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  rn 0;.  }.  nByt
19a0: 65 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f 57  e = MultiByteToW
19b0: 69 64 65 43 68 61 72 28 63 6f 64 65 70 61 67 65  ideChar(codepage
19c0: 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  , 0, zFilename, 
19d0: 2d 31 2c 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  -1, zMbcsFilenam
19e0: 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  e, nByte);.  if(
19f0: 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
1a00: 20 66 72 65 65 28 7a 4d 62 63 73 46 69 6c 65 6e   free(zMbcsFilen
1a10: 61 6d 65 29 3b 0a 20 20 20 20 7a 4d 62 63 73 46  ame);.    zMbcsF
1a20: 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ilename = 0;.  }
1a30: 0a 20 20 72 65 74 75 72 6e 20 7a 4d 62 63 73 46  .  return zMbcsF
1a40: 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
1a50: 2a 20 43 6f 6e 76 65 72 74 20 6d 69 63 72 6f 73  * Convert micros
1a60: 6f 66 74 20 75 6e 69 63 6f 64 65 20 74 6f 20 6d  oft unicode to m
1a70: 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74  ultibyte charact
1a80: 65 72 20 73 74 72 69 6e 67 2c 20 62 61 73 65 64  er string, based
1a90: 20 6f 6e 20 74 68 65 0a 2a 2a 20 75 73 65 72 27   on the.** user'
1aa0: 73 20 41 6e 73 69 20 63 6f 64 65 70 61 67 65 2e  s Ansi codepage.
1ab0: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
1ac0: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
1ad0: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
1ae0: 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 6d 61 6c  ined from.** mal
1af0: 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  loc()..*/.static
1b00: 20 63 68 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f   char *unicodeTo
1b10: 4d 62 63 73 28 63 6f 6e 73 74 20 57 43 48 41 52  Mbcs(const WCHAR
1b20: 20 2a 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29   *zWideFilename)
1b30: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  {.  int nByte;. 
1b40: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1b50: 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65  ;.  int codepage
1b60: 20 3d 20 41 72 65 46 69 6c 65 41 70 69 73 41 4e   = AreFileApisAN
1b70: 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20  SI() ? CP_ACP : 
1b80: 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79  CP_OEMCP;..  nBy
1b90: 74 65 20 3d 20 57 69 64 65 43 68 61 72 54 6f 4d  te = WideCharToM
1ba0: 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67  ultiByte(codepag
1bb0: 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e  e, 0, zWideFilen
1bc0: 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30  ame, -1, 0, 0, 0
1bd0: 2c 20 30 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d  , 0);.  zFilenam
1be0: 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74  e = malloc( nByt
1bf0: 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65  e );.  if( zFile
1c00: 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  name==0 ){.    r
1c10: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
1c20: 42 79 74 65 20 3d 20 57 69 64 65 43 68 61 72 54  Byte = WideCharT
1c30: 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70  oMultiByte(codep
1c40: 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c  age, 0, zWideFil
1c50: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65  ename, -1, zFile
1c60: 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20  name, nByte,.   
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c80: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 29             0, 0)
1c90: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
1ca0: 20 30 20 29 7b 0a 20 20 20 20 66 72 65 65 28 7a   0 ){.    free(z
1cb0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Filename);.    z
1cc0: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
1cd0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65  }.  return zFile
1ce0: 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  name;.}../*.** C
1cf0: 6f 6e 76 65 72 74 20 6d 75 6c 74 69 62 79 74 65  onvert multibyte
1d00: 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e   character strin
1d10: 67 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61  g to UTF-8.  Spa
1d20: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a  ce to hold the.*
1d30: 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  * returned strin
1d40: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
1d50: 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  om malloc()..*/.
1d60: 73 74 61 74 69 63 20 63 68 61 72 20 2a 6d 62 63  static char *mbc
1d70: 73 54 6f 55 74 66 38 28 63 6f 6e 73 74 20 63 68  sToUtf8(const ch
1d80: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
1d90: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
1da0: 65 55 74 66 38 3b 0a 20 20 57 43 48 41 52 20 2a  eUtf8;.  WCHAR *
1db0: 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d  zTmpWide;..  zTm
1dc0: 70 57 69 64 65 20 3d 20 6d 62 63 73 54 6f 55 6e  pWide = mbcsToUn
1dd0: 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
1de0: 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65  ;.  if( zTmpWide
1df0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1e00: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  n 0;.  }.  zFile
1e10: 6e 61 6d 65 55 74 66 38 20 3d 20 75 6e 69 63 6f  nameUtf8 = unico
1e20: 64 65 54 6f 55 74 66 38 28 7a 54 6d 70 57 69 64  deToUtf8(zTmpWid
1e30: 65 29 3b 0a 20 20 66 72 65 65 28 7a 54 6d 70 57  e);.  free(zTmpW
1e40: 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  ide);.  return z
1e50: 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 7d 0a  FilenameUtf8;.}.
1e60: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 55  ./*.** Convert U
1e70: 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69 62 79 74  TF-8 to multibyt
1e80: 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69  e character stri
1e90: 6e 67 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  ng.  Space to ho
1ea0: 6c 64 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72  ld the .** retur
1eb0: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
1ec0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
1ed0: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
1ee0: 63 68 61 72 20 2a 75 74 66 38 54 6f 4d 62 63 73  char *utf8ToMbcs
1ef0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
1f00: 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  lename){.  char 
1f10: 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a  *zFilenameMbcs;.
1f20: 20 20 57 43 48 41 52 20 2a 7a 54 6d 70 57 69 64    WCHAR *zTmpWid
1f30: 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d  e;..  zTmpWide =
1f40: 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a   utf8ToUnicode(z
1f50: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
1f60: 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a   zTmpWide==0 ){.
1f70: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1f80: 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63  }.  zFilenameMbc
1f90: 73 20 3d 20 75 6e 69 63 6f 64 65 54 6f 4d 62 63  s = unicodeToMbc
1fa0: 73 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 66  s(zTmpWide);.  f
1fb0: 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20  ree(zTmpWide);. 
1fc0: 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d   return zFilenam
1fd0: 65 4d 62 63 73 3b 0a 7d 0a 0a 23 69 66 20 4f 53  eMbcs;.}..#if OS
1fe0: 5f 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  _WINCE./********
1ff0: 2a 2a 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 0a 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f  *.** This sectio
2040: 6e 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20  n contains code 
2050: 66 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a  for WinCE only..
2060: 2a 2f 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73  */./*.** Windows
2070: 43 45 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  CE does not have
2080: 20 61 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 66   a localtime() f
2090: 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 63 72 65  unction.  So cre
20a0: 61 74 65 20 61 0a 2a 2a 20 73 75 62 73 74 69 74  ate a.** substit
20b0: 75 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ute..*/.#include
20c0: 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 72 75 63 74   <time.h>.struct
20d0: 20 74 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f 63   tm *__cdecl loc
20e0: 61 6c 74 69 6d 65 28 63 6f 6e 73 74 20 74 69 6d  altime(const tim
20f0: 65 5f 74 20 2a 74 29 0a 7b 0a 20 20 73 74 61 74  e_t *t).{.  stat
2100: 69 63 20 73 74 72 75 63 74 20 74 6d 20 79 3b 0a  ic struct tm y;.
2110: 20 20 46 49 4c 45 54 49 4d 45 20 75 54 6d 2c 20    FILETIME uTm, 
2120: 6c 54 6d 3b 0a 20 20 53 59 53 54 45 4d 54 49 4d  lTm;.  SYSTEMTIM
2130: 45 20 70 54 6d 3b 0a 20 20 69 36 34 20 74 36 34  E pTm;.  i64 t64
2140: 3b 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20  ;.  t64 = *t;.  
2150: 74 36 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36  t64 = (t64 + 116
2160: 34 34 34 37 33 36 30 30 29 2a 31 30 30 30 30 30  44473600)*100000
2170: 30 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44  00;.  uTm.dwLowD
2180: 61 74 65 54 69 6d 65 20 3d 20 74 36 34 20 26 20  ateTime = t64 & 
2190: 30 78 46 46 46 46 46 46 46 46 3b 0a 20 20 75 54  0xFFFFFFFF;.  uT
21a0: 6d 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65  m.dwHighDateTime
21b0: 3d 20 74 36 34 20 3e 3e 20 33 32 3b 0a 20 20 46  = t64 >> 32;.  F
21c0: 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69  ileTimeToLocalFi
21d0: 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26 6c 54 6d  leTime(&uTm,&lTm
21e0: 29 3b 0a 20 20 46 69 6c 65 54 69 6d 65 54 6f 53  );.  FileTimeToS
21f0: 79 73 74 65 6d 54 69 6d 65 28 26 6c 54 6d 2c 26  ystemTime(&lTm,&
2200: 70 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f 79 65 61  pTm);.  y.tm_yea
2210: 72 20 3d 20 70 54 6d 2e 77 59 65 61 72 20 2d 20  r = pTm.wYear - 
2220: 31 39 30 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f 6e  1900;.  y.tm_mon
2230: 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20   = pTm.wMonth - 
2240: 31 3b 0a 20 20 79 2e 74 6d 5f 77 64 61 79 20 3d  1;.  y.tm_wday =
2250: 20 70 54 6d 2e 77 44 61 79 4f 66 57 65 65 6b 3b   pTm.wDayOfWeek;
2260: 0a 20 20 79 2e 74 6d 5f 6d 64 61 79 20 3d 20 70  .  y.tm_mday = p
2270: 54 6d 2e 77 44 61 79 3b 0a 20 20 79 2e 74 6d 5f  Tm.wDay;.  y.tm_
2280: 68 6f 75 72 20 3d 20 70 54 6d 2e 77 48 6f 75 72  hour = pTm.wHour
2290: 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20 70  ;.  y.tm_min = p
22a0: 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20 20 79 2e  Tm.wMinute;.  y.
22b0: 74 6d 5f 73 65 63 20 3d 20 70 54 6d 2e 77 53 65  tm_sec = pTm.wSe
22c0: 63 6f 6e 64 3b 0a 20 20 72 65 74 75 72 6e 20 26  cond;.  return &
22d0: 79 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 77 69  y;.}../* This wi
22e0: 6c 6c 20 6e 65 76 65 72 20 62 65 20 63 61 6c 6c  ll never be call
22f0: 65 64 2c 20 62 75 74 20 64 65 66 69 6e 65 64 20  ed, but defined 
2300: 74 6f 20 6d 61 6b 65 20 74 68 65 20 63 6f 64 65  to make the code
2310: 20 63 6f 6d 70 69 6c 65 20 2a 2f 0a 23 64 65 66   compile */.#def
2320: 69 6e 65 20 47 65 74 54 65 6d 70 50 61 74 68 41  ine GetTempPathA
2330: 28 61 2c 62 29 0a 0a 23 64 65 66 69 6e 65 20 4c  (a,b)..#define L
2340: 6f 63 6b 46 69 6c 65 28 61 2c 62 2c 63 2c 64 2c  ockFile(a,b,c,d,
2350: 65 29 20 20 20 20 20 20 20 77 69 6e 63 65 4c 6f  e)       winceLo
2360: 63 6b 46 69 6c 65 28 26 61 2c 20 62 2c 20 63 2c  ckFile(&a, b, c,
2370: 20 64 2c 20 65 29 0a 23 64 65 66 69 6e 65 20 55   d, e).#define U
2380: 6e 6c 6f 63 6b 46 69 6c 65 28 61 2c 62 2c 63 2c  nlockFile(a,b,c,
2390: 64 2c 65 29 20 20 20 20 20 77 69 6e 63 65 55 6e  d,e)     winceUn
23a0: 6c 6f 63 6b 46 69 6c 65 28 26 61 2c 20 62 2c 20  lockFile(&a, b, 
23b0: 63 2c 20 64 2c 20 65 29 0a 23 64 65 66 69 6e 65  c, d, e).#define
23c0: 20 4c 6f 63 6b 46 69 6c 65 45 78 28 61 2c 62 2c   LockFileEx(a,b,
23d0: 63 2c 64 2c 65 2c 66 29 20 20 20 77 69 6e 63 65  c,d,e,f)   wince
23e0: 4c 6f 63 6b 46 69 6c 65 45 78 28 26 61 2c 20 62  LockFileEx(&a, b
23f0: 2c 20 63 2c 20 64 2c 20 65 2c 20 66 29 0a 0a 23  , c, d, e, f)..#
2400: 64 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f 54 4f  define HANDLE_TO
2410: 5f 57 49 4e 46 49 4c 45 28 61 29 20 28 77 69 6e  _WINFILE(a) (win
2420: 46 69 6c 65 2a 29 26 28 28 63 68 61 72 2a 29 61  File*)&((char*)a
2430: 29 5b 2d 6f 66 66 73 65 74 6f 66 28 77 69 6e 46  )[-offsetof(winF
2440: 69 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41  ile,h)]../*.** A
2450: 63 71 75 69 72 65 20 61 20 6c 6f 63 6b 20 6f 6e  cquire a lock on
2460: 20 74 68 65 20 68 61 6e 64 6c 65 20 68 0a 2a 2f   the handle h.*/
2470: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
2480: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 48  ceMutexAcquire(H
2490: 41 4e 44 4c 45 20 68 29 7b 0a 20 20 20 44 57 4f  ANDLE h){.   DWO
24a0: 52 44 20 64 77 45 72 72 3b 0a 20 20 20 64 6f 20  RD dwErr;.   do 
24b0: 7b 0a 20 20 20 20 20 64 77 45 72 72 20 3d 20 57  {.     dwErr = W
24c0: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
24d0: 63 74 28 68 2c 20 49 4e 46 49 4e 49 54 45 29 3b  ct(h, INFINITE);
24e0: 0a 20 20 20 7d 20 77 68 69 6c 65 20 28 64 77 45  .   } while (dwE
24f0: 72 72 20 21 3d 20 57 41 49 54 5f 4f 42 4a 45 43  rr != WAIT_OBJEC
2500: 54 5f 30 20 26 26 20 64 77 45 72 72 20 21 3d 20  T_0 && dwErr != 
2510: 57 41 49 54 5f 41 42 41 4e 44 4f 4e 45 44 29 3b  WAIT_ABANDONED);
2520: 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  .}./*.** Release
2530: 20 61 20 6c 6f 63 6b 20 61 63 71 75 69 72 65 64   a lock acquired
2540: 20 62 79 20 77 69 6e 63 65 4d 75 74 65 78 41 63   by winceMutexAc
2550: 71 75 69 72 65 28 29 0a 2a 2f 0a 23 64 65 66 69  quire().*/.#defi
2560: 6e 65 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c  ne winceMutexRel
2570: 65 61 73 65 28 68 29 20 52 65 6c 65 61 73 65 4d  ease(h) ReleaseM
2580: 75 74 65 78 28 68 29 0a 0a 2f 2a 0a 2a 2a 20 43  utex(h)../*.** C
2590: 72 65 61 74 65 20 74 68 65 20 6d 75 74 65 78 20  reate the mutex 
25a0: 61 6e 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  and shared memor
25b0: 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  y used for locki
25c0: 6e 67 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a  ng in the file.*
25d0: 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  * descriptor pFi
25e0: 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  le.*/.static BOO
25f0: 4c 20 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63  L winceCreateLoc
2600: 6b 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  k(const char *zF
2610: 69 6c 65 6e 61 6d 65 2c 20 77 69 6e 46 69 6c 65  ilename, winFile
2620: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 57 43 48 41   *pFile){.  WCHA
2630: 52 20 2a 7a 54 6f 6b 3b 0a 20 20 57 43 48 41 52  R *zTok;.  WCHAR
2640: 20 2a 7a 4e 61 6d 65 20 3d 20 75 74 66 38 54 6f   *zName = utf8To
2650: 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d  Unicode(zFilenam
2660: 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74  e);.  BOOL bInit
2670: 20 3d 20 54 52 55 45 3b 0a 0a 20 20 2f 2a 20 49   = TRUE;..  /* I
2680: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f  nitialize the lo
2690: 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a  cal lockdata */.
26a0: 20 20 5a 65 72 6f 4d 65 6d 6f 72 79 28 26 70 46    ZeroMemory(&pF
26b0: 69 6c 65 2d 3e 6c 6f 63 61 6c 2c 20 73 69 7a 65  ile->local, size
26c0: 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29  of(pFile->local)
26d0: 29 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65  );..  /* Replace
26e0: 20 74 68 65 20 62 61 63 6b 73 6c 61 73 68 65 73   the backslashes
26f0: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61   from the filena
2700: 6d 65 20 61 6e 64 20 6c 6f 77 65 72 63 61 73 65  me and lowercase
2710: 20 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69   it.  ** to deri
2720: 76 65 20 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e  ve a mutex name.
2730: 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 43 68 61   */.  zTok = Cha
2740: 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a  rLowerW(zName);.
2750: 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54    for (;*zTok;zT
2760: 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a  ok++){.    if (*
2770: 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a  zTok == '\\') *z
2780: 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a  Tok = '_';.  }..
2790: 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e    /* Create/open
27a0: 20 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78   the named mutex
27b0: 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75   */.  pFile->hMu
27c0: 74 65 78 20 3d 20 43 72 65 61 74 65 4d 75 74 65  tex = CreateMute
27d0: 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c 20  xW(NULL, FALSE, 
27e0: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 21 70  zName);.  if (!p
27f0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20  File->hMutex){. 
2800: 20 20 20 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a     free(zName);.
2810: 20 20 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45      return FALSE
2820: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75  ;.  }..  /* Acqu
2830: 69 72 65 20 74 68 65 20 6d 75 74 65 78 20 62 65  ire the mutex be
2840: 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20  fore continuing 
2850: 2a 2f 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41  */.  winceMutexA
2860: 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d  cquire(pFile->hM
2870: 75 74 65 78 29 3b 0a 20 20 0a 20 20 2f 2a 20 53  utex);.  .  /* S
2880: 69 6e 63 65 20 74 68 65 20 6e 61 6d 65 73 20 6f  ince the names o
2890: 66 20 6e 61 6d 65 64 20 6d 75 74 65 78 65 73 2c  f named mutexes,
28a0: 20 73 65 6d 61 70 68 6f 72 65 73 2c 20 66 69 6c   semaphores, fil
28b0: 65 20 6d 61 70 70 69 6e 67 73 20 65 74 63 20 61  e mappings etc a
28c0: 72 65 20 0a 20 20 2a 2a 20 63 61 73 65 2d 73 65  re .  ** case-se
28d0: 6e 73 69 74 69 76 65 2c 20 74 61 6b 65 20 61 64  nsitive, take ad
28e0: 76 61 6e 74 61 67 65 20 6f 66 20 74 68 61 74 20  vantage of that 
28f0: 62 79 20 75 70 70 65 72 63 61 73 69 6e 67 20 74  by uppercasing t
2900: 68 65 20 6d 75 74 65 78 20 6e 61 6d 65 0a 20 20  he mutex name.  
2910: 2a 2a 20 61 6e 64 20 75 73 69 6e 67 20 74 68 61  ** and using tha
2920: 74 20 61 73 20 74 68 65 20 73 68 61 72 65 64 20  t as the shared 
2930: 66 69 6c 65 6d 61 70 70 69 6e 67 20 6e 61 6d 65  filemapping name
2940: 2e 0a 20 20 2a 2f 0a 20 20 43 68 61 72 55 70 70  ..  */.  CharUpp
2950: 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 46  erW(zName);.  pF
2960: 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 43  ile->hShared = C
2970: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
2980: 57 28 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  W(INVALID_HANDLE
2990: 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20  _VALUE, NULL,.  
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c0: 20 20 20 20 20 50 41 47 45 5f 52 45 41 44 57 52       PAGE_READWR
29d0: 49 54 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  ITE, 0, sizeof(w
29e0: 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20  inceLock),.     
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a10: 20 20 7a 4e 61 6d 65 29 3b 20 20 0a 0a 20 20 2f    zName);  ..  /
2a20: 2a 20 53 65 74 20 61 20 66 6c 61 67 20 74 68 61  * Set a flag tha
2a30: 74 20 69 6e 64 69 63 61 74 65 73 20 77 65 27 72  t indicates we'r
2a40: 65 20 74 68 65 20 66 69 72 73 74 20 74 6f 20 63  e the first to c
2a50: 72 65 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79  reate the memory
2a60: 20 73 6f 20 69 74 20 0a 20 20 2a 2a 20 6d 75 73   so it .  ** mus
2a70: 74 20 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61  t be zero-initia
2a80: 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 66 20 28 47  lized */.  if (G
2a90: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 3d 3d  etLastError() ==
2aa0: 20 45 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45   ERROR_ALREADY_E
2ab0: 58 49 53 54 53 29 7b 0a 20 20 20 20 62 49 6e 69  XISTS){.    bIni
2ac0: 74 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a  t = FALSE;.  }..
2ad0: 20 20 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a    free(zName);..
2ae0: 20 20 2f 2a 20 49 66 20 77 65 20 73 75 63 63 65    /* If we succe
2af0: 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67 20 74  eded in making t
2b00: 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
2b10: 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69 74 2e   handle, map it.
2b20: 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d   */.  if (pFile-
2b30: 3e 68 53 68 61 72 65 64 29 7b 0a 20 20 20 20 70  >hShared){.    p
2b40: 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d 20 28  File->shared = (
2b50: 77 69 6e 63 65 4c 6f 63 6b 2a 29 4d 61 70 56 69  winceLock*)MapVi
2b60: 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ewOfFile(pFile->
2b70: 68 53 68 61 72 65 64 2c 20 0a 20 20 20 20 20 20  hShared, .      
2b80: 20 20 20 20 20 20 20 46 49 4c 45 5f 4d 41 50 5f         FILE_MAP_
2b90: 52 45 41 44 7c 46 49 4c 45 5f 4d 41 50 5f 57 52  READ|FILE_MAP_WR
2ba0: 49 54 45 2c 20 30 2c 20 30 2c 20 73 69 7a 65 6f  ITE, 0, 0, sizeo
2bb0: 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20  f(winceLock));. 
2bc0: 20 20 20 2f 2a 20 49 66 20 6d 61 70 70 69 6e 67     /* If mapping
2bd0: 20 66 61 69 6c 65 64 2c 20 63 6c 6f 73 65 20 74   failed, close t
2be0: 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
2bf0: 20 68 61 6e 64 6c 65 20 61 6e 64 20 65 72 61 73   handle and eras
2c00: 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28  e it */.    if (
2c10: 21 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 29 7b  !pFile->shared){
2c20: 0a 20 20 20 20 20 20 43 6c 6f 73 65 48 61 6e 64  .      CloseHand
2c30: 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  le(pFile->hShare
2c40: 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  d);.      pFile-
2c50: 3e 68 53 68 61 72 65 64 20 3d 20 4e 55 4c 4c 3b  >hShared = NULL;
2c60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2c70: 20 49 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   If shared memor
2c80: 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63  y could not be c
2c90: 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63 6c 6f  reated, then clo
2ca0: 73 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64  se the mutex and
2cb0: 20 66 61 69 6c 20 2a 2f 0a 20 20 69 66 20 28 70   fail */.  if (p
2cc0: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 3d  File->hShared ==
2cd0: 20 4e 55 4c 4c 29 7b 0a 20 20 20 20 77 69 6e 63   NULL){.    winc
2ce0: 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46  eMutexRelease(pF
2cf0: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
2d00: 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46    CloseHandle(pF
2d10: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
2d20: 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20    pFile->hMutex 
2d30: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 74 75  = NULL;.    retu
2d40: 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 20 20  rn FALSE;.  }.  
2d50: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
2d60: 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
2d70: 72 79 20 69 66 20 77 65 27 72 65 20 73 75 70 70  ry if we're supp
2d80: 6f 73 65 64 20 74 6f 20 2a 2f 0a 20 20 69 66 20  osed to */.  if 
2d90: 28 62 49 6e 69 74 29 20 7b 0a 20 20 20 20 5a 65  (bInit) {.    Ze
2da0: 72 6f 4d 65 6d 6f 72 79 28 70 46 69 6c 65 2d 3e  roMemory(pFile->
2db0: 73 68 61 72 65 64 2c 20 73 69 7a 65 6f 66 28 77  shared, sizeof(w
2dc0: 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 7d 0a  inceLock));.  }.
2dd0: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c  .  winceMutexRel
2de0: 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
2df0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 52  ex);.  return TR
2e00: 55 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  UE;.}../*.** Des
2e10: 74 72 6f 79 20 74 68 65 20 70 61 72 74 20 6f 66  troy the part of
2e20: 20 77 69 6e 46 69 6c 65 20 74 68 61 74 20 64 65   winFile that de
2e30: 61 6c 73 20 77 69 74 68 20 77 69 6e 63 65 20 6c  als with wince l
2e40: 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ocks.*/.static v
2e50: 6f 69 64 20 77 69 6e 63 65 44 65 73 74 72 6f 79  oid winceDestroy
2e60: 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46  Lock(winFile *pF
2e70: 69 6c 65 29 7b 0a 20 20 69 66 20 28 70 46 69 6c  ile){.  if (pFil
2e80: 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20  e->hMutex){.    
2e90: 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65 20 6d  /* Acquire the m
2ea0: 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63  utex */.    winc
2eb0: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46  eMutexAcquire(pF
2ec0: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20  ile->hMutex);.. 
2ed0: 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
2ee0: 69 6e 67 20 62 6c 6f 63 6b 73 20 73 68 6f 75 6c  ing blocks shoul
2ef0: 64 20 70 72 6f 62 61 62 6c 79 20 61 73 73 65 72  d probably asser
2f00: 74 20 69 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  t in debug mode,
2f10: 20 62 75 74 20 74 68 65 79 0a 20 20 20 20 20 20   but they.      
2f20: 20 61 72 65 20 74 6f 20 63 6c 65 61 6e 75 70 20   are to cleanup 
2f30: 69 6e 20 63 61 73 65 20 61 6e 79 20 6c 6f 63 6b  in case any lock
2f40: 73 20 72 65 6d 61 69 6e 65 64 20 6f 70 65 6e 20  s remained open 
2f50: 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  */.    if (pFile
2f60: 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
2f70: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
2f80: 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73  shared->nReaders
2f90: 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   --;.    }.    i
2fa0: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
2fb0: 62 52 65 73 65 72 76 65 64 29 7b 0a 20 20 20 20  bReserved){.    
2fc0: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
2fd0: 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c  >bReserved = FAL
2fe0: 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  SE;.    }.    if
2ff0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
3000: 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20  Pending){.      
3010: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
3020: 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b  Pending = FALSE;
3030: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70  .    }.    if (p
3040: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63  File->local.bExc
3050: 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20 70  lusive){.      p
3060: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45  File->shared->bE
3070: 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45  xclusive = FALSE
3080: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
3090: 44 65 2d 72 65 66 65 72 65 6e 63 65 20 61 6e 64  De-reference and
30a0: 20 63 6c 6f 73 65 20 6f 75 72 20 63 6f 70 79 20   close our copy 
30b0: 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  of the shared me
30c0: 6d 6f 72 79 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  mory handle */. 
30d0: 20 20 20 55 6e 6d 61 70 56 69 65 77 4f 66 46 69     UnmapViewOfFi
30e0: 6c 65 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  le(pFile->shared
30f0: 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64  );.    CloseHand
3100: 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  le(pFile->hShare
3110: 64 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 46 69  d);..    if( pFi
3120: 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
3130: 73 65 20 29 7b 0a 20 20 20 20 20 20 44 65 6c 65  se ){.      Dele
3140: 74 65 46 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a  teFileW(pFile->z
3150: 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a  DeleteOnClose);.
3160: 20 20 20 20 20 20 66 72 65 65 28 70 46 69 6c 65        free(pFile
3170: 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
3180: 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
3190: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 3d  zDeleteOnClose =
31a0: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
31b0: 2a 20 44 6f 6e 65 20 77 69 74 68 20 74 68 65 20  * Done with the 
31c0: 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e  mutex */.    win
31d0: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
31e0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 20 20  File->hMutex);  
31f0: 20 20 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64    .    CloseHand
3200: 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  le(pFile->hMutex
3210: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d  );.    pFile->hM
3220: 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  utex = NULL;.  }
3230: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e 20 69 6d  .}../* .** An im
3240: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
3250: 74 68 65 20 4c 6f 63 6b 46 69 6c 65 28 29 20 41  the LockFile() A
3260: 50 49 20 6f 66 20 77 69 6e 64 6f 77 73 20 66 6f  PI of windows fo
3270: 72 20 77 69 6e 63 65 0a 2a 2f 0a 73 74 61 74 69  r wince.*/.stati
3280: 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b  c BOOL winceLock
3290: 46 69 6c 65 28 0a 20 20 48 41 4e 44 4c 45 20 2a  File(.  HANDLE *
32a0: 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20  phFile,.  DWORD 
32b0: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c  dwFileOffsetLow,
32c0: 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f  .  DWORD dwFileO
32d0: 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f  ffsetHigh,.  DWO
32e0: 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
32f0: 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57  sToLockLow,.  DW
3300: 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
3310: 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a  esToLockHigh.){.
3320: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
3330: 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e   = HANDLE_TO_WIN
3340: 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20  FILE(phFile);.  
3350: 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46  BOOL bReturn = F
3360: 41 4c 53 45 3b 0a 0a 20 20 69 66 20 28 21 70 46  ALSE;..  if (!pF
3370: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74  ile->hMutex) ret
3380: 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63  urn TRUE;.  winc
3390: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46  eMutexAcquire(pF
33a0: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20  ile->hMutex);.. 
33b0: 20 2f 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20 65   /* Wanting an e
33c0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a  xclusive lock? *
33d0: 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66  /.  if (dwFileOf
33e0: 66 73 65 74 4c 6f 77 20 3d 3d 20 53 48 41 52 45  fsetLow == SHARE
33f0: 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20 20 26  D_FIRST.       &
3400: 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
3410: 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 53 48 41  ToLockLow == SHA
3420: 52 45 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69  RED_SIZE){.    i
3430: 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
3440: 2d 3e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 20  ->nReaders == 0 
3450: 26 26 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  && pFile->shared
3460: 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20  ->bExclusive == 
3470: 30 29 7b 0a 20 20 20 20 20 20 20 70 46 69 6c 65  0){.       pFile
3480: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
3490: 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20  sive = TRUE;.   
34a0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
34b0: 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52  .bExclusive = TR
34c0: 55 45 3b 0a 20 20 20 20 20 20 20 62 52 65 74 75  UE;.       bRetu
34d0: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
34e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20  .  }..  /* Want 
34f0: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b  a read-only lock
3500: 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  ? */.  else if (
3510: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
3520: 20 3e 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54   >= SHARED_FIRST
3530: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
3540: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
3550: 3c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b  < SHARED_FIRST +
3560: 20 53 48 41 52 45 44 5f 53 49 5a 45 29 20 26 26   SHARED_SIZE) &&
3570: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 4e 75  .            nNu
3580: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
3590: 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
35a0: 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
35b0: 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d  d->bExclusive ==
35c0: 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65   0){.      pFile
35d0: 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
35e0: 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28 70   ++;.      if (p
35f0: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
3600: 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20  ders == 1){.    
3610: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
3620: 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a  d->nReaders ++;.
3630: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52        }.      bR
3640: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
3650: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
3660: 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63  nt a pending loc
3670: 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  k? */.  else if 
3680: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
3690: 20 3d 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45   == PENDING_BYTE
36a0: 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
36b0: 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  esToLockLow == 1
36c0: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20  ){.    /* If no 
36d0: 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73  pending lock has
36e0: 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 2c 20   been acquired, 
36f0: 74 68 65 6e 20 61 63 71 75 69 72 65 20 69 74 20  then acquire it 
3700: 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  */.    if (pFile
3710: 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69  ->shared->bPendi
3720: 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20  ng == 0) {.     
3730: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
3740: 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b  bPending = TRUE;
3750: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
3760: 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 54  cal.bPending = T
3770: 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75  RUE;.      bRetu
3780: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
3790: 0a 20 20 7d 0a 20 20 2f 2a 20 57 61 6e 74 20 61  .  }.  /* Want a
37a0: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 3f 20   reserved lock? 
37b0: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
37c0: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
37d0: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 26   RESERVED_BYTE &
37e0: 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
37f0: 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  ToLockLow == 1){
3800: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
3810: 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65  shared->bReserve
3820: 64 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20  d == 0) {.      
3830: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
3840: 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b  Reserved = TRUE;
3850: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
3860: 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20  cal.bReserved = 
3870: 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74  TRUE;.      bRet
3880: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
3890: 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75  }.  }..  winceMu
38a0: 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
38b0: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74  ->hMutex);.  ret
38c0: 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a  urn bReturn;.}..
38d0: 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65  /*.** An impleme
38e0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 55  ntation of the U
38f0: 6e 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f 66  nlockFile API of
3900: 20 77 69 6e 64 6f 77 73 20 66 6f 72 20 77 69 6e   windows for win
3910: 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  ce.*/.static BOO
3920: 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c  L winceUnlockFil
3930: 65 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46  e(.  HANDLE *phF
3940: 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  ile,.  DWORD dwF
3950: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20  ileOffsetLow,.  
3960: 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
3970: 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20  etHigh,.  DWORD 
3980: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
3990: 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f  UnlockLow,.  DWO
39a0: 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
39b0: 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b  sToUnlockHigh.){
39c0: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
39d0: 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49  e = HANDLE_TO_WI
39e0: 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20  NFILE(phFile);. 
39f0: 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20   BOOL bReturn = 
3a00: 46 41 4c 53 45 3b 0a 0a 20 20 69 66 20 28 21 70  FALSE;..  if (!p
3a10: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65  File->hMutex) re
3a20: 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e  turn TRUE;.  win
3a30: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
3a40: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a  File->hMutex);..
3a50: 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61    /* Releasing a
3a60: 20 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20   reader lock or 
3a70: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
3a80: 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c  k */.  if (dwFil
3a90: 65 4f 66 66 73 65 74 4c 6f 77 20 3e 3d 20 53 48  eOffsetLow >= SH
3aa0: 41 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20 20  ARED_FIRST &&.  
3ab0: 20 20 20 20 20 64 77 46 69 6c 65 4f 66 66 73 65       dwFileOffse
3ac0: 74 4c 6f 77 20 3c 20 53 48 41 52 45 44 5f 46 49  tLow < SHARED_FI
3ad0: 52 53 54 20 2b 20 53 48 41 52 45 44 5f 53 49 5a  RST + SHARED_SIZ
3ae0: 45 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20 77  E){.    /* Did w
3af0: 65 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  e have an exclus
3b00: 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20  ive lock? */.   
3b10: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
3b20: 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20  l.bExclusive){. 
3b30: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
3b40: 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46  l.bExclusive = F
3b50: 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  ALSE;.      pFil
3b60: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
3b70: 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20  usive = FALSE;. 
3b80: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
3b90: 52 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  RUE;.    }..    
3ba0: 2f 2a 20 44 69 64 20 77 65 20 6a 75 73 74 20 68  /* Did we just h
3bb0: 61 76 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63  ave a reader loc
3bc0: 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  k? */.    else i
3bd0: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
3be0: 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20  nReaders){.     
3bf0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52   pFile->local.nR
3c00: 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20  eaders --;.     
3c10: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
3c20: 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 29  l.nReaders == 0)
3c30: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
3c40: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
3c50: 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20  nReaders --;.   
3c60: 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75     }.      bRetu
3c70: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
3c80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  .  }..  /* Relea
3c90: 73 69 6e 67 20 61 20 70 65 6e 64 69 6e 67 20 6c  sing a pending l
3ca0: 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ock */.  else if
3cb0: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
3cc0: 77 20 3d 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  w == PENDING_BYT
3cd0: 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79  E && nNumberOfBy
3ce0: 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d  tesToUnlockLow =
3cf0: 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46  = 1){.    if (pF
3d00: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64  ile->local.bPend
3d10: 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ing){.      pFil
3d20: 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e  e->local.bPendin
3d30: 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  g = FALSE;.     
3d40: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
3d50: 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45  bPending = FALSE
3d60: 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  ;.      bReturn 
3d70: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
3d80: 7d 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67  }.  /* Releasing
3d90: 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
3da0: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64   */.  else if (d
3db0: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
3dc0: 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20  = RESERVED_BYTE 
3dd0: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
3de0: 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
3df0: 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  1){.    if (pFil
3e00: 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
3e10: 65 64 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ed) {.      pFil
3e20: 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
3e30: 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ed = FALSE;.    
3e40: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
3e50: 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c  >bReserved = FAL
3e60: 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  SE;.      bRetur
3e70: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
3e80: 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65    }..  winceMute
3e90: 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e  xRelease(pFile->
3ea0: 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  hMutex);.  retur
3eb0: 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  n bReturn;.}../*
3ec0: 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74  .** An implement
3ed0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63  ation of the Loc
3ee0: 6b 46 69 6c 65 45 78 28 29 20 41 50 49 20 6f 66  kFileEx() API of
3ef0: 20 77 69 6e 64 6f 77 73 20 66 6f 72 20 77 69 6e   windows for win
3f00: 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  ce.*/.static BOO
3f10: 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45  L winceLockFileE
3f20: 78 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46  x(.  HANDLE *phF
3f30: 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  ile,.  DWORD dwF
3f40: 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 64 77  lags,.  DWORD dw
3f50: 52 65 73 65 72 76 65 64 2c 0a 20 20 44 57 4f 52  Reserved,.  DWOR
3f60: 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
3f70: 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f  ToLockLow,.  DWO
3f80: 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
3f90: 73 54 6f 4c 6f 63 6b 48 69 67 68 2c 0a 20 20 4c  sToLockHigh,.  L
3fa0: 50 4f 56 45 52 4c 41 50 50 45 44 20 6c 70 4f 76  POVERLAPPED lpOv
3fb0: 65 72 6c 61 70 70 65 64 0a 29 7b 0a 20 20 2f 2a  erlapped.){.  /*
3fc0: 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 77   If the caller w
3fd0: 61 6e 74 73 20 61 20 73 68 61 72 65 64 20 72 65  ants a shared re
3fe0: 61 64 20 6c 6f 63 6b 2c 20 66 6f 72 77 61 72 64  ad lock, forward
3ff0: 20 74 68 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20   this call.  ** 
4000: 74 6f 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65  to winceLockFile
4010: 20 2a 2f 0a 20 20 69 66 20 28 6c 70 4f 76 65 72   */.  if (lpOver
4020: 6c 61 70 70 65 64 2d 3e 4f 66 66 73 65 74 20 3d  lapped->Offset =
4030: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 26  = SHARED_FIRST &
4040: 26 0a 20 20 20 20 20 20 64 77 46 6c 61 67 73 20  &.      dwFlags 
4050: 3d 3d 20 31 20 26 26 0a 20 20 20 20 20 20 6e 4e  == 1 &&.      nN
4060: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
4070: 63 6b 4c 6f 77 20 3d 3d 20 53 48 41 52 45 44 5f  ckLow == SHARED_
4080: 53 49 5a 45 29 7b 0a 20 20 20 20 72 65 74 75 72  SIZE){.    retur
4090: 6e 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28  n winceLockFile(
40a0: 70 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46  phFile, SHARED_F
40b0: 49 52 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  IRST, 0, 1, 0);.
40c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 46 41 4c    }.  return FAL
40d0: 53 45 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20  SE;.}./*.** End 
40e0: 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  of the special c
40f0: 6f 64 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a  ode for wince.**
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: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e  ***********/.#en
4150: 64 69 66 20 2f 2a 20 4f 53 5f 57 49 4e 43 45 20  dif /* OS_WINCE 
4160: 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
4170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
41a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
41b0: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67  **.** The next g
41c0: 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73  roup of routines
41d0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49   implement the I
41e0: 2f 4f 20 6d 65 74 68 6f 64 73 20 73 70 65 63 69  /O methods speci
41f0: 66 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73  fied.** by the s
4200: 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
4210: 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a  s object..******
4220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4260: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
4270: 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
4280: 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65 70 6f 72  *.** It is repor
4290: 74 65 64 20 74 68 61 74 20 61 6e 20 61 74 74 65  ted that an atte
42a0: 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20 61 20 68  mpt to close a h
42b0: 61 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65  andle might some
42c0: 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20  times.** fail.  
42d0: 54 68 69 73 20 69 73 20 61 20 76 65 72 79 20 75  This is a very u
42e0: 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72 65 73 75  nreasonable resu
42f0: 6c 74 2c 20 62 75 74 20 77 69 6e 64 6f 77 73 20  lt, but windows 
4300: 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20  is notorious.** 
4310: 66 6f 72 20 62 65 69 6e 67 20 75 6e 72 65 61 73  for being unreas
4320: 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e  onable so I do n
4330: 6f 74 20 64 6f 75 62 74 20 74 68 61 74 20 69 74  ot doubt that it
4340: 20 6d 69 67 68 74 20 68 61 70 70 65 6e 2e 20 20   might happen.  
4350: 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20  If.** the close 
4360: 66 61 69 6c 73 2c 20 77 65 20 70 61 75 73 65 20  fails, we pause 
4370: 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73 65 63  for 100 millisec
4380: 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 61 67 61  onds and try aga
4390: 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20  in.  As.** many 
43a0: 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45  as MX_CLOSE_ATTE
43b0: 4d 50 54 20 61 74 74 65 6d 70 74 73 20 74 6f 20  MPT attempts to 
43c0: 63 6c 6f 73 65 20 74 68 65 20 68 61 6e 64 6c 65  close the handle
43d0: 20 61 72 65 20 6d 61 64 65 20 62 65 66 6f 72 65   are made before
43e0: 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70 20 61 6e  .** giving up an
43f0: 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  d returning an e
4400: 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rror..*/.#define
4410: 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50   MX_CLOSE_ATTEMP
4420: 54 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77  T 3.static int w
4430: 69 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  inClose(sqlite3_
4440: 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74  file *id){.  int
4450: 20 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20   rc, cnt = 0;.  
4460: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
4470: 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
4480: 20 4f 53 54 52 41 43 45 32 28 22 43 4c 4f 53 45   OSTRACE2("CLOSE
4490: 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %d\n", pFile->h
44a0: 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20  );.  do{.    rc 
44b0: 3d 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  = CloseHandle(pF
44c0: 69 6c 65 2d 3e 68 29 3b 0a 20 20 7d 77 68 69 6c  ile->h);.  }whil
44d0: 65 28 20 72 63 3d 3d 30 20 26 26 20 63 6e 74 2b  e( rc==0 && cnt+
44e0: 2b 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54  + < MX_CLOSE_ATT
44f0: 45 4d 50 54 20 26 26 20 28 53 6c 65 65 70 28 31  EMPT && (Sleep(1
4500: 30 30 29 2c 20 31 29 20 29 3b 0a 23 69 66 20 4f  00), 1) );.#if O
4510: 53 5f 57 49 4e 43 45 0a 20 20 77 69 6e 63 65 44  S_WINCE.  winceD
4520: 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65  estroyLock(pFile
4530: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 4f 70 65 6e  );.#endif.  Open
4540: 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 72  Counter(-1);.  r
4550: 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54  eturn rc ? SQLIT
4560: 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f  E_OK : SQLITE_IO
4570: 45 52 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f  ERR;.}../*.** So
4580: 6d 65 20 6d 69 63 72 6f 73 6f 66 74 20 63 6f 6d  me microsoft com
4590: 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73  pilers lack this
45a0: 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a   definition..*/.
45b0: 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f  #ifndef INVALID_
45c0: 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
45d0: 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49  .# define INVALI
45e0: 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
45f0: 45 52 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23  ER ((DWORD)-1).#
4600: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
4610: 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69  d data from a fi
4620: 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72  le into a buffer
4630: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
4640: 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79  _OK if all.** by
4650: 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75  tes were read su
4660: 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53  ccessfully and S
4670: 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61  QLITE_IOERR if a
4680: 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
4690: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
46a0: 20 69 6e 74 20 77 69 6e 52 65 61 64 28 0a 20 20   int winRead(.  
46b0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
46c0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ,          /* Fi
46d0: 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  le to read from 
46e0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  */.  void *pBuf,
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4700: 2f 2a 20 57 72 69 74 65 20 63 6f 6e 74 65 6e 74  /* Write content
4710: 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
4720: 72 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20  r */.  int amt, 
4730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4740: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
4750: 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a  ytes to read */.
4760: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
4770: 6f 66 66 73 65 74 20 20 20 20 20 20 20 2f 2a 20  offset       /* 
4780: 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 61 74  Begin reading at
4790: 20 74 68 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a   this offset */.
47a0: 29 7b 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42  ){.  LONG upperB
47b0: 69 74 73 20 3d 20 28 6f 66 66 73 65 74 3e 3e 33  its = (offset>>3
47c0: 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66 3b  2) & 0x7fffffff;
47d0: 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74  .  LONG lowerBit
47e0: 73 20 3d 20 6f 66 66 73 65 74 20 26 20 30 78 66  s = offset & 0xf
47f0: 66 66 66 66 66 66 66 3b 0a 20 20 44 57 4f 52 44  fffffff;.  DWORD
4800: 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 67 6f 74   rc;.  DWORD got
4810: 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  ;.  winFile *pFi
4820: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
4830: 64 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  d;.  assert( id!
4840: 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  =0 );.  Simulate
4850: 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
4860: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
4870: 29 3b 0a 20 20 4f 53 54 52 41 43 45 33 28 22 52  );.  OSTRACE3("R
4880: 45 41 44 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e  EAD %d lock=%d\n
4890: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69  ", pFile->h, pFi
48a0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  le->locktype);. 
48b0: 20 72 63 20 3d 20 53 65 74 46 69 6c 65 50 6f 69   rc = SetFilePoi
48c0: 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c  nter(pFile->h, l
48d0: 6f 77 65 72 42 69 74 73 2c 20 26 75 70 70 65 72  owerBits, &upper
48e0: 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e  Bits, FILE_BEGIN
48f0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 49 4e 56  );.  if( rc==INV
4900: 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f  ALID_SET_FILE_PO
4910: 49 4e 54 45 52 20 26 26 20 47 65 74 4c 61 73 74  INTER && GetLast
4920: 45 72 72 6f 72 28 29 21 3d 4e 4f 5f 45 52 52 4f  Error()!=NO_ERRO
4930: 52 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  R ){.    return 
4940: 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d  SQLITE_FULL;.  }
4950: 0a 20 20 69 66 28 20 21 52 65 61 64 46 69 6c 65  .  if( !ReadFile
4960: 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c  (pFile->h, pBuf,
4970: 20 61 6d 74 2c 20 26 67 6f 74 2c 20 30 29 20 29   amt, &got, 0) )
4980: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
4990: 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a  ITE_IOERR_READ;.
49a0: 20 20 7d 0a 20 20 69 66 28 20 67 6f 74 3d 3d 28    }.  if( got==(
49b0: 44 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20 20  DWORD)amt ){.   
49c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
49d0: 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
49e0: 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29  memset(&((char*)
49f0: 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61  pBuf)[got], 0, a
4a00: 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74  mt-got);.    ret
4a10: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
4a20: 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d  _SHORT_READ;.  }
4a30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
4a40: 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
4a50: 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20  er into a file. 
4a60: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
4a70: 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20  K on success.** 
4a80: 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
4a90: 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c  ror code on fail
4aa0: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
4ab0: 6e 74 20 77 69 6e 57 72 69 74 65 28 0a 20 20 73  nt winWrite(.  s
4ac0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
4ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
4ae0: 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 2a   to write into *
4af0: 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
4b00: 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 2f 2a  pBuf,         /*
4b10: 20 54 68 65 20 62 79 74 65 73 20 74 6f 20 62 65   The bytes to be
4b20: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
4b30: 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20  t amt,          
4b40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4b50: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77 72  r of bytes to wr
4b60: 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ite */.  sqlite3
4b70: 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20  _int64 offset   
4b80: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
4b90: 6f 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  o the file to be
4ba0: 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a  gin writing at *
4bb0: 2f 0a 29 7b 0a 20 20 4c 4f 4e 47 20 75 70 70 65  /.){.  LONG uppe
4bc0: 72 42 69 74 73 20 3d 20 28 6f 66 66 73 65 74 3e  rBits = (offset>
4bd0: 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66  >32) & 0x7ffffff
4be0: 66 3b 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42  f;.  LONG lowerB
4bf0: 69 74 73 20 3d 20 6f 66 66 73 65 74 20 26 20 30  its = offset & 0
4c00: 78 66 66 66 66 66 66 66 66 3b 0a 20 20 44 57 4f  xffffffff;.  DWO
4c10: 52 44 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 77  RD rc;.  DWORD w
4c20: 72 6f 74 65 3b 0a 20 20 77 69 6e 46 69 6c 65 20  rote;.  winFile 
4c30: 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
4c40: 65 2a 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28  e*)id;.  assert(
4c50: 20 69 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75   id!=0 );.  Simu
4c60: 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
4c70: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
4c80: 57 52 49 54 45 29 3b 0a 20 20 53 69 6d 75 6c 61  WRITE);.  Simula
4c90: 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
4ca0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
4cb0: 4c 4c 29 3b 0a 20 20 4f 53 54 52 41 43 45 33 28  LL);.  OSTRACE3(
4cc0: 22 57 52 49 54 45 20 25 64 20 6c 6f 63 6b 3d 25  "WRITE %d lock=%
4cd0: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
4ce0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
4cf0: 3b 0a 20 20 72 63 20 3d 20 53 65 74 46 69 6c 65  ;.  rc = SetFile
4d00: 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68  Pointer(pFile->h
4d10: 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70  , lowerBits, &up
4d20: 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45  perBits, FILE_BE
4d30: 47 49 4e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  GIN);.  if( rc==
4d40: 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
4d50: 5f 50 4f 49 4e 54 45 52 20 26 26 20 47 65 74 4c  _POINTER && GetL
4d60: 61 73 74 45 72 72 6f 72 28 29 21 3d 4e 4f 5f 45  astError()!=NO_E
4d70: 52 52 4f 52 20 29 7b 0a 20 20 20 20 72 65 74 75  RROR ){.    retu
4d80: 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
4d90: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 61 6d    }.  assert( am
4da0: 74 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 0a  t>0 );.  while(.
4db0: 20 20 20 20 20 61 6d 74 3e 30 0a 20 20 20 20 20       amt>0.     
4dc0: 26 26 20 28 72 63 20 3d 20 57 72 69 74 65 46 69  && (rc = WriteFi
4dd0: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75  le(pFile->h, pBu
4de0: 66 2c 20 61 6d 74 2c 20 26 77 72 6f 74 65 2c 20  f, amt, &wrote, 
4df0: 30 29 29 21 3d 30 0a 20 20 20 20 20 26 26 20 77  0))!=0.     && w
4e00: 72 6f 74 65 3e 30 0a 20 20 29 7b 0a 20 20 20 20  rote>0.  ){.    
4e10: 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20  amt -= wrote;.  
4e20: 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72    pBuf = &((char
4e30: 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a  *)pBuf)[wrote];.
4e40: 20 20 7d 0a 20 20 69 66 28 20 21 72 63 20 7c 7c    }.  if( !rc ||
4e50: 20 61 6d 74 3e 28 69 6e 74 29 77 72 6f 74 65 20   amt>(int)wrote 
4e60: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
4e70: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20  LITE_FULL;.  }. 
4e80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4e90: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  K;.}../*.** Trun
4ea0: 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c  cate an open fil
4eb0: 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64  e to a specified
4ec0: 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20   size.*/.static 
4ed0: 69 6e 74 20 77 69 6e 54 72 75 6e 63 61 74 65 28  int winTruncate(
4ee0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
4ef0: 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  , i64 nByte){.  
4f00: 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73 20 3d  LONG upperBits =
4f10: 20 28 6e 42 79 74 65 3e 3e 33 32 29 20 26 20 30   (nByte>>32) & 0
4f20: 78 37 66 66 66 66 66 66 66 3b 0a 20 20 4c 4f 4e  x7fffffff;.  LON
4f30: 47 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 6e 42  G lowerBits = nB
4f40: 79 74 65 20 26 20 30 78 66 66 66 66 66 66 66 66  yte & 0xffffffff
4f50: 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  ;.  winFile *pFi
4f60: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
4f70: 64 3b 0a 20 20 4f 53 54 52 41 43 45 33 28 22 54  d;.  OSTRACE3("T
4f80: 52 55 4e 43 41 54 45 20 25 64 20 25 6c 6c 64 5c  RUNCATE %d %lld\
4f90: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42  n", pFile->h, nB
4fa0: 79 74 65 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  yte);.  Simulate
4fb0: 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
4fc0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
4fd0: 43 41 54 45 29 3b 0a 20 20 53 65 74 46 69 6c 65  CATE);.  SetFile
4fe0: 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68  Pointer(pFile->h
4ff0: 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70  , lowerBits, &up
5000: 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45  perBits, FILE_BE
5010: 47 49 4e 29 3b 0a 20 20 53 65 74 45 6e 64 4f 66  GIN);.  SetEndOf
5020: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a  File(pFile->h);.
5030: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5040: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  OK;.}../*.** Mak
5050: 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65  e sure all write
5060: 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61  s to a particula
5070: 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69  r file are commi
5080: 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f  tted to disk..*/
5090: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
50a0: 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ync(sqlite3_file
50b0: 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29   *id, int flags)
50c0: 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
50d0: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
50e0: 64 3b 0a 20 20 4f 53 54 52 41 43 45 33 28 22 53  d;.  OSTRACE3("S
50f0: 59 4e 43 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e  YNC %d lock=%d\n
5100: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69  ", pFile->h, pFi
5110: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  le->locktype);. 
5120: 20 69 66 28 20 46 6c 75 73 68 46 69 6c 65 42 75   if( FlushFileBu
5130: 66 66 65 72 73 28 70 46 69 6c 65 2d 3e 68 29 20  ffers(pFile->h) 
5140: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
5150: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
5160: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
5170: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 7d  ITE_IOERR;.  }.}
5180: 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
5190: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  e the current si
51a0: 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20  ze of a file in 
51b0: 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  bytes.*/.static 
51c0: 69 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a 65 28  int winFileSize(
51d0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
51e0: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
51f0: 2a 70 53 69 7a 65 29 7b 0a 20 20 77 69 6e 46 69  *pSize){.  winFi
5200: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
5210: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52  File*)id;.  DWOR
5220: 44 20 75 70 70 65 72 42 69 74 73 2c 20 6c 6f 77  D upperBits, low
5230: 65 72 42 69 74 73 3b 0a 20 20 53 69 6d 75 6c 61  erBits;.  Simula
5240: 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
5250: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
5260: 54 41 54 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74  TAT);.  lowerBit
5270: 73 20 3d 20 47 65 74 46 69 6c 65 53 69 7a 65 28  s = GetFileSize(
5280: 70 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65 72  pFile->h, &upper
5290: 42 69 74 73 29 3b 0a 20 20 2a 70 53 69 7a 65 20  Bits);.  *pSize 
52a0: 3d 20 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74  = (((sqlite3_int
52b0: 36 34 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33  64)upperBits)<<3
52c0: 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a  2) + lowerBits;.
52d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
52e0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43  OK;.}../*.** LOC
52f0: 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
5300: 49 41 54 45 4c 59 20 69 73 20 75 6e 64 65 66 69  IATELY is undefi
5310: 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e 64  ned on some Wind
5320: 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a  ows systems..*/.
5330: 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45  #ifndef LOCKFILE
5340: 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
5350: 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46  Y.# define LOCKF
5360: 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
5370: 54 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a 2f  TELY 1.#endif../
5380: 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72  *.** Acquire a r
5390: 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44  eader lock..** D
53a0: 69 66 66 65 72 65 6e 74 20 41 50 49 20 72 6f 75  ifferent API rou
53b0: 74 69 6e 65 73 20 61 72 65 20 63 61 6c 6c 65 64  tines are called
53c0: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
53d0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 69  ether or not thi
53e0: 73 0a 2a 2a 20 69 73 20 57 69 6e 39 35 20 6f 72  s.** is Win95 or
53f0: 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69   WinNT..*/.stati
5400: 63 20 69 6e 74 20 67 65 74 52 65 61 64 4c 6f 63  c int getReadLoc
5410: 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  k(winFile *pFile
5420: 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ){.  int res;.  
5430: 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
5440: 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c    OVERLAPPED ovl
5450: 70 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73  p;.    ovlp.Offs
5460: 65 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  et = SHARED_FIRS
5470: 54 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73  T;.    ovlp.Offs
5480: 65 74 48 69 67 68 20 3d 20 30 3b 0a 20 20 20 20  etHigh = 0;.    
5490: 6f 76 6c 70 2e 68 45 76 65 6e 74 20 3d 20 30 3b  ovlp.hEvent = 0;
54a0: 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46  .    res = LockF
54b0: 69 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20  ileEx(pFile->h, 
54c0: 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
54d0: 4d 45 44 49 41 54 45 4c 59 2c 0a 20 20 20 20 20  MEDIATELY,.     
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54f0: 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20  0, SHARED_SIZE, 
5500: 30 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c  0, &ovlp);.  }el
5510: 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 3b 0a  se{.    int lk;.
5520: 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f      sqlite3Rando
5530: 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 6c 6b 29  mness(sizeof(lk)
5540: 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 70 46 69 6c  , &lk);.    pFil
5550: 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e->sharedLockByt
5560: 65 20 3d 20 28 6c 6b 20 26 20 30 78 37 66 66 66  e = (lk & 0x7fff
5570: 66 66 66 66 29 25 28 53 48 41 52 45 44 5f 53 49  ffff)%(SHARED_SI
5580: 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 72 65 73  ZE - 1);.    res
5590: 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c   = LockFile(pFil
55a0: 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
55b0: 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  ST+pFile->shared
55c0: 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20  LockByte, 0, 1, 
55d0: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
55e0: 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   res;.}../*.** U
55f0: 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a  ndo a readlock.*
5600: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 6c  /.static int unl
5610: 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46  ockReadLock(winF
5620: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
5630: 6e 74 20 72 65 73 3b 0a 20 20 69 66 28 20 69 73  nt res;.  if( is
5640: 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65 73 20  NT() ){.    res 
5650: 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69  = UnlockFile(pFi
5660: 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
5670: 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53  RST, 0, SHARED_S
5680: 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  IZE, 0);.  }else
5690: 7b 0a 20 20 20 20 72 65 73 20 3d 20 55 6e 6c 6f  {.    res = Unlo
56a0: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
56b0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20   SHARED_FIRST + 
56c0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
56d0: 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b  kByte, 0, 1, 0);
56e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
56f0: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  s;.}../*.** Lock
5700: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
5710: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
5720: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c  d by parameter l
5730: 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a  ocktype - one.**
5740: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
5750: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
5760: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
5770: 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
5780: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
5790: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
57a0: 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
57b0: 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
57c0: 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
57d0: 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
57e0: 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
57f0: 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
5800: 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
5810: 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
5820: 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
5830: 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
5840: 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
5850: 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
5860: 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
5870: 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
5880: 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
5890: 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
58a0: 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
58b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
58c0: 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
58d0: 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
58e0: 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
58f0: 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
5900: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
5910: 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
5920: 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
5930: 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
5940: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
5950: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
5960: 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
5970: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
5980: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
5990: 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
59a0: 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
59b0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
59c0: 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
59d0: 6c 6f 63 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e  lock.  The winUn
59e0: 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a  lock() routine.*
59f0: 2a 20 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63  * erases all loc
5a00: 6b 73 20 61 74 20 6f 6e 63 65 20 61 6e 64 20 72  ks at once and r
5a10: 65 74 75 72 6e 73 20 75 73 20 69 6d 6d 65 64 69  eturns us immedi
5a20: 61 74 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67  ately to locking
5a30: 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20   level 0..** It 
5a40: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
5a50: 74 6f 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63  to lower the loc
5a60: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73  king level one s
5a70: 74 65 70 20 61 74 20 61 20 74 69 6d 65 2e 20 20  tep at a time.  
5a80: 59 6f 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73  You.** must go s
5a90: 74 72 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69  traight to locki
5aa0: 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73  ng level 0..*/.s
5ab0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63  tatic int winLoc
5ac0: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
5ad0: 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
5ae0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
5af0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52  LITE_OK;    /* R
5b00: 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
5b10: 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20  subroutines */. 
5b20: 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20   int res = 1;   
5b30: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
5b40: 74 20 6f 66 20 61 20 77 69 6e 64 6f 77 73 20 6c  t of a windows l
5b50: 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e  ock call */.  in
5b60: 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20  t newLocktype;  
5b70: 20 20 20 20 20 2f 2a 20 53 65 74 20 70 46 69 6c       /* Set pFil
5b80: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74  e->locktype to t
5b90: 68 69 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65  his value before
5ba0: 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e   exiting */.  in
5bb0: 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b  t gotPendingLock
5bc0: 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69 66 20   = 0;/* True if 
5bd0: 77 65 20 61 63 71 75 69 72 65 64 20 61 20 50 45  we acquired a PE
5be0: 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20  NDING lock this 
5bf0: 74 69 6d 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  time */.  winFil
5c00: 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
5c10: 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65  ile*)id;..  asse
5c20: 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a  rt( pFile!=0 );.
5c30: 20 20 4f 53 54 52 41 43 45 35 28 22 4c 4f 43 4b    OSTRACE5("LOCK
5c40: 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64   %d %d was %d(%d
5c50: 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
5c60: 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
5c70: 70 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  pe, pFile->lockt
5c80: 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72  ype, pFile->shar
5c90: 65 64 4c 6f 63 6b 42 79 74 65 29 3b 0a 0a 20 20  edLockByte);..  
5ca0: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
5cb0: 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66  lready a lock of
5cc0: 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f   this type or mo
5cd0: 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f  re restrictive o
5ce0: 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c  n the.  ** OsFil
5cf0: 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
5d00: 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64  on't use the end
5d10: 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
5d20: 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65  , as.  ** sqlite
5d30: 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20  3OsEnterMutex() 
5d40: 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
5d50: 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
5d60: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
5d70: 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe>=locktype ){.
5d80: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5d90: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
5da0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
5db0: 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  cking sequence i
5dc0: 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20  s correct.  */. 
5dd0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
5de0: 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43  locktype!=NO_LOC
5df0: 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K || locktype==S
5e00: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
5e10: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
5e20: 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
5e30: 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
5e40: 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c  type!=RESERVED_L
5e50: 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f  OCK || pFile->lo
5e60: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
5e70: 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  OCK );..  /* Loc
5e80: 6b 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f  k the PENDING_LO
5e90: 43 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e 65  CK byte if we ne
5ea0: 65 64 20 74 6f 20 61 63 71 75 69 72 65 20 61 20  ed to acquire a 
5eb0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a  PENDING lock or.
5ec0: 20 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f    ** a SHARED lo
5ed0: 63 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20 61  ck.  If we are a
5ee0: 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
5ef0: 44 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75  D lock, the acqu
5f00: 69 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20  isition of.  ** 
5f10: 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  the PENDING_LOCK
5f20: 20 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61   byte is tempora
5f30: 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f  ry..  */.  newLo
5f40: 63 6b 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e  cktype = pFile->
5f50: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20  locktype;.  if( 
5f60: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
5f70: 3d 4e 4f 5f 4c 4f 43 4b 0a 20 20 20 7c 7c 20 28  =NO_LOCK.   || (
5f80: 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
5f90: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  IVE_LOCK && pFil
5fa0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53  e->locktype==RES
5fb0: 45 52 56 45 44 5f 4c 4f 43 4b 29 0a 20 20 29 7b  ERVED_LOCK).  ){
5fc0: 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 33  .    int cnt = 3
5fd0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6e 74  ;.    while( cnt
5fe0: 2d 2d 3e 30 20 26 26 20 28 72 65 73 20 3d 20 4c  -->0 && (res = L
5ff0: 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  ockFile(pFile->h
6000: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
6010: 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a  0, 1, 0))==0 ){.
6020: 20 20 20 20 20 20 2f 2a 20 54 72 79 20 33 20 74        /* Try 3 t
6030: 69 6d 65 73 20 74 6f 20 67 65 74 20 74 68 65 20  imes to get the 
6040: 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54  pending lock.  T
6050: 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20  he pending lock 
6060: 6d 69 67 68 74 20 62 65 0a 20 20 20 20 20 20 2a  might be.      *
6070: 2a 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65  * held by anothe
6080: 72 20 72 65 61 64 65 72 20 70 72 6f 63 65 73 73  r reader process
6090: 20 77 68 6f 20 77 69 6c 6c 20 72 65 6c 65 61 73   who will releas
60a0: 65 20 69 74 20 6d 6f 6d 65 6e 74 61 72 69 6c 79  e it momentarily
60b0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
60c0: 20 4f 53 54 52 41 43 45 32 28 22 63 6f 75 6c 64   OSTRACE2("could
60d0: 20 6e 6f 74 20 67 65 74 20 61 20 50 45 4e 44 49   not get a PENDI
60e0: 4e 47 20 6c 6f 63 6b 2e 20 63 6e 74 3d 25 64 5c  NG lock. cnt=%d\
60f0: 6e 22 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20  n", cnt);.      
6100: 53 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a  Sleep(1);.    }.
6110: 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f      gotPendingLo
6120: 63 6b 20 3d 20 72 65 73 3b 0a 20 20 7d 0a 0a 20  ck = res;.  }.. 
6130: 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 73 68   /* Acquire a sh
6140: 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  ared lock.  */. 
6150: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
6160: 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65  HARED_LOCK && re
6170: 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  s ){.    assert(
6180: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
6190: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ==NO_LOCK );.   
61a0: 20 72 65 73 20 3d 20 67 65 74 52 65 61 64 4c 6f   res = getReadLo
61b0: 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 69  ck(pFile);.    i
61c0: 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
61d0: 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48  newLocktype = SH
61e0: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  ARED_LOCK;.    }
61f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
6200: 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  re a RESERVED lo
6210: 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
6220: 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44  cktype==RESERVED
6230: 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
6240: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
6250: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  e->locktype==SHA
6260: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
6270: 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70  res = LockFile(p
6280: 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45  File->h, RESERVE
6290: 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  D_BYTE, 0, 1, 0)
62a0: 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b  ;.    if( res ){
62b0: 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  .      newLockty
62c0: 70 65 20 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f  pe = RESERVED_LO
62d0: 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  CK;.    }.  }.. 
62e0: 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 50 45   /* Acquire a PE
62f0: 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  NDING lock.  */.
6300: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
6310: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
6320: 26 20 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77  & res ){.    new
6330: 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49  Locktype = PENDI
6340: 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74  NG_LOCK;.    got
6350: 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b  PendingLock = 0;
6360: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
6370: 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  re an EXCLUSIVE 
6380: 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
6390: 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
63a0: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20  IVE_LOCK && res 
63b0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
63c0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
63d0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
63e0: 20 20 20 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52     res = unlockR
63f0: 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  eadLock(pFile);.
6400: 20 20 20 20 4f 53 54 52 41 43 45 32 28 22 75 6e      OSTRACE2("un
6410: 72 65 61 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22  readlock = %d\n"
6420: 2c 20 72 65 73 29 3b 0a 20 20 20 20 72 65 73 20  , res);.    res 
6430: 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65  = LockFile(pFile
6440: 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
6450: 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a  T, 0, SHARED_SIZ
6460: 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  E, 0);.    if( r
6470: 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
6480: 6f 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53  ocktype = EXCLUS
6490: 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65  IVE_LOCK;.    }e
64a0: 6c 73 65 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  lse{.      OSTRA
64b0: 43 45 32 28 22 65 72 72 6f 72 2d 63 6f 64 65 20  CE2("error-code 
64c0: 3d 20 25 64 5c 6e 22 2c 20 47 65 74 4c 61 73 74  = %d\n", GetLast
64d0: 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 20 20  Error());.      
64e0: 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  getReadLock(pFil
64f0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
6500: 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 68 6f   /* If we are ho
6510: 6c 64 69 6e 67 20 61 20 50 45 4e 44 49 4e 47 20  lding a PENDING 
6520: 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67 68 74 20  lock that ought 
6530: 74 6f 20 62 65 20 72 65 6c 65 61 73 65 64 2c 20  to be released, 
6540: 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73  then.  ** releas
6550: 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  e it now..  */. 
6560: 20 69 66 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c   if( gotPendingL
6570: 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  ock && locktype=
6580: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
6590: 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70      UnlockFile(p
65a0: 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47  File->h, PENDING
65b0: 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
65c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
65d0: 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  e the state of t
65e0: 68 65 20 6c 6f 63 6b 20 68 61 73 20 68 65 6c 64  he lock has held
65f0: 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73   in the file des
6600: 63 72 69 70 74 6f 72 20 74 68 65 6e 0a 20 20 2a  criptor then.  *
6610: 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61 70 70  * return the app
6620: 72 6f 70 72 69 61 74 65 20 72 65 73 75 6c 74 20  ropriate result 
6630: 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  code..  */.  if(
6640: 20 72 65 73 20 29 7b 0a 20 20 20 20 72 63 20 3d   res ){.    rc =
6650: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
6660: 6c 73 65 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  lse{.    OSTRACE
6670: 34 28 22 4c 4f 43 4b 20 46 41 49 4c 45 44 20 25  4("LOCK FAILED %
6680: 64 20 74 72 79 69 6e 67 20 66 6f 72 20 25 64 20  d trying for %d 
6690: 62 75 74 20 67 6f 74 20 25 64 5c 6e 22 2c 20 70  but got %d\n", p
66a0: 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
66b0: 20 20 20 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65      locktype, ne
66c0: 77 4c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20  wLocktype);.    
66d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
66e0: 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c  ;.  }.  pFile->l
66f0: 6f 63 6b 74 79 70 65 20 3d 20 6e 65 77 4c 6f 63  ocktype = newLoc
6700: 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20  ktype;.  return 
6710: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
6720: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
6730: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
6740: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
6750: 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
6760: 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
6770: 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
6780: 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
6790: 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
67a0: 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
67b0: 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 7a  ero, otherwise z
67c0: 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
67d0: 6e 74 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72  nt winCheckReser
67e0: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
67f0: 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74  file *id){.  int
6800: 20 72 63 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a   rc;.  winFile *
6810: 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
6820: 2a 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20  *)id;.  assert( 
6830: 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66  pFile!=0 );.  if
6840: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
6850: 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e>=RESERVED_LOCK
6860: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a   ){.    rc = 1;.
6870: 20 20 20 20 4f 53 54 52 41 43 45 33 28 22 54 45      OSTRACE3("TE
6880: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
6890: 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69   (local)\n", pFi
68a0: 6c 65 2d 3e 68 2c 20 72 63 29 3b 0a 20 20 7d 65  le->h, rc);.  }e
68b0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 4c 6f  lse{.    rc = Lo
68c0: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
68d0: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
68e0: 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 1, 0);.    if
68f0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 55 6e  ( rc ){.      Un
6900: 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e  lockFile(pFile->
6910: 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
6920: 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  , 0, 1, 0);.    
6930: 7d 0a 20 20 20 20 72 63 20 3d 20 21 72 63 3b 0a  }.    rc = !rc;.
6940: 20 20 20 20 4f 53 54 52 41 43 45 33 28 22 54 45      OSTRACE3("TE
6950: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
6960: 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 70 46   (remote)\n", pF
6970: 69 6c 65 2d 3e 68 2c 20 72 63 29 3b 0a 20 20 7d  ile->h, rc);.  }
6980: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6990: 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
69a0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
69b0: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
69c0: 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65  r id to locktype
69d0: 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d  .  locktype.** m
69e0: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
69f0: 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
6a00: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
6a10: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
6a20: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
6a30: 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
6a40: 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
6a50: 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
6a60: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
6a70: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
6a80: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74   no-op..**.** It
6a90: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
6aa0: 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
6ab0: 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74 68 65  e to fail if the
6ac0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
6ad0: 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20  .** is NO_LOCK. 
6ae0: 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
6af0: 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41 52 45  rgument is SHARE
6b00: 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69 73  D_LOCK then this
6b10: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68   routine.** migh
6b20: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
6b30: 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69 63  IOERR;.*/.static
6b40: 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28 73   int winUnlock(s
6b50: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
6b60: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
6b70: 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 77 69    int type;.  wi
6b80: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
6b90: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  winFile*)id;.  i
6ba0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6bb0: 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  K;.  assert( pFi
6bc0: 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  le!=0 );.  asser
6bd0: 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41  t( locktype<=SHA
6be0: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f 53  RED_LOCK );.  OS
6bf0: 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 25  TRACE5("UNLOCK %
6c00: 64 20 74 6f 20 25 64 20 77 61 73 20 25 64 28 25  d to %d was %d(%
6c10: 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  d)\n", pFile->h,
6c20: 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20   locktype,.     
6c30: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b       pFile->lock
6c40: 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61  type, pFile->sha
6c50: 72 65 64 4c 6f 63 6b 42 79 74 65 29 3b 0a 20 20  redLockByte);.  
6c60: 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f  type = pFile->lo
6c70: 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 74 79  cktype;.  if( ty
6c80: 70 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe>=EXCLUSIVE_LO
6c90: 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b  CK ){.    Unlock
6ca0: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53  File(pFile->h, S
6cb0: 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20  HARED_FIRST, 0, 
6cc0: 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
6cd0: 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  .    if( locktyp
6ce0: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26  e==SHARED_LOCK &
6cf0: 26 20 21 67 65 74 52 65 61 64 4c 6f 63 6b 28 70  & !getReadLock(p
6d00: 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  File) ){.      /
6d10: 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65  * This should ne
6d20: 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20  ver happen.  We 
6d30: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
6d40: 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a   able to.      *
6d50: 2a 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  * reacquire the 
6d60: 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  read lock */.   
6d70: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
6d80: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
6d90: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70   }.  }.  if( typ
6da0: 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e>=RESERVED_LOCK
6db0: 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69   ){.    UnlockFi
6dc0: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53  le(pFile->h, RES
6dd0: 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31  ERVED_BYTE, 0, 1
6de0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
6df0: 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
6e00: 4b 20 26 26 20 74 79 70 65 3e 3d 53 48 41 52 45  K && type>=SHARE
6e10: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 6e  D_LOCK ){.    un
6e20: 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69  lockReadLock(pFi
6e30: 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74  le);.  }.  if( t
6e40: 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ype>=PENDING_LOC
6e50: 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46  K ){.    UnlockF
6e60: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45  ile(pFile->h, PE
6e70: 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31  NDING_BYTE, 0, 1
6e80: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c  , 0);.  }.  pFil
6e90: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
6ea0: 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e  cktype;.  return
6eb0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 75   rc;.}../*.** Cu
6ec0: 72 72 65 6e 74 6c 79 20 75 6e 69 6d 70 6c 65 6d  rrently unimplem
6ed0: 65 6e 74 65 64 0a 2a 2f 0a 73 74 61 74 69 63 20  ented.*/.static 
6ee0: 69 6e 74 20 77 69 6e 42 72 65 61 6b 4c 6f 63 6b  int winBreakLock
6ef0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
6f00: 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  d){.  return SQL
6f10: 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  ITE_ERROR;.}../*
6f20: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  .** Return an in
6f30: 74 65 67 65 72 20 74 68 61 74 20 69 6e 64 69 63  teger that indic
6f40: 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 6c  es the type of l
6f50: 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 68 65  ock currently he
6f60: 6c 64 0a 2a 2a 20 62 79 20 74 68 69 73 20 68 61  ld.** by this ha
6f70: 6e 64 6c 65 2e 20 20 28 55 73 65 64 20 66 6f 72  ndle.  (Used for
6f80: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
6f90: 6c 79 73 69 73 20 6f 6e 6c 79 2e 29 0a 2a 2f 0a  lysis only.).*/.
6fa0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f  static int winLo
6fb0: 63 6b 53 74 61 74 65 28 73 71 6c 69 74 65 33 5f  ckState(sqlite3_
6fc0: 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69 6e  file *id){.  win
6fd0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
6fe0: 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 72 65  inFile*)id;.  re
6ff0: 74 75 72 6e 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  turn pFile->lock
7000: 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  type;.}../*.** R
7010: 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
7020: 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
7030: 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
7040: 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
7050: 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
7060: 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
7070: 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
7080: 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
7090: 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
70a0: 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
70b0: 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
70c0: 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
70d0: 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
70e0: 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
70f0: 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
7100: 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
7110: 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
7120: 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
7130: 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
7140: 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
7150: 20 69 74 27 73 20 6a 6f 75 72 6e 61 6c 20 66 69   it's journal fi
7160: 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63  le) that the sec
7170: 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
7180: 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72   the.** same for
7190: 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63   both..*/.static
71a0: 20 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53 69   int winSectorSi
71b0: 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
71c0: 2a 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53  *id){.  return S
71d0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45  QLITE_DEFAULT_SE
71e0: 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a  CTOR_SIZE;.}../*
71f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65 63  .** Return a vec
7200: 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63 68  tor of device ch
7210: 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a 2a  aracteristics..*
7220: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
7230: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
7240: 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69  stics(sqlite3_fi
7250: 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65 74 75 72  le *id){.  retur
7260: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
7270: 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65  is vector define
7280: 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64  s all the method
7290: 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61  s that can opera
72a0: 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69  te on an.** sqli
72b0: 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e  te3_file for win
72c0: 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  32..*/.static co
72d0: 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
72e0: 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74 68  ethods winIoMeth
72f0: 6f 64 20 3d 20 7b 0a 20 20 31 2c 20 20 20 20 20  od = {.  1,     
7300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7310: 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
7320: 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 0a 20 20  /.  winClose,.  
7330: 77 69 6e 52 65 61 64 2c 0a 20 20 77 69 6e 57 72  winRead,.  winWr
7340: 69 74 65 2c 0a 20 20 77 69 6e 54 72 75 6e 63 61  ite,.  winTrunca
7350: 74 65 2c 0a 20 20 77 69 6e 53 79 6e 63 2c 0a 20  te,.  winSync,. 
7360: 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c 0a 20 20   winFileSize,.  
7370: 77 69 6e 4c 6f 63 6b 2c 0a 20 20 77 69 6e 55 6e  winLock,.  winUn
7380: 6c 6f 63 6b 2c 0a 20 20 77 69 6e 43 68 65 63 6b  lock,.  winCheck
7390: 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 20 20  ReservedLock,.  
73a0: 77 69 6e 42 72 65 61 6b 4c 6f 63 6b 2c 0a 20 20  winBreakLock,.  
73b0: 77 69 6e 4c 6f 63 6b 53 74 61 74 65 2c 0a 20 20  winLockState,.  
73c0: 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c 0a 20  winSectorSize,. 
73d0: 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63   winDeviceCharac
73e0: 74 65 72 69 73 74 69 63 73 0a 7d 3b 0a 0a 2f 2a  teristics.};../*
73f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 48 65  **********.** He
7440: 72 65 20 65 6e 64 73 20 74 68 65 20 49 2f 4f 20  re ends the I/O 
7450: 6d 65 74 68 6f 64 73 20 74 68 61 74 20 66 6f 72  methods that for
7460: 6d 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  m the sqlite3_io
7470: 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e  _methods object.
7480: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20  .**.** The next 
7490: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 6d  block of code im
74a0: 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 56 46 53  plements the VFS
74b0: 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 2a 2a 2a 2a   methods..******
74c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7500: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  ******/../*.** C
7510: 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20 66  onvert a UTF-8 f
7520: 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61  ilename into wha
7530: 74 65 76 65 72 20 66 6f 72 6d 20 74 68 65 20 75  tever form the u
7540: 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65  nderlying.** ope
7550: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 77 61  rating system wa
7560: 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e  nts filenames in
7570: 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
7580: 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69   the result.** i
7590: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
75a0: 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20  malloc and must 
75b0: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
75c0: 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
75d0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
75e0: 6f 69 64 20 2a 63 6f 6e 76 65 72 74 55 74 66 38  oid *convertUtf8
75f0: 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63  Filename(const c
7600: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
7610: 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
7620: 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 69  ted = 0;.  if( i
7630: 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f  sNT() ){.    zCo
7640: 6e 76 65 72 74 65 64 20 3d 20 75 74 66 38 54 6f  nverted = utf8To
7650: 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d  Unicode(zFilenam
7660: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
7670: 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 75 74   zConverted = ut
7680: 66 38 54 6f 4d 62 63 73 28 7a 46 69 6c 65 6e 61  f8ToMbcs(zFilena
7690: 6d 65 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 63 61  me);.  }.  /* ca
76a0: 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65  ller will handle
76b0: 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a   out of memory *
76c0: 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76  /.  return zConv
76d0: 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  erted;.}../*.** 
76e0: 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  Open a file..*/.
76f0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70  static int winOp
7700: 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
7710: 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
7720: 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  /* Not used */. 
7730: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
7740: 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  me,        /* Na
7750: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28  me of the file (
7760: 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69  UTF-8) */.  sqli
7770: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20  te3_file *id,   
7780: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
7790: 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65 20 68  he SQLite file h
77a0: 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20  andle here */.  
77b0: 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
77c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
77d0: 6e 20 6d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a  n mode flags */.
77e0: 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73    int *pOutFlags
77f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7800: 74 61 74 75 73 20 72 65 74 75 72 6e 20 66 6c 61  tatus return fla
7810: 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c  gs */.){.  HANDL
7820: 45 20 68 3b 0a 20 20 44 57 4f 52 44 20 64 77 44  E h;.  DWORD dwD
7830: 65 73 69 72 65 64 41 63 63 65 73 73 3b 0a 20 20  esiredAccess;.  
7840: 44 57 4f 52 44 20 64 77 53 68 61 72 65 4d 6f 64  DWORD dwShareMod
7850: 65 3b 0a 20 20 44 57 4f 52 44 20 64 77 43 72 65  e;.  DWORD dwCre
7860: 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
7870: 3b 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67  ;.  DWORD dwFlag
7880: 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
7890: 20 30 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70   0;.  winFile *p
78a0: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
78b0: 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  )id;.  void *zCo
78c0: 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72  nverted = conver
78d0: 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4e  tUtf8Filename(zN
78e0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ame);.  if( zCon
78f0: 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
7900: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
7910: 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  OMEM;.  }..  if(
7920: 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
7930: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 29  OPEN_READWRITE )
7940: 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41  {.    dwDesiredA
7950: 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f  ccess = GENERIC_
7960: 52 45 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57  READ | GENERIC_W
7970: 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RITE;.  }else{. 
7980: 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
7990: 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41  ss = GENERIC_REA
79a0: 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  D;.  }.  if( fla
79b0: 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
79c0: 5f 43 52 45 41 54 45 20 29 7b 0a 20 20 20 20 64  _CREATE ){.    d
79d0: 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
79e0: 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41  tion = OPEN_ALWA
79f0: 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  YS;.  }else{.   
7a00: 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
7a10: 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58  sition = OPEN_EX
7a20: 49 53 54 49 4e 47 3b 0a 20 20 7d 0a 20 20 69 66  ISTING;.  }.  if
7a30: 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
7a40: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b  _OPEN_MAIN_DB ){
7a50: 0a 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65  .    dwShareMode
7a60: 20 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45   = FILE_SHARE_RE
7a70: 41 44 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f  AD | FILE_SHARE_
7a80: 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  WRITE;.  }else{.
7a90: 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20      dwShareMode 
7aa0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  = 0;.  }.  if( f
7ab0: 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f  lags & (SQLITE_O
7ac0: 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 53 51  PEN_TEMP_DB | SQ
7ad0: 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
7ae0: 4f 55 52 4e 41 4c 0a 20 20 20 20 20 20 20 20 20  OURNAL.         
7af0: 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
7b00: 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
7b10: 4e 41 4c 29 20 29 7b 0a 20 20 20 20 64 77 46 6c  NAL) ){.    dwFl
7b20: 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
7b30: 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   = FILE_ATTRIBUT
7b40: 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20 20 20  E_TEMPORARY.    
7b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b60: 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c             | FIL
7b70: 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44  E_ATTRIBUTE_HIDD
7b80: 45 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  EN.             
7b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ba0: 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45    | FILE_FLAG_DE
7bb0: 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 20  LETE_ON_CLOSE;. 
7bc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 46 6c   }else{.    dwFl
7bd0: 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
7be0: 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   = FILE_ATTRIBUT
7bf0: 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20  E_NORMAL;.  }.  
7c00: 69 66 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c  if( flags & (SQL
7c10: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
7c20: 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54   | SQLITE_OPEN_T
7c30: 45 4d 50 5f 44 42 29 20 29 7b 0a 20 20 20 20 64  EMP_DB) ){.    d
7c40: 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
7c50: 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47  tes |= FILE_FLAG
7c60: 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a  _RANDOM_ACCESS;.
7c70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 46    }else{.    dwF
7c80: 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
7c90: 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 53  s |= FILE_FLAG_S
7ca0: 45 51 55 45 4e 54 49 41 4c 5f 53 43 41 4e 3b 0a  EQUENTIAL_SCAN;.
7cb0: 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29    }.  if( isNT()
7cc0: 20 29 7b 0a 20 20 20 20 68 20 3d 20 43 72 65 61   ){.    h = Crea
7cd0: 74 65 46 69 6c 65 57 28 28 57 43 48 41 52 2a 29  teFileW((WCHAR*)
7ce0: 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
7cf0: 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
7d00: 73 73 2c 0a 20 20 20 20 20 20 20 64 77 53 68 61  ss,.       dwSha
7d10: 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20 20 20 4e  reMode,.       N
7d20: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 64 77 43 72  ULL,.       dwCr
7d30: 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
7d40: 6e 2c 0a 20 20 20 20 20 20 20 64 77 46 6c 61 67  n,.       dwFlag
7d50: 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a  sAndAttributes,.
7d60: 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20         NULL.    
7d70: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 20  );.  }else{.#if 
7d80: 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 72 65 74  OS_WINCE.    ret
7d90: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
7da0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68 20 3d 20  ;.#else.    h = 
7db0: 43 72 65 61 74 65 46 69 6c 65 41 28 28 63 68 61  CreateFileA((cha
7dc0: 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  r*)zConverted,. 
7dd0: 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
7de0: 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 64 77  ccess,.       dw
7df0: 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20  ShareMode,.     
7e00: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 64    NULL,.       d
7e10: 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
7e20: 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 64 77 46  tion,.       dwF
7e30: 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
7e40: 73 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20  s,.       NULL. 
7e50: 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d     );.#endif.  }
7e60: 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49  .  if( h==INVALI
7e70: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
7e80: 7b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20  {.    if( flags 
7e90: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
7ea0: 41 44 57 52 49 54 45 20 29 7b 0a 20 20 20 20 20  ADWRITE ){.     
7eb0: 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64   free(zConverted
7ec0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
7ed0: 77 69 6e 4f 70 65 6e 28 30 2c 20 7a 4e 61 6d 65  winOpen(0, zName
7ee0: 2c 20 69 64 2c 20 0a 20 20 20 20 20 20 20 20 20  , id, .         
7ef0: 20 20 20 20 28 28 66 6c 61 67 73 7c 53 51 4c 49      ((flags|SQLI
7f00: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
7f10: 29 26 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  )&~SQLITE_OPEN_R
7f20: 45 41 44 57 52 49 54 45 29 2c 20 70 4f 75 74 46  EADWRITE), pOutF
7f30: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lags);.    }else
7f40: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
7f50: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
7f60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
7f70: 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20  pOutFlags ){.   
7f80: 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
7f90: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
7fa0: 54 45 20 29 7b 0a 20 20 20 20 20 20 2a 70 4f 75  TE ){.      *pOu
7fb0: 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  tFlags = SQLITE_
7fc0: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a  OPEN_READWRITE;.
7fd0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7fe0: 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51   *pOutFlags = SQ
7ff0: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
8000: 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  LY;.    }.  }.  
8010: 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c  memset(pFile, 0,
8020: 20 73 69 7a 65 6f 66 28 2a 70 46 69 6c 65 29 29   sizeof(*pFile))
8030: 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  ;.  pFile->pMeth
8040: 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f  od = &winIoMetho
8050: 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  d;.  pFile->h = 
8060: 68 3b 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a  h;.#if OS_WINCE.
8070: 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28    if( (flags & (
8080: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
8090: 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
80a0: 4e 5f 4d 41 49 4e 5f 44 42 29 29 20 3d 3d 0a 20  N_MAIN_DB)) ==. 
80b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
80c0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
80d0: 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
80e0: 5f 4d 41 49 4e 5f 44 42 29 0a 20 20 20 20 20 20  _MAIN_DB).      
80f0: 20 26 26 20 21 77 69 6e 63 65 43 72 65 61 74 65   && !winceCreate
8100: 4c 6f 63 6b 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  Lock(zFilename, 
8110: 26 66 29 0a 20 20 29 7b 0a 20 20 20 20 43 6c 6f  &f).  ){.    Clo
8120: 73 65 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20  seHandle(h);.   
8130: 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64   free(zConverted
8140: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
8150: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
8160: 20 7d 0a 20 20 69 66 28 20 64 77 46 6c 61 67 73   }.  if( dwFlags
8170: 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 26 20  AndAttributes & 
8180: 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45  FILE_FLAG_DELETE
8190: 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20 70  ONCLOSE ){.    p
81a0: 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
81b0: 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65  lose = zConverte
81c0: 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  d;.  }else.#endi
81d0: 66 0a 20 20 7b 0a 20 20 20 20 66 72 65 65 28 7a  f.  {.    free(z
81e0: 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a  Converted);.  }.
81f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8200: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  OK;.}../*.** Del
8210: 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69  ete the named fi
8220: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  le..**.** Note t
8230: 68 61 74 20 77 69 6e 64 6f 77 73 20 64 6f 65 73  hat windows does
8240: 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c   not allow a fil
8250: 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  e to be deleted 
8260: 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  if some other.**
8270: 20 70 72 6f 63 65 73 73 20 68 61 73 20 69 74 20   process has it 
8280: 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73  open.  Sometimes
8290: 20 61 20 76 69 72 75 73 20 73 63 61 6e 6e 65 72   a virus scanner
82a0: 20 6f 72 20 69 6e 64 65 78 69 6e 67 20 70 72 6f   or indexing pro
82b0: 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65  gram.** will ope
82c0: 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  n a journal file
82d0: 20 73 68 6f 72 74 6c 79 20 61 66 74 65 72 20 69   shortly after i
82e0: 74 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20  t is created in 
82f0: 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77  order to do.** w
8300: 68 61 74 65 76 65 72 20 69 74 20 69 73 20 69 74  hatever it is it
8310: 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20 74 68   does.  While th
8320: 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  is other process
8330: 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a   is holding the.
8340: 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65  ** file open, we
8350: 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20   will be unable 
8360: 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20 54  to delete it.  T
8370: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
8380: 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77  is.** problem, w
8390: 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c  e delay 100 mill
83a0: 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79  iseconds and try
83b0: 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69 6e   to delete again
83c0: 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44  .  Up.** to MX_D
83d0: 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 73  ELETION_ATTEMPTs
83e0: 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d 70   deletion attemp
83f0: 74 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f 72  ts are run befor
8400: 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20 61  e giving.** up a
8410: 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20  nd returning an 
8420: 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  error..*/.#defin
8430: 65 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54  e MX_DELETION_AT
8440: 54 45 4d 50 54 53 20 33 0a 73 74 61 74 69 63 20  TEMPTS 3.static 
8450: 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 0a 20  int winDelete(. 
8460: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
8470: 66 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fs,          /* 
8480: 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33  Not used on win3
8490: 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  2 */.  const cha
84a0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
84b0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
84c0: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  le to delete */.
84d0: 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20 20 20    int syncDir   
84e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
84f0: 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e   Not used on win
8500: 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63  32 */.){.  int c
8510: 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  nt = 0;.  int rc
8520: 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
8530: 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74  rted = convertUt
8540: 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65  f8Filename(zFile
8550: 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  name);.  if( zCo
8560: 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
8570: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8580: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 53 69 6d  NOMEM;.  }.  Sim
8590: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
85a0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
85b0: 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66 28 20  _DELETE);.  if( 
85c0: 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 64 6f  isNT() ){.    do
85d0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 44 65 6c  {.      rc = Del
85e0: 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65 72  eteFileW(zConver
85f0: 74 65 64 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  ted);.    }while
8600: 28 20 72 63 3d 3d 30 20 26 26 20 47 65 74 46 69  ( rc==0 && GetFi
8610: 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 7a 43  leAttributesW(zC
8620: 6f 6e 76 65 72 74 65 64 29 21 3d 30 78 66 66 66  onverted)!=0xfff
8630: 66 66 66 66 66 20 0a 20 20 20 20 20 20 20 20 20  fffff .         
8640: 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20 4d 58     && cnt++ < MX
8650: 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
8660: 54 53 20 26 26 20 28 53 6c 65 65 70 28 31 30 30  TS && (Sleep(100
8670: 29 2c 20 31 29 20 29 3b 0a 20 20 7d 65 6c 73 65  ), 1) );.  }else
8680: 7b 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20  {.#if OS_WINCE. 
8690: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
86a0: 5f 4e 4f 4d 45 4d 3b 0a 23 65 6c 73 65 0a 20 20  _NOMEM;.#else.  
86b0: 20 20 64 6f 7b 0a 20 20 20 20 20 20 72 63 20 3d    do{.      rc =
86c0: 20 44 65 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f   DeleteFileA(zCo
86d0: 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7d 77  nverted);.    }w
86e0: 68 69 6c 65 28 20 72 63 3d 3d 30 20 26 26 20 47  hile( rc==0 && G
86f0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
8700: 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 21 3d 30  A(zConverted)!=0
8710: 78 66 66 66 66 66 66 66 66 0a 20 20 20 20 20 20  xffffffff.      
8720: 20 20 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c        && cnt++ <
8730: 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54   MX_DELETION_ATT
8740: 45 4d 50 54 53 20 26 26 20 28 53 6c 65 65 70 28  EMPTS && (Sleep(
8750: 31 30 30 29 2c 20 31 29 20 29 3b 0a 23 65 6e 64  100), 1) );.#end
8760: 69 66 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a 43  if.  }.  free(zC
8770: 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 4f 53 54  onverted);.  OST
8780: 52 41 43 45 32 28 22 44 45 4c 45 54 45 20 5c 22  RACE2("DELETE \"
8790: 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  %s\"\n", zFilena
87a0: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  me);.  return rc
87b0: 21 3d 30 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  !=0 ? SQLITE_OK 
87c0: 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  : SQLITE_IOERR;.
87d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
87e0: 68 65 20 65 78 69 73 74 61 6e 63 65 20 61 6e 64  he existance and
87f0: 20 73 74 61 74 75 73 20 6f 66 20 61 20 66 69 6c   status of a fil
8800: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
8810: 20 77 69 6e 41 63 63 65 73 73 28 0a 20 20 73 71   winAccess(.  sq
8820: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
8830: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
8840: 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f  used on win32 */
8850: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8860: 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Filename,     /*
8870: 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f   Name of file to
8880: 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20   check */.  int 
8890: 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
88a0: 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
88b0: 66 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 6f  f test to make o
88c0: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29  n this file */.)
88d0: 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a  {.  DWORD attr;.
88e0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 6f 69 64    int rc;.  void
88f0: 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63   *zConverted = c
8900: 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61  onvertUtf8Filena
8910: 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
8920: 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
8930: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
8940: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
8950: 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20   }.  if( isNT() 
8960: 29 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 47 65  ){.    attr = Ge
8970: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
8980: 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72  ((WCHAR*)zConver
8990: 74 65 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23  ted);.  }else{.#
89a0: 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  if OS_WINCE.    
89b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
89c0: 4d 45 4d 3b 0a 23 65 6c 73 65 0a 20 20 20 20 61  MEM;.#else.    a
89d0: 74 74 72 20 3d 20 47 65 74 46 69 6c 65 41 74 74  ttr = GetFileAtt
89e0: 72 69 62 75 74 65 73 41 28 28 63 68 61 72 2a 29  ributesA((char*)
89f0: 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e  zConverted);.#en
8a00: 64 69 66 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a  dif.  }.  free(z
8a10: 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 73 77  Converted);.  sw
8a20: 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20  itch( flags ){. 
8a30: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
8a40: 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20  CCESS_EXISTS:.  
8a50: 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d 30      rc = attr!=0
8a60: 78 66 66 66 66 66 66 66 66 3b 0a 20 20 20 20 20  xffffffff;.     
8a70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8a80: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
8a90: 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20  EADWRITE:.      
8aa0: 72 63 20 3d 20 28 61 74 74 72 20 26 20 46 49 4c  rc = (attr & FIL
8ab0: 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45 41 44  E_ATTRIBUTE_READ
8ac0: 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ONLY)==0;.      
8ad0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8ae0: 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
8af0: 41 44 4f 4e 4c 59 3a 0a 20 20 20 20 20 20 72 63  ADONLY:.      rc
8b00: 20 3d 20 28 61 74 74 72 21 3d 30 78 66 66 66 66   = (attr!=0xffff
8b10: 66 66 66 66 29 20 26 26 20 28 28 61 74 74 72 20  ffff) && ((attr 
8b20: 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  & FILE_ATTRIBUTE
8b30: 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 31 29 3b 0a  _READONLY)==1);.
8b40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8b50: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
8b60: 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64  assert(!"Invalid
8b70: 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22   flags argument"
8b80: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
8b90: 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 72  rc;.}.../*.** Cr
8ba0: 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  eate a temporary
8bb0: 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42   file name in zB
8bc0: 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62  uf.  zBuf must b
8bd0: 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 0a  e big enough to.
8be0: 2a 2a 20 68 6f 6c 64 20 61 74 20 70 56 66 73 2d  ** hold at pVfs-
8bf0: 3e 6d 78 50 61 74 68 6e 61 6d 65 20 63 68 61 72  >mxPathname char
8c00: 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  acters..*/.stati
8c10: 63 20 69 6e 74 20 77 69 6e 47 65 74 54 65 6d 70  c int winGetTemp
8c20: 4e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  Name(sqlite3_vfs
8c30: 20 2a 70 56 66 73 2c 20 63 68 61 72 20 2a 7a 42   *pVfs, char *zB
8c40: 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  uf){.  static ch
8c50: 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20  ar zChars[] =.  
8c60: 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d    "abcdefghijklm
8c70: 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20  nopqrstuvwxyz". 
8c80: 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c     "ABCDEFGHIJKL
8c90: 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a  MNOPQRSTUVWXYZ".
8ca0: 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22      "0123456789"
8cb0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
8cc0: 63 68 61 72 20 7a 54 65 6d 70 50 61 74 68 5b 4d  char zTempPath[M
8cd0: 41 58 5f 50 41 54 48 2b 31 5d 3b 0a 20 20 69 66  AX_PATH+1];.  if
8ce0: 28 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  ( sqlite3_temp_d
8cf0: 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20  irectory ){.    
8d00: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
8d10: 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54  (MAX_PATH-30, zT
8d20: 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20 73  empPath, "%s", s
8d30: 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
8d40: 63 74 6f 72 79 29 3b 0a 20 20 7d 65 6c 73 65 20  ctory);.  }else 
8d50: 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
8d60: 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a    char *zMulti;.
8d70: 20 20 20 20 57 43 48 41 52 20 7a 57 69 64 65 50      WCHAR zWideP
8d80: 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20  ath[MAX_PATH];. 
8d90: 20 20 20 47 65 74 54 65 6d 70 50 61 74 68 57 28     GetTempPathW(
8da0: 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 57 69  MAX_PATH-30, zWi
8db0: 64 65 50 61 74 68 29 3b 0a 20 20 20 20 7a 4d 75  dePath);.    zMu
8dc0: 6c 74 69 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55  lti = unicodeToU
8dd0: 74 66 38 28 7a 57 69 64 65 50 61 74 68 29 3b 0a  tf8(zWidePath);.
8de0: 20 20 20 20 69 66 28 20 7a 4d 75 6c 74 69 20 29      if( zMulti )
8df0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
8e00: 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
8e10: 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c  H-30, zTempPath,
8e20: 20 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a   "%s", zMulti);.
8e30: 20 20 20 20 20 20 66 72 65 65 28 7a 4d 75 6c 74        free(zMult
8e40: 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i);.    }else{. 
8e50: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8e60: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
8e70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
8e80: 72 20 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63 68  r *zUtf8;.    ch
8e90: 61 72 20 7a 4d 62 63 73 50 61 74 68 5b 4d 41 58  ar zMbcsPath[MAX
8ea0: 5f 50 41 54 48 5d 3b 0a 20 20 20 20 47 65 74 54  _PATH];.    GetT
8eb0: 65 6d 70 50 61 74 68 41 28 4d 41 58 5f 50 41 54  empPathA(MAX_PAT
8ec0: 48 2d 33 30 2c 20 7a 4d 62 63 73 50 61 74 68 29  H-30, zMbcsPath)
8ed0: 3b 0a 20 20 20 20 7a 55 74 66 38 20 3d 20 6d 62  ;.    zUtf8 = mb
8ee0: 63 73 54 6f 55 74 66 38 28 7a 4d 62 63 73 50 61  csToUtf8(zMbcsPa
8ef0: 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 55 74  th);.    if( zUt
8f00: 66 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  f8 ){.      sqli
8f10: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58  te3_snprintf(MAX
8f20: 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50  _PATH-30, zTempP
8f30: 61 74 68 2c 20 22 25 73 22 2c 20 7a 55 74 66 38  ath, "%s", zUtf8
8f40: 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 55  );.      free(zU
8f50: 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tf8);.    }else{
8f60: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
8f70: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
8f80: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73 74  }.  }.  for(i=st
8f90: 72 6c 65 6e 28 7a 54 65 6d 70 50 61 74 68 29 3b  rlen(zTempPath);
8fa0: 20 69 3e 30 20 26 26 20 7a 54 65 6d 70 50 61 74   i>0 && zTempPat
8fb0: 68 5b 69 2d 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d  h[i-1]=='\\'; i-
8fc0: 2d 29 7b 7d 0a 20 20 7a 54 65 6d 70 50 61 74 68  -){}.  zTempPath
8fd0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 3b  [i] = 0;.  for(;
8fe0: 3b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ;){.    sqlite3_
8ff0: 73 6e 70 72 69 6e 74 66 28 70 56 66 73 2d 3e 6d  snprintf(pVfs->m
9000: 78 50 61 74 68 6e 61 6d 65 2d 33 30 2c 20 7a 42  xPathname-30, zB
9010: 75 66 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  uf,.            
9020: 20 20 20 20 20 20 20 20 20 22 25 73 5c 5c 22 53           "%s\\"S
9030: 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
9040: 50 52 45 46 49 58 2c 20 7a 54 65 6d 70 50 61 74  PREFIX, zTempPat
9050: 68 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c  h);.    j = strl
9060: 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71  en(zBuf);.    sq
9070: 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28  lite3Randomness(
9080: 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20  15, &zBuf[j]);. 
9090: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35     for(i=0; i<15
90a0: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
90b0: 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68     zBuf[j] = (ch
90c0: 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73  ar)zChars[ ((uns
90d0: 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b  igned char)zBuf[
90e0: 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61  j])%(sizeof(zCha
90f0: 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a  rs)-1) ];.    }.
9100: 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b      zBuf[j] = 0;
9110: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
9120: 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
9130: 7a 42 75 66 2c 20 53 51 4c 49 54 45 5f 41 43 43  zBuf, SQLITE_ACC
9140: 45 53 53 5f 45 58 49 53 54 53 29 20 29 20 62 72  ESS_EXISTS) ) br
9150: 65 61 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  eak;.  }.  OSTRA
9160: 43 45 32 28 22 54 45 4d 50 20 46 49 4c 45 4e 41  CE2("TEMP FILENA
9170: 4d 45 3a 20 25 73 5c 6e 22 2c 20 7a 42 75 66 29  ME: %s\n", zBuf)
9180: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
9190: 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  E_OK; .}../*.** 
91a0: 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20  Turn a relative 
91b0: 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20  pathname into a 
91c0: 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20  full pathname.  
91d0: 57 72 69 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a  Write the full.*
91e0: 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  * pathname into 
91f0: 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20  zOut[].  zOut[] 
9200: 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61 73 74  will be at least
9210: 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
9220: 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69  e.** bytes in si
9230: 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
9240: 74 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  t winFullPathnam
9250: 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
9260: 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
9270: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
9280: 7a 52 65 6c 61 74 69 76 65 2c 0a 20 20 63 68 61  zRelative,.  cha
9290: 72 20 2a 7a 46 75 6c 6c 0a 29 7b 0a 0a 23 69 66  r *zFull.){..#if
92a0: 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49   defined(__CYGWI
92b0: 4e 5f 5f 29 0a 20 20 63 79 67 77 69 6e 5f 63 6f  N__).  cygwin_co
92c0: 6e 76 5f 74 6f 5f 66 75 6c 6c 5f 77 69 6e 33 32  nv_to_full_win32
92d0: 5f 70 61 74 68 28 7a 52 65 6c 61 74 69 76 65 2c  _path(zRelative,
92e0: 20 7a 46 75 6c 6c 29 3b 0a 20 20 72 65 74 75 72   zFull);.  retur
92f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64  n SQLITE_OK.#end
9300: 69 66 0a 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45  if..#if OS_WINCE
9310: 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68 61 73 20  .  /* WinCE has 
9320: 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20 61 20  no concept of a 
9330: 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
9340: 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f  e, or so I am to
9350: 6c 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ld. */.  sqlite3
9360: 5f 73 6e 70 72 69 6e 74 66 28 70 56 66 73 2d 3e  _snprintf(pVfs->
9370: 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c  mxPathname, zFul
9380: 6c 2c 20 22 25 73 22 2c 20 7a 52 65 6c 61 74 69  l, "%s", zRelati
9390: 76 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ve);.#endif..#if
93a0: 20 21 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64   !OS_WINCE && !d
93b0: 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
93c0: 5f 29 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  _).  int nByte;.
93d0: 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
93e0: 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74  ed;.  char *zOut
93f0: 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d  ;.  zConverted =
9400: 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65   convertUtf8File
9410: 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 3b  name(zRelative);
9420: 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
9430: 0a 20 20 20 20 57 43 48 41 52 20 2a 7a 54 65 6d  .    WCHAR *zTem
9440: 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 47  p;.    nByte = G
9450: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28  etFullPathNameW(
9460: 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74  (WCHAR*)zConvert
9470: 65 64 2c 20 30 2c 20 30 2c 20 30 29 20 2b 20 33  ed, 0, 0, 0) + 3
9480: 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 6d 61  ;.    zTemp = ma
9490: 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a 65  lloc( nByte*size
94a0: 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a  of(zTemp[0]) );.
94b0: 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30      if( zTemp==0
94c0: 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 7a   ){.      free(z
94d0: 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
94e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
94f0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
9500: 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65   GetFullPathName
9510: 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65  W((WCHAR*)zConve
9520: 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65  rted, nByte, zTe
9530: 6d 70 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65  mp, 0);.    free
9540: 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
9550: 20 20 7a 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65    zOut = unicode
9560: 54 6f 55 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20  ToUtf8(zTemp);. 
9570: 20 20 20 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a     free(zTemp);.
9580: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
9590: 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42  r *zTemp;.    nB
95a0: 79 74 65 20 3d 20 47 65 74 46 75 6c 6c 50 61 74  yte = GetFullPat
95b0: 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43  hNameA((char*)zC
95c0: 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20  onverted, 0, 0, 
95d0: 30 29 20 2b 20 33 3b 0a 20 20 20 20 7a 54 65 6d  0) + 3;.    zTem
95e0: 70 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74  p = malloc( nByt
95f0: 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30  e*sizeof(zTemp[0
9600: 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54  ]) );.    if( zT
9610: 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  emp==0 ){.      
9620: 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
9630: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
9640: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
9650: 20 7d 0a 20 20 20 20 47 65 74 46 75 6c 6c 50 61   }.    GetFullPa
9660: 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a  thNameA((char*)z
9670: 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65  Converted, nByte
9680: 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20  , zTemp, 0);.   
9690: 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64   free(zConverted
96a0: 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 6d 62  );.    zOut = mb
96b0: 63 73 54 6f 55 74 66 38 28 7a 54 65 6d 70 29 3b  csToUtf8(zTemp);
96c0: 0a 20 20 20 20 66 72 65 65 28 7a 54 65 6d 70 29  .    free(zTemp)
96d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4f 75 74  ;.  }.  if( zOut
96e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
96f0: 73 6e 70 72 69 6e 74 66 28 70 56 66 73 2d 3e 6d  snprintf(pVfs->m
9700: 78 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c  xPathname, zFull
9710: 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20  , "%s", zOut);. 
9720: 20 20 20 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20     free(zOut);. 
9730: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9740: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
9750: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9760: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69  NOMEM;.  }.#endi
9770: 66 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  f.}..#ifndef SQL
9780: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
9790: 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e  TENSION./*.** In
97a0: 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65  terfaces for ope
97b0: 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69  ning a shared li
97c0: 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65  brary, finding e
97d0: 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77  ntry points.** w
97e0: 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64  ithin the shared
97f0: 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c   library, and cl
9800: 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  osing the shared
9810: 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a   library..*/./*.
9820: 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f  ** Interfaces fo
9830: 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72  r opening a shar
9840: 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64  ed library, find
9850: 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  ing entry points
9860: 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73  .** within the s
9870: 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61  hared library, a
9880: 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73  nd closing the s
9890: 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a  hared library..*
98a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  /.static void *w
98b0: 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  inDlOpen(sqlite3
98c0: 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73  _vfs *pVfs, cons
98d0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
98e0: 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a  e){.  HANDLE h;.
98f0: 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
9900: 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38  ed = convertUtf8
9910: 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Filename(zFilena
9920: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  me);.  if( zConv
9930: 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
9940: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
9950: 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
9960: 20 20 68 20 3d 20 4c 6f 61 64 4c 69 62 72 61 72    h = LoadLibrar
9970: 79 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76  yW((WCHAR*)zConv
9980: 65 72 74 65 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  erted);.  }else{
9990: 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20  .#if OS_WINCE.  
99a0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73    return 0;.#els
99b0: 65 0a 20 20 20 20 68 20 3d 20 4c 6f 61 64 4c 69  e.    h = LoadLi
99c0: 62 72 61 72 79 41 28 28 63 68 61 72 2a 29 7a 43  braryA((char*)zC
99d0: 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69  onverted);.#endi
99e0: 66 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a 43 6f  f.  }.  free(zCo
99f0: 6e 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75  nverted);.  retu
9a00: 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73  rn (void*)h;.}.s
9a10: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c  tatic void winDl
9a20: 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
9a30: 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
9a40: 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74  f, char *zBufOut
9a50: 29 7b 0a 20 20 46 6f 72 6d 61 74 4d 65 73 73 61  ){.  FormatMessa
9a60: 67 65 28 0a 20 20 20 20 46 4f 52 4d 41 54 5f 4d  ge(.    FORMAT_M
9a70: 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54  ESSAGE_FROM_SYST
9a80: 45 4d 2c 0a 20 20 20 20 4e 55 4c 4c 2c 0a 20 20  EM,.    NULL,.  
9a90: 20 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29    GetLastError()
9aa0: 2c 0a 20 20 20 20 30 2c 0a 20 20 20 20 7a 42 75  ,.    0,.    zBu
9ab0: 66 4f 75 74 2c 0a 20 20 20 20 6e 42 75 66 2d 31  fOut,.    nBuf-1
9ac0: 2c 0a 20 20 20 20 30 0a 20 20 29 3b 0a 7d 0a 76  ,.    0.  );.}.v
9ad0: 6f 69 64 20 2a 77 69 6e 44 6c 53 79 6d 28 73 71  oid *winDlSym(sq
9ae0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
9af0: 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 2c 20   void *pHandle, 
9b00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d  const char *zSym
9b10: 62 6f 6c 29 7b 0a 23 69 66 20 4f 53 5f 57 49 4e  bol){.#if OS_WIN
9b20: 43 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74 50  CE.  /* The GetP
9b30: 72 6f 63 41 64 64 72 65 73 73 41 28 29 20 72 6f  rocAddressA() ro
9b40: 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76  utine is only av
9b50: 61 69 6c 61 62 6c 65 20 6f 6e 20 77 69 6e 63 65  ailable on wince
9b60: 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 47 65  . */.  return Ge
9b70: 74 50 72 6f 63 41 64 64 72 65 73 73 41 28 28 48  tProcAddressA((H
9b80: 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 2c 20 7a  ANDLE)pHandle, z
9b90: 53 79 6d 62 6f 6c 29 3b 0a 23 65 6c 73 65 0a 20  Symbol);.#else. 
9ba0: 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 77 69   /* All other wi
9bb0: 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20  ndows platforms 
9bc0: 65 78 70 65 63 74 20 47 65 74 50 72 6f 63 41 64  expect GetProcAd
9bd0: 64 72 65 73 73 28 29 20 74 6f 20 74 61 6b 65 0a  dress() to take.
9be0: 20 20 2a 2a 20 61 6e 20 41 6e 73 69 20 73 74 72    ** an Ansi str
9bf0: 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ing regardless o
9c00: 66 20 74 68 65 20 5f 55 4e 49 43 4f 44 45 20 73  f the _UNICODE s
9c10: 65 74 74 69 6e 67 20 2a 2f 0a 20 20 72 65 74 75  etting */.  retu
9c20: 72 6e 20 47 65 74 50 72 6f 63 41 64 64 72 65 73  rn GetProcAddres
9c30: 73 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c  s((HANDLE)pHandl
9c40: 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 23 65 6e  e, zSymbol);.#en
9c50: 64 69 66 0a 7d 0a 76 6f 69 64 20 77 69 6e 44 6c  dif.}.void winDl
9c60: 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66  Close(sqlite3_vf
9c70: 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70  s *pVfs, void *p
9c80: 48 61 6e 64 6c 65 29 7b 0a 20 20 46 72 65 65 4c  Handle){.  FreeL
9c90: 69 62 72 61 72 79 28 28 48 41 4e 44 4c 45 29 70  ibrary((HANDLE)p
9ca0: 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65  Handle);.}.#else
9cb0: 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d   /* if SQLITE_OM
9cc0: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
9cd0: 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f  N is defined: */
9ce0: 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c  .  #define winDl
9cf0: 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e  Open  0.  #defin
9d00: 65 20 77 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20  e winDlError 0. 
9d10: 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 53 79   #define winDlSy
9d20: 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  m   0.  #define 
9d30: 77 69 6e 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e  winDlClose 0.#en
9d40: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  dif.../*.** Writ
9d50: 65 20 75 70 20 74 6f 20 6e 42 75 66 20 62 79 74  e up to nBuf byt
9d60: 65 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73  es of randomness
9d70: 20 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73   into zBuf..*/.s
9d80: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 61 6e  tatic int winRan
9d90: 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f  domness(sqlite3_
9da0: 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
9db0: 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
9dc0: 7b 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c  {.  if( sizeof(L
9dd0: 50 53 59 53 54 45 4d 54 49 4d 45 29 3e 3d 6e 42  PSYSTEMTIME)>=nB
9de0: 75 66 20 29 7b 0a 20 20 20 20 47 65 74 53 79 73  uf ){.    GetSys
9df0: 74 65 6d 54 69 6d 65 28 28 4c 50 53 59 53 54 45  temTime((LPSYSTE
9e00: 4d 54 49 4d 45 29 7a 42 75 66 29 3b 0a 20 20 20  MTIME)zBuf);.   
9e10: 20 72 65 74 75 72 6e 20 73 69 7a 65 6f 66 28 4c   return sizeof(L
9e20: 50 53 59 53 54 45 4d 54 49 4d 45 29 3b 0a 20 20  PSYSTEMTIME);.  
9e30: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
9e40: 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  n 0;.  }.}.../*.
9e50: 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c  ** Sleep for a l
9e60: 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65  ittle while.  Re
9e70: 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20  turn the amount 
9e80: 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a  of time slept..*
9e90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
9ea0: 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66  Sleep(sqlite3_vf
9eb0: 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6d 69 63  s *pVfs, int mic
9ec0: 72 6f 73 65 63 29 7b 0a 20 20 53 6c 65 65 70 28  rosec){.  Sleep(
9ed0: 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31  (microsec+999)/1
9ee0: 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  000);.  return (
9ef0: 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31  (microsec+999)/1
9f00: 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a  000)*1000;.}../*
9f10: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
9f20: 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73  g variable, if s
9f30: 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  et to a non-zero
9f40: 20 76 61 6c 75 65 2c 20 62 65 63 6f 6d 65 73 20   value, becomes 
9f50: 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 72 65  the result.** re
9f60: 74 75 72 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  turned from sqli
9f70: 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65  te3OsCurrentTime
9f80: 28 29 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  ().  This is use
9f90: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a  d for testing..*
9fa0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
9fb0: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
9fc0: 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20  _current_time = 
9fd0: 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
9fe0: 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
9ff0: 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
a000: 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
a010: 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74   Time).  Write t
a020: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69  he.** current ti
a030: 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
a040: 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
a050: 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61  er into *prNow a
a060: 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20  nd.** return 0. 
a070: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
a080: 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
a090: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
a0a0: 2a 2f 0a 69 6e 74 20 77 69 6e 43 75 72 72 65 6e  */.int winCurren
a0b0: 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  tTime(sqlite3_vf
a0c0: 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20  s *pVfs, double 
a0d0: 2a 70 72 4e 6f 77 29 7b 0a 20 20 46 49 4c 45 54  *prNow){.  FILET
a0e0: 49 4d 45 20 66 74 3b 0a 20 20 2f 2a 20 46 49 4c  IME ft;.  /* FIL
a0f0: 45 54 49 4d 45 20 73 74 72 75 63 74 75 72 65 20  ETIME structure 
a100: 69 73 20 61 20 36 34 2d 62 69 74 20 76 61 6c 75  is a 64-bit valu
a110: 65 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74  e representing t
a120: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20  he number of .  
a130: 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e     100-nanosecon
a140: 64 20 69 6e 74 65 72 76 61 6c 73 20 73 69 6e 63  d intervals sinc
a150: 65 20 4a 61 6e 75 61 72 79 20 31 2c 20 31 36 30  e January 1, 160
a160: 31 20 28 3d 20 4a 44 20 32 33 30 35 38 31 33 2e  1 (= JD 2305813.
a170: 35 29 2e 20 0a 20 20 2a 2f 0a 20 20 64 6f 75 62  5). .  */.  doub
a180: 6c 65 20 6e 6f 77 3b 0a 23 69 66 20 4f 53 5f 57  le now;.#if OS_W
a190: 49 4e 43 45 0a 20 20 53 59 53 54 45 4d 54 49 4d  INCE.  SYSTEMTIM
a1a0: 45 20 74 69 6d 65 3b 0a 20 20 47 65 74 53 79 73  E time;.  GetSys
a1b0: 74 65 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a  temTime(&time);.
a1c0: 20 20 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69    SystemTimeToFi
a1d0: 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74  leTime(&time,&ft
a1e0: 29 3b 0a 23 65 6c 73 65 0a 20 20 47 65 74 53 79  );.#else.  GetSy
a1f0: 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69  stemTimeAsFileTi
a200: 6d 65 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69  me( &ft );.#endi
a210: 66 0a 20 20 6e 6f 77 20 3d 20 28 28 64 6f 75 62  f.  now = ((doub
a220: 6c 65 29 66 74 2e 64 77 48 69 67 68 44 61 74 65  le)ft.dwHighDate
a230: 54 69 6d 65 29 20 2a 20 34 32 39 34 39 36 37 32  Time) * 42949672
a240: 39 36 2e 30 3b 20 0a 20 20 2a 70 72 4e 6f 77 20  96.0; .  *prNow 
a250: 3d 20 28 6e 6f 77 20 2b 20 66 74 2e 64 77 4c 6f  = (now + ft.dwLo
a260: 77 44 61 74 65 54 69 6d 65 29 2f 38 36 34 30 30  wDateTime)/86400
a270: 30 30 30 30 30 30 30 2e 30 20 2b 20 32 33 30 35  0000000.0 + 2305
a280: 38 31 33 2e 35 3b 0a 23 69 66 64 65 66 20 53 51  813.5;.#ifdef SQ
a290: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
a2a0: 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
a2b0: 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 72 4e  time ){.    *prN
a2c0: 6f 77 20 3d 20 73 71 6c 69 74 65 33 5f 63 75 72  ow = sqlite3_cur
a2d0: 72 65 6e 74 5f 74 69 6d 65 2f 38 36 34 30 30 2e  rent_time/86400.
a2e0: 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 20  0 + 2440587.5;. 
a2f0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
a300: 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
a310: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
a320: 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 44   to the sqlite3D
a330: 65 66 61 75 6c 74 56 66 73 20 73 74 72 75 63 74  efaultVfs struct
a340: 75 72 65 2e 20 20 20 57 65 20 75 73 65 0a 2a 2a  ure.   We use.**
a350: 20 61 20 66 75 6e 63 74 69 6f 6e 20 72 61 74 68   a function rath
a360: 65 72 20 74 68 61 6e 20 67 69 76 65 20 74 68 65  er than give the
a370: 20 73 74 72 75 63 74 75 72 65 20 67 6c 6f 62 61   structure globa
a380: 6c 20 73 63 6f 70 65 20 62 65 63 61 75 73 65 0a  l scope because.
a390: 2a 2a 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72  ** some compiler
a3a0: 73 20 28 4d 53 56 43 29 20 64 6f 20 6e 6f 74 20  s (MSVC) do not 
a3b0: 61 6c 6c 6f 77 20 66 6f 72 77 61 72 64 20 64 65  allow forward de
a3c0: 63 6c 61 72 61 74 69 6f 6e 73 20 6f 66 0a 2a 2a  clarations of.**
a3d0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74 72   initialized str
a3e0: 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 73 71 6c 69  uctures..*/.sqli
a3f0: 74 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33  te3_vfs *sqlite3
a400: 4f 73 44 65 66 61 75 6c 74 56 66 73 28 76 6f 69  OsDefaultVfs(voi
a410: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c  d){.  static sql
a420: 69 74 65 33 5f 76 66 73 20 77 69 6e 56 66 73 20  ite3_vfs winVfs 
a430: 3d 20 7b 0a 20 20 20 20 31 2c 20 20 20 20 20 20  = {.    1,      
a440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
a450: 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69  ersion */.    si
a460: 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20  zeof(winFile),  
a470: 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a   /* szOsFile */.
a480: 20 20 20 20 4d 41 58 5f 50 41 54 48 2c 20 20 20      MAX_PATH,   
a490: 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68         /* mxPath
a4a0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20  name */.    0,  
a4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a4c0: 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22  * pNext */.    "
a4d0: 77 69 6e 33 32 22 2c 20 20 20 20 20 20 20 20 20  win32",         
a4e0: 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20    /* zName */.  
a4f0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
a500: 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61       /* pAppData
a510: 20 2a 2f 0a 20 20 0a 20 20 20 20 77 69 6e 4f 70   */.  .    winOp
a520: 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  en,           /*
a530: 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69   xOpen */.    wi
a540: 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20  nDelete,        
a550: 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20   /* xDelete */. 
a560: 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20     winAccess,   
a570: 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73        /* xAccess
a580: 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 54 65   */.    winGetTe
a590: 6d 70 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 78 47  mpName,    /* xG
a5a0: 65 74 54 65 6d 70 4e 61 6d 65 20 2a 2f 0a 20 20  etTempName */.  
a5b0: 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d    winFullPathnam
a5c0: 65 2c 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74  e,   /* xFullPat
a5d0: 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e  hname */.    win
a5e0: 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  DlOpen,         
a5f0: 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20  /* xDlOpen */.  
a600: 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20    winDlError,   
a610: 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72       /* xDlError
a620: 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d   */.    winDlSym
a630: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
a640: 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44  lSym */.    winD
a650: 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 2f  lClose,        /
a660: 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20  * xDlClose */.  
a670: 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c    winRandomness,
a680: 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e       /* xRandomn
a690: 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c  ess */.    winSl
a6a0: 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  eep,          /*
a6b0: 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77   xSleep */.    w
a6c0: 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 20 20 20  inCurrentTime   
a6d0: 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
a6e0: 65 20 2a 2f 0a 20 20 7d 3b 0a 20 20 0a 20 20 72  e */.  };.  .  r
a6f0: 65 74 75 72 6e 20 26 77 69 6e 56 66 73 3b 0a 7d  eturn &winVfs;.}
a700: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 57  ..#endif /* OS_W
a710: 49 4e 20 2a 2f 0a                                IN */.