/ Hex Artifact Content
Login

Artifact c832d528ea774c7094d887749d71884984c9034c:


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 73 71 6c 69 74 65 33  E pTm;.  sqlite3
2140: 5f 69 6e 74 36 34 20 74 36 34 3b 0a 20 20 74 36  _int64 t64;.  t6
2150: 34 20 3d 20 2a 74 3b 0a 20 20 74 36 34 20 3d 20  4 = *t;.  t64 = 
2160: 28 74 36 34 20 2b 20 31 31 36 34 34 34 37 33 36  (t64 + 116444736
2170: 30 30 29 2a 31 30 30 30 30 30 30 30 3b 0a 20 20  00)*10000000;.  
2180: 75 54 6d 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d  uTm.dwLowDateTim
2190: 65 20 3d 20 74 36 34 20 26 20 30 78 46 46 46 46  e = t64 & 0xFFFF
21a0: 46 46 46 46 3b 0a 20 20 75 54 6d 2e 64 77 48 69  FFFF;.  uTm.dwHi
21b0: 67 68 44 61 74 65 54 69 6d 65 3d 20 74 36 34 20  ghDateTime= t64 
21c0: 3e 3e 20 33 32 3b 0a 20 20 46 69 6c 65 54 69 6d  >> 32;.  FileTim
21d0: 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65  eToLocalFileTime
21e0: 28 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 46  (&uTm,&lTm);.  F
21f0: 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54  ileTimeToSystemT
2200: 69 6d 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a  ime(&lTm,&pTm);.
2210: 20 20 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70 54    y.tm_year = pT
2220: 6d 2e 77 59 65 61 72 20 2d 20 31 39 30 30 3b 0a  m.wYear - 1900;.
2230: 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d    y.tm_mon = pTm
2240: 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20 79  .wMonth - 1;.  y
2250: 2e 74 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e 77  .tm_wday = pTm.w
2260: 44 61 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e 74  DayOfWeek;.  y.t
2270: 6d 5f 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44 61  m_mday = pTm.wDa
2280: 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20 3d  y;.  y.tm_hour =
2290: 20 70 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79 2e   pTm.wHour;.  y.
22a0: 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d 69  tm_min = pTm.wMi
22b0: 6e 75 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65 63  nute;.  y.tm_sec
22c0: 20 3d 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a   = pTm.wSecond;.
22d0: 20 20 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a 0a    return &y;.}..
22e0: 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 6e 65 76  /* This will nev
22f0: 65 72 20 62 65 20 63 61 6c 6c 65 64 2c 20 62 75  er be called, bu
2300: 74 20 64 65 66 69 6e 65 64 20 74 6f 20 6d 61 6b  t defined to mak
2310: 65 20 74 68 65 20 63 6f 64 65 20 63 6f 6d 70 69  e the code compi
2320: 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 47 65  le */.#define Ge
2330: 74 54 65 6d 70 50 61 74 68 41 28 61 2c 62 29 0a  tTempPathA(a,b).
2340: 0a 23 64 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c  .#define LockFil
2350: 65 28 61 2c 62 2c 63 2c 64 2c 65 29 20 20 20 20  e(a,b,c,d,e)    
2360: 20 20 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65     winceLockFile
2370: 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29  (&a, b, c, d, e)
2380: 0a 23 64 65 66 69 6e 65 20 55 6e 6c 6f 63 6b 46  .#define UnlockF
2390: 69 6c 65 28 61 2c 62 2c 63 2c 64 2c 65 29 20 20  ile(a,b,c,d,e)  
23a0: 20 20 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69     winceUnlockFi
23b0: 6c 65 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20  le(&a, b, c, d, 
23c0: 65 29 0a 23 64 65 66 69 6e 65 20 4c 6f 63 6b 46  e).#define LockF
23d0: 69 6c 65 45 78 28 61 2c 62 2c 63 2c 64 2c 65 2c  ileEx(a,b,c,d,e,
23e0: 66 29 20 20 20 77 69 6e 63 65 4c 6f 63 6b 46 69  f)   winceLockFi
23f0: 6c 65 45 78 28 26 61 2c 20 62 2c 20 63 2c 20 64  leEx(&a, b, c, d
2400: 2c 20 65 2c 20 66 29 0a 0a 23 64 65 66 69 6e 65  , e, f)..#define
2410: 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49   HANDLE_TO_WINFI
2420: 4c 45 28 61 29 20 28 77 69 6e 46 69 6c 65 2a 29  LE(a) (winFile*)
2430: 26 28 28 63 68 61 72 2a 29 61 29 5b 2d 6f 66 66  &((char*)a)[-off
2440: 73 65 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29  setof(winFile,h)
2450: 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  ]../*.** Acquire
2460: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68   a lock on the h
2470: 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69  andle h.*/.stati
2480: 63 20 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 65  c void winceMute
2490: 78 41 63 71 75 69 72 65 28 48 41 4e 44 4c 45 20  xAcquire(HANDLE 
24a0: 68 29 7b 0a 20 20 20 44 57 4f 52 44 20 64 77 45  h){.   DWORD dwE
24b0: 72 72 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20  rr;.   do {.    
24c0: 20 64 77 45 72 72 20 3d 20 57 61 69 74 46 6f 72   dwErr = WaitFor
24d0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20  SingleObject(h, 
24e0: 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20  INFINITE);.   } 
24f0: 77 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20  while (dwErr != 
2500: 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26  WAIT_OBJECT_0 &&
2510: 20 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41   dwErr != WAIT_A
2520: 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a  BANDONED);.}./*.
2530: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63  ** Release a loc
2540: 6b 20 61 63 71 75 69 72 65 64 20 62 79 20 77 69  k acquired by wi
2550: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
2560: 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e  ).*/.#define win
2570: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68  ceMutexRelease(h
2580: 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68  ) ReleaseMutex(h
2590: 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  )../*.** Create 
25a0: 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68  the mutex and sh
25b0: 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64  ared memory used
25c0: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20   for locking in 
25d0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  the file.** desc
25e0: 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a  riptor pFile.*/.
25f0: 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63  static BOOL winc
2600: 65 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73  eCreateLock(cons
2610: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
2620: 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  e, winFile *pFil
2630: 65 29 7b 0a 20 20 57 43 48 41 52 20 2a 7a 54 6f  e){.  WCHAR *zTo
2640: 6b 3b 0a 20 20 57 43 48 41 52 20 2a 7a 4e 61 6d  k;.  WCHAR *zNam
2650: 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64  e = utf8ToUnicod
2660: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
2670: 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55  BOOL bInit = TRU
2680: 45 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  E;..  /* Initial
2690: 69 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f  ize the local lo
26a0: 63 6b 64 61 74 61 20 2a 2f 0a 20 20 5a 65 72 6f  ckdata */.  Zero
26b0: 4d 65 6d 6f 72 79 28 26 70 46 69 6c 65 2d 3e 6c  Memory(&pFile->l
26c0: 6f 63 61 6c 2c 20 73 69 7a 65 6f 66 28 70 46 69  ocal, sizeof(pFi
26d0: 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20 20  le->local));..  
26e0: 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 62  /* Replace the b
26f0: 61 63 6b 73 6c 61 73 68 65 73 20 66 72 6f 6d 20  ackslashes from 
2700: 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64  the filename and
2710: 20 6c 6f 77 65 72 63 61 73 65 20 69 74 0a 20 20   lowercase it.  
2720: 2a 2a 20 74 6f 20 64 65 72 69 76 65 20 61 20 6d  ** to derive a m
2730: 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20  utex name. */.  
2740: 7a 54 6f 6b 20 3d 20 43 68 61 72 4c 6f 77 65 72  zTok = CharLower
2750: 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 20  W(zName);.  for 
2760: 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b  (;*zTok;zTok++){
2770: 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f 6b 20 3d  .    if (*zTok =
2780: 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b 20 3d 20  = '\\') *zTok = 
2790: 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  '_';.  }..  /* C
27a0: 72 65 61 74 65 2f 6f 70 65 6e 20 74 68 65 20 6e  reate/open the n
27b0: 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f 0a 20 20  amed mutex */.  
27c0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20  pFile->hMutex = 
27d0: 43 72 65 61 74 65 4d 75 74 65 78 57 28 4e 55 4c  CreateMutexW(NUL
27e0: 4c 2c 20 46 41 4c 53 45 2c 20 7a 4e 61 6d 65 29  L, FALSE, zName)
27f0: 3b 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e  ;.  if (!pFile->
2800: 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 66 72 65  hMutex){.    fre
2810: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  e(zName);.    re
2820: 74 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a  turn FALSE;.  }.
2830: 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68  .  /* Acquire th
2840: 65 20 6d 75 74 65 78 20 62 65 66 6f 72 65 20 63  e mutex before c
2850: 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77  ontinuing */.  w
2860: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
2870: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
2880: 0a 20 20 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74  .  .  /* Since t
2890: 68 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65  he names of name
28a0: 64 20 6d 75 74 65 78 65 73 2c 20 73 65 6d 61 70  d mutexes, semap
28b0: 68 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61 70 70  hores, file mapp
28c0: 69 6e 67 73 20 65 74 63 20 61 72 65 20 0a 20 20  ings etc are .  
28d0: 2a 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69 76  ** case-sensitiv
28e0: 65 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67  e, take advantag
28f0: 65 20 6f 66 20 74 68 61 74 20 62 79 20 75 70 70  e of that by upp
2900: 65 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75 74  ercasing the mut
2910: 65 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64  ex name.  ** and
2920: 20 75 73 69 6e 67 20 74 68 61 74 20 61 73 20 74   using that as t
2930: 68 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d 61  he shared filema
2940: 70 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f  pping name..  */
2950: 0a 20 20 43 68 61 72 55 70 70 65 72 57 28 7a 4e  .  CharUpperW(zN
2960: 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68  ame);.  pFile->h
2970: 53 68 61 72 65 64 20 3d 20 43 72 65 61 74 65 46  Shared = CreateF
2980: 69 6c 65 4d 61 70 70 69 6e 67 57 28 49 4e 56 41  ileMappingW(INVA
2990: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
29a0: 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  , NULL,.        
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
29d0: 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30  AGE_READWRITE, 0
29e0: 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f  , sizeof(winceLo
29f0: 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ck),.           
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
2a20: 65 29 3b 20 20 0a 0a 20 20 2f 2a 20 53 65 74 20  e);  ..  /* Set 
2a30: 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69  a flag that indi
2a40: 63 61 74 65 73 20 77 65 27 72 65 20 74 68 65 20  cates we're the 
2a50: 66 69 72 73 74 20 74 6f 20 63 72 65 61 74 65 20  first to create 
2a60: 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74  the memory so it
2a70: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a   .  ** must be z
2a80: 65 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20  ero-initialized 
2a90: 2a 2f 0a 20 20 69 66 20 28 47 65 74 4c 61 73 74  */.  if (GetLast
2aa0: 45 72 72 6f 72 28 29 20 3d 3d 20 45 52 52 4f 52  Error() == ERROR
2ab0: 5f 41 4c 52 45 41 44 59 5f 45 58 49 53 54 53 29  _ALREADY_EXISTS)
2ac0: 7b 0a 20 20 20 20 62 49 6e 69 74 20 3d 20 46 41  {.    bInit = FA
2ad0: 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 66 72 65 65  LSE;.  }..  free
2ae0: 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49  (zName);..  /* I
2af0: 66 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69  f we succeeded i
2b00: 6e 20 6d 61 6b 69 6e 67 20 74 68 65 20 73 68 61  n making the sha
2b10: 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c  red memory handl
2b20: 65 2c 20 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20  e, map it. */.  
2b30: 69 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61 72  if (pFile->hShar
2b40: 65 64 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ed){.    pFile->
2b50: 73 68 61 72 65 64 20 3d 20 28 77 69 6e 63 65 4c  shared = (winceL
2b60: 6f 63 6b 2a 29 4d 61 70 56 69 65 77 4f 66 46 69  ock*)MapViewOfFi
2b70: 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  le(pFile->hShare
2b80: 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d, .            
2b90: 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c 46   FILE_MAP_READ|F
2ba0: 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20 30  ILE_MAP_WRITE, 0
2bb0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63  , 0, sizeof(winc
2bc0: 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a 20  eLock));.    /* 
2bd0: 49 66 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65  If mapping faile
2be0: 64 2c 20 63 6c 6f 73 65 20 74 68 65 20 73 68 61  d, close the sha
2bf0: 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c  red memory handl
2c00: 65 20 61 6e 64 20 65 72 61 73 65 20 69 74 20 2a  e and erase it *
2c10: 2f 0a 20 20 20 20 69 66 20 28 21 70 46 69 6c 65  /.    if (!pFile
2c20: 2d 3e 73 68 61 72 65 64 29 7b 0a 20 20 20 20 20  ->shared){.     
2c30: 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69   CloseHandle(pFi
2c40: 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20 20  le->hShared);.  
2c50: 20 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72      pFile->hShar
2c60: 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  ed = NULL;.    }
2c70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68  .  }..  /* If sh
2c80: 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c  ared memory coul
2c90: 64 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64  d not be created
2ca0: 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65  , then close the
2cb0: 20 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c 20   mutex and fail 
2cc0: 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
2cd0: 68 53 68 61 72 65 64 20 3d 3d 20 4e 55 4c 4c 29  hShared == NULL)
2ce0: 7b 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78  {.    winceMutex
2cf0: 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
2d00: 4d 75 74 65 78 29 3b 0a 20 20 20 20 43 6c 6f 73  Mutex);.    Clos
2d10: 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
2d20: 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c  Mutex);.    pFil
2d30: 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c  e->hMutex = NULL
2d40: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41 4c  ;.    return FAL
2d50: 53 45 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  SE;.  }.  .  /* 
2d60: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  Initialize the s
2d70: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66 20  hared memory if 
2d80: 77 65 27 72 65 20 73 75 70 70 6f 73 65 64 20 74  we're supposed t
2d90: 6f 20 2a 2f 0a 20 20 69 66 20 28 62 49 6e 69 74  o */.  if (bInit
2da0: 29 20 7b 0a 20 20 20 20 5a 65 72 6f 4d 65 6d 6f  ) {.    ZeroMemo
2db0: 72 79 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  ry(pFile->shared
2dc0: 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f  , sizeof(winceLo
2dd0: 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e  ck));.  }..  win
2de0: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
2df0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
2e00: 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 7d 0a   return TRUE;.}.
2e10: 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74  ./*.** Destroy t
2e20: 68 65 20 70 61 72 74 20 6f 66 20 77 69 6e 46 69  he part of winFi
2e30: 6c 65 20 74 68 61 74 20 64 65 61 6c 73 20 77 69  le that deals wi
2e40: 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a  th wince locks.*
2e50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
2e60: 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77  nceDestroyLock(w
2e70: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
2e80: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75    if (pFile->hMu
2e90: 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71  tex){.    /* Acq
2ea0: 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20 2a  uire the mutex *
2eb0: 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78  /.    winceMutex
2ec0: 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
2ed0: 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20  Mutex);..    /* 
2ee0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
2ef0: 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f 62  ocks should prob
2f00: 61 62 6c 79 20 61 73 73 65 72 74 20 69 6e 20 64  ably assert in d
2f10: 65 62 75 67 20 6d 6f 64 65 2c 20 62 75 74 20 74  ebug mode, but t
2f20: 68 65 79 0a 20 20 20 20 20 20 20 61 72 65 20 74  hey.       are t
2f30: 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20 63 61 73  o cleanup in cas
2f40: 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61  e any locks rema
2f50: 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20  ined open */.   
2f60: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
2f70: 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20  l.nReaders){.   
2f80: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
2f90: 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20  ->nReaders --;. 
2fa0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69     }.    if (pFi
2fb0: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
2fc0: 76 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ved){.      pFil
2fd0: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
2fe0: 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  rved = FALSE;.  
2ff0: 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c    }.    if (pFil
3000: 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e  e->local.bPendin
3010: 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  g){.      pFile-
3020: 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
3030: 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d  g = FALSE;.    }
3040: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
3050: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
3060: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
3070: 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
3080: 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ve = FALSE;.    
3090: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65 66  }..    /* De-ref
30a0: 65 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65  erence and close
30b0: 20 6f 75 72 20 63 6f 70 79 20 6f 66 20 74 68 65   our copy of the
30c0: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68   shared memory h
30d0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 55 6e 6d  andle */.    Unm
30e0: 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  apViewOfFile(pFi
30f0: 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20 20  le->shared);.   
3100: 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69   CloseHandle(pFi
3110: 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 0a 20  le->hShared);.. 
3120: 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74 68 20     /* Done with 
3130: 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20  the mutex */.   
3140: 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
3150: 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  se(pFile->hMutex
3160: 29 3b 20 20 20 20 0a 20 20 20 20 43 6c 6f 73 65  );    .    Close
3170: 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d  Handle(pFile->hM
3180: 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65  utex);.    pFile
3190: 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ->hMutex = NULL;
31a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41  .  }.}../* .** A
31b0: 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
31c0: 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65   of the LockFile
31d0: 28 29 20 41 50 49 20 6f 66 20 77 69 6e 64 6f 77  () API of window
31e0: 73 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2f 0a 73  s for wince.*/.s
31f0: 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65  tatic BOOL wince
3200: 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 48 41 4e 44  LockFile(.  HAND
3210: 4c 45 20 2a 70 68 46 69 6c 65 2c 0a 20 20 44 57  LE *phFile,.  DW
3220: 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
3230: 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  Low,.  DWORD dwF
3240: 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20  ileOffsetHigh,. 
3250: 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
3260: 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a  BytesToLockLow,.
3270: 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
3280: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68  fBytesToLockHigh
3290: 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
32a0: 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f  File = HANDLE_TO
32b0: 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29  _WINFILE(phFile)
32c0: 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e  ;.  BOOL bReturn
32d0: 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 69 66 20   = FALSE;..  if 
32e0: 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  (!pFile->hMutex)
32f0: 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20   return TRUE;.  
3300: 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72  winceMutexAcquir
3310: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
3320: 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74 69 6e 67 20  ;..  /* Wanting 
3330: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
3340: 6b 3f 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69  k? */.  if (dwFi
3350: 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 53  leOffsetLow == S
3360: 48 41 52 45 44 5f 46 49 52 53 54 0a 20 20 20 20  HARED_FIRST.    
3370: 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42     && nNumberOfB
3380: 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d  ytesToLockLow ==
3390: 20 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20   SHARED_SIZE){. 
33a0: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68     if (pFile->sh
33b0: 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 3d  ared->nReaders =
33c0: 3d 20 30 20 26 26 20 70 46 69 6c 65 2d 3e 73 68  = 0 && pFile->sh
33d0: 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65  ared->bExclusive
33e0: 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 20 70   == 0){.       p
33f0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45  File->shared->bE
3400: 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b  xclusive = TRUE;
3410: 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  .       pFile->l
3420: 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20  ocal.bExclusive 
3430: 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 62  = TRUE;.       b
3440: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
3450: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
3460: 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  ant a read-only 
3470: 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20  lock? */.  else 
3480: 69 66 20 28 28 64 77 46 69 6c 65 4f 66 66 73 65  if ((dwFileOffse
3490: 74 4c 6f 77 20 3e 3d 20 53 48 41 52 45 44 5f 46  tLow >= SHARED_F
34a0: 49 52 53 54 20 26 26 0a 20 20 20 20 20 20 20 20  IRST &&.        
34b0: 20 20 20 20 64 77 46 69 6c 65 4f 66 66 73 65 74      dwFileOffset
34c0: 4c 6f 77 20 3c 20 53 48 41 52 45 44 5f 46 49 52  Low < SHARED_FIR
34d0: 53 54 20 2b 20 53 48 41 52 45 44 5f 53 49 5a 45  ST + SHARED_SIZE
34e0: 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  ) &&.           
34f0: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
3500: 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  oLockLow == 1){.
3510: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73      if (pFile->s
3520: 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
3530: 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 70  e == 0){.      p
3540: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
3550: 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69  ders ++;.      i
3560: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
3570: 6e 52 65 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a  nReaders == 1){.
3580: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73          pFile->s
3590: 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20  hared->nReaders 
35a0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
35b0: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
35c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
35d0: 2a 20 57 61 6e 74 20 61 20 70 65 6e 64 69 6e 67  * Want a pending
35e0: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65   lock? */.  else
35f0: 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
3600: 74 4c 6f 77 20 3d 3d 20 50 45 4e 44 49 4e 47 5f  tLow == PENDING_
3610: 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f  BYTE && nNumberO
3620: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
3630: 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66  == 1){.    /* If
3640: 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b   no pending lock
3650: 20 68 61 73 20 62 65 65 6e 20 61 63 71 75 69 72   has been acquir
3660: 65 64 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65  ed, then acquire
3670: 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70   it */.    if (p
3680: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
3690: 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20  ending == 0) {. 
36a0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
36b0: 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54  ed->bPending = T
36c0: 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  RUE;.      pFile
36d0: 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67  ->local.bPending
36e0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62   = TRUE;.      b
36f0: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
3700: 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 57 61     }.  }.  /* Wa
3710: 6e 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  nt a reserved lo
3720: 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ck? */.  else if
3730: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
3740: 77 20 3d 3d 20 52 45 53 45 52 56 45 44 5f 42 59  w == RESERVED_BY
3750: 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42  TE && nNumberOfB
3760: 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d  ytesToLockLow ==
3770: 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
3780: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
3790: 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20  erved == 0) {.  
37a0: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
37b0: 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 54  d->bReserved = T
37c0: 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  RUE;.      pFile
37d0: 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
37e0: 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  d = TRUE;.      
37f0: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
3800: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e      }.  }..  win
3810: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
3820: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
3830: 20 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b   return bReturn;
3840: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70  .}../*.** An imp
3850: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
3860: 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50  he UnlockFile AP
3870: 49 20 6f 66 20 77 69 6e 64 6f 77 73 20 66 6f 72  I of windows for
3880: 20 77 69 6e 63 65 0a 2a 2f 0a 73 74 61 74 69 63   wince.*/.static
3890: 20 42 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63   BOOL winceUnloc
38a0: 6b 46 69 6c 65 28 0a 20 20 48 41 4e 44 4c 45 20  kFile(.  HANDLE 
38b0: 2a 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44  *phFile,.  DWORD
38c0: 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77   dwFileOffsetLow
38d0: 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65  ,.  DWORD dwFile
38e0: 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  OffsetHigh,.  DW
38f0: 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
3900: 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20  esToUnlockLow,. 
3910: 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
3920: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67  BytesToUnlockHig
3930: 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  h.){.  winFile *
3940: 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54  pFile = HANDLE_T
3950: 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65  O_WINFILE(phFile
3960: 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72  );.  BOOL bRetur
3970: 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 69 66  n = FALSE;..  if
3980: 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78   (!pFile->hMutex
3990: 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20  ) return TRUE;. 
39a0: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
39b0: 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  re(pFile->hMutex
39c0: 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69  );..  /* Releasi
39d0: 6e 67 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b  ng a reader lock
39e0: 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65   or an exclusive
39f0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20 28 64   lock */.  if (d
3a00: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3e  wFileOffsetLow >
3a10: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 26  = SHARED_FIRST &
3a20: 26 0a 20 20 20 20 20 20 20 64 77 46 69 6c 65 4f  &.       dwFileO
3a30: 66 66 73 65 74 4c 6f 77 20 3c 20 53 48 41 52 45  ffsetLow < SHARE
3a40: 44 5f 46 49 52 53 54 20 2b 20 53 48 41 52 45 44  D_FIRST + SHARED
3a50: 5f 53 49 5a 45 29 7b 0a 20 20 20 20 2f 2a 20 44  _SIZE){.    /* D
3a60: 69 64 20 77 65 20 68 61 76 65 20 61 6e 20 65 78  id we have an ex
3a70: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f  clusive lock? */
3a80: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
3a90: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
3aa0: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
3ab0: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
3ac0: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
3ad0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
3ae0: 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53  Exclusive = FALS
3af0: 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
3b00: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 0a   = TRUE;.    }..
3b10: 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 6a 75      /* Did we ju
3b20: 73 74 20 68 61 76 65 20 61 20 72 65 61 64 65 72  st have a reader
3b30: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c   lock? */.    el
3b40: 73 65 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f  se if (pFile->lo
3b50: 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20  cal.nReaders){. 
3b60: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
3b70: 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20  l.nReaders --;. 
3b80: 20 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e       if (pFile->
3b90: 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d  local.nReaders =
3ba0: 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 20 20 20  = 0).      {.   
3bb0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
3bc0: 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b  ed->nReaders --;
3bd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
3be0: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
3bf0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
3c00: 65 6c 65 61 73 69 6e 67 20 61 20 70 65 6e 64 69  eleasing a pendi
3c10: 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73  ng lock */.  els
3c20: 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
3c30: 65 74 4c 6f 77 20 3d 3d 20 50 45 4e 44 49 4e 47  etLow == PENDING
3c40: 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72  _BYTE && nNumber
3c50: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
3c60: 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66  ow == 1){.    if
3c70: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
3c80: 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20  Pending){.      
3c90: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
3ca0: 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20  nding = FALSE;. 
3cb0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
3cc0: 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46  ed->bPending = F
3cd0: 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74  ALSE;.      bRet
3ce0: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
3cf0: 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 6c 65 61  }.  }.  /* Relea
3d00: 73 69 6e 67 20 61 20 72 65 73 65 72 76 65 64 20  sing a reserved 
3d10: 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69  lock */.  else i
3d20: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
3d30: 6f 77 20 3d 3d 20 52 45 53 45 52 56 45 44 5f 42  ow == RESERVED_B
3d40: 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66  YTE && nNumberOf
3d50: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
3d60: 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28   == 1){.    if (
3d70: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
3d80: 73 65 72 76 65 64 29 20 7b 0a 20 20 20 20 20 20  served) {.      
3d90: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
3da0: 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a  served = FALSE;.
3db0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
3dc0: 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
3dd0: 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52   FALSE;.      bR
3de0: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
3df0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65    }.  }..  wince
3e00: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
3e10: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72  le->hMutex);.  r
3e20: 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d  eturn bReturn;.}
3e30: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65  ../*.** An imple
3e40: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
3e50: 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50   LockFileEx() AP
3e60: 49 20 6f 66 20 77 69 6e 64 6f 77 73 20 66 6f 72  I of windows for
3e70: 20 77 69 6e 63 65 0a 2a 2f 0a 73 74 61 74 69 63   wince.*/.static
3e80: 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46   BOOL winceLockF
3e90: 69 6c 65 45 78 28 0a 20 20 48 41 4e 44 4c 45 20  ileEx(.  HANDLE 
3ea0: 2a 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44  *phFile,.  DWORD
3eb0: 20 64 77 46 6c 61 67 73 2c 0a 20 20 44 57 4f 52   dwFlags,.  DWOR
3ec0: 44 20 64 77 52 65 73 65 72 76 65 64 2c 0a 20 20  D dwReserved,.  
3ed0: 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42  DWORD nNumberOfB
3ee0: 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20  ytesToLockLow,. 
3ef0: 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
3f00: 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 2c  BytesToLockHigh,
3f10: 0a 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 20  .  LPOVERLAPPED 
3f20: 6c 70 4f 76 65 72 6c 61 70 70 65 64 0a 29 7b 0a  lpOverlapped.){.
3f30: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    /* If the call
3f40: 65 72 20 77 61 6e 74 73 20 61 20 73 68 61 72 65  er wants a share
3f50: 64 20 72 65 61 64 20 6c 6f 63 6b 2c 20 66 6f 72  d read lock, for
3f60: 77 61 72 64 20 74 68 69 73 20 63 61 6c 6c 0a 20  ward this call. 
3f70: 20 2a 2a 20 74 6f 20 77 69 6e 63 65 4c 6f 63 6b   ** to winceLock
3f80: 46 69 6c 65 20 2a 2f 0a 20 20 69 66 20 28 6c 70  File */.  if (lp
3f90: 4f 76 65 72 6c 61 70 70 65 64 2d 3e 4f 66 66 73  Overlapped->Offs
3fa0: 65 74 20 3d 3d 20 53 48 41 52 45 44 5f 46 49 52  et == SHARED_FIR
3fb0: 53 54 20 26 26 0a 20 20 20 20 20 20 64 77 46 6c  ST &&.      dwFl
3fc0: 61 67 73 20 3d 3d 20 31 20 26 26 0a 20 20 20 20  ags == 1 &&.    
3fd0: 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73    nNumberOfBytes
3fe0: 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 53 48 41  ToLockLow == SHA
3ff0: 52 45 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20 72  RED_SIZE){.    r
4000: 65 74 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46  eturn winceLockF
4010: 69 6c 65 28 70 68 46 69 6c 65 2c 20 53 48 41 52  ile(phFile, SHAR
4020: 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 31 2c 20  ED_FIRST, 0, 1, 
4030: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
4040: 20 46 41 4c 53 45 3b 0a 7d 0a 2f 2a 0a 2a 2a 20   FALSE;.}./*.** 
4050: 45 6e 64 20 6f 66 20 74 68 65 20 73 70 65 63 69  End of the speci
4060: 61 6c 20 63 6f 64 65 20 66 6f 72 20 77 69 6e 63  al code for winc
4070: 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e.**************
4080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
40a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
40b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
40c0: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 57 49  .#endif /* OS_WI
40d0: 4e 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  NCE */../*******
40e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
40f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4120: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ******.** The ne
4130: 78 74 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  xt group of rout
4140: 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74  ines implement t
4150: 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 73  he I/O methods s
4160: 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 74  pecified.** by t
4170: 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
4180: 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a  thods object..**
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
41c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
41d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
41e0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
41f0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72  e..**.** It is r
4200: 65 70 6f 72 74 65 64 20 74 68 61 74 20 61 6e 20  eported that an 
4210: 61 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65  attempt to close
4220: 20 61 20 68 61 6e 64 6c 65 20 6d 69 67 68 74 20   a handle might 
4230: 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69  sometimes.** fai
4240: 6c 2e 20 20 54 68 69 73 20 69 73 20 61 20 76 65  l.  This is a ve
4250: 72 79 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20  ry unreasonable 
4260: 72 65 73 75 6c 74 2c 20 62 75 74 20 77 69 6e 64  result, but wind
4270: 6f 77 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73  ows is notorious
4280: 0a 2a 2a 20 66 6f 72 20 62 65 69 6e 67 20 75 6e  .** for being un
4290: 72 65 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20  reasonable so I 
42a0: 64 6f 20 6e 6f 74 20 64 6f 75 62 74 20 74 68 61  do not doubt tha
42b0: 74 20 69 74 20 6d 69 67 68 74 20 68 61 70 70 65  t it might happe
42c0: 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c  n.  If.** the cl
42d0: 6f 73 65 20 66 61 69 6c 73 2c 20 77 65 20 70 61  ose fails, we pa
42e0: 75 73 65 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c  use for 100 mill
42f0: 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79  iseconds and try
4300: 20 61 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d   again.  As.** m
4310: 61 6e 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f  any as MX_CLOSE_
4320: 41 54 54 45 4d 50 54 20 61 74 74 65 6d 70 74 73  ATTEMPT attempts
4330: 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 68 61   to close the ha
4340: 6e 64 6c 65 20 61 72 65 20 6d 61 64 65 20 62 65  ndle are made be
4350: 66 6f 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75  fore.** giving u
4360: 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20  p and returning 
4370: 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65  an error..*/.#de
4380: 66 69 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54  fine MX_CLOSE_AT
4390: 54 45 4d 50 54 20 33 0a 73 74 61 74 69 63 20 69  TEMPT 3.static i
43a0: 6e 74 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69  nt winClose(sqli
43b0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
43c0: 20 69 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20 30   int rc, cnt = 0
43d0: 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  ;.  winFile *pFi
43e0: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
43f0: 64 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 43  d;.  OSTRACE2("C
4400: 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 70 46 69 6c  LOSE %d\n", pFil
4410: 65 2d 3e 68 29 3b 0a 20 20 64 6f 7b 0a 20 20 20  e->h);.  do{.   
4420: 20 72 63 20 3d 20 43 6c 6f 73 65 48 61 6e 64 6c   rc = CloseHandl
4430: 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 7d  e(pFile->h);.  }
4440: 77 68 69 6c 65 28 20 72 63 3d 3d 30 20 26 26 20  while( rc==0 && 
4450: 63 6e 74 2b 2b 20 3c 20 4d 58 5f 43 4c 4f 53 45  cnt++ < MX_CLOSE
4460: 5f 41 54 54 45 4d 50 54 20 26 26 20 28 53 6c 65  _ATTEMPT && (Sle
4470: 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23  ep(100), 1) );.#
4480: 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20 77 69  if OS_WINCE.  wi
4490: 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 70  nceDestroyLock(p
44a0: 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 46 69  File);.  if( pFi
44b0: 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
44c0: 73 65 20 29 7b 0a 20 20 20 20 44 65 6c 65 74 65  se ){.    Delete
44d0: 46 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65  FileW(pFile->zDe
44e0: 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20  leteOnClose);.  
44f0: 20 20 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44    free(pFile->zD
4500: 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20  eleteOnClose);. 
4510: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 70 65 6e   }.#endif.  Open
4520: 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 72  Counter(-1);.  r
4530: 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54  eturn rc ? SQLIT
4540: 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f  E_OK : SQLITE_IO
4550: 45 52 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f  ERR;.}../*.** So
4560: 6d 65 20 6d 69 63 72 6f 73 6f 66 74 20 63 6f 6d  me microsoft com
4570: 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73  pilers lack this
4580: 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a   definition..*/.
4590: 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f  #ifndef INVALID_
45a0: 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
45b0: 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49  .# define INVALI
45c0: 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
45d0: 45 52 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23  ER ((DWORD)-1).#
45e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
45f0: 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69  d data from a fi
4600: 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72  le into a buffer
4610: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
4620: 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79  _OK if all.** by
4630: 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75  tes were read su
4640: 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53  ccessfully and S
4650: 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61  QLITE_IOERR if a
4660: 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
4670: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
4680: 20 69 6e 74 20 77 69 6e 52 65 61 64 28 0a 20 20   int winRead(.  
4690: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
46a0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ,          /* Fi
46b0: 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  le to read from 
46c0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  */.  void *pBuf,
46d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46e0: 2f 2a 20 57 72 69 74 65 20 63 6f 6e 74 65 6e 74  /* Write content
46f0: 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
4700: 72 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20  r */.  int amt, 
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4720: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
4730: 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a  ytes to read */.
4740: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
4750: 6f 66 66 73 65 74 20 20 20 20 20 20 20 2f 2a 20  offset       /* 
4760: 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 61 74  Begin reading at
4770: 20 74 68 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a   this offset */.
4780: 29 7b 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42  ){.  LONG upperB
4790: 69 74 73 20 3d 20 28 6f 66 66 73 65 74 3e 3e 33  its = (offset>>3
47a0: 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66 3b  2) & 0x7fffffff;
47b0: 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74  .  LONG lowerBit
47c0: 73 20 3d 20 6f 66 66 73 65 74 20 26 20 30 78 66  s = offset & 0xf
47d0: 66 66 66 66 66 66 66 3b 0a 20 20 44 57 4f 52 44  fffffff;.  DWORD
47e0: 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 67 6f 74   rc;.  DWORD got
47f0: 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  ;.  winFile *pFi
4800: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
4810: 64 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  d;.  assert( id!
4820: 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  =0 );.  Simulate
4830: 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
4840: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
4850: 29 3b 0a 20 20 4f 53 54 52 41 43 45 33 28 22 52  );.  OSTRACE3("R
4860: 45 41 44 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e  EAD %d lock=%d\n
4870: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69  ", pFile->h, pFi
4880: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  le->locktype);. 
4890: 20 72 63 20 3d 20 53 65 74 46 69 6c 65 50 6f 69   rc = SetFilePoi
48a0: 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c  nter(pFile->h, l
48b0: 6f 77 65 72 42 69 74 73 2c 20 26 75 70 70 65 72  owerBits, &upper
48c0: 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e  Bits, FILE_BEGIN
48d0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 49 4e 56  );.  if( rc==INV
48e0: 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f  ALID_SET_FILE_PO
48f0: 49 4e 54 45 52 20 26 26 20 47 65 74 4c 61 73 74  INTER && GetLast
4900: 45 72 72 6f 72 28 29 21 3d 4e 4f 5f 45 52 52 4f  Error()!=NO_ERRO
4910: 52 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  R ){.    return 
4920: 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d  SQLITE_FULL;.  }
4930: 0a 20 20 69 66 28 20 21 52 65 61 64 46 69 6c 65  .  if( !ReadFile
4940: 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c  (pFile->h, pBuf,
4950: 20 61 6d 74 2c 20 26 67 6f 74 2c 20 30 29 20 29   amt, &got, 0) )
4960: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
4970: 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a  ITE_IOERR_READ;.
4980: 20 20 7d 0a 20 20 69 66 28 20 67 6f 74 3d 3d 28    }.  if( got==(
4990: 44 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20 20  DWORD)amt ){.   
49a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
49b0: 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
49c0: 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29  memset(&((char*)
49d0: 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61  pBuf)[got], 0, a
49e0: 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74  mt-got);.    ret
49f0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
4a00: 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d  _SHORT_READ;.  }
4a10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
4a20: 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
4a30: 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20  er into a file. 
4a40: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
4a50: 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20  K on success.** 
4a60: 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
4a70: 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c  ror code on fail
4a80: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
4a90: 6e 74 20 77 69 6e 57 72 69 74 65 28 0a 20 20 73  nt winWrite(.  s
4aa0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
4ab0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
4ac0: 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 2a   to write into *
4ad0: 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
4ae0: 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 2f 2a  pBuf,         /*
4af0: 20 54 68 65 20 62 79 74 65 73 20 74 6f 20 62 65   The bytes to be
4b00: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
4b10: 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20  t amt,          
4b20: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4b30: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77 72  r of bytes to wr
4b40: 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ite */.  sqlite3
4b50: 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20  _int64 offset   
4b60: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
4b70: 6f 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  o the file to be
4b80: 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a  gin writing at *
4b90: 2f 0a 29 7b 0a 20 20 4c 4f 4e 47 20 75 70 70 65  /.){.  LONG uppe
4ba0: 72 42 69 74 73 20 3d 20 28 6f 66 66 73 65 74 3e  rBits = (offset>
4bb0: 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66  >32) & 0x7ffffff
4bc0: 66 3b 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42  f;.  LONG lowerB
4bd0: 69 74 73 20 3d 20 6f 66 66 73 65 74 20 26 20 30  its = offset & 0
4be0: 78 66 66 66 66 66 66 66 66 3b 0a 20 20 44 57 4f  xffffffff;.  DWO
4bf0: 52 44 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 77  RD rc;.  DWORD w
4c00: 72 6f 74 65 3b 0a 20 20 77 69 6e 46 69 6c 65 20  rote;.  winFile 
4c10: 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
4c20: 65 2a 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28  e*)id;.  assert(
4c30: 20 69 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75   id!=0 );.  Simu
4c40: 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
4c50: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
4c60: 57 52 49 54 45 29 3b 0a 20 20 53 69 6d 75 6c 61  WRITE);.  Simula
4c70: 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
4c80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
4c90: 4c 4c 29 3b 0a 20 20 4f 53 54 52 41 43 45 33 28  LL);.  OSTRACE3(
4ca0: 22 57 52 49 54 45 20 25 64 20 6c 6f 63 6b 3d 25  "WRITE %d lock=%
4cb0: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
4cc0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
4cd0: 3b 0a 20 20 72 63 20 3d 20 53 65 74 46 69 6c 65  ;.  rc = SetFile
4ce0: 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68  Pointer(pFile->h
4cf0: 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70  , lowerBits, &up
4d00: 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45  perBits, FILE_BE
4d10: 47 49 4e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  GIN);.  if( rc==
4d20: 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
4d30: 5f 50 4f 49 4e 54 45 52 20 26 26 20 47 65 74 4c  _POINTER && GetL
4d40: 61 73 74 45 72 72 6f 72 28 29 21 3d 4e 4f 5f 45  astError()!=NO_E
4d50: 52 52 4f 52 20 29 7b 0a 20 20 20 20 72 65 74 75  RROR ){.    retu
4d60: 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
4d70: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 61 6d    }.  assert( am
4d80: 74 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 0a  t>0 );.  while(.
4d90: 20 20 20 20 20 61 6d 74 3e 30 0a 20 20 20 20 20       amt>0.     
4da0: 26 26 20 28 72 63 20 3d 20 57 72 69 74 65 46 69  && (rc = WriteFi
4db0: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75  le(pFile->h, pBu
4dc0: 66 2c 20 61 6d 74 2c 20 26 77 72 6f 74 65 2c 20  f, amt, &wrote, 
4dd0: 30 29 29 21 3d 30 0a 20 20 20 20 20 26 26 20 77  0))!=0.     && w
4de0: 72 6f 74 65 3e 30 0a 20 20 29 7b 0a 20 20 20 20  rote>0.  ){.    
4df0: 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20  amt -= wrote;.  
4e00: 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72    pBuf = &((char
4e10: 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a  *)pBuf)[wrote];.
4e20: 20 20 7d 0a 20 20 69 66 28 20 21 72 63 20 7c 7c    }.  if( !rc ||
4e30: 20 61 6d 74 3e 28 69 6e 74 29 77 72 6f 74 65 20   amt>(int)wrote 
4e40: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
4e50: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20  LITE_FULL;.  }. 
4e60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4e70: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  K;.}../*.** Trun
4e80: 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c  cate an open fil
4e90: 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64  e to a specified
4ea0: 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20   size.*/.static 
4eb0: 69 6e 74 20 77 69 6e 54 72 75 6e 63 61 74 65 28  int winTruncate(
4ec0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
4ed0: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
4ee0: 6e 42 79 74 65 29 7b 0a 20 20 4c 4f 4e 47 20 75  nByte){.  LONG u
4ef0: 70 70 65 72 42 69 74 73 20 3d 20 28 6e 42 79 74  pperBits = (nByt
4f00: 65 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66  e>>32) & 0x7ffff
4f10: 66 66 66 3b 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65  fff;.  LONG lowe
4f20: 72 42 69 74 73 20 3d 20 6e 42 79 74 65 20 26 20  rBits = nByte & 
4f30: 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 77 69  0xffffffff;.  wi
4f40: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
4f50: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 4f  winFile*)id;.  O
4f60: 53 54 52 41 43 45 33 28 22 54 52 55 4e 43 41 54  STRACE3("TRUNCAT
4f70: 45 20 25 64 20 25 6c 6c 64 5c 6e 22 2c 20 70 46  E %d %lld\n", pF
4f80: 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 3b 0a  ile->h, nByte);.
4f90: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
4fa0: 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
4fb0: 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 29 3b  IOERR_TRUNCATE);
4fc0: 0a 20 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  .  SetFilePointe
4fd0: 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65  r(pFile->h, lowe
4fe0: 72 42 69 74 73 2c 20 26 75 70 70 65 72 42 69 74  rBits, &upperBit
4ff0: 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a  s, FILE_BEGIN);.
5000: 20 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 70    SetEndOfFile(p
5010: 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 72 65 74 75  File->h);.  retu
5020: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
5030: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
5040: 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  EST./*.** Count 
5050: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75  the number of fu
5060: 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d  llsyncs and norm
5070: 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20  al syncs.  This 
5080: 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a  is used to test.
5090: 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e  ** that syncs an
50a0: 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20  d fullsyncs are 
50b0: 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68 65 20  occuring at the 
50c0: 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a  right times..*/.
50d0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  int sqlite3_sync
50e0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20  _count = 0;.int 
50f0: 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
5100: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
5110: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  if../*.** Make s
5120: 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74  ure all writes t
5130: 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66  o a particular f
5140: 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65  ile are committe
5150: 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74  d to disk..*/.st
5160: 61 74 69 63 20 69 6e 74 20 77 69 6e 53 79 6e 63  atic int winSync
5170: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
5180: 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  d, int flags){. 
5190: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
51a0: 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
51b0: 20 20 4f 53 54 52 41 43 45 33 28 22 53 59 4e 43    OSTRACE3("SYNC
51c0: 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20   %d lock=%d\n", 
51d0: 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d  pFile->h, pFile-
51e0: 3e 6c 6f 63 6b 74 79 70 65 29 3b 0a 23 69 66 64  >locktype);.#ifd
51f0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
5200: 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
5210: 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 29 7b  ITE_SYNC_FULL ){
5220: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 75 6c  .    sqlite3_ful
5230: 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20  lsync_count++;. 
5240: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e   }.  sqlite3_syn
5250: 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  c_count++;.#endi
5260: 66 0a 20 20 69 66 28 20 46 6c 75 73 68 46 69 6c  f.  if( FlushFil
5270: 65 42 75 66 66 65 72 73 28 70 46 69 6c 65 2d 3e  eBuffers(pFile->
5280: 68 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  h) ){.    return
5290: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
52a0: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
52b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
52c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  }.}../*.** Deter
52d0: 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74  mine the current
52e0: 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20   size of a file 
52f0: 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74  in bytes.*/.stat
5300: 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 53 69  ic int winFileSi
5310: 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
5320: 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  *id, sqlite3_int
5330: 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 77 69  64 *pSize){.  wi
5340: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
5350: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44  winFile*)id;.  D
5360: 57 4f 52 44 20 75 70 70 65 72 42 69 74 73 2c 20  WORD upperBits, 
5370: 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 53 69 6d  lowerBits;.  Sim
5380: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
5390: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
53a0: 5f 46 53 54 41 54 29 3b 0a 20 20 6c 6f 77 65 72  _FSTAT);.  lower
53b0: 42 69 74 73 20 3d 20 47 65 74 46 69 6c 65 53 69  Bits = GetFileSi
53c0: 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26 75 70  ze(pFile->h, &up
53d0: 70 65 72 42 69 74 73 29 3b 0a 20 20 2a 70 53 69  perBits);.  *pSi
53e0: 7a 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33 5f  ze = (((sqlite3_
53f0: 69 6e 74 36 34 29 75 70 70 65 72 42 69 74 73 29  int64)upperBits)
5400: 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74  <<32) + lowerBit
5410: 73 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  s;.  return SQLI
5420: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
5430: 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
5440: 4d 45 44 49 41 54 45 4c 59 20 69 73 20 75 6e 64  MEDIATELY is und
5450: 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57  efined on some W
5460: 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a  indows systems..
5470: 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46  */.#ifndef LOCKF
5480: 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
5490: 54 45 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f  TELY.# define LO
54a0: 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
54b0: 44 49 41 54 45 4c 59 20 31 0a 23 65 6e 64 69 66  DIATELY 1.#endif
54c0: 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
54d0: 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a  a reader lock..*
54e0: 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50 49 20  * Different API 
54f0: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c  routines are cal
5500: 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  led depending on
5510: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
5520: 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39 35  this.** is Win95
5530: 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74   or WinNT..*/.st
5540: 61 74 69 63 20 69 6e 74 20 67 65 74 52 65 61 64  atic int getRead
5550: 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46  Lock(winFile *pF
5560: 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b  ile){.  int res;
5570: 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
5580: 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20  .    OVERLAPPED 
5590: 6f 76 6c 70 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f  ovlp;.    ovlp.O
55a0: 66 66 73 65 74 20 3d 20 53 48 41 52 45 44 5f 46  ffset = SHARED_F
55b0: 49 52 53 54 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f  IRST;.    ovlp.O
55c0: 66 66 73 65 74 48 69 67 68 20 3d 20 30 3b 0a 20  ffsetHigh = 0;. 
55d0: 20 20 20 6f 76 6c 70 2e 68 45 76 65 6e 74 20 3d     ovlp.hEvent =
55e0: 20 30 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f   0;.    res = Lo
55f0: 63 6b 46 69 6c 65 45 78 28 70 46 69 6c 65 2d 3e  ckFileEx(pFile->
5600: 68 2c 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  h, LOCKFILE_FAIL
5610: 5f 49 4d 4d 45 44 49 41 54 45 4c 59 2c 0a 20 20  _IMMEDIATELY,.  
5620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5630: 20 20 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a     0, SHARED_SIZ
5640: 45 2c 20 30 2c 20 26 6f 76 6c 70 29 3b 0a 20 20  E, 0, &ovlp);.  
5650: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c  }else{.    int l
5660: 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 61  k;.    sqlite3Ra
5670: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
5680: 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 70  lk), &lk);.    p
5690: 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
56a0: 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 30 78 37  Byte = (lk & 0x7
56b0: 66 66 66 66 66 66 66 29 25 28 53 48 41 52 45 44  fffffff)%(SHARED
56c0: 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20  _SIZE - 1);.    
56d0: 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70  res = LockFile(p
56e0: 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
56f0: 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61  FIRST+pFile->sha
5700: 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20  redLockByte, 0, 
5710: 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  1, 0);.  }.  ret
5720: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
5730: 2a 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63  * Undo a readloc
5740: 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  k.*/.static int 
5750: 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77  unlockReadLock(w
5760: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
5770: 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 66 28    int res;.  if(
5780: 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72   isNT() ){.    r
5790: 65 73 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 28  es = UnlockFile(
57a0: 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
57b0: 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45  _FIRST, 0, SHARE
57c0: 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 65  D_SIZE, 0);.  }e
57d0: 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 55  lse{.    res = U
57e0: 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d  nlockFile(pFile-
57f0: 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
5800: 20 2b 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64   + pFile->shared
5810: 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20  LockByte, 0, 1, 
5820: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
5830: 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c   res;.}../*.** L
5840: 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
5850: 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
5860: 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
5870: 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65  r locktype - one
5880: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
5890: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
58a0: 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
58b0: 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
58c0: 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
58d0: 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
58e0: 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
58f0: 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
5900: 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
5910: 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
5920: 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
5930: 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
5940: 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
5950: 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
5960: 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
5970: 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
5980: 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
5990: 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
59a0: 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
59b0: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
59c0: 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
59d0: 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
59e0: 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
59f0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
5a00: 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
5a10: 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
5a20: 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
5a30: 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
5a40: 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
5a50: 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
5a60: 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
5a70: 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
5a80: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
5a90: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
5aa0: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
5ab0: 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
5ac0: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
5ad0: 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
5ae0: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
5af0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
5b00: 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
5b10: 20 61 20 6c 6f 63 6b 2e 20 20 54 68 65 20 77 69   a lock.  The wi
5b20: 6e 55 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e  nUnlock() routin
5b30: 65 0a 2a 2a 20 65 72 61 73 65 73 20 61 6c 6c 20  e.** erases all 
5b40: 6c 6f 63 6b 73 20 61 74 20 6f 6e 63 65 20 61 6e  locks at once an
5b50: 64 20 72 65 74 75 72 6e 73 20 75 73 20 69 6d 6d  d returns us imm
5b60: 65 64 69 61 74 65 6c 79 20 74 6f 20 6c 6f 63 6b  ediately to lock
5b70: 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20  ing level 0..** 
5b80: 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
5b90: 6c 65 20 74 6f 20 6c 6f 77 65 72 20 74 68 65 20  le to lower the 
5ba0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
5bb0: 65 20 73 74 65 70 20 61 74 20 61 20 74 69 6d 65  e step at a time
5bc0: 2e 20 20 59 6f 75 0a 2a 2a 20 6d 75 73 74 20 67  .  You.** must g
5bd0: 6f 20 73 74 72 61 69 67 68 74 20 74 6f 20 6c 6f  o straight to lo
5be0: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a  cking level 0..*
5bf0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
5c00: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
5c10: 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
5c20: 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ype){.  int rc =
5c30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f   SQLITE_OK;    /
5c40: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72  * Return code fr
5c50: 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a  om subroutines *
5c60: 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
5c70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
5c80: 73 75 6c 74 20 6f 66 20 61 20 77 69 6e 64 6f 77  sult of a window
5c90: 73 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20  s lock call */. 
5ca0: 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65   int newLocktype
5cb0: 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70  ;       /* Set p
5cc0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 74  File->locktype t
5cd0: 6f 20 74 68 69 73 20 76 61 6c 75 65 20 62 65 66  o this value bef
5ce0: 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20  ore exiting */. 
5cf0: 20 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c   int gotPendingL
5d00: 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20  ock = 0;/* True 
5d10: 69 66 20 77 65 20 61 63 71 75 69 72 65 64 20 61  if we acquired a
5d20: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68   PENDING lock th
5d30: 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20 77 69 6e  is time */.  win
5d40: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
5d50: 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61  inFile*)id;..  a
5d60: 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20  ssert( pFile!=0 
5d70: 29 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22 4c  );.  OSTRACE5("L
5d80: 4f 43 4b 20 25 64 20 25 64 20 77 61 73 20 25 64  OCK %d %d was %d
5d90: 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  (%d)\n",.       
5da0: 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63     pFile->h, loc
5db0: 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f  ktype, pFile->lo
5dc0: 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73  cktype, pFile->s
5dd0: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 29 3b 0a  haredLockByte);.
5de0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
5df0: 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
5e00: 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72   of this type or
5e10: 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76   more restrictiv
5e20: 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73  e on the.  ** Os
5e30: 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  File, do nothing
5e40: 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20  . Don't use the 
5e50: 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70  end_lock: exit p
5e60: 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c  ath, as.  ** sql
5e70: 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78  ite3OsEnterMutex
5e80: 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63  () hasn't been c
5e90: 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a  alled yet..  */.
5ea0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
5eb0: 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20  ktype>=locktype 
5ec0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
5ed0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
5ee0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
5ef0: 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63   locking sequenc
5f00: 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a  e is correct.  *
5f10: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
5f20: 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f  e->locktype!=NO_
5f30: 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65  LOCK || locktype
5f40: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
5f50: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
5f60: 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ype!=PENDING_LOC
5f70: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  K );.  assert( l
5f80: 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45  ocktype!=RESERVE
5f90: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d  D_LOCK || pFile-
5fa0: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  >locktype==SHARE
5fb0: 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  D_LOCK );..  /* 
5fc0: 4c 6f 63 6b 20 74 68 65 20 50 45 4e 44 49 4e 47  Lock the PENDING
5fd0: 5f 4c 4f 43 4b 20 62 79 74 65 20 69 66 20 77 65  _LOCK byte if we
5fe0: 20 6e 65 65 64 20 74 6f 20 61 63 71 75 69 72 65   need to acquire
5ff0: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
6000: 6f 72 0a 20 20 2a 2a 20 61 20 53 48 41 52 45 44  or.  ** a SHARED
6010: 20 6c 6f 63 6b 2e 20 20 49 66 20 77 65 20 61 72   lock.  If we ar
6020: 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
6030: 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 61  ARED lock, the a
6040: 63 71 75 69 73 69 74 69 6f 6e 20 6f 66 0a 20 20  cquisition of.  
6050: 2a 2a 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c  ** the PENDING_L
6060: 4f 43 4b 20 62 79 74 65 20 69 73 20 74 65 6d 70  OCK byte is temp
6070: 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65  orary..  */.  ne
6080: 77 4c 6f 63 6b 74 79 70 65 20 3d 20 70 46 69 6c  wLocktype = pFil
6090: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69  e->locktype;.  i
60a0: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
60b0: 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 0a 20 20 20 7c  pe==NO_LOCK.   |
60c0: 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  | (locktype==EXC
60d0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
60e0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
60f0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 0a 20  RESERVED_LOCK). 
6100: 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20   ){.    int cnt 
6110: 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 3;.    while( 
6120: 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65 73 20  cnt-->0 && (res 
6130: 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65  = LockFile(pFile
6140: 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ->h, PENDING_BYT
6150: 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20  E, 0, 1, 0))==0 
6160: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20  ){.      /* Try 
6170: 33 20 74 69 6d 65 73 20 74 6f 20 67 65 74 20 74  3 times to get t
6180: 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e  he pending lock.
6190: 20 20 54 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f    The pending lo
61a0: 63 6b 20 6d 69 67 68 74 20 62 65 0a 20 20 20 20  ck might be.    
61b0: 20 20 2a 2a 20 68 65 6c 64 20 62 79 20 61 6e 6f    ** held by ano
61c0: 74 68 65 72 20 72 65 61 64 65 72 20 70 72 6f 63  ther reader proc
61d0: 65 73 73 20 77 68 6f 20 77 69 6c 6c 20 72 65 6c  ess who will rel
61e0: 65 61 73 65 20 69 74 20 6d 6f 6d 65 6e 74 61 72  ease it momentar
61f0: 69 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ily..      */.  
6200: 20 20 20 20 4f 53 54 52 41 43 45 32 28 22 63 6f      OSTRACE2("co
6210: 75 6c 64 20 6e 6f 74 20 67 65 74 20 61 20 50 45  uld not get a PE
6220: 4e 44 49 4e 47 20 6c 6f 63 6b 2e 20 63 6e 74 3d  NDING lock. cnt=
6230: 25 64 5c 6e 22 2c 20 63 6e 74 29 3b 0a 20 20 20  %d\n", cnt);.   
6240: 20 20 20 53 6c 65 65 70 28 31 29 3b 0a 20 20 20     Sleep(1);.   
6250: 20 7d 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e   }.    gotPendin
6260: 67 4c 6f 63 6b 20 3d 20 72 65 73 3b 0a 20 20 7d  gLock = res;.  }
6270: 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61  ..  /* Acquire a
6280: 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a   shared lock.  *
6290: 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
62a0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
62b0: 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65   res ){.    asse
62c0: 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
62d0: 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a  ype==NO_LOCK );.
62e0: 20 20 20 20 72 65 73 20 3d 20 67 65 74 52 65 61      res = getRea
62f0: 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
6300: 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
6310: 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d     newLocktype =
6320: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
6330: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63    }.  }..  /* Ac
6340: 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44  quire a RESERVED
6350: 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28   lock.  */.  if(
6360: 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52   locktype==RESER
6370: 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20  VED_LOCK && res 
6380: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
6390: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
63a0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
63b0: 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c     res = LockFil
63c0: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45  e(pFile->h, RESE
63d0: 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
63e0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73   0);.    if( res
63f0: 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
6400: 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56 45 44  ktype = RESERVED
6410: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _LOCK;.    }.  }
6420: 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61  ..  /* Acquire a
6430: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20   PENDING lock.  
6440: 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
6450: 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
6460: 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
6470: 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45  newLocktype = PE
6480: 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20  NDING_LOCK;.    
6490: 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d  gotPendingLock =
64a0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63   0;.  }..  /* Ac
64b0: 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49  quire an EXCLUSI
64c0: 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  VE lock.  */.  i
64d0: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
64e0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72  LUSIVE_LOCK && r
64f0: 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
6500: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
6510: 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e>=SHARED_LOCK )
6520: 3b 0a 20 20 20 20 72 65 73 20 3d 20 75 6e 6c 6f  ;.    res = unlo
6530: 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  ckReadLock(pFile
6540: 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 32 28  );.    OSTRACE2(
6550: 22 75 6e 72 65 61 64 6c 6f 63 6b 20 3d 20 25 64  "unreadlock = %d
6560: 5c 6e 22 2c 20 72 65 73 29 3b 0a 20 20 20 20 72  \n", res);.    r
6570: 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46  es = LockFile(pF
6580: 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
6590: 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f  IRST, 0, SHARED_
65a0: 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  SIZE, 0);.    if
65b0: 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e  ( res ){.      n
65c0: 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58 43  ewLocktype = EXC
65d0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20  LUSIVE_LOCK;.   
65e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4f 53   }else{.      OS
65f0: 54 52 41 43 45 32 28 22 65 72 72 6f 72 2d 63 6f  TRACE2("error-co
6600: 64 65 20 3d 20 25 64 5c 6e 22 2c 20 47 65 74 4c  de = %d\n", GetL
6610: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20  astError());.   
6620: 20 20 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70     getReadLock(p
6630: 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  File);.    }.  }
6640: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65  ..  /* If we are
6650: 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49   holding a PENDI
6660: 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67  NG lock that oug
6670: 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73 65  ht to be release
6680: 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c  d, then.  ** rel
6690: 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a  ease it now..  *
66a0: 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64 69  /.  if( gotPendi
66b0: 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79  ngLock && lockty
66c0: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
66d0: 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c  ){.    UnlockFil
66e0: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44  e(pFile->h, PEND
66f0: 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  ING_BYTE, 0, 1, 
6700: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70  0);.  }..  /* Up
6710: 64 61 74 65 20 74 68 65 20 73 74 61 74 65 20 6f  date the state o
6720: 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 68  f the lock has h
6730: 65 6c 64 20 69 6e 20 74 68 65 20 66 69 6c 65 20  eld in the file 
6740: 64 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e 0a  descriptor then.
6750: 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20    ** return the 
6760: 61 70 70 72 6f 70 72 69 61 74 65 20 72 65 73 75  appropriate resu
6770: 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  lt code..  */.  
6780: 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 72  if( res ){.    r
6790: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
67a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 53 54 52   }else{.    OSTR
67b0: 41 43 45 34 28 22 4c 4f 43 4b 20 46 41 49 4c 45  ACE4("LOCK FAILE
67c0: 44 20 25 64 20 74 72 79 69 6e 67 20 66 6f 72 20  D %d trying for 
67d0: 25 64 20 62 75 74 20 67 6f 74 20 25 64 5c 6e 22  %d but got %d\n"
67e0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
67f0: 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 2c         locktype,
6800: 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29 3b 0a 20   newLocktype);. 
6810: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
6820: 55 53 59 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65  USY;.  }.  pFile
6830: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6e 65 77  ->locktype = new
6840: 4c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75  Locktype;.  retu
6850: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
6860: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
6870: 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
6880: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
6890: 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
68a0: 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
68b0: 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
68c0: 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
68d0: 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
68e0: 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  ld, return.** no
68f0: 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73  n-zero, otherwis
6900: 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  e zero..*/.stati
6910: 63 20 69 6e 74 20 77 69 6e 43 68 65 63 6b 52 65  c int winCheckRe
6920: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
6930: 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
6940: 69 6e 74 20 72 63 3b 0a 20 20 77 69 6e 46 69 6c  int rc;.  winFil
6950: 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
6960: 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73 65 72  ile*)id;.  asser
6970: 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20  t( pFile!=0 );. 
6980: 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
6990: 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c  type>=RESERVED_L
69a0: 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  OCK ){.    rc = 
69b0: 31 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 33 28  1;.    OSTRACE3(
69c0: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
69d0: 20 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20   %d (local)\n", 
69e0: 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 3b 0a 20  pFile->h, rc);. 
69f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
6a00: 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d   LockFile(pFile-
6a10: 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  >h, RESERVED_BYT
6a20: 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20  E, 0, 1, 0);.   
6a30: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
6a40: 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c   UnlockFile(pFil
6a50: 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
6a60: 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
6a70: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 21 72     }.    rc = !r
6a80: 63 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 33 28  c;.    OSTRACE3(
6a90: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
6aa0: 20 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c   %d (remote)\n",
6ab0: 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 3b 0a   pFile->h, rc);.
6ac0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6ad0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
6ae0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
6af0: 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
6b00: 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74  ptor id to lockt
6b10: 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a  ype.  locktype.*
6b20: 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
6b30: 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
6b40: 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
6b50: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
6b60: 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
6b70: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
6b80: 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
6b90: 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
6ba0: 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
6bb0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
6bc0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
6bd0: 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
6be0: 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75  ble for this rou
6bf0: 74 69 6e 65 20 74 6f 20 66 61 69 6c 20 69 66 20  tine to fail if 
6c00: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
6c10: 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43  ent.** is NO_LOC
6c20: 4b 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  K.  If the secon
6c30: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 48  d argument is SH
6c40: 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74  ARED_LOCK then t
6c50: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d  his routine.** m
6c60: 69 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49  ight return SQLI
6c70: 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61  TE_IOERR;.*/.sta
6c80: 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63  tic int winUnloc
6c90: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
6ca0: 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
6cb0: 29 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20  ){.  int type;. 
6cc0: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
6cd0: 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
6ce0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
6cf0: 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
6d00: 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73  pFile!=0 );.  as
6d10: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d  sert( locktype<=
6d20: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
6d30: 20 4f 53 54 52 41 43 45 35 28 22 55 4e 4c 4f 43   OSTRACE5("UNLOC
6d40: 4b 20 25 64 20 74 6f 20 25 64 20 77 61 73 20 25  K %d to %d was %
6d50: 64 28 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  d(%d)\n", pFile-
6d60: 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20  >h, locktype,.  
6d70: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
6d80: 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e  ocktype, pFile->
6d90: 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 29 3b  sharedLockByte);
6da0: 0a 20 20 74 79 70 65 20 3d 20 70 46 69 6c 65 2d  .  type = pFile-
6db0: 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28  >locktype;.  if(
6dc0: 20 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56 45   type>=EXCLUSIVE
6dd0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c  _LOCK ){.    Unl
6de0: 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  ockFile(pFile->h
6df0: 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
6e00: 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20  0, SHARED_SIZE, 
6e10: 30 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  0);.    if( lock
6e20: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
6e30: 4b 20 26 26 20 21 67 65 74 52 65 61 64 4c 6f 63  K && !getReadLoc
6e40: 6b 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  k(pFile) ){.    
6e50: 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64    /* This should
6e60: 20 6e 65 76 65 72 20 68 61 70 70 65 6e 2e 20 20   never happen.  
6e70: 57 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  We should always
6e80: 20 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20 20   be able to.    
6e90: 20 20 2a 2a 20 72 65 61 63 71 75 69 72 65 20 74    ** reacquire t
6ea0: 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a  he read lock */.
6eb0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6ec0: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
6ed0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
6ee0: 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c  type>=RESERVED_L
6ef0: 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63  OCK ){.    Unloc
6f00: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
6f10: 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
6f20: 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  , 1, 0);.  }.  i
6f30: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  f( locktype==NO_
6f40: 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53 48  LOCK && type>=SH
6f50: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
6f60: 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28   unlockReadLock(
6f70: 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pFile);.  }.  if
6f80: 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f  ( type>=PENDING_
6f90: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f  LOCK ){.    Unlo
6fa0: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
6fb0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30   PENDING_BYTE, 0
6fc0: 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70  , 1, 0);.  }.  p
6fd0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
6fe0: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74   locktype;.  ret
6ff0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7000: 20 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65   Control and que
7010: 72 79 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66  ry of the open f
7020: 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ile handle..*/.s
7030: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c  tatic int winFil
7040: 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
7050: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f  _file *id, int o
7060: 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  p, void *pArg){.
7070: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
7080: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7090: 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a  FCNTL_LOCKSTATE:
70a0: 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
70b0: 70 41 72 67 20 3d 20 28 28 77 69 6e 46 69 6c 65  pArg = ((winFile
70c0: 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b  *)id)->locktype;
70d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
70e0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
70f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
7100: 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  TE_ERROR;.}../*.
7110: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
7120: 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74  ctor size in byt
7130: 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c  es of the underl
7140: 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63  ying block devic
7150: 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65  e for.** the spe
7160: 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69  cified file. Thi
7170: 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61  s is almost alwa
7180: 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62 75  ys 512 bytes, bu
7190: 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67  t may be.** larg
71a0: 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69  er for some devi
71b0: 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ces..**.** SQLit
71c0: 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74  e code assumes t
71d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  his function can
71e0: 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73  not fail. It als
71f0: 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a  o assumes that.*
7200: 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61  * if two files a
7210: 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  re created in th
7220: 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74  e same file-syst
7230: 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e  em directory (i.
7240: 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65  e..** a database
7250: 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c   and its journal
7260: 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65 20   file) that the 
7270: 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c  sector size will
7280: 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20   be the.** same 
7290: 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61  for both..*/.sta
72a0: 74 69 63 20 69 6e 74 20 77 69 6e 53 65 63 74 6f  tic int winSecto
72b0: 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  rSize(sqlite3_fi
72c0: 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65 74 75 72  le *id){.  retur
72d0: 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  n SQLITE_DEFAULT
72e0: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a  _SECTOR_SIZE;.}.
72f0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
7300: 76 65 63 74 6f 72 20 6f 66 20 64 65 76 69 63 65  vector of device
7310: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
7320: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7330: 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63 74  winDeviceCharact
7340: 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33  eristics(sqlite3
7350: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65  _file *id){.  re
7360: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
7370: 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66   This vector def
7380: 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74  ines all the met
7390: 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70  hods that can op
73a0: 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73  erate on an.** s
73b0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20  qlite3_file for 
73c0: 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  win32..*/.static
73d0: 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
73e0: 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d  o_methods winIoM
73f0: 65 74 68 6f 64 20 3d 20 7b 0a 20 20 31 2c 20 20  ethod = {.  1,  
7400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7410: 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
7420: 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c  n */.  winClose,
7430: 0a 20 20 77 69 6e 52 65 61 64 2c 0a 20 20 77 69  .  winRead,.  wi
7440: 6e 57 72 69 74 65 2c 0a 20 20 77 69 6e 54 72 75  nWrite,.  winTru
7450: 6e 63 61 74 65 2c 0a 20 20 77 69 6e 53 79 6e 63  ncate,.  winSync
7460: 2c 0a 20 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c  ,.  winFileSize,
7470: 0a 20 20 77 69 6e 4c 6f 63 6b 2c 0a 20 20 77 69  .  winLock,.  wi
7480: 6e 55 6e 6c 6f 63 6b 2c 0a 20 20 77 69 6e 43 68  nUnlock,.  winCh
7490: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
74a0: 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f  .  winFileContro
74b0: 6c 2c 0a 20 20 77 69 6e 53 65 63 74 6f 72 53 69  l,.  winSectorSi
74c0: 7a 65 2c 0a 20 20 77 69 6e 44 65 76 69 63 65 43  ze,.  winDeviceC
74d0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 0a 7d  haracteristics.}
74e0: 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;../************
74f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
7530: 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68 65  ** Here ends the
7540: 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 74 68 61   I/O methods tha
7550: 74 20 66 6f 72 6d 20 74 68 65 20 73 71 6c 69 74  t form the sqlit
7560: 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
7570: 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ject..**.** The 
7580: 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  next block of co
7590: 64 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  de implements th
75a0: 65 20 56 46 53 20 6d 65 74 68 6f 64 73 2e 0a 2a  e VFS methods..*
75b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
75c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
75d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
75e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
75f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
7600: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54  .** Convert a UT
7610: 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74  F-8 filename int
7620: 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 20  o whatever form 
7630: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a  the underlying.*
7640: 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
7650: 65 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d  em wants filenam
7660: 65 73 20 69 6e 2e 20 20 53 70 61 63 65 20 74 6f  es in.  Space to
7670: 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74   hold the result
7680: 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20  .** is obtained 
7690: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20  from malloc and 
76a0: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
76b0: 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
76c0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
76d0: 74 69 63 20 76 6f 69 64 20 2a 63 6f 6e 76 65 72  tic void *conver
76e0: 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f  tUtf8Filename(co
76f0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
7700: 61 6d 65 29 7b 0a 20 20 76 6f 69 64 20 2a 7a 43  ame){.  void *zC
7710: 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20  onverted = 0;.  
7720: 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
7730: 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 75    zConverted = u
7740: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
7750: 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  lename);.  }else
7760: 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64  {.    zConverted
7770: 20 3d 20 75 74 66 38 54 6f 4d 62 63 73 28 7a 46   = utf8ToMbcs(zF
7780: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ilename);.  }.  
7790: 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68  /* caller will h
77a0: 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d  andle out of mem
77b0: 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ory */.  return 
77c0: 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f  zConverted;.}../
77d0: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65  *.** Open a file
77e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
77f0: 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  winOpen(.  sqlit
7800: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
7810: 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64       /* Not used
7820: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
7830: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
7840: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
7850: 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20  ile (UTF-8) */. 
7860: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
7870: 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  d,         /* Wr
7880: 69 74 65 20 74 68 65 20 53 51 4c 69 74 65 20 66  ite the SQLite f
7890: 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20  ile handle here 
78a0: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
78c0: 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67  * Open mode flag
78d0: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74  s */.  int *pOut
78e0: 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
78f0: 20 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75 72   /* Status retur
7900: 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  n flags */.){.  
7910: 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52  HANDLE h;.  DWOR
7920: 44 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73  D dwDesiredAcces
7930: 73 3b 0a 20 20 44 57 4f 52 44 20 64 77 53 68 61  s;.  DWORD dwSha
7940: 72 65 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20  reMode;.  DWORD 
7950: 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
7960: 69 74 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64  ition;.  DWORD d
7970: 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
7980: 74 65 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  tes = 0;.  int i
7990: 73 54 65 6d 70 3b 0a 20 20 77 69 6e 46 69 6c 65  sTemp;.  winFile
79a0: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
79b0: 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a  le*)id;.  void *
79c0: 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e  zConverted = con
79d0: 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65  vertUtf8Filename
79e0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  (zName);.  if( z
79f0: 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
7a00: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7a10: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
7a20: 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
7a30: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
7a40: 45 20 29 7b 0a 20 20 20 20 64 77 44 65 73 69 72  E ){.    dwDesir
7a50: 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52  edAccess = GENER
7a60: 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49  IC_READ | GENERI
7a70: 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65  C_WRITE;.  }else
7a80: 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41  {.    dwDesiredA
7a90: 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f  ccess = GENERIC_
7aa0: 52 45 41 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20  READ;.  }.  if( 
7ab0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
7ac0: 50 45 4e 5f 43 52 45 41 54 45 20 29 7b 0a 20 20  PEN_CREATE ){.  
7ad0: 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
7ae0: 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41  osition = OPEN_A
7af0: 4c 57 41 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a  LWAYS;.  }else{.
7b00: 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
7b10: 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e  sposition = OPEN
7b20: 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a 20  _EXISTING;.  }. 
7b30: 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
7b40: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
7b50: 20 29 7b 0a 20 20 20 20 64 77 53 68 61 72 65 4d   ){.    dwShareM
7b60: 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48 41 52 45  ode = FILE_SHARE
7b70: 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48 41  _READ | FILE_SHA
7b80: 52 45 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73  RE_WRITE;.  }els
7b90: 65 7b 0a 20 20 20 20 64 77 53 68 61 72 65 4d 6f  e{.    dwShareMo
7ba0: 64 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  de = 0;.  }.  if
7bb0: 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
7bc0: 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
7bd0: 4f 53 45 20 29 7b 0a 23 69 66 20 4f 53 5f 57 49  OSE ){.#if OS_WI
7be0: 4e 43 45 0a 20 20 20 20 64 77 46 6c 61 67 73 41  NCE.    dwFlagsA
7bf0: 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46  ndAttributes = F
7c00: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49  ILE_ATTRIBUTE_HI
7c10: 44 44 45 4e 3b 0a 23 65 6c 73 65 0a 20 20 20 20  DDEN;.#else.    
7c20: 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
7c30: 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52  utes = FILE_ATTR
7c40: 49 42 55 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a  IBUTE_TEMPORARY.
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
7c70: 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
7c80: 48 49 44 44 45 4e 0a 20 20 20 20 20 20 20 20 20  HIDDEN.         
7c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ca0: 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41        | FILE_FLA
7cb0: 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53  G_DELETE_ON_CLOS
7cc0: 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 73  E;.#endif.    is
7cd0: 54 65 6d 70 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  Temp = 1;.  }els
7ce0: 65 7b 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e  e{.    dwFlagsAn
7cf0: 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49  dAttributes = FI
7d00: 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52  LE_ATTRIBUTE_NOR
7d10: 4d 41 4c 3b 0a 20 20 20 20 69 73 54 65 6d 70 20  MAL;.    isTemp 
7d20: 3d 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65  = 0;.  }.  /* Re
7d30: 70 6f 72 74 73 20 66 72 6f 6d 20 74 68 65 20 69  ports from the i
7d40: 6e 74 65 72 6e 65 74 20 61 72 65 20 74 68 61 74  nternet are that
7d50: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 73 20   performance is 
7d60: 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65 74 74  always.  ** bett
7d70: 65 72 20 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f  er if FILE_FLAG_
7d80: 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69 73  RANDOM_ACCESS is
7d90: 20 75 73 65 64 2e 20 20 54 69 63 6b 65 74 20 23   used.  Ticket #
7da0: 32 36 39 39 2e 20 2a 2f 0a 20 20 64 77 46 6c 61  2699. */.  dwFla
7db0: 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
7dc0: 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e  |= FILE_FLAG_RAN
7dd0: 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 20 20 69 66  DOM_ACCESS;.  if
7de0: 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
7df0: 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 57 28  h = CreateFileW(
7e00: 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74  (WCHAR*)zConvert
7e10: 65 64 2c 0a 20 20 20 20 20 20 20 64 77 44 65 73  ed,.       dwDes
7e20: 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20  iredAccess,.    
7e30: 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a     dwShareMode,.
7e40: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20         NULL,.   
7e50: 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
7e60: 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20  sposition,.     
7e70: 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
7e80: 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 4e  ibutes,.       N
7e90: 55 4c 4c 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c  ULL.    );.  }el
7ea0: 73 65 7b 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45  se{.#if OS_WINCE
7eb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7ec0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 23 65 6c 73 65 0a  TE_NOMEM;.#else.
7ed0: 20 20 20 20 68 20 3d 20 43 72 65 61 74 65 46 69      h = CreateFi
7ee0: 6c 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  leA((char*)zConv
7ef0: 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 64 77  erted,.       dw
7f00: 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20  DesiredAccess,. 
7f10: 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
7f20: 65 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a  e,.       NULL,.
7f30: 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f         dwCreatio
7f40: 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20  nDisposition,.  
7f50: 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41       dwFlagsAndA
7f60: 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20  ttributes,.     
7f70: 20 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 23 65    NULL.    );.#e
7f80: 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 68  ndif.  }.  if( h
7f90: 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
7fa0: 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 66 72  _VALUE ){.    fr
7fb0: 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
7fc0: 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
7fd0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
7fe0: 57 52 49 54 45 20 29 7b 0a 20 20 20 20 20 20 72  WRITE ){.      r
7ff0: 65 74 75 72 6e 20 77 69 6e 4f 70 65 6e 28 30 2c  eturn winOpen(0,
8000: 20 7a 4e 61 6d 65 2c 20 69 64 2c 20 0a 20 20 20   zName, id, .   
8010: 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67            ((flag
8020: 73 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  s|SQLITE_OPEN_RE
8030: 41 44 4f 4e 4c 59 29 26 7e 53 51 4c 49 54 45 5f  ADONLY)&~SQLITE_
8040: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 2c  OPEN_READWRITE),
8050: 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 20   pOutFlags);.   
8060: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
8070: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
8080: 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OPEN;.    }.  }.
8090: 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20    if( pOutFlags 
80a0: 29 7b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  ){.    if( flags
80b0: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
80c0: 45 41 44 57 52 49 54 45 20 29 7b 0a 20 20 20 20  EADWRITE ){.    
80d0: 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53    *pOutFlags = S
80e0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
80f0: 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RITE;.    }else{
8100: 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  .      *pOutFlag
8110: 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
8120: 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  READONLY;.    }.
8130: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 46 69    }.  memset(pFi
8140: 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  le, 0, sizeof(*p
8150: 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d  File));.  pFile-
8160: 3e 70 4d 65 74 68 6f 64 20 3d 20 26 77 69 6e 49  >pMethod = &winI
8170: 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65  oMethod;.  pFile
8180: 2d 3e 68 20 3d 20 68 3b 0a 23 69 66 20 4f 53 5f  ->h = h;.#if OS_
8190: 57 49 4e 43 45 0a 20 20 69 66 28 20 28 66 6c 61  WINCE.  if( (fla
81a0: 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs & (SQLITE_OPE
81b0: 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
81c0: 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29  TE_OPEN_MAIN_DB)
81d0: 29 20 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20  ) ==.           
81e0: 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
81f0: 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
8200: 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 0a  E_OPEN_MAIN_DB).
8210: 20 20 20 20 20 20 20 26 26 20 21 77 69 6e 63 65         && !wince
8220: 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65  CreateLock(zName
8230: 2c 20 70 46 69 6c 65 29 0a 20 20 29 7b 0a 20 20  , pFile).  ){.  
8240: 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29    CloseHandle(h)
8250: 3b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76  ;.    free(zConv
8260: 65 72 74 65 64 29 3b 0a 20 20 20 20 72 65 74 75  erted);.    retu
8270: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
8280: 45 4e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  EN;.  }.  if( is
8290: 54 65 6d 70 20 29 7b 0a 20 20 20 20 70 46 69 6c  Temp ){.    pFil
82a0: 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
82b0: 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  e = zConverted;.
82c0: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
82d0: 20 7b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e   {.    free(zCon
82e0: 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 20 20 4f  verted);.  }.  O
82f0: 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a  penCounter(+1);.
8300: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8310: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  OK;.}../*.** Del
8320: 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69  ete the named fi
8330: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  le..**.** Note t
8340: 68 61 74 20 77 69 6e 64 6f 77 73 20 64 6f 65 73  hat windows does
8350: 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c   not allow a fil
8360: 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  e to be deleted 
8370: 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  if some other.**
8380: 20 70 72 6f 63 65 73 73 20 68 61 73 20 69 74 20   process has it 
8390: 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73  open.  Sometimes
83a0: 20 61 20 76 69 72 75 73 20 73 63 61 6e 6e 65 72   a virus scanner
83b0: 20 6f 72 20 69 6e 64 65 78 69 6e 67 20 70 72 6f   or indexing pro
83c0: 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65  gram.** will ope
83d0: 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  n a journal file
83e0: 20 73 68 6f 72 74 6c 79 20 61 66 74 65 72 20 69   shortly after i
83f0: 74 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20  t is created in 
8400: 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77  order to do.** w
8410: 68 61 74 65 76 65 72 20 64 6f 65 73 2e 20 20 57  hatever does.  W
8420: 68 69 6c 65 20 74 68 69 73 20 6f 74 68 65 72 20  hile this other 
8430: 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
8440: 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 6f  ng the.** file o
8450: 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20 62 65 20  pen, we will be 
8460: 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  unable to delete
8470: 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72   it.  To work ar
8480: 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20 70 72 6f  ound this.** pro
8490: 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61 79 20 31  blem, we delay 1
84a0: 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  00 milliseconds 
84b0: 61 6e 64 20 74 72 79 20 74 6f 20 64 65 6c 65 74  and try to delet
84c0: 65 20 61 67 61 69 6e 2e 20 20 55 70 0a 2a 2a 20  e again.  Up.** 
84d0: 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41  to MX_DELETION_A
84e0: 54 54 45 4d 50 54 73 20 64 65 6c 65 74 69 6f 6e  TTEMPTs deletion
84f0: 20 61 74 74 65 6d 70 74 73 20 61 72 65 20 72 75   attempts are ru
8500: 6e 20 62 65 66 6f 72 65 20 67 69 76 69 6e 67 0a  n before giving.
8510: 2a 2a 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e  ** up and return
8520: 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f  ing an error..*/
8530: 0a 23 64 65 66 69 6e 65 20 4d 58 5f 44 45 4c 45  .#define MX_DELE
8540: 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 35 0a  TION_ATTEMPTS 5.
8550: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65  static int winDe
8560: 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  lete(.  sqlite3_
8570: 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
8580: 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20      /* Not used 
8590: 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f  on win32 */.  co
85a0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
85b0: 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ame,      /* Nam
85c0: 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c  e of file to del
85d0: 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e  ete */.  int syn
85e0: 63 44 69 72 20 20 20 20 20 20 20 20 20 20 20 20  cDir            
85f0: 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64       /* Not used
8600: 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a   on win32 */.){.
8610: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
8620: 20 69 6e 74 20 72 63 3b 0a 20 20 76 6f 69 64 20   int rc;.  void 
8630: 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f  *zConverted = co
8640: 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d  nvertUtf8Filenam
8650: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
8660: 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
8670: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
8680: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8690: 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  }.  SimulateIOEr
86a0: 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
86b0: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b  E_IOERR_DELETE);
86c0: 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
86d0: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 44  .    do{.      D
86e0: 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e 76  eleteFileW(zConv
86f0: 65 72 74 65 64 29 3b 0a 20 20 20 20 7d 77 68 69  erted);.    }whi
8700: 6c 65 28 20 28 72 63 20 3d 20 47 65 74 46 69 6c  le( (rc = GetFil
8710: 65 41 74 74 72 69 62 75 74 65 73 57 28 7a 43 6f  eAttributesW(zCo
8720: 6e 76 65 72 74 65 64 29 29 21 3d 30 78 66 66 66  nverted))!=0xfff
8730: 66 66 66 66 66 20 0a 20 20 20 20 20 20 20 20 20  fffff .         
8740: 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20 4d 58     && cnt++ < MX
8750: 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
8760: 54 53 20 26 26 20 28 53 6c 65 65 70 28 31 30 30  TS && (Sleep(100
8770: 29 2c 20 31 29 20 29 3b 0a 20 20 7d 65 6c 73 65  ), 1) );.  }else
8780: 7b 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20  {.#if OS_WINCE. 
8790: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
87a0: 5f 4e 4f 4d 45 4d 3b 0a 23 65 6c 73 65 0a 20 20  _NOMEM;.#else.  
87b0: 20 20 64 6f 7b 0a 20 20 20 20 20 20 44 65 6c 65    do{.      Dele
87c0: 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74  teFileA(zConvert
87d0: 65 64 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  ed);.    }while(
87e0: 20 28 72 63 20 3d 20 47 65 74 46 69 6c 65 41 74   (rc = GetFileAt
87f0: 74 72 69 62 75 74 65 73 41 28 7a 43 6f 6e 76 65  tributesA(zConve
8800: 72 74 65 64 29 29 21 3d 30 78 66 66 66 66 66 66  rted))!=0xffffff
8810: 66 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  ff.            &
8820: 26 20 63 6e 74 2b 2b 20 3c 20 4d 58 5f 44 45 4c  & cnt++ < MX_DEL
8830: 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 26  ETION_ATTEMPTS &
8840: 26 20 28 53 6c 65 65 70 28 31 30 30 29 2c 20 31  & (Sleep(100), 1
8850: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ) );.#endif.  }.
8860: 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65    free(zConverte
8870: 64 29 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22  d);.  OSTRACE2("
8880: 44 45 4c 45 54 45 20 5c 22 25 73 5c 22 5c 6e 22  DELETE \"%s\"\n"
8890: 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
88a0: 72 65 74 75 72 6e 20 72 63 3d 3d 30 78 66 66 66  return rc==0xfff
88b0: 66 66 66 66 66 20 3f 20 53 51 4c 49 54 45 5f 4f  fffff ? SQLITE_O
88c0: 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  K : SQLITE_IOERR
88d0: 5f 44 45 4c 45 54 45 3b 0a 7d 0a 0a 2f 2a 0a 2a  _DELETE;.}../*.*
88e0: 2a 20 43 68 65 63 6b 20 74 68 65 20 65 78 69 73  * Check the exis
88f0: 74 61 6e 63 65 20 61 6e 64 20 73 74 61 74 75 73  tance and status
8900: 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73   of a file..*/.s
8910: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 41 63 63  tatic int winAcc
8920: 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ess(.  sqlite3_v
8930: 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
8940: 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e    /* Not used on
8950: 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73   win32 */.  cons
8960: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
8970: 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  e,     /* Name o
8980: 66 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20  f file to check 
8990: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89b0: 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 73 74 20  /* Type of test 
89c0: 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20  to make on this 
89d0: 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f  file */.){.  DWO
89e0: 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72  RD attr;.  int r
89f0: 63 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  c;.  void *zConv
8a00: 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55  erted = convertU
8a10: 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c  tf8Filename(zFil
8a20: 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43  ename);.  if( zC
8a30: 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
8a40: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8a50: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
8a60: 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
8a70: 61 74 74 72 20 3d 20 47 65 74 46 69 6c 65 41 74  attr = GetFileAt
8a80: 74 72 69 62 75 74 65 73 57 28 28 57 43 48 41 52  tributesW((WCHAR
8a90: 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  *)zConverted);. 
8aa0: 20 7d 65 6c 73 65 7b 0a 23 69 66 20 4f 53 5f 57   }else{.#if OS_W
8ab0: 49 4e 43 45 0a 20 20 20 20 72 65 74 75 72 6e 20  INCE.    return 
8ac0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 23 65  SQLITE_NOMEM;.#e
8ad0: 6c 73 65 0a 20 20 20 20 61 74 74 72 20 3d 20 47  lse.    attr = G
8ae0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
8af0: 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
8b00: 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  ted);.#endif.  }
8b10: 0a 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  .  free(zConvert
8b20: 65 64 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66  ed);.  switch( f
8b30: 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65  lags ){.    case
8b40: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
8b50: 45 41 44 3a 0a 20 20 20 20 63 61 73 65 20 53 51  EAD:.    case SQ
8b60: 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
8b70: 54 53 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61  TS:.      rc = a
8b80: 74 74 72 21 3d 30 78 66 66 66 66 66 66 66 66 3b  ttr!=0xffffffff;
8b90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8ba0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
8bb0: 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a  CESS_READWRITE:.
8bc0: 20 20 20 20 20 20 72 63 20 3d 20 28 61 74 74 72        rc = (attr
8bd0: 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   & FILE_ATTRIBUT
8be0: 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a  E_READONLY)==0;.
8bf0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8c00: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
8c10: 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64  assert(!"Invalid
8c20: 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22   flags argument"
8c30: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
8c40: 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 72  rc;.}.../*.** Cr
8c50: 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  eate a temporary
8c60: 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42   file name in zB
8c70: 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62  uf.  zBuf must b
8c80: 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 0a  e big enough to.
8c90: 2a 2a 20 68 6f 6c 64 20 61 74 20 70 56 66 73 2d  ** hold at pVfs-
8ca0: 3e 6d 78 50 61 74 68 6e 61 6d 65 20 63 68 61 72  >mxPathname char
8cb0: 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  acters..*/.stati
8cc0: 63 20 69 6e 74 20 77 69 6e 47 65 74 54 65 6d 70  c int winGetTemp
8cd0: 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  name(sqlite3_vfs
8ce0: 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
8cf0: 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
8d00: 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 43 68   static char zCh
8d10: 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63  ars[] =.    "abc
8d20: 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
8d30: 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42  tuvwxyz".    "AB
8d40: 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
8d50: 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30  STUVWXYZ".    "0
8d60: 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 69 6e  123456789";.  in
8d70: 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 7a  t i, j;.  char z
8d80: 54 65 6d 70 50 61 74 68 5b 4d 41 58 5f 50 41 54  TempPath[MAX_PAT
8d90: 48 2b 31 5d 3b 0a 20 20 69 66 28 20 73 71 6c 69  H+1];.  if( sqli
8da0: 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
8db0: 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ry ){.    sqlite
8dc0: 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
8dd0: 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74  ATH-30, zTempPat
8de0: 68 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  h, "%s", sqlite3
8df0: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29  _temp_directory)
8e00: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73  ;.  }else if( is
8e10: 4e 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72  NT() ){.    char
8e20: 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 57 43   *zMulti;.    WC
8e30: 48 41 52 20 7a 57 69 64 65 50 61 74 68 5b 4d 41  HAR zWidePath[MA
8e40: 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 47 65 74  X_PATH];.    Get
8e50: 54 65 6d 70 50 61 74 68 57 28 4d 41 58 5f 50 41  TempPathW(MAX_PA
8e60: 54 48 2d 33 30 2c 20 7a 57 69 64 65 50 61 74 68  TH-30, zWidePath
8e70: 29 3b 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20  );.    zMulti = 
8e80: 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 57  unicodeToUtf8(zW
8e90: 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 69 66  idePath);.    if
8ea0: 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20  ( zMulti ){.    
8eb0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
8ec0: 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20  tf(MAX_PATH-30, 
8ed0: 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c  zTempPath, "%s",
8ee0: 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20   zMulti);.      
8ef0: 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20  free(zMulti);.  
8f00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
8f10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
8f20: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  EM;.    }.  }els
8f30: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 74  e{.    char *zUt
8f40: 66 38 3b 0a 20 20 20 20 63 68 61 72 20 7a 4d 62  f8;.    char zMb
8f50: 63 73 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d  csPath[MAX_PATH]
8f60: 3b 0a 20 20 20 20 47 65 74 54 65 6d 70 50 61 74  ;.    GetTempPat
8f70: 68 41 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20  hA(MAX_PATH-30, 
8f80: 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20  zMbcsPath);.    
8f90: 7a 55 74 66 38 20 3d 20 6d 62 63 73 54 6f 55 74  zUtf8 = mbcsToUt
8fa0: 66 38 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20  f8(zMbcsPath);. 
8fb0: 20 20 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a     if( zUtf8 ){.
8fc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
8fd0: 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d  printf(MAX_PATH-
8fe0: 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22  30, zTempPath, "
8ff0: 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20  %s", zUtf8);.   
9000: 20 20 20 66 72 65 65 28 7a 55 74 66 38 29 3b 0a     free(zUtf8);.
9010: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9020: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
9030: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
9040: 20 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a    for(i=strlen(z
9050: 54 65 6d 70 50 61 74 68 29 3b 20 69 3e 30 20 26  TempPath); i>0 &
9060: 26 20 7a 54 65 6d 70 50 61 74 68 5b 69 2d 31 5d  & zTempPath[i-1]
9070: 3d 3d 27 5c 5c 27 3b 20 69 2d 2d 29 7b 7d 0a 20  =='\\'; i--){}. 
9080: 20 7a 54 65 6d 70 50 61 74 68 5b 69 5d 20 3d 20   zTempPath[i] = 
9090: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  0;.  sqlite3_snp
90a0: 72 69 6e 74 66 28 6e 42 75 66 2d 33 30 2c 20 7a  rintf(nBuf-30, z
90b0: 42 75 66 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Buf,.           
90c0: 20 20 20 20 20 20 20 20 22 25 73 5c 5c 22 53 51          "%s\\"SQ
90d0: 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
90e0: 52 45 46 49 58 2c 20 7a 54 65 6d 70 50 61 74 68  REFIX, zTempPath
90f0: 29 3b 0a 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28  );.  j = strlen(
9100: 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  zBuf);.  sqlite3
9110: 52 61 6e 64 6f 6d 6e 65 73 73 28 32 30 2c 20 26  Randomness(20, &
9120: 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28  zBuf[j]);.  for(
9130: 69 3d 30 3b 20 69 3c 32 30 3b 20 69 2b 2b 2c 20  i=0; i<20; i++, 
9140: 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a  j++){.    zBuf[j
9150: 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73  ] = (char)zChars
9160: 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  [ ((unsigned cha
9170: 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65  r)zBuf[j])%(size
9180: 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b  of(zChars)-1) ];
9190: 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d  .  }.  zBuf[j] =
91a0: 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22   0;.  OSTRACE2("
91b0: 54 45 4d 50 20 46 49 4c 45 4e 41 4d 45 3a 20 25  TEMP FILENAME: %
91c0: 73 5c 6e 22 2c 20 7a 42 75 66 29 3b 0a 20 20 72  s\n", zBuf);.  r
91d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
91e0: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20   .}../*.** Turn 
91f0: 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
9200: 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20  ame into a full 
9210: 70 61 74 68 6e 61 6d 65 2e 20 20 57 72 69 74 65  pathname.  Write
9220: 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61 74   the full.** pat
9230: 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74 5b  hname into zOut[
9240: 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20  ].  zOut[] will 
9250: 62 65 20 61 74 20 6c 65 61 73 74 20 70 56 66 73  be at least pVfs
9260: 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a 20  ->mxPathname.** 
9270: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
9280: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
9290: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20  FullPathname(.  
92a0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
92b0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
92c0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20   Pointer to vfs 
92d0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73  object */.  cons
92e0: 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76  t char *zRelativ
92f0: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73  e,        /* Pos
9300: 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69  sibly relative i
9310: 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69  nput path */.  i
9320: 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20 20  nt nFull,       
9330: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9340: 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62  Size of output b
9350: 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a  uffer in bytes *
9360: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20  /.  char *zFull 
9370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9380: 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66    /* Output buff
9390: 65 72 20 2a 2f 0a 29 7b 0a 0a 23 69 66 20 64 65  er */.){..#if de
93a0: 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
93b0: 29 0a 20 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f  ).  cygwin_conv_
93c0: 74 6f 5f 66 75 6c 6c 5f 77 69 6e 33 32 5f 70 61  to_full_win32_pa
93d0: 74 68 28 7a 52 65 6c 61 74 69 76 65 2c 20 7a 46  th(zRelative, zF
93e0: 75 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ull);.  return S
93f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
9400: 0a 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20  ..#if OS_WINCE. 
9410: 20 2f 2a 20 57 69 6e 43 45 20 68 61 73 20 6e 6f   /* WinCE has no
9420: 20 63 6f 6e 63 65 70 74 20 6f 66 20 61 20 72 65   concept of a re
9430: 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2c  lative pathname,
9440: 20 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64   or so I am told
9450: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  . */.  sqlite3_s
9460: 6e 70 72 69 6e 74 66 28 70 56 66 73 2d 3e 6d 78  nprintf(pVfs->mx
9470: 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 2c  Pathname, zFull,
9480: 20 22 25 73 22 2c 20 7a 52 65 6c 61 74 69 76 65   "%s", zRelative
9490: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
94a0: 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23  TE_OK;.#endif..#
94b0: 69 66 20 21 4f 53 5f 57 49 4e 43 45 20 26 26 20  if !OS_WINCE && 
94c0: 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49  !defined(__CYGWI
94d0: 4e 5f 5f 29 0a 20 20 69 6e 74 20 6e 42 79 74 65  N__).  int nByte
94e0: 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
94f0: 72 74 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f  rted;.  char *zO
9500: 75 74 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64  ut;.  zConverted
9510: 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69   = convertUtf8Fi
9520: 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65  lename(zRelative
9530: 29 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  );.  if( isNT() 
9540: 29 7b 0a 20 20 20 20 57 43 48 41 52 20 2a 7a 54  ){.    WCHAR *zT
9550: 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  emp;.    nByte =
9560: 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65   GetFullPathName
9570: 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65  W((WCHAR*)zConve
9580: 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 20 2b  rted, 0, 0, 0) +
9590: 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20   3;.    zTemp = 
95a0: 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69  malloc( nByte*si
95b0: 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29  zeof(zTemp[0]) )
95c0: 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d  ;.    if( zTemp=
95d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  =0 ){.      free
95e0: 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
95f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9600: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
9610: 20 20 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61     GetFullPathNa
9620: 6d 65 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e  meW((WCHAR*)zCon
9630: 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a  verted, nByte, z
9640: 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 66 72  Temp, 0);.    fr
9650: 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
9660: 20 20 20 20 7a 4f 75 74 20 3d 20 75 6e 69 63 6f      zOut = unico
9670: 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 29 3b  deToUtf8(zTemp);
9680: 0a 20 20 20 20 66 72 65 65 28 7a 54 65 6d 70 29  .    free(zTemp)
9690: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
96a0: 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20  har *zTemp;.    
96b0: 6e 42 79 74 65 20 3d 20 47 65 74 46 75 6c 6c 50  nByte = GetFullP
96c0: 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29  athNameA((char*)
96d0: 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30  zConverted, 0, 0
96e0: 2c 20 30 29 20 2b 20 33 3b 0a 20 20 20 20 7a 54  , 0) + 3;.    zT
96f0: 65 6d 70 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42  emp = malloc( nB
9700: 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70  yte*sizeof(zTemp
9710: 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
9720: 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20  zTemp==0 ){.    
9730: 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65    free(zConverte
9740: 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
9750: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9760: 20 20 20 7d 0a 20 20 20 20 47 65 74 46 75 6c 6c     }.    GetFull
9770: 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a  PathNameA((char*
9780: 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79  )zConverted, nBy
9790: 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20  te, zTemp, 0);. 
97a0: 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74     free(zConvert
97b0: 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20  ed);.    zOut = 
97c0: 6d 62 63 73 54 6f 55 74 66 38 28 7a 54 65 6d 70  mbcsToUtf8(zTemp
97d0: 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 54 65 6d  );.    free(zTem
97e0: 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4f  p);.  }.  if( zO
97f0: 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ut ){.    sqlite
9800: 33 5f 73 6e 70 72 69 6e 74 66 28 70 56 66 73 2d  3_snprintf(pVfs-
9810: 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75  >mxPathname, zFu
9820: 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b  ll, "%s", zOut);
9830: 0a 20 20 20 20 66 72 65 65 28 7a 4f 75 74 29 3b  .    free(zOut);
9840: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9850: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
9860: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9870: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e  E_NOMEM;.  }.#en
9880: 64 69 66 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  dif.}..#ifndef S
9890: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
98a0: 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20  EXTENSION./*.** 
98b0: 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f  Interfaces for o
98c0: 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20  pening a shared 
98d0: 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67  library, finding
98e0: 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a   entry points.**
98f0: 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72   within the shar
9900: 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20  ed library, and 
9910: 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72  closing the shar
9920: 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 2f  ed library..*/./
9930: 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20  *.** Interfaces 
9940: 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68  for opening a sh
9950: 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69  ared library, fi
9960: 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e  nding entry poin
9970: 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ts.** within the
9980: 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
9990: 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65   and closing the
99a0: 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e   shared library.
99b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
99c0: 2a 77 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69 74  *winDlOpen(sqlit
99d0: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f  e3_vfs *pVfs, co
99e0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
99f0: 61 6d 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68  ame){.  HANDLE h
9a00: 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
9a10: 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74  rted = convertUt
9a20: 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65  f8Filename(zFile
9a30: 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  name);.  if( zCo
9a40: 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
9a50: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
9a60: 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
9a70: 20 20 20 20 68 20 3d 20 4c 6f 61 64 4c 69 62 72      h = LoadLibr
9a80: 61 72 79 57 28 28 57 43 48 41 52 2a 29 7a 43 6f  aryW((WCHAR*)zCo
9a90: 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 65 6c 73  nverted);.  }els
9aa0: 65 7b 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a  e{.#if OS_WINCE.
9ab0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65      return 0;.#e
9ac0: 6c 73 65 0a 20 20 20 20 68 20 3d 20 4c 6f 61 64  lse.    h = Load
9ad0: 4c 69 62 72 61 72 79 41 28 28 63 68 61 72 2a 29  LibraryA((char*)
9ae0: 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e  zConverted);.#en
9af0: 64 69 66 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a  dif.  }.  free(z
9b00: 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 72 65  Converted);.  re
9b10: 74 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d  turn (void*)h;.}
9b20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
9b30: 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  DlError(sqlite3_
9b40: 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
9b50: 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f  Buf, char *zBufO
9b60: 75 74 29 7b 0a 23 69 66 20 4f 53 5f 57 49 4e 43  ut){.#if OS_WINC
9b70: 45 0a 20 20 69 6e 74 20 65 72 72 6f 72 20 3d 20  E.  int error = 
9b80: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
9b90: 20 20 69 66 28 20 65 72 72 6f 72 3e 30 78 37 46    if( error>0x7F
9ba0: 46 46 46 46 46 20 29 7b 0a 20 20 20 20 73 71 6c  FFFFF ){.    sql
9bb0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
9bc0: 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22 4f 73  uf, zBufOut, "Os
9bd0: 45 72 72 6f 72 20 30 78 25 78 22 2c 20 65 72 72  Error 0x%x", err
9be0: 6f 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  or);.  }else{.  
9bf0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
9c00: 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74  tf(nBuf, zBufOut
9c10: 2c 20 22 4f 73 45 72 72 6f 72 20 25 64 22 2c 20  , "OsError %d", 
9c20: 65 72 72 6f 72 29 3b 0a 20 20 7d 0a 23 65 6c 73  error);.  }.#els
9c30: 65 0a 20 20 46 6f 72 6d 61 74 4d 65 73 73 61 67  e.  FormatMessag
9c40: 65 41 28 0a 20 20 20 20 46 4f 52 4d 41 54 5f 4d  eA(.    FORMAT_M
9c50: 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54  ESSAGE_FROM_SYST
9c60: 45 4d 2c 0a 20 20 20 20 4e 55 4c 4c 2c 0a 20 20  EM,.    NULL,.  
9c70: 20 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29    GetLastError()
9c80: 2c 0a 20 20 20 20 30 2c 0a 20 20 20 20 7a 42 75  ,.    0,.    zBu
9c90: 66 4f 75 74 2c 0a 20 20 20 20 6e 42 75 66 2d 31  fOut,.    nBuf-1
9ca0: 2c 0a 20 20 20 20 30 0a 20 20 29 3b 0a 23 65 6e  ,.    0.  );.#en
9cb0: 64 69 66 0a 7d 0a 76 6f 69 64 20 2a 77 69 6e 44  dif.}.void *winD
9cc0: 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73  lSym(sqlite3_vfs
9cd0: 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48   *pVfs, void *pH
9ce0: 61 6e 64 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61  andle, const cha
9cf0: 72 20 2a 7a 53 79 6d 62 6f 6c 29 7b 0a 23 69 66  r *zSymbol){.#if
9d00: 20 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 20 54   OS_WINCE.  /* T
9d10: 68 65 20 47 65 74 50 72 6f 63 41 64 64 72 65 73  he GetProcAddres
9d20: 73 41 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20  sA() routine is 
9d30: 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f  only available o
9d40: 6e 20 77 69 6e 63 65 2e 20 2a 2f 0a 20 20 72 65  n wince. */.  re
9d50: 74 75 72 6e 20 47 65 74 50 72 6f 63 41 64 64 72  turn GetProcAddr
9d60: 65 73 73 41 28 28 48 41 4e 44 4c 45 29 70 48 61  essA((HANDLE)pHa
9d70: 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a  ndle, zSymbol);.
9d80: 23 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f  #else.  /* All o
9d90: 74 68 65 72 20 77 69 6e 64 6f 77 73 20 70 6c 61  ther windows pla
9da0: 74 66 6f 72 6d 73 20 65 78 70 65 63 74 20 47 65  tforms expect Ge
9db0: 74 50 72 6f 63 41 64 64 72 65 73 73 28 29 20 74  tProcAddress() t
9dc0: 6f 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41  o take.  ** an A
9dd0: 6e 73 69 20 73 74 72 69 6e 67 20 72 65 67 61 72  nsi string regar
9de0: 64 6c 65 73 73 20 6f 66 20 74 68 65 20 5f 55 4e  dless of the _UN
9df0: 49 43 4f 44 45 20 73 65 74 74 69 6e 67 20 2a 2f  ICODE setting */
9e00: 0a 20 20 72 65 74 75 72 6e 20 47 65 74 50 72 6f  .  return GetPro
9e10: 63 41 64 64 72 65 73 73 28 28 48 41 4e 44 4c 45  cAddress((HANDLE
9e20: 29 70 48 61 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f  )pHandle, zSymbo
9e30: 6c 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 76 6f 69  l);.#endif.}.voi
9e40: 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28 73 71 6c  d winDlClose(sql
9e50: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
9e60: 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a  void *pHandle){.
9e70: 20 20 46 72 65 65 4c 69 62 72 61 72 79 28 28 48    FreeLibrary((H
9e80: 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a  ANDLE)pHandle);.
9e90: 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51  }.#else /* if SQ
9ea0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
9eb0: 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69  XTENSION is defi
9ec0: 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e  ned: */.  #defin
9ed0: 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a 20  e winDlOpen  0. 
9ee0: 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 45 72   #define winDlEr
9ef0: 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20  ror 0.  #define 
9f00: 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20 23  winDlSym   0.  #
9f10: 64 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f 73  define winDlClos
9f20: 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  e 0.#endif.../*.
9f30: 2a 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20 6e  ** Write up to n
9f40: 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e  Buf bytes of ran
9f50: 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75  domness into zBu
9f60: 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
9f70: 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73   winRandomness(s
9f80: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
9f90: 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
9fa0: 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e 74 20 6e   *zBuf){.  int n
9fb0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 69 7a 65   = 0;.  if( size
9fc0: 6f 66 28 53 59 53 54 45 4d 54 49 4d 45 29 3c 3d  of(SYSTEMTIME)<=
9fd0: 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 53 59  nBuf-n ){.    SY
9fe0: 53 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20  STEMTIME x;.    
9ff0: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26 78  GetSystemTime(&x
a000: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
a010: 42 75 66 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a 65  Buf[n], &x, size
a020: 6f 66 28 78 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  of(x));.    n +=
a030: 20 73 69 7a 65 6f 66 28 78 29 3b 0a 20 20 7d 0a   sizeof(x);.  }.
a040: 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f    if( sizeof(DWO
a050: 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20  RD)<=nBuf-n ){. 
a060: 20 20 20 44 57 4f 52 44 20 70 69 64 20 3d 20 47     DWORD pid = G
a070: 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
a080: 49 64 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Id();.    memcpy
a090: 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 70 69 64 2c  (&zBuf[n], &pid,
a0a0: 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20   sizeof(pid));. 
a0b0: 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 70     n += sizeof(p
a0c0: 69 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  id);.  }.  if( s
a0d0: 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42  izeof(DWORD)<=nB
a0e0: 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52  uf-n ){.    DWOR
a0f0: 44 20 63 6e 74 20 3d 20 47 65 74 54 69 63 6b 43  D cnt = GetTickC
a100: 6f 75 6e 74 28 29 3b 0a 20 20 20 20 6d 65 6d 63  ount();.    memc
a110: 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e  py(&zBuf[n], &cn
a120: 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b  t, sizeof(cnt));
a130: 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66  .    n += sizeof
a140: 28 63 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  (cnt);.  }.  if(
a150: 20 73 69 7a 65 6f 66 28 4c 41 52 47 45 5f 49 4e   sizeof(LARGE_IN
a160: 54 45 47 45 52 29 3c 3d 6e 42 75 66 2d 6e 20 29  TEGER)<=nBuf-n )
a170: 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45  {.    LARGE_INTE
a180: 47 45 52 20 69 3b 0a 20 20 20 20 51 75 65 72 79  GER i;.    Query
a190: 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
a1a0: 65 72 28 26 69 29 3b 0a 20 20 20 20 6d 65 6d 63  er(&i);.    memc
a1b0: 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c  py(&zBuf[n], &i,
a1c0: 20 73 69 7a 65 6f 66 28 69 29 29 3b 0a 20 20 20   sizeof(i));.   
a1d0: 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 69 29 3b   n += sizeof(i);
a1e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
a1f0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70  .}.../*.** Sleep
a200: 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68   for a little wh
a210: 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ile.  Return the
a220: 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20   amount of time 
a230: 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  slept..*/.static
a240: 20 69 6e 74 20 77 69 6e 53 6c 65 65 70 28 73 71   int winSleep(sq
a250: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
a260: 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a   int microsec){.
a270: 20 20 53 6c 65 65 70 28 28 6d 69 63 72 6f 73 65    Sleep((microse
a280: 63 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20  c+999)/1000);.  
a290: 72 65 74 75 72 6e 20 28 28 6d 69 63 72 6f 73 65  return ((microse
a2a0: 63 2b 39 39 39 29 2f 31 30 30 30 29 2a 31 30 30  c+999)/1000)*100
a2b0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  0;.}../*.** The 
a2c0: 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
a2d0: 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20  le, if set to a 
a2e0: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20  non-zero value, 
a2f0: 62 65 63 6f 6d 65 73 20 74 68 65 20 72 65 73 75  becomes the resu
a300: 6c 74 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 66  lt.** returned f
a310: 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 43 75 72  rom sqlite3OsCur
a320: 72 65 6e 74 54 69 6d 65 28 29 2e 20 20 54 68 69  rentTime().  Thi
a330: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  s is used for te
a340: 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66  sting..*/.#ifdef
a350: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
a360: 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
a370: 5f 74 69 6d 65 20 3d 20 30 3b 0a 23 65 6e 64 69  _time = 0;.#endi
a380: 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  f../*.** Find th
a390: 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28  e current time (
a3a0: 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f  in Universal Coo
a3b0: 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20  rdinated Time). 
a3c0: 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75   Write the.** cu
a3d0: 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64  rrent time and d
a3e0: 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ate as a Julian 
a3f0: 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  Day number into 
a400: 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65  *prNow and.** re
a410: 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20  turn 0.  Return 
a420: 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e  1 if the time an
a430: 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65  d date cannot be
a440: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 77   found..*/.int w
a450: 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71  inCurrentTime(sq
a460: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
a470: 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b   double *prNow){
a480: 0a 20 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a  .  FILETIME ft;.
a490: 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74    /* FILETIME st
a4a0: 72 75 63 74 75 72 65 20 69 73 20 61 20 36 34 2d  ructure is a 64-
a4b0: 62 69 74 20 76 61 6c 75 65 20 72 65 70 72 65 73  bit value repres
a4c0: 65 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  enting the numbe
a4d0: 72 20 6f 66 20 0a 20 20 20 20 20 31 30 30 2d 6e  r of .     100-n
a4e0: 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76  anosecond interv
a4f0: 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72  als since Januar
a500: 79 20 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20  y 1, 1601 (= JD 
a510: 32 33 30 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a  2305813.5). .  *
a520: 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 6f 77 3b 0a  /.  double now;.
a530: 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20 53  #if OS_WINCE.  S
a540: 59 53 54 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a  YSTEMTIME time;.
a550: 20 20 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28    GetSystemTime(
a560: 26 74 69 6d 65 29 3b 0a 20 20 53 79 73 74 65 6d  &time);.  System
a570: 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 26  TimeToFileTime(&
a580: 74 69 6d 65 2c 26 66 74 29 3b 0a 23 65 6c 73 65  time,&ft);.#else
a590: 0a 20 20 47 65 74 53 79 73 74 65 6d 54 69 6d 65  .  GetSystemTime
a5a0: 41 73 46 69 6c 65 54 69 6d 65 28 20 26 66 74 20  AsFileTime( &ft 
a5b0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 6e 6f 77 20  );.#endif.  now 
a5c0: 3d 20 28 28 64 6f 75 62 6c 65 29 66 74 2e 64 77  = ((double)ft.dw
a5d0: 48 69 67 68 44 61 74 65 54 69 6d 65 29 20 2a 20  HighDateTime) * 
a5e0: 34 32 39 34 39 36 37 32 39 36 2e 30 3b 20 0a 20  4294967296.0; . 
a5f0: 20 2a 70 72 4e 6f 77 20 3d 20 28 6e 6f 77 20 2b   *prNow = (now +
a600: 20 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d   ft.dwLowDateTim
a610: 65 29 2f 38 36 34 30 30 30 30 30 30 30 30 30 2e  e)/864000000000.
a620: 30 20 2b 20 32 33 30 35 38 31 33 2e 35 3b 0a 23  0 + 2305813.5;.#
a630: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
a640: 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
a650: 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a  current_time ){.
a660: 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 73 71 6c      *prNow = sql
a670: 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
a680: 65 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30  e/86400.0 + 2440
a690: 35 38 37 2e 35 3b 0a 20 20 7d 0a 23 65 6e 64 69  587.5;.  }.#endi
a6a0: 66 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  f.  return 0;.}.
a6b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
a6c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
a6d0: 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 56 66  sqlite3DefaultVf
a6e0: 73 20 73 74 72 75 63 74 75 72 65 2e 20 20 20 57  s structure.   W
a6f0: 65 20 75 73 65 0a 2a 2a 20 61 20 66 75 6e 63 74  e use.** a funct
a700: 69 6f 6e 20 72 61 74 68 65 72 20 74 68 61 6e 20  ion rather than 
a710: 67 69 76 65 20 74 68 65 20 73 74 72 75 63 74 75  give the structu
a720: 72 65 20 67 6c 6f 62 61 6c 20 73 63 6f 70 65 20  re global scope 
a730: 62 65 63 61 75 73 65 0a 2a 2a 20 73 6f 6d 65 20  because.** some 
a740: 63 6f 6d 70 69 6c 65 72 73 20 28 4d 53 56 43 29  compilers (MSVC)
a750: 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 66 6f   do not allow fo
a760: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
a770: 6e 73 20 6f 66 0a 2a 2a 20 69 6e 69 74 69 61 6c  ns of.** initial
a780: 69 7a 65 64 20 73 74 72 75 63 74 75 72 65 73 2e  ized structures.
a790: 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 66 73 20  .*/.sqlite3_vfs 
a7a0: 2a 73 71 6c 69 74 65 33 4f 73 44 65 66 61 75 6c  *sqlite3OsDefaul
a7b0: 74 56 66 73 28 76 6f 69 64 29 7b 0a 20 20 73 74  tVfs(void){.  st
a7c0: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
a7d0: 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20   winVfs = {.    
a7e0: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
a7f0: 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
a800: 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e  /.    sizeof(win
a810: 46 69 6c 65 29 2c 20 20 20 2f 2a 20 73 7a 4f 73  File),   /* szOs
a820: 46 69 6c 65 20 2a 2f 0a 20 20 20 20 4d 41 58 5f  File */.    MAX_
a830: 50 41 54 48 2c 20 20 20 20 20 20 20 20 20 20 2f  PATH,          /
a840: 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  * mxPathname */.
a850: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
a860: 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20         /* pNext 
a870: 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22 2c 20  */.    "win32", 
a880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61            /* zNa
a890: 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  me */.    0,    
a8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a8b0: 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 0a 20  pAppData */.  . 
a8c0: 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20     winOpen,     
a8d0: 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
a8e0: 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c  /.    winDelete,
a8f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c           /* xDel
a900: 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63  ete */.    winAc
a910: 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 2f 2a  cess,         /*
a920: 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20   xAccess */.    
a930: 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 2c 20  winGetTempname, 
a940: 20 20 20 2f 2a 20 78 47 65 74 54 65 6d 70 4e 61     /* xGetTempNa
a950: 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c  me */.    winFul
a960: 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 2f 2a 20  lPathname,   /* 
a970: 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f  xFullPathname */
a980: 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20  .    winDlOpen, 
a990: 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70          /* xDlOp
a9a0: 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45  en */.    winDlE
a9b0: 72 72 6f 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  rror,        /* 
a9c0: 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  xDlError */.    
a9d0: 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20  winDlSym,       
a9e0: 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a     /* xDlSym */.
a9f0: 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20      winDlClose, 
aa00: 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f         /* xDlClo
aa10: 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e  se */.    winRan
aa20: 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 2f 2a 20  domness,     /* 
aa30: 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20  xRandomness */. 
aa40: 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20     winSleep,    
aa50: 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20        /* xSleep 
aa60: 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e  */.    winCurren
aa70: 74 54 69 6d 65 20 20 20 20 20 2f 2a 20 78 43 75  tTime     /* xCu
aa80: 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 7d  rrentTime */.  }
aa90: 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 26 77  ;.  .  return &w
aaa0: 69 6e 56 66 73 3b 0a 7d 0a 0a 23 65 6e 64 69 66  inVfs;.}..#endif
aab0: 20 2f 2a 20 4f 53 5f 57 49 4e 20 2a 2f 0a         /* OS_WIN */.