/ Hex Artifact Content
Login

Artifact ce778c06afcbfd120ede237befece4655e83c8d0:


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 6f   rc;.}../*.** Co
6ec0: 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20  ntrol and query 
6ed0: 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
6ee0: 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
6ef0: 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f  ic int winFileCo
6f00: 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
6f10: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20  le *id, int op, 
6f20: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73  void *pArg){.  s
6f30: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
6f40: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
6f50: 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a  TL_LOCKSTATE: {.
6f60: 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
6f70: 67 20 3d 20 28 28 77 69 6e 46 69 6c 65 2a 29 69  g = ((winFile*)i
6f80: 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  d)->locktype;.  
6f90: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6fa0: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
6fb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6fc0: 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
6fd0: 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f  Return the secto
6fe0: 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  r size in bytes 
6ff0: 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
7000: 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66  g block device f
7010: 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66  or.** the specif
7020: 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69  ied file. This i
7030: 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20  s almost always 
7040: 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d  512 bytes, but m
7050: 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20  ay be.** larger 
7060: 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73  for some devices
7070: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63  ..**.** SQLite c
7080: 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73  ode assumes this
7090: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74   function cannot
70a0: 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61   fail. It also a
70b0: 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69  ssumes that.** i
70c0: 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20  f two files are 
70d0: 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73  created in the s
70e0: 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ame file-system 
70f0: 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a  directory (i.e..
7100: 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e  ** a database an
7110: 64 20 69 74 27 73 20 6a 6f 75 72 6e 61 6c 20 66  d it's journal f
7120: 69 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65  ile) that the se
7130: 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
7140: 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f  e the.** same fo
7150: 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69  r both..*/.stati
7160: 63 20 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53  c int winSectorS
7170: 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
7180: 20 2a 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20   *id){.  return 
7190: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
71a0: 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f  ECTOR_SIZE;.}../
71b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65  *.** Return a ve
71c0: 63 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63  ctor of device c
71d0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a  haracteristics..
71e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
71f0: 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  nDeviceCharacter
7200: 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66  istics(sqlite3_f
7210: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65 74 75  ile *id){.  retu
7220: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
7230: 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e  his vector defin
7240: 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f  es all the metho
7250: 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72  ds that can oper
7260: 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c  ate on an.** sql
7270: 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77 69  ite3_file for wi
7280: 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  n32..*/.static c
7290: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
72a0: 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74  methods winIoMet
72b0: 68 6f 64 20 3d 20 7b 0a 20 20 31 2c 20 20 20 20  hod = {.  1,    
72c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72d0: 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
72e0: 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 0a 20  */.  winClose,. 
72f0: 20 77 69 6e 52 65 61 64 2c 0a 20 20 77 69 6e 57   winRead,.  winW
7300: 72 69 74 65 2c 0a 20 20 77 69 6e 54 72 75 6e 63  rite,.  winTrunc
7310: 61 74 65 2c 0a 20 20 77 69 6e 53 79 6e 63 2c 0a  ate,.  winSync,.
7320: 20 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c 0a 20    winFileSize,. 
7330: 20 77 69 6e 4c 6f 63 6b 2c 0a 20 20 77 69 6e 55   winLock,.  winU
7340: 6e 6c 6f 63 6b 2c 0a 20 20 77 69 6e 43 68 65 63  nlock,.  winChec
7350: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 20  kReservedLock,. 
7360: 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c   winFileControl,
7370: 0a 20 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65  .  winSectorSize
7380: 2c 0a 20 20 77 69 6e 44 65 76 69 63 65 43 68 61  ,.  winDeviceCha
7390: 72 61 63 74 65 72 69 73 74 69 63 73 0a 7d 3b 0a  racteristics.};.
73a0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
73b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
73c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
73d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
73e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
73f0: 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 49   Here ends the I
7400: 2f 4f 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20  /O methods that 
7410: 66 6f 72 6d 20 74 68 65 20 73 71 6c 69 74 65 33  form the sqlite3
7420: 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
7430: 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ct..**.** The ne
7440: 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  xt block of code
7450: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
7460: 56 46 53 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 2a  VFS methods..***
7470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
74c0: 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d  * Convert a UTF-
74d0: 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20  8 filename into 
74e0: 77 68 61 74 65 76 65 72 20 66 6f 72 6d 20 74 68  whatever form th
74f0: 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20  e underlying.** 
7500: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
7510: 20 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73   wants filenames
7520: 20 69 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68   in.  Space to h
7530: 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  old the result.*
7540: 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  * is obtained fr
7550: 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75  om malloc and mu
7560: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
7570: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
7580: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
7590: 63 20 76 6f 69 64 20 2a 63 6f 6e 76 65 72 74 55  c void *convertU
75a0: 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73  tf8Filename(cons
75b0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
75c0: 65 29 7b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  e){.  void *zCon
75d0: 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66  verted = 0;.  if
75e0: 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
75f0: 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 75 74 66  zConverted = utf
7600: 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  8ToUnicode(zFile
7610: 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  name);.  }else{.
7620: 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
7630: 20 75 74 66 38 54 6f 4d 62 63 73 28 7a 46 69 6c   utf8ToMbcs(zFil
7640: 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 2f 2a  ename);.  }.  /*
7650: 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e   caller will han
7660: 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  dle out of memor
7670: 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43  y */.  return zC
7680: 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a  onverted;.}../*.
7690: 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a  ** Open a file..
76a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
76b0: 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  nOpen(.  sqlite3
76c0: 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
76d0: 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a     /* Not used *
76e0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
76f0: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a  zName,        /*
7700: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
7710: 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73  e (UTF-8) */.  s
7720: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
7730: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
7740: 65 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c  e the SQLite fil
7750: 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f  e handle here */
7760: 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7780: 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73 20  Open mode flags 
7790: 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c  */.  int *pOutFl
77a0: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
77b0: 2a 20 53 74 61 74 75 73 20 72 65 74 75 72 6e 20  * Status return 
77c0: 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 41  flags */.){.  HA
77d0: 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44 20  NDLE h;.  DWORD 
77e0: 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 3b  dwDesiredAccess;
77f0: 0a 20 20 44 57 4f 52 44 20 64 77 53 68 61 72 65  .  DWORD dwShare
7800: 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20 64 77  Mode;.  DWORD dw
7810: 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
7820: 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64 77 46  ion;.  DWORD dwF
7830: 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
7840: 73 20 3d 20 30 3b 0a 20 20 77 69 6e 46 69 6c 65  s = 0;.  winFile
7850: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
7860: 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a  le*)id;.  void *
7870: 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e  zConverted = con
7880: 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65  vertUtf8Filename
7890: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  (zName);.  if( z
78a0: 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
78b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
78c0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
78d0: 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
78e0: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
78f0: 45 20 29 7b 0a 20 20 20 20 64 77 44 65 73 69 72  E ){.    dwDesir
7900: 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52  edAccess = GENER
7910: 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49  IC_READ | GENERI
7920: 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65  C_WRITE;.  }else
7930: 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41  {.    dwDesiredA
7940: 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f  ccess = GENERIC_
7950: 52 45 41 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20  READ;.  }.  if( 
7960: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
7970: 50 45 4e 5f 43 52 45 41 54 45 20 29 7b 0a 20 20  PEN_CREATE ){.  
7980: 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
7990: 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41  osition = OPEN_A
79a0: 4c 57 41 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a  LWAYS;.  }else{.
79b0: 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
79c0: 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e  sposition = OPEN
79d0: 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a 20  _EXISTING;.  }. 
79e0: 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
79f0: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
7a00: 20 29 7b 0a 20 20 20 20 64 77 53 68 61 72 65 4d   ){.    dwShareM
7a10: 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48 41 52 45  ode = FILE_SHARE
7a20: 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48 41  _READ | FILE_SHA
7a30: 52 45 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73  RE_WRITE;.  }els
7a40: 65 7b 0a 20 20 20 20 64 77 53 68 61 72 65 4d 6f  e{.    dwShareMo
7a50: 64 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  de = 0;.  }.  if
7a60: 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54  ( flags & (SQLIT
7a70: 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c  E_OPEN_TEMP_DB |
7a80: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
7a90: 50 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 20  P_JOURNAL.      
7aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
7ab0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
7ac0: 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 64  OURNAL) ){.    d
7ad0: 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
7ae0: 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49  tes = FILE_ATTRI
7af0: 42 55 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20  BUTE_TEMPORARY. 
7b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
7b20: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48  FILE_ATTRIBUTE_H
7b30: 49 44 44 45 4e 0a 20 20 20 20 20 20 20 20 20 20  IDDEN.          
7b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b50: 20 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47       | FILE_FLAG
7b60: 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45  _DELETE_ON_CLOSE
7b70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
7b80: 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
7b90: 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49  tes = FILE_ATTRI
7ba0: 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d  BUTE_NORMAL;.  }
7bb0: 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 28  .  if( flags & (
7bc0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
7bd0: 5f 44 42 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  _DB | SQLITE_OPE
7be0: 4e 5f 54 45 4d 50 5f 44 42 29 20 29 7b 0a 20 20  N_TEMP_DB) ){.  
7bf0: 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
7c00: 69 62 75 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46  ibutes |= FILE_F
7c10: 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53  LAG_RANDOM_ACCES
7c20: 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  S;.  }else{.    
7c30: 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
7c40: 75 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41  utes |= FILE_FLA
7c50: 47 5f 53 45 51 55 45 4e 54 49 41 4c 5f 53 43 41  G_SEQUENTIAL_SCA
7c60: 4e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e  N;.  }.  if( isN
7c70: 54 28 29 20 29 7b 0a 20 20 20 20 68 20 3d 20 43  T() ){.    h = C
7c80: 72 65 61 74 65 46 69 6c 65 57 28 28 57 43 48 41  reateFileW((WCHA
7c90: 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  R*)zConverted,. 
7ca0: 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
7cb0: 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 64 77  ccess,.       dw
7cc0: 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20  ShareMode,.     
7cd0: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 64    NULL,.       d
7ce0: 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
7cf0: 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 64 77 46  tion,.       dwF
7d00: 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
7d10: 73 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20  s,.       NULL. 
7d20: 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23     );.  }else{.#
7d30: 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  if OS_WINCE.    
7d40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
7d50: 4d 45 4d 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68  MEM;.#else.    h
7d60: 20 3d 20 43 72 65 61 74 65 46 69 6c 65 41 28 28   = CreateFileA((
7d70: 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
7d80: 2c 0a 20 20 20 20 20 20 20 64 77 44 65 73 69 72  ,.       dwDesir
7d90: 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20  edAccess,.      
7da0: 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20   dwShareMode,.  
7db0: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
7dc0: 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
7dd0: 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20  osition,.       
7de0: 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
7df0: 75 74 65 73 2c 0a 20 20 20 20 20 20 20 4e 55 4c  utes,.       NUL
7e00: 4c 0a 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a  L.    );.#endif.
7e10: 20 20 7d 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56    }.  if( h==INV
7e20: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
7e30: 45 20 29 7b 0a 20 20 20 20 66 72 65 65 28 7a 43  E ){.    free(zC
7e40: 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 69  onverted);.    i
7e50: 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
7e60: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
7e70: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
7e80: 20 77 69 6e 4f 70 65 6e 28 30 2c 20 7a 4e 61 6d   winOpen(0, zNam
7e90: 65 2c 20 69 64 2c 20 0a 20 20 20 20 20 20 20 20  e, id, .        
7ea0: 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53 51 4c       ((flags|SQL
7eb0: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
7ec0: 59 29 26 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  Y)&~SQLITE_OPEN_
7ed0: 52 45 41 44 57 52 49 54 45 29 2c 20 70 4f 75 74  READWRITE), pOut
7ee0: 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73  Flags);.    }els
7ef0: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
7f00: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
7f10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
7f20: 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20   pOutFlags ){.  
7f30: 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
7f40: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
7f50: 49 54 45 20 29 7b 0a 20 20 20 20 20 20 2a 70 4f  ITE ){.      *pO
7f60: 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  utFlags = SQLITE
7f70: 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b  _OPEN_READWRITE;
7f80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7f90: 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53    *pOutFlags = S
7fa0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
7fb0: 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  NLY;.    }.  }. 
7fc0: 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30   memset(pFile, 0
7fd0: 2c 20 73 69 7a 65 6f 66 28 2a 70 46 69 6c 65 29  , sizeof(*pFile)
7fe0: 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74  );.  pFile->pMet
7ff0: 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68  hod = &winIoMeth
8000: 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d  od;.  pFile->h =
8010: 20 68 3b 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45   h;.#if OS_WINCE
8020: 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20  .  if( (flags & 
8030: 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
8040: 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
8050: 45 4e 5f 4d 41 49 4e 5f 44 42 29 29 20 3d 3d 0a  EN_MAIN_DB)) ==.
8060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
8070: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
8080: 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
8090: 4e 5f 4d 41 49 4e 5f 44 42 29 0a 20 20 20 20 20  N_MAIN_DB).     
80a0: 20 20 26 26 20 21 77 69 6e 63 65 43 72 65 61 74    && !winceCreat
80b0: 65 4c 6f 63 6b 28 7a 46 69 6c 65 6e 61 6d 65 2c  eLock(zFilename,
80c0: 20 26 66 29 0a 20 20 29 7b 0a 20 20 20 20 43 6c   &f).  ){.    Cl
80d0: 6f 73 65 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20  oseHandle(h);.  
80e0: 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65    free(zConverte
80f0: 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  d);.    return S
8100: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
8110: 20 20 7d 0a 20 20 69 66 28 20 64 77 46 6c 61 67    }.  if( dwFlag
8120: 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 26  sAndAttributes &
8130: 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54   FILE_FLAG_DELET
8140: 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20  EONCLOSE ){.    
8150: 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
8160: 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74  Close = zConvert
8170: 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ed;.  }else.#end
8180: 69 66 0a 20 20 7b 0a 20 20 20 20 66 72 65 65 28  if.  {.    free(
8190: 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d  zConverted);.  }
81a0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
81b0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
81c0: 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66  lete the named f
81d0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ile..**.** Note 
81e0: 74 68 61 74 20 77 69 6e 64 6f 77 73 20 64 6f 65  that windows doe
81f0: 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69  s not allow a fi
8200: 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  le to be deleted
8210: 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a   if some other.*
8220: 2a 20 70 72 6f 63 65 73 73 20 68 61 73 20 69 74  * process has it
8230: 20 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65   open.  Sometime
8240: 73 20 61 20 76 69 72 75 73 20 73 63 61 6e 6e 65  s a virus scanne
8250: 72 20 6f 72 20 69 6e 64 65 78 69 6e 67 20 70 72  r or indexing pr
8260: 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70  ogram.** will op
8270: 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  en a journal fil
8280: 65 20 73 68 6f 72 74 6c 79 20 61 66 74 65 72 20  e shortly after 
8290: 69 74 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  it is created in
82a0: 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20   order to do.** 
82b0: 77 68 61 74 65 76 65 72 20 69 74 20 69 73 20 69  whatever it is i
82c0: 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20 74  t does.  While t
82d0: 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73  his other proces
82e0: 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  s is holding the
82f0: 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77  .** file open, w
8300: 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65  e will be unable
8310: 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20   to delete it.  
8320: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
8330: 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20  his.** problem, 
8340: 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c  we delay 100 mil
8350: 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72  liseconds and tr
8360: 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69  y to delete agai
8370: 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f  n.  Up.** to MX_
8380: 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54  DELETION_ATTEMPT
8390: 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d  s deletion attem
83a0: 70 74 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f  pts are run befo
83b0: 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20  re giving.** up 
83c0: 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  and returning an
83d0: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69   error..*/.#defi
83e0: 6e 65 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41  ne MX_DELETION_A
83f0: 54 54 45 4d 50 54 53 20 33 0a 73 74 61 74 69 63  TTEMPTS 3.static
8400: 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 0a   int winDelete(.
8410: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
8420: 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Vfs,          /*
8430: 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e   Not used on win
8440: 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  32 */.  const ch
8450: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
8460: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66      /* Name of f
8470: 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f  ile to delete */
8480: 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20 20  .  int syncDir  
8490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
84a0: 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69  * Not used on wi
84b0: 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  n32 */.){.  int 
84c0: 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  cnt = 0;.  int r
84d0: 63 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  c;.  void *zConv
84e0: 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55  erted = convertU
84f0: 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c  tf8Filename(zFil
8500: 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43  ename);.  if( zC
8510: 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
8520: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8530: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 53 69  _NOMEM;.  }.  Si
8540: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
8550: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
8560: 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66 28  R_DELETE);.  if(
8570: 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 64   isNT() ){.    d
8580: 6f 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 44 65  o{.      rc = De
8590: 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65  leteFileW(zConve
85a0: 72 74 65 64 29 3b 0a 20 20 20 20 7d 77 68 69 6c  rted);.    }whil
85b0: 65 28 20 72 63 3d 3d 30 20 26 26 20 47 65 74 46  e( rc==0 && GetF
85c0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 7a  ileAttributesW(z
85d0: 43 6f 6e 76 65 72 74 65 64 29 21 3d 30 78 66 66  Converted)!=0xff
85e0: 66 66 66 66 66 66 20 0a 20 20 20 20 20 20 20 20  ffffff .        
85f0: 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20 4d      && cnt++ < M
8600: 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d  X_DELETION_ATTEM
8610: 50 54 53 20 26 26 20 28 53 6c 65 65 70 28 31 30  PTS && (Sleep(10
8620: 30 29 2c 20 31 29 20 29 3b 0a 20 20 7d 65 6c 73  0), 1) );.  }els
8630: 65 7b 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a  e{.#if OS_WINCE.
8640: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8650: 45 5f 4e 4f 4d 45 4d 3b 0a 23 65 6c 73 65 0a 20  E_NOMEM;.#else. 
8660: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 72 63 20     do{.      rc 
8670: 3d 20 44 65 6c 65 74 65 46 69 6c 65 41 28 7a 43  = DeleteFileA(zC
8680: 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7d  onverted);.    }
8690: 77 68 69 6c 65 28 20 72 63 3d 3d 30 20 26 26 20  while( rc==0 && 
86a0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
86b0: 73 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 21 3d  sA(zConverted)!=
86c0: 30 78 66 66 66 66 66 66 66 66 0a 20 20 20 20 20  0xffffffff.     
86d0: 20 20 20 20 20 20 20 26 26 20 63 6e 74 2b 2b 20         && cnt++ 
86e0: 3c 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54  < MX_DELETION_AT
86f0: 54 45 4d 50 54 53 20 26 26 20 28 53 6c 65 65 70  TEMPTS && (Sleep
8700: 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23 65 6e  (100), 1) );.#en
8710: 64 69 66 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a  dif.  }.  free(z
8720: 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 4f 53  Converted);.  OS
8730: 54 52 41 43 45 32 28 22 44 45 4c 45 54 45 20 5c  TRACE2("DELETE \
8740: 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 6e  "%s\"\n", zFilen
8750: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ame);.  return r
8760: 63 21 3d 30 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  c!=0 ? SQLITE_OK
8770: 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b   : SQLITE_IOERR;
8780: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
8790: 74 68 65 20 65 78 69 73 74 61 6e 63 65 20 61 6e  the existance an
87a0: 64 20 73 74 61 74 75 73 20 6f 66 20 61 20 66 69  d status of a fi
87b0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
87c0: 74 20 77 69 6e 41 63 63 65 73 73 28 0a 20 20 73  t winAccess(.  s
87d0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
87e0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74  ,         /* Not
87f0: 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a   used on win32 *
8800: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
8810: 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f  zFilename,     /
8820: 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
8830: 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74  o check */.  int
8840: 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
8850: 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
8860: 6f 66 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20  of test to make 
8870: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
8880: 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b  ){.  DWORD attr;
8890: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 6f 69  .  int rc;.  voi
88a0: 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  d *zConverted = 
88b0: 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e  convertUtf8Filen
88c0: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
88d0: 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
88e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
88f0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
8900: 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29    }.  if( isNT()
8910: 20 29 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 47   ){.    attr = G
8920: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
8930: 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65  W((WCHAR*)zConve
8940: 72 74 65 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rted);.  }else{.
8950: 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20 20  #if OS_WINCE.   
8960: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
8970: 4f 4d 45 4d 3b 0a 23 65 6c 73 65 0a 20 20 20 20  OMEM;.#else.    
8980: 61 74 74 72 20 3d 20 47 65 74 46 69 6c 65 41 74  attr = GetFileAt
8990: 74 72 69 62 75 74 65 73 41 28 28 63 68 61 72 2a  tributesA((char*
89a0: 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65  )zConverted);.#e
89b0: 6e 64 69 66 0a 20 20 7d 0a 20 20 66 72 65 65 28  ndif.  }.  free(
89c0: 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 73  zConverted);.  s
89d0: 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a  witch( flags ){.
89e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
89f0: 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20  ACCESS_READ:.   
8a00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
8a10: 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20  ESS_EXISTS:.    
8a20: 20 20 72 63 20 3d 20 61 74 74 72 21 3d 30 78 66    rc = attr!=0xf
8a30: 66 66 66 66 66 66 66 3b 0a 20 20 20 20 20 20 62  fffffff;.      b
8a40: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
8a50: 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
8a60: 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 72 63  DWRITE:.      rc
8a70: 20 3d 20 28 61 74 74 72 20 26 20 46 49 4c 45 5f   = (attr & FILE_
8a80: 41 54 54 52 49 42 55 54 45 5f 52 45 41 44 4f 4e  ATTRIBUTE_READON
8a90: 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20 20 62 72  LY)==0;.      br
8aa0: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
8ab0: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 21  :.      assert(!
8ac0: 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61  "Invalid flags a
8ad0: 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20  rgument");.  }. 
8ae0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
8af0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74  /*.** Create a t
8b00: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61  emporary file na
8b10: 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75  me in zBuf.  zBu
8b20: 66 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e  f must be big en
8b30: 6f 75 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20  ough to.** hold 
8b40: 61 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  at pVfs->mxPathn
8b50: 61 6d 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a  ame characters..
8b60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
8b70: 6e 47 65 74 54 65 6d 70 4e 61 6d 65 28 73 71 6c  nGetTempName(sql
8b80: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
8b90: 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73  char *zBuf){.  s
8ba0: 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61 72  tatic char zChar
8bb0: 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65  s[] =.    "abcde
8bc0: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
8bd0: 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44  vwxyz".    "ABCD
8be0: 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
8bf0: 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32  UVWXYZ".    "012
8c00: 33 34 35 36 37 38 39 22 3b 0a 20 20 69 6e 74 20  3456789";.  int 
8c10: 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 7a 54 65  i, j;.  char zTe
8c20: 6d 70 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 2b  mpPath[MAX_PATH+
8c30: 31 5d 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  1];.  if( sqlite
8c40: 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
8c50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
8c60: 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
8c70: 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c  H-30, zTempPath,
8c80: 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 74   "%s", sqlite3_t
8c90: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a  emp_directory);.
8ca0: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 54    }else if( isNT
8cb0: 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  () ){.    char *
8cc0: 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 57 43 48 41  zMulti;.    WCHA
8cd0: 52 20 7a 57 69 64 65 50 61 74 68 5b 4d 41 58 5f  R zWidePath[MAX_
8ce0: 50 41 54 48 5d 3b 0a 20 20 20 20 47 65 74 54 65  PATH];.    GetTe
8cf0: 6d 70 50 61 74 68 57 28 4d 41 58 5f 50 41 54 48  mpPathW(MAX_PATH
8d00: 2d 33 30 2c 20 7a 57 69 64 65 50 61 74 68 29 3b  -30, zWidePath);
8d10: 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20 75 6e  .    zMulti = un
8d20: 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 57 69 64  icodeToUtf8(zWid
8d30: 65 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  ePath);.    if( 
8d40: 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20 20 20  zMulti ){.      
8d50: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
8d60: 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54  (MAX_PATH-30, zT
8d70: 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20 7a  empPath, "%s", z
8d80: 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 66 72  Multi);.      fr
8d90: 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20  ee(zMulti);.    
8da0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
8db0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
8dc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
8dd0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38  .    char *zUtf8
8de0: 3b 0a 20 20 20 20 63 68 61 72 20 7a 4d 62 63 73  ;.    char zMbcs
8df0: 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a  Path[MAX_PATH];.
8e00: 20 20 20 20 47 65 74 54 65 6d 70 50 61 74 68 41      GetTempPathA
8e10: 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 4d  (MAX_PATH-30, zM
8e20: 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20 7a 55  bcsPath);.    zU
8e30: 74 66 38 20 3d 20 6d 62 63 73 54 6f 55 74 66 38  tf8 = mbcsToUtf8
8e40: 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20  (zMbcsPath);.   
8e50: 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20   if( zUtf8 ){.  
8e60: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
8e70: 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30  intf(MAX_PATH-30
8e80: 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73  , zTempPath, "%s
8e90: 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ", zUtf8);.     
8ea0: 20 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20   free(zUtf8);.  
8eb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
8ec0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
8ed0: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
8ee0: 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a 54 65  for(i=strlen(zTe
8ef0: 6d 70 50 61 74 68 29 3b 20 69 3e 30 20 26 26 20  mpPath); i>0 && 
8f00: 7a 54 65 6d 70 50 61 74 68 5b 69 2d 31 5d 3d 3d  zTempPath[i-1]==
8f10: 27 5c 5c 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a  '\\'; i--){}.  z
8f20: 54 65 6d 70 50 61 74 68 5b 69 5d 20 3d 20 30 3b  TempPath[i] = 0;
8f30: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
8f40: 6e 74 66 28 70 56 66 73 2d 3e 6d 78 50 61 74 68  ntf(pVfs->mxPath
8f50: 6e 61 6d 65 2d 33 30 2c 20 7a 42 75 66 2c 0a 20  name-30, zBuf,. 
8f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f70: 20 20 22 25 73 5c 5c 22 53 51 4c 49 54 45 5f 54    "%s\\"SQLITE_T
8f80: 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c  EMP_FILE_PREFIX,
8f90: 20 7a 54 65 6d 70 50 61 74 68 29 3b 0a 20 20 6a   zTempPath);.  j
8fa0: 20 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b   = strlen(zBuf);
8fb0: 0a 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d  .  sqlite3Random
8fc0: 6e 65 73 73 28 32 30 2c 20 26 7a 42 75 66 5b 6a  ness(20, &zBuf[j
8fd0: 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
8fe0: 3c 32 30 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a  <20; i++, j++){.
8ff0: 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63      zBuf[j] = (c
9000: 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e  har)zChars[ ((un
9010: 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66  signed char)zBuf
9020: 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68  [j])%(sizeof(zCh
9030: 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20  ars)-1) ];.  }. 
9040: 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20   zBuf[j] = 0;.  
9050: 4f 53 54 52 41 43 45 32 28 22 54 45 4d 50 20 46  OSTRACE2("TEMP F
9060: 49 4c 45 4e 41 4d 45 3a 20 25 73 5c 6e 22 2c 20  ILENAME: %s\n", 
9070: 7a 42 75 66 29 3b 0a 20 20 72 65 74 75 72 6e 20  zBuf);.  return 
9080: 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f  SQLITE_OK; .}../
9090: 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61  *.** Turn a rela
90a0: 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e  tive pathname in
90b0: 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61  to a full pathna
90c0: 6d 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 66  me.  Write the f
90d0: 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20  ull.** pathname 
90e0: 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f  into zOut[].  zO
90f0: 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61 74 20  ut[] will be at 
9100: 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d 78 50 61  least pVfs->mxPa
9110: 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20  thname.** bytes 
9120: 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  in size..*/.stat
9130: 69 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61  ic int winFullPa
9140: 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  thname(.  sqlite
9150: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
9160: 20 20 20 20 20 20 0a 20 20 63 6f 6e 73 74 20 63        .  const c
9170: 68 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c 0a  har *zRelative,.
9180: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 0a 29 7b    char *zFull.){
9190: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
91a0: 43 59 47 57 49 4e 5f 5f 29 0a 20 20 63 79 67 77  CYGWIN__).  cygw
91b0: 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 66 75 6c 6c 5f  in_conv_to_full_
91c0: 77 69 6e 33 32 5f 70 61 74 68 28 7a 52 65 6c 61  win32_path(zRela
91d0: 74 69 76 65 2c 20 7a 46 75 6c 6c 29 3b 0a 20 20  tive, zFull);.  
91e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
91f0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f  .#endif..#if OS_
9200: 57 49 4e 43 45 0a 20 20 2f 2a 20 57 69 6e 43 45  WINCE.  /* WinCE
9210: 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20   has no concept 
9220: 6f 66 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  of a relative pa
9230: 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20  thname, or so I 
9240: 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 73 71  am told. */.  sq
9250: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 70  lite3_snprintf(p
9260: 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c  Vfs->mxPathname,
9270: 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52   zFull, "%s", zR
9280: 65 6c 61 74 69 76 65 29 3b 0a 23 65 6e 64 69 66  elative);.#endif
9290: 0a 0a 23 69 66 20 21 4f 53 5f 57 49 4e 43 45 20  ..#if !OS_WINCE 
92a0: 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59  && !defined(__CY
92b0: 47 57 49 4e 5f 5f 29 0a 20 20 69 6e 74 20 6e 42  GWIN__).  int nB
92c0: 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  yte;.  void *zCo
92d0: 6e 76 65 72 74 65 64 3b 0a 20 20 63 68 61 72 20  nverted;.  char 
92e0: 2a 7a 4f 75 74 3b 0a 20 20 7a 43 6f 6e 76 65 72  *zOut;.  zConver
92f0: 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66  ted = convertUtf
9300: 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74  8Filename(zRelat
9310: 69 76 65 29 3b 0a 20 20 69 66 28 20 69 73 4e 54  ive);.  if( isNT
9320: 28 29 20 29 7b 0a 20 20 20 20 57 43 48 41 52 20  () ){.    WCHAR 
9330: 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74  *zTemp;.    nByt
9340: 65 20 3d 20 47 65 74 46 75 6c 6c 50 61 74 68 4e  e = GetFullPathN
9350: 61 6d 65 57 28 28 57 43 48 41 52 2a 29 7a 43 6f  ameW((WCHAR*)zCo
9360: 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30  nverted, 0, 0, 0
9370: 29 20 2b 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70  ) + 3;.    zTemp
9380: 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65   = malloc( nByte
9390: 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d  *sizeof(zTemp[0]
93a0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65  ) );.    if( zTe
93b0: 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  mp==0 ){.      f
93c0: 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
93d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
93e0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
93f0: 7d 0a 20 20 20 20 47 65 74 46 75 6c 6c 50 61 74  }.    GetFullPat
9400: 68 4e 61 6d 65 57 28 28 57 43 48 41 52 2a 29 7a  hNameW((WCHAR*)z
9410: 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65  Converted, nByte
9420: 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20  , zTemp, 0);.   
9430: 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64   free(zConverted
9440: 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 75 6e  );.    zOut = un
9450: 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d  icodeToUtf8(zTem
9460: 70 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 54 65  p);.    free(zTe
9470: 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  mp);.  }else{.  
9480: 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20    char *zTemp;. 
9490: 20 20 20 6e 42 79 74 65 20 3d 20 47 65 74 46 75     nByte = GetFu
94a0: 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61  llPathNameA((cha
94b0: 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30  r*)zConverted, 0
94c0: 2c 20 30 2c 20 30 29 20 2b 20 33 3b 0a 20 20 20  , 0, 0) + 3;.   
94d0: 20 7a 54 65 6d 70 20 3d 20 6d 61 6c 6c 6f 63 28   zTemp = malloc(
94e0: 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54   nByte*sizeof(zT
94f0: 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  emp[0]) );.    i
9500: 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20  f( zTemp==0 ){. 
9510: 20 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65       free(zConve
9520: 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
9530: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
9540: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 47 65 74 46  ;.    }.    GetF
9550: 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68  ullPathNameA((ch
9560: 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  ar*)zConverted, 
9570: 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29  nByte, zTemp, 0)
9580: 3b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76  ;.    free(zConv
9590: 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74  erted);.    zOut
95a0: 20 3d 20 6d 62 63 73 54 6f 55 74 66 38 28 7a 54   = mbcsToUtf8(zT
95b0: 65 6d 70 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  emp);.    free(z
95c0: 54 65 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Temp);.  }.  if(
95d0: 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c   zOut ){.    sql
95e0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 70 56  ite3_snprintf(pV
95f0: 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20  fs->mxPathname, 
9600: 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75  zFull, "%s", zOu
9610: 74 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 4f 75  t);.    free(zOu
9620: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
9630: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
9640: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
9650: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
9660: 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 6e 64 65  #endif.}..#ifnde
9670: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
9680: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a  AD_EXTENSION./*.
9690: 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f  ** Interfaces fo
96a0: 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72  r opening a shar
96b0: 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64  ed library, find
96c0: 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  ing entry points
96d0: 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73  .** within the s
96e0: 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61  hared library, a
96f0: 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73  nd closing the s
9700: 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a  hared library..*
9710: 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  /./*.** Interfac
9720: 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61  es for opening a
9730: 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
9740: 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70   finding entry p
9750: 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20  oints.** within 
9760: 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
9770: 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20  ry, and closing 
9780: 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
9790: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
97a0: 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e 28 73 71  id *winDlOpen(sq
97b0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
97c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
97d0: 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e 44 4c  lename){.  HANDL
97e0: 45 20 68 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  E h;.  void *zCo
97f0: 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72  nverted = conver
9800: 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  tUtf8Filename(zF
9810: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
9820: 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
9830: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
9840: 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20   }.  if( isNT() 
9850: 29 7b 0a 20 20 20 20 68 20 3d 20 4c 6f 61 64 4c  ){.    h = LoadL
9860: 69 62 72 61 72 79 57 28 28 57 43 48 41 52 2a 29  ibraryW((WCHAR*)
9870: 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d  zConverted);.  }
9880: 65 6c 73 65 7b 0a 23 69 66 20 4f 53 5f 57 49 4e  else{.#if OS_WIN
9890: 43 45 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  CE.    return 0;
98a0: 0a 23 65 6c 73 65 0a 20 20 20 20 68 20 3d 20 4c  .#else.    h = L
98b0: 6f 61 64 4c 69 62 72 61 72 79 41 28 28 63 68 61  oadLibraryA((cha
98c0: 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  r*)zConverted);.
98d0: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 66 72 65  #endif.  }.  fre
98e0: 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
98f0: 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 68   return (void*)h
9900: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
9910: 77 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c 69 74  winDlError(sqlit
9920: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
9930: 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
9940: 75 66 4f 75 74 29 7b 0a 20 20 46 6f 72 6d 61 74  ufOut){.  Format
9950: 4d 65 73 73 61 67 65 28 0a 20 20 20 20 46 4f 52  Message(.    FOR
9960: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d  MAT_MESSAGE_FROM
9970: 5f 53 59 53 54 45 4d 2c 0a 20 20 20 20 4e 55 4c  _SYSTEM,.    NUL
9980: 4c 2c 0a 20 20 20 20 47 65 74 4c 61 73 74 45 72  L,.    GetLastEr
9990: 72 6f 72 28 29 2c 0a 20 20 20 20 30 2c 0a 20 20  ror(),.    0,.  
99a0: 20 20 7a 42 75 66 4f 75 74 2c 0a 20 20 20 20 6e    zBufOut,.    n
99b0: 42 75 66 2d 31 2c 0a 20 20 20 20 30 0a 20 20 29  Buf-1,.    0.  )
99c0: 3b 0a 7d 0a 76 6f 69 64 20 2a 77 69 6e 44 6c 53  ;.}.void *winDlS
99d0: 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ym(sqlite3_vfs *
99e0: 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e  pVfs, void *pHan
99f0: 64 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  dle, const char 
9a00: 2a 7a 53 79 6d 62 6f 6c 29 7b 0a 23 69 66 20 4f  *zSymbol){.#if O
9a10: 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 20 54 68 65  S_WINCE.  /* The
9a20: 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41   GetProcAddressA
9a30: 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  () routine is on
9a40: 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
9a50: 77 69 6e 63 65 2e 20 2a 2f 0a 20 20 72 65 74 75  wince. */.  retu
9a60: 72 6e 20 47 65 74 50 72 6f 63 41 64 64 72 65 73  rn GetProcAddres
9a70: 73 41 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64  sA((HANDLE)pHand
9a80: 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 23 65  le, zSymbol);.#e
9a90: 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68  lse.  /* All oth
9aa0: 65 72 20 77 69 6e 64 6f 77 73 20 70 6c 61 74 66  er windows platf
9ab0: 6f 72 6d 73 20 65 78 70 65 63 74 20 47 65 74 50  orms expect GetP
9ac0: 72 6f 63 41 64 64 72 65 73 73 28 29 20 74 6f 20  rocAddress() to 
9ad0: 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 6e 73  take.  ** an Ans
9ae0: 69 20 73 74 72 69 6e 67 20 72 65 67 61 72 64 6c  i string regardl
9af0: 65 73 73 20 6f 66 20 74 68 65 20 5f 55 4e 49 43  ess of the _UNIC
9b00: 4f 44 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20  ODE setting */. 
9b10: 20 72 65 74 75 72 6e 20 47 65 74 50 72 6f 63 41   return GetProcA
9b20: 64 64 72 65 73 73 28 28 48 41 4e 44 4c 45 29 70  ddress((HANDLE)p
9b30: 48 61 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29  Handle, zSymbol)
9b40: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 76 6f 69 64 20  ;.#endif.}.void 
9b50: 77 69 6e 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74  winDlClose(sqlit
9b60: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f  e3_vfs *pVfs, vo
9b70: 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20  id *pHandle){.  
9b80: 46 72 65 65 4c 69 62 72 61 72 79 28 28 48 41 4e  FreeLibrary((HAN
9b90: 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a  DLE)pHandle);.}.
9ba0: 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49  #else /* if SQLI
9bb0: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
9bc0: 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65  ENSION is define
9bd0: 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  d: */.  #define 
9be0: 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23  winDlOpen  0.  #
9bf0: 64 65 66 69 6e 65 20 77 69 6e 44 6c 45 72 72 6f  define winDlErro
9c00: 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69  r 0.  #define wi
9c10: 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65  nDlSym   0.  #de
9c20: 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f 73 65 20  fine winDlClose 
9c30: 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
9c40: 20 57 72 69 74 65 20 75 70 20 74 6f 20 6e 42 75   Write up to nBu
9c50: 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f  f bytes of rando
9c60: 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e  mness into zBuf.
9c70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
9c80: 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c  inRandomness(sql
9c90: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
9ca0: 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
9cb0: 7a 42 75 66 29 7b 0a 20 20 69 66 28 20 73 69 7a  zBuf){.  if( siz
9cc0: 65 6f 66 28 4c 50 53 59 53 54 45 4d 54 49 4d 45  eof(LPSYSTEMTIME
9cd0: 29 3e 3d 6e 42 75 66 20 29 7b 0a 20 20 20 20 47  )>=nBuf ){.    G
9ce0: 65 74 53 79 73 74 65 6d 54 69 6d 65 28 28 4c 50  etSystemTime((LP
9cf0: 53 59 53 54 45 4d 54 49 4d 45 29 7a 42 75 66 29  SYSTEMTIME)zBuf)
9d00: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 69 7a  ;.    return siz
9d10: 65 6f 66 28 4c 50 53 59 53 54 45 4d 54 49 4d 45  eof(LPSYSTEMTIME
9d20: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
9d30: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a  return 0;.  }.}.
9d40: 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f  ../*.** Sleep fo
9d50: 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65  r a little while
9d60: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d  .  Return the am
9d70: 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65  ount of time sle
9d80: 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  pt..*/.static in
9d90: 74 20 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 74  t winSleep(sqlit
9da0: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
9db0: 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 53  t microsec){.  S
9dc0: 6c 65 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39  leep((microsec+9
9dd0: 39 39 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74  99)/1000);.  ret
9de0: 75 72 6e 20 28 28 6d 69 63 72 6f 73 65 63 2b 39  urn ((microsec+9
9df0: 39 39 29 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a  99)/1000)*1000;.
9e00: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
9e10: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c  lowing variable,
9e20: 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e   if set to a non
9e30: 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 62 65 63  -zero value, bec
9e40: 6f 6d 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a  omes the result.
9e50: 2a 2a 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d  ** returned from
9e60: 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e   sqlite3OsCurren
9e70: 74 54 69 6d 65 28 29 2e 20 20 54 68 69 73 20 69  tTime().  This i
9e80: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
9e90: 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ng..*/.#ifdef SQ
9ea0: 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
9eb0: 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
9ec0: 6d 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  me = 0;.#endif..
9ed0: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  /*.** Find the c
9ee0: 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20  urrent time (in 
9ef0: 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69  Universal Coordi
9f00: 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72  nated Time).  Wr
9f10: 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65  ite the.** curre
9f20: 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
9f30: 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
9f40: 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72   number into *pr
9f50: 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  Now and.** retur
9f60: 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69  n 0.  Return 1 i
9f70: 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
9f80: 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  ate cannot be fo
9f90: 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 77 69 6e 43  und..*/.int winC
9fa0: 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74  urrentTime(sqlit
9fb0: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f  e3_vfs *pVfs, do
9fc0: 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20  uble *prNow){.  
9fd0: 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 2f  FILETIME ft;.  /
9fe0: 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63  * FILETIME struc
9ff0: 74 75 72 65 20 69 73 20 61 20 36 34 2d 62 69 74  ture is a 64-bit
a000: 20 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74   value represent
a010: 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
a020: 66 20 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f  f .     100-nano
a030: 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73  second intervals
a040: 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31   since January 1
a050: 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30  , 1601 (= JD 230
a060: 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20  5813.5). .  */. 
a070: 20 64 6f 75 62 6c 65 20 6e 6f 77 3b 0a 23 69 66   double now;.#if
a080: 20 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59 53 54   OS_WINCE.  SYST
a090: 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20 47  EMTIME time;.  G
a0a0: 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26 74 69  etSystemTime(&ti
a0b0: 6d 65 29 3b 0a 20 20 53 79 73 74 65 6d 54 69 6d  me);.  SystemTim
a0c0: 65 54 6f 46 69 6c 65 54 69 6d 65 28 26 74 69 6d  eToFileTime(&tim
a0d0: 65 2c 26 66 74 29 3b 0a 23 65 6c 73 65 0a 20 20  e,&ft);.#else.  
a0e0: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46  GetSystemTimeAsF
a0f0: 69 6c 65 54 69 6d 65 28 20 26 66 74 20 29 3b 0a  ileTime( &ft );.
a100: 23 65 6e 64 69 66 0a 20 20 6e 6f 77 20 3d 20 28  #endif.  now = (
a110: 28 64 6f 75 62 6c 65 29 66 74 2e 64 77 48 69 67  (double)ft.dwHig
a120: 68 44 61 74 65 54 69 6d 65 29 20 2a 20 34 32 39  hDateTime) * 429
a130: 34 39 36 37 32 39 36 2e 30 3b 20 0a 20 20 2a 70  4967296.0; .  *p
a140: 72 4e 6f 77 20 3d 20 28 6e 6f 77 20 2b 20 66 74  rNow = (now + ft
a150: 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f  .dwLowDateTime)/
a160: 38 36 34 30 30 30 30 30 30 30 30 30 2e 30 20 2b  864000000000.0 +
a170: 20 32 33 30 35 38 31 33 2e 35 3b 0a 23 69 66 64   2305813.5;.#ifd
a180: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
a190: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72   if( sqlite3_cur
a1a0: 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20  rent_time ){.   
a1b0: 20 2a 70 72 4e 6f 77 20 3d 20 73 71 6c 69 74 65   *prNow = sqlite
a1c0: 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 2f 38  3_current_time/8
a1d0: 36 34 30 30 2e 30 20 2b 20 32 34 34 30 35 38 37  6400.0 + 2440587
a1e0: 2e 35 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  .5;.  }.#endif. 
a1f0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
a200: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
a210: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 71 6c  inter to the sql
a220: 69 74 65 33 44 65 66 61 75 6c 74 56 66 73 20 73  ite3DefaultVfs s
a230: 74 72 75 63 74 75 72 65 2e 20 20 20 57 65 20 75  tructure.   We u
a240: 73 65 0a 2a 2a 20 61 20 66 75 6e 63 74 69 6f 6e  se.** a function
a250: 20 72 61 74 68 65 72 20 74 68 61 6e 20 67 69 76   rather than giv
a260: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  e the structure 
a270: 67 6c 6f 62 61 6c 20 73 63 6f 70 65 20 62 65 63  global scope bec
a280: 61 75 73 65 0a 2a 2a 20 73 6f 6d 65 20 63 6f 6d  ause.** some com
a290: 70 69 6c 65 72 73 20 28 4d 53 56 43 29 20 64 6f  pilers (MSVC) do
a2a0: 20 6e 6f 74 20 61 6c 6c 6f 77 20 66 6f 72 77 61   not allow forwa
a2b0: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20  rd declarations 
a2c0: 6f 66 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65  of.** initialize
a2d0: 64 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  d structures..*/
a2e0: 0a 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71  .sqlite3_vfs *sq
a2f0: 6c 69 74 65 33 4f 73 44 65 66 61 75 6c 74 56 66  lite3OsDefaultVf
a300: 73 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  s(void){.  stati
a310: 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69  c sqlite3_vfs wi
a320: 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20 31 2c 20  nVfs = {.    1, 
a330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a340: 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
a350: 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c     sizeof(winFil
a360: 65 29 2c 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c  e),   /* szOsFil
a370: 65 20 2a 2f 0a 20 20 20 20 4d 41 58 5f 50 41 54  e */.    MAX_PAT
a380: 48 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6d  H,          /* m
a390: 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  xPathname */.   
a3a0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
a3b0: 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a      /* pNext */.
a3c0: 20 20 20 20 22 77 69 6e 33 32 22 2c 20 20 20 20      "win32",    
a3d0: 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20         /* zName 
a3e0: 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
a3f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70            /* pAp
a400: 70 44 61 74 61 20 2a 2f 0a 20 20 0a 20 20 20 20  pData */.  .    
a410: 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  winOpen,        
a420: 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20     /* xOpen */. 
a430: 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20     winDelete,   
a440: 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65        /* xDelete
a450: 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73   */.    winAcces
a460: 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41  s,         /* xA
a470: 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e  ccess */.    win
a480: 47 65 74 54 65 6d 70 4e 61 6d 65 2c 20 20 20 20  GetTempName,    
a490: 2f 2a 20 78 47 65 74 54 65 6d 70 4e 61 6d 65 20  /* xGetTempName 
a4a0: 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61  */.    winFullPa
a4b0: 74 68 6e 61 6d 65 2c 20 20 20 2f 2a 20 78 46 75  thname,   /* xFu
a4c0: 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  llPathname */.  
a4d0: 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20    winDlOpen,    
a4e0: 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20       /* xDlOpen 
a4f0: 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f  */.    winDlErro
a500: 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c  r,        /* xDl
a510: 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e  Error */.    win
a520: 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20  DlSym,          
a530: 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20  /* xDlSym */.   
a540: 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20   winDlClose,    
a550: 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20      /* xDlClose 
a560: 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d  */.    winRandom
a570: 6e 65 73 73 2c 20 20 20 20 20 2f 2a 20 78 52 61  ness,     /* xRa
a580: 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20  ndomness */.    
a590: 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20  winSleep,       
a5a0: 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a     /* xSleep */.
a5b0: 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69      winCurrentTi
a5c0: 6d 65 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65  me     /* xCurre
a5d0: 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 7d 3b 0a 20  ntTime */.  };. 
a5e0: 20 0a 20 20 72 65 74 75 72 6e 20 26 77 69 6e 56   .  return &winV
a5f0: 66 73 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  fs;.}..#endif /*
a600: 20 4f 53 5f 57 49 4e 20 2a 2f 0a                  OS_WIN */.