/ Hex Artifact Content
Login

Artifact e655b2a640ed0481940161ddf811ddcc16d94783:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 77 69 6e 64 6f 77 73 2e  ific to windows.
01b0: 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 6f 73 5f 77  .**.** $Id: os_w
01c0: 69 6e 2e 63 2c 76 20 31 2e 31 35 32 20 32 30 30  in.c,v 1.152 200
01d0: 39 2f 30 33 2f 33 30 20 31 33 3a 30 34 3a 31 38  9/03/30 13:04:18
01e0: 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69   drh Exp $.*/.#i
01f0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0200: 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54 45 5f  t.h".#if SQLITE_
0210: 4f 53 5f 57 49 4e 20 20 20 20 20 20 20 20 20 20  OS_WIN          
0220: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66 69 6c       /* This fil
0230: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 77 69  e is used for wi
0240: 6e 64 6f 77 73 20 6f 6e 6c 79 20 2a 2f 0a 0a 0a  ndows only */...
0250: 2f 2a 0a 2a 2a 20 41 20 4e 6f 74 65 20 41 62 6f  /*.** A Note Abo
0260: 75 74 20 4d 65 6d 6f 72 79 20 41 6c 6c 6f 63 61  ut Memory Alloca
0270: 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion:.**.** This
0280: 20 64 72 69 76 65 72 20 75 73 65 73 20 6d 61 6c   driver uses mal
0290: 6c 6f 63 28 29 2f 66 72 65 65 28 29 20 64 69 72  loc()/free() dir
02a0: 65 63 74 6c 79 20 72 61 74 68 65 72 20 74 68 61  ectly rather tha
02b0: 6e 20 67 6f 69 6e 67 20 74 68 72 6f 75 67 68 0a  n going through.
02c0: 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 2d 77 72  ** the SQLite-wr
02d0: 61 70 70 65 72 73 20 73 71 6c 69 74 65 33 5f 6d  appers sqlite3_m
02e0: 61 6c 6c 6f 63 28 29 2f 73 71 6c 69 74 65 33 5f  alloc()/sqlite3_
02f0: 66 72 65 65 28 29 2e 20 20 54 68 6f 73 65 20 77  free().  Those w
0300: 72 61 70 70 65 72 73 0a 2a 2a 20 61 72 65 20 64  rappers.** are d
0310: 65 73 69 67 6e 65 64 20 66 6f 72 20 75 73 65 20  esigned for use 
0320: 6f 6e 20 65 6d 62 65 64 64 65 64 20 73 79 73 74  on embedded syst
0330: 65 6d 73 20 77 68 65 72 65 20 6d 65 6d 6f 72 79  ems where memory
0340: 20 69 73 20 73 63 61 72 63 65 20 61 6e 64 0a 2a   is scarce and.*
0350: 2a 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  * malloc failure
0360: 73 20 68 61 70 70 65 6e 20 66 72 65 71 75 65 6e  s happen frequen
0370: 74 6c 79 2e 20 20 57 69 6e 33 32 20 64 6f 65 73  tly.  Win32 does
0380: 20 6e 6f 74 20 74 79 70 69 63 61 6c 6c 79 20 72   not typically r
0390: 75 6e 20 6f 6e 0a 2a 2a 20 65 6d 62 65 64 64 65  un on.** embedde
03a0: 64 20 73 79 73 74 65 6d 73 2c 20 61 6e 64 20 77  d systems, and w
03b0: 68 65 6e 20 69 74 20 64 6f 65 73 20 74 68 65 20  hen it does the 
03c0: 64 65 76 65 6c 6f 70 65 72 73 20 6e 6f 72 6d 61  developers norma
03d0: 6c 6c 79 20 68 61 76 65 20 62 69 67 67 65 72 0a  lly have bigger.
03e0: 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 74 6f 20 77  ** problems to w
03f0: 6f 72 72 79 20 61 62 6f 75 74 20 74 68 61 6e 20  orry about than 
0400: 72 75 6e 6e 69 6e 67 20 6f 75 74 20 6f 66 20 6d  running out of m
0410: 65 6d 6f 72 79 2e 20 20 53 6f 20 74 68 65 72 65  emory.  So there
0420: 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 63 6f 6d   is not.** a com
0430: 70 65 6c 6c 69 6e 67 20 6e 65 65 64 20 74 6f 20  pelling need to 
0440: 75 73 65 20 74 68 65 20 77 72 61 70 70 65 72 73  use the wrappers
0450: 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 74 68 65 72  ..**.** But ther
0460: 65 20 69 73 20 61 20 67 6f 6f 64 20 72 65 61 73  e is a good reas
0470: 6f 6e 20 74 6f 20 6e 6f 74 20 75 73 65 20 74 68  on to not use th
0480: 65 20 77 72 61 70 70 65 72 73 2e 20 20 49 66 20  e wrappers.  If 
0490: 77 65 20 75 73 65 20 74 68 65 0a 2a 2a 20 77 72  we use the.** wr
04a0: 61 70 70 65 72 73 20 74 68 65 6e 20 77 65 20 77  appers then we w
04b0: 69 6c 6c 20 67 65 74 20 73 69 6d 75 6c 61 74 65  ill get simulate
04c0: 64 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  d malloc() failu
04d0: 72 65 73 20 77 69 74 68 69 6e 20 74 68 69 73 0a  res within this.
04e0: 2a 2a 20 64 72 69 76 65 72 2e 20 20 41 6e 64 20  ** driver.  And 
04f0: 74 68 61 74 20 63 61 75 73 65 73 20 61 6c 6c 20  that causes all 
0500: 6b 69 6e 64 73 20 6f 66 20 70 72 6f 62 6c 65 6d  kinds of problem
0510: 73 20 66 6f 72 20 6f 75 72 20 74 65 73 74 73 2e  s for our tests.
0520: 20 20 57 65 0a 2a 2a 20 63 6f 75 6c 64 20 65 6e    We.** could en
0530: 68 61 6e 63 65 20 53 51 4c 69 74 65 20 74 6f 20  hance SQLite to 
0540: 64 65 61 6c 20 77 69 74 68 20 73 69 6d 75 6c 61  deal with simula
0550: 74 65 64 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  ted malloc failu
0560: 72 65 73 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68  res within.** th
0570: 65 20 4f 53 20 64 72 69 76 65 72 2c 20 62 75 74  e OS driver, but
0580: 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64 65 61   the code to dea
0590: 6c 20 77 69 74 68 20 74 68 6f 73 65 20 66 61 69  l with those fai
05a0: 6c 75 72 65 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a  lure would not.*
05b0: 2a 20 62 65 20 65 78 65 72 63 69 73 65 64 20 6f  * be exercised o
05c0: 6e 20 4c 69 6e 75 78 20 28 77 68 69 63 68 20 64  n Linux (which d
05d0: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
05e0: 6d 61 6c 6c 6f 63 28 29 20 69 6e 20 74 68 65 20  malloc() in the 
05f0: 64 72 69 76 65 72 29 0a 2a 2a 20 61 6e 64 20 73  driver).** and s
0600: 6f 20 77 65 20 77 6f 75 6c 64 20 68 61 76 65 20  o we would have 
0610: 64 69 66 66 69 63 75 6c 74 79 20 77 72 69 74 69  difficulty writi
0620: 6e 67 20 63 6f 76 65 72 61 67 65 20 74 65 73 74  ng coverage test
0630: 73 20 66 6f 72 20 74 68 61 74 0a 2a 2a 20 63 6f  s for that.** co
0640: 64 65 2e 20 20 42 65 74 74 65 72 20 74 6f 20 6c  de.  Better to l
0650: 65 61 76 65 20 74 68 65 20 63 6f 64 65 20 6f 75  eave the code ou
0660: 74 2c 20 77 65 20 74 68 69 6e 6b 2e 0a 2a 2a 0a  t, we think..**.
0670: 2a 2a 20 54 68 65 20 70 6f 69 6e 74 20 6f 66 20  ** The point of 
0680: 74 68 69 73 20 64 69 73 63 75 73 73 69 6f 6e 20  this discussion 
0690: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 20  is as follows:  
06a0: 57 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20  When creating a 
06b0: 6e 65 77 0a 2a 2a 20 4f 53 20 6c 61 79 65 72 20  new.** OS layer 
06c0: 66 6f 72 20 61 6e 20 65 6d 62 65 64 64 65 64 20  for an embedded 
06d0: 73 79 73 74 65 6d 2c 20 69 66 20 79 6f 75 20 75  system, if you u
06e0: 73 65 20 74 68 69 73 20 66 69 6c 65 20 61 73 20  se this file as 
06f0: 61 6e 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61  an example,.** a
0700: 76 6f 69 64 20 74 68 65 20 75 73 65 20 6f 66 20  void the use of 
0710: 6d 61 6c 6c 6f 63 28 29 2f 66 72 65 65 28 29 2e  malloc()/free().
0720: 20 20 54 68 6f 73 65 20 72 6f 75 74 69 6e 65 73    Those routines
0730: 20 77 6f 72 6b 20 6f 6b 20 6f 6e 20 77 69 6e 64   work ok on wind
0740: 6f 77 73 0a 2a 2a 20 64 65 73 6b 74 6f 70 73 20  ows.** desktops 
0750: 62 75 74 20 6e 6f 74 20 73 6f 20 77 65 6c 6c 20  but not so well 
0760: 69 6e 20 65 6d 62 65 64 64 65 64 20 73 79 73 74  in embedded syst
0770: 65 6d 73 2e 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 64  ems..*/..#includ
0780: 65 20 3c 77 69 6e 62 61 73 65 2e 68 3e 0a 0a 23  e <winbase.h>..#
0790: 69 66 64 65 66 20 5f 5f 43 59 47 57 49 4e 5f 5f  ifdef __CYGWIN__
07a0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  .# include <sys/
07b0: 63 79 67 77 69 6e 2e 68 3e 0a 23 65 6e 64 69 66  cygwin.h>.#endif
07c0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 75  ../*.** Macros u
07d0: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
07e0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
07f0: 74 6f 20 75 73 65 20 74 68 72 65 61 64 73 2e 0a  to use threads..
0800: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 54  */.#if defined(T
0810: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 54 48  HREADSAFE) && TH
0820: 52 45 41 44 53 41 46 45 0a 23 20 64 65 66 69 6e  READSAFE.# defin
0830: 65 20 53 51 4c 49 54 45 5f 57 33 32 5f 54 48 52  e SQLITE_W32_THR
0840: 45 41 44 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f  EADS 1.#endif../
0850: 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64  *.** Include cod
0860: 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e  e that is common
0870: 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66   to all os_*.c f
0880: 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  iles.*/.#include
0890: 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a   "os_common.h"..
08a0: 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 6d 69 63 72 6f  /*.** Some micro
08b0: 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c  soft compilers l
08c0: 61 63 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74  ack this definit
08d0: 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
08e0: 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
08f0: 52 49 42 55 54 45 53 0a 23 20 64 65 66 69 6e 65  RIBUTES.# define
0900: 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54   INVALID_FILE_AT
0910: 54 52 49 42 55 54 45 53 20 28 28 44 57 4f 52 44  TRIBUTES ((DWORD
0920: 29 2d 31 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a  )-1) .#endif../*
0930: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66  .** Determine if
0940: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
0950: 77 69 74 68 20 57 69 6e 64 6f 77 73 43 45 20 2d  with WindowsCE -
0960: 20 77 68 69 63 68 20 68 61 73 20 61 20 6d 75 63   which has a muc
0970: 68 0a 2a 2a 20 72 65 64 75 63 65 64 20 41 50 49  h.** reduced API
0980: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
0990: 4f 53 5f 57 49 4e 43 45 0a 23 20 64 65 66 69 6e  OS_WINCE.# defin
09a0: 65 20 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  e AreFileApisANS
09b0: 49 28 29 20 31 0a 23 20 64 65 66 69 6e 65 20 47  I() 1.# define G
09c0: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57  etDiskFreeSpaceW
09d0: 28 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  () 0.#endif../*.
09e0: 2a 2a 20 57 69 6e 43 45 20 6c 61 63 6b 73 20 6e  ** WinCE lacks n
09f0: 61 74 69 76 65 20 73 75 70 70 6f 72 74 20 66 6f  ative support fo
0a00: 72 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73  r file locking s
0a10: 6f 20 77 65 20 68 61 76 65 20 74 6f 20 66 61 6b  o we have to fak
0a20: 65 20 69 74 0a 2a 2a 20 77 69 74 68 20 73 6f 6d  e it.** with som
0a30: 65 20 63 6f 64 65 20 6f 66 20 6f 75 72 20 6f 77  e code of our ow
0a40: 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  n..*/.#if SQLITE
0a50: 5f 4f 53 5f 57 49 4e 43 45 0a 74 79 70 65 64 65  _OS_WINCE.typede
0a60: 66 20 73 74 72 75 63 74 20 77 69 6e 63 65 4c 6f  f struct winceLo
0a70: 63 6b 20 7b 0a 20 20 69 6e 74 20 6e 52 65 61 64  ck {.  int nRead
0a80: 65 72 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  ers;       /* Nu
0a90: 6d 62 65 72 20 6f 66 20 72 65 61 64 65 72 20 6c  mber of reader l
0aa0: 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 2a 2f  ocks obtained */
0ab0: 0a 20 20 42 4f 4f 4c 20 62 50 65 6e 64 69 6e 67  .  BOOL bPending
0ac0: 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61  ;      /* Indica
0ad0: 74 65 73 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f  tes a pending lo
0ae0: 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61  ck has been obta
0af0: 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  ined */.  BOOL b
0b00: 52 65 73 65 72 76 65 64 3b 20 20 20 20 20 2f 2a  Reserved;     /*
0b10: 20 49 6e 64 69 63 61 74 65 73 20 61 20 72 65 73   Indicates a res
0b20: 65 72 76 65 64 20 6c 6f 63 6b 20 68 61 73 20 62  erved lock has b
0b30: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a  een obtained */.
0b40: 20 20 42 4f 4f 4c 20 62 45 78 63 6c 75 73 69 76    BOOL bExclusiv
0b50: 65 3b 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74  e;    /* Indicat
0b60: 65 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  es an exclusive 
0b70: 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62  lock has been ob
0b80: 74 61 69 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e 63  tained */.} winc
0b90: 65 4c 6f 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a 2f  eLock;.#endif../
0ba0: 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 46 69 6c 65  *.** The winFile
0bb0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 20   structure is a 
0bc0: 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69  subclass of sqli
0bd0: 74 65 33 5f 66 69 6c 65 2a 20 73 70 65 63 69 66  te3_file* specif
0be0: 69 63 20 74 6f 20 74 68 65 20 77 69 6e 33 32 0a  ic to the win32.
0bf0: 2a 2a 20 70 6f 72 74 61 62 69 6c 69 74 79 20 6c  ** portability l
0c00: 61 79 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ayer..*/.typedef
0c10: 20 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20   struct winFile 
0c20: 77 69 6e 46 69 6c 65 3b 0a 73 74 72 75 63 74 20  winFile;.struct 
0c30: 77 69 6e 46 69 6c 65 20 7b 0a 20 20 63 6f 6e 73  winFile {.  cons
0c40: 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
0c50: 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 3b 2f 2a  hods *pMethod;/*
0c60: 20 4d 75 73 74 20 62 65 20 66 69 72 73 74 20 2a   Must be first *
0c70: 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20 20 20  /.  HANDLE h;   
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
0c90: 61 6e 64 6c 65 20 66 6f 72 20 61 63 63 65 73 73  andle for access
0ca0: 69 6e 67 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a  ing the file */.
0cb0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
0cc0: 6c 6f 63 6b 74 79 70 65 3b 20 2f 2a 20 54 79 70  locktype; /* Typ
0cd0: 65 20 6f 66 20 6c 6f 63 6b 20 63 75 72 72 65 6e  e of lock curren
0ce0: 74 6c 79 20 68 65 6c 64 20 6f 6e 20 74 68 69 73  tly held on this
0cf0: 20 66 69 6c 65 20 2a 2f 0a 20 20 73 68 6f 72 74   file */.  short
0d00: 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 3b   sharedLockByte;
0d10: 20 20 20 2f 2a 20 52 61 6e 64 6f 6d 6c 79 20 63     /* Randomly c
0d20: 68 6f 73 65 6e 20 62 79 74 65 20 75 73 65 64 20  hosen byte used 
0d30: 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  as a shared lock
0d40: 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   */.  DWORD last
0d50: 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 2f 2a  Errno;        /*
0d60: 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72 72   The Windows err
0d70: 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74  no from the last
0d80: 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20   I/O error */.  
0d90: 44 57 4f 52 44 20 73 65 63 74 6f 72 53 69 7a 65  DWORD sectorSize
0da0: 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f  ;       /* Secto
0db0: 72 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 65  r size of the de
0dc0: 76 69 63 65 20 66 69 6c 65 20 69 73 20 6f 6e 20  vice file is on 
0dd0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
0de0: 5f 57 49 4e 43 45 0a 20 20 57 43 48 41 52 20 2a  _WINCE.  WCHAR *
0df0: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20  zDeleteOnClose; 
0e00: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
0e10: 20 74 6f 20 64 65 6c 65 74 65 20 77 68 65 6e 20   to delete when 
0e20: 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e  closing */.  HAN
0e30: 44 4c 45 20 68 4d 75 74 65 78 3b 20 20 20 20 20  DLE hMutex;     
0e40: 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 75 73       /* Mutex us
0e50: 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63  ed to control ac
0e60: 63 65 73 73 20 74 6f 20 73 68 61 72 65 64 20 6c  cess to shared l
0e70: 6f 63 6b 20 2a 2f 20 20 0a 20 20 48 41 4e 44 4c  ock */  .  HANDL
0e80: 45 20 68 53 68 61 72 65 64 3b 20 20 20 20 20 20  E hShared;      
0e90: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
0ea0: 6f 72 79 20 73 65 67 6d 65 6e 74 20 75 73 65 64  ory segment used
0eb0: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a   for locking */.
0ec0: 20 20 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61    winceLock loca
0ed0: 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63  l;        /* Loc
0ee0: 6b 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74  ks obtained by t
0ef0: 68 69 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  his instance of 
0f00: 77 69 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e  winFile */.  win
0f10: 63 65 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20  ceLock *shared; 
0f20: 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73       /* Global s
0f30: 68 61 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72  hared lock memor
0f40: 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 20  y for the file  
0f50: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
0f60: 0a 2a 2a 20 46 6f 72 77 61 72 64 20 70 72 6f 74  .** Forward prot
0f70: 6f 74 79 70 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  otypes..*/.stati
0f80: 63 20 69 6e 74 20 67 65 74 53 65 63 74 6f 72 53  c int getSectorS
0f90: 69 7a 65 28 0a 20 20 20 20 73 71 6c 69 74 65 33  ize(.    sqlite3
0fa0: 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 20 20  _vfs *pVfs,.    
0fb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c  const char *zRel
0fc0: 61 74 69 76 65 20 20 20 20 20 2f 2a 20 55 54 46  ative     /* UTF
0fd0: 2d 38 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a  -8 file name */.
0fe0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  );../*.** The fo
0ff0: 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
1000: 20 69 73 20 28 6e 6f 72 6d 61 6c 6c 79 29 20 73   is (normally) s
1010: 65 74 20 6f 6e 63 65 20 61 6e 64 20 6e 65 76 65  et once and neve
1020: 72 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 65  r changes.** the
1030: 72 65 61 66 74 65 72 2e 20 20 49 74 20 72 65 63  reafter.  It rec
1040: 6f 72 64 73 20 77 68 65 74 68 65 72 20 74 68 65  ords whether the
1050: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
1060: 6d 20 69 73 20 57 69 6e 39 35 0a 2a 2a 20 6f 72  m is Win95.** or
1070: 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a   WinNT..**.** 0:
1080: 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73     Operating sys
1090: 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20  tem unknown..** 
10a0: 31 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73  1:   Operating s
10b0: 79 73 74 65 6d 20 69 73 20 57 69 6e 39 35 2e 0a  ystem is Win95..
10c0: 2a 2a 20 32 3a 20 20 20 4f 70 65 72 61 74 69 6e  ** 2:   Operatin
10d0: 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 4e  g system is WinN
10e0: 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65  T..**.** In orde
10f0: 72 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20  r to facilitate 
1100: 74 65 73 74 69 6e 67 20 6f 6e 20 61 20 57 69 6e  testing on a Win
1110: 4e 54 20 73 79 73 74 65 6d 2c 20 74 68 65 20 74  NT system, the t
1120: 65 73 74 20 66 69 78 74 75 72 65 0a 2a 2a 20 63  est fixture.** c
1130: 61 6e 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20  an manually set 
1140: 74 68 69 73 20 76 61 6c 75 65 20 74 6f 20 31 20  this value to 1 
1150: 74 6f 20 65 6d 75 6c 61 74 65 20 57 69 6e 39 38  to emulate Win98
1160: 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69   behavior..*/.#i
1170: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1180: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
1190: 74 79 70 65 20 3d 20 30 3b 0a 23 65 6c 73 65 0a  type = 0;.#else.
11a0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
11b0: 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a  e3_os_type = 0;.
11c0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
11d0: 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a  turn true (non-z
11e0: 65 72 6f 29 20 69 66 20 77 65 20 61 72 65 20 72  ero) if we are r
11f0: 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 69 6e  unning under Win
1200: 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58 50  NT, Win2K, WinXP
1210: 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20 20  ,.** or WinCE.  
1220: 52 65 74 75 72 6e 20 66 61 6c 73 65 20 28 7a 65  Return false (ze
1230: 72 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c 20 57  ro) for Win95, W
1240: 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a  in98, or WinME..
1250: 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 61 6e  **.** Here is an
1260: 20 69 6e 74 65 72 65 73 74 69 6e 67 20 6f 62 73   interesting obs
1270: 65 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35  ervation:  Win95
1280: 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e  , Win98, and Win
1290: 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c  ME lack.** the L
12a0: 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e  ockFileEx() API.
12b0: 20 20 42 75 74 20 77 65 20 63 61 6e 20 73 74 69    But we can sti
12c0: 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69  ll statically li
12d0: 6e 6b 20 61 67 61 69 6e 73 74 20 74 68 61 74 0a  nk against that.
12e0: 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67 20 61  ** API as long a
12f0: 73 20 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20  s we don't call 
1300: 69 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20  it when running 
1310: 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20  Win95/98/ME.  A 
1320: 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20  call to.** this 
1330: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
1340: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
1350: 74 68 65 20 68 6f 73 74 20 69 73 20 57 69 6e 39  the host is Win9
1360: 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69  5/98/ME or.** Wi
1370: 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61  nNT/2K/XP so tha
1380: 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77  t we will know w
1390: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 77 65  hether or not we
13a0: 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c   can safely call
13b0: 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  .** the LockFile
13c0: 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 23 69 66  Ex() API..*/.#if
13d0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
13e0: 0a 23 20 64 65 66 69 6e 65 20 69 73 4e 54 28 29  .# define isNT()
13f0: 20 20 28 31 29 0a 23 65 6c 73 65 0a 20 20 73 74    (1).#else.  st
1400: 61 74 69 63 20 69 6e 74 20 69 73 4e 54 28 76 6f  atic int isNT(vo
1410: 69 64 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  id){.    if( sql
1420: 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 30 20  ite3_os_type==0 
1430: 29 7b 0a 20 20 20 20 20 20 4f 53 56 45 52 53 49  ){.      OSVERSI
1440: 4f 4e 49 4e 46 4f 20 73 49 6e 66 6f 3b 0a 20 20  ONINFO sInfo;.  
1450: 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65      sInfo.dwOSVe
1460: 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20  rsionInfoSize = 
1470: 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20  sizeof(sInfo);. 
1480: 20 20 20 20 20 47 65 74 56 65 72 73 69 6f 6e 45       GetVersionE
1490: 78 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 20  x(&sInfo);.     
14a0: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
14b0: 20 3d 20 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66   = sInfo.dwPlatf
14c0: 6f 72 6d 49 64 3d 3d 56 45 52 5f 50 4c 41 54 46  ormId==VER_PLATF
14d0: 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f 20 32  ORM_WIN32_NT ? 2
14e0: 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   : 1;.    }.    
14f0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6f  return sqlite3_o
1500: 73 5f 74 79 70 65 3d 3d 32 3b 0a 20 20 7d 0a 23  s_type==2;.  }.#
1510: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1520: 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a  OS_WINCE */../*.
1530: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46  ** Convert a UTF
1540: 2d 38 20 73 74 72 69 6e 67 20 74 6f 20 6d 69 63  -8 string to mic
1550: 72 6f 73 6f 66 74 20 75 6e 69 63 6f 64 65 20 28  rosoft unicode (
1560: 55 54 46 2d 31 36 3f 29 2e 20 0a 2a 2a 0a 2a 2a  UTF-16?). .**.**
1570: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
1580: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
1590: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
15a0: 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73  rom malloc..*/.s
15b0: 74 61 74 69 63 20 57 43 48 41 52 20 2a 75 74 66  tatic WCHAR *utf
15c0: 38 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74  8ToUnicode(const
15d0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
15e0: 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a  ){.  int nChar;.
15f0: 20 20 57 43 48 41 52 20 2a 7a 57 69 64 65 46 69    WCHAR *zWideFi
1600: 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72  lename;..  nChar
1610: 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   = MultiByteToWi
1620: 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20  deChar(CP_UTF8, 
1630: 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  0, zFilename, -1
1640: 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 7a 57  , NULL, 0);.  zW
1650: 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 6d 61  ideFilename = ma
1660: 6c 6c 6f 63 28 20 6e 43 68 61 72 2a 73 69 7a 65  lloc( nChar*size
1670: 6f 66 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  of(zWideFilename
1680: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 57  [0]) );.  if( zW
1690: 69 64 65 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  ideFilename==0 )
16a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
16b0: 20 20 7d 0a 20 20 6e 43 68 61 72 20 3d 20 4d 75    }.  nChar = Mu
16c0: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
16d0: 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46  r(CP_UTF8, 0, zF
16e0: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69  ilename, -1, zWi
16f0: 64 65 46 69 6c 65 6e 61 6d 65 2c 20 6e 43 68 61  deFilename, nCha
1700: 72 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d  r);.  if( nChar=
1710: 3d 30 20 29 7b 0a 20 20 20 20 66 72 65 65 28 7a  =0 ){.    free(z
1720: 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  WideFilename);. 
1730: 20 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65     zWideFilename
1740: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1750: 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  rn zWideFilename
1760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
1770: 72 74 20 6d 69 63 72 6f 73 6f 66 74 20 75 6e 69  rt microsoft uni
1780: 63 6f 64 65 20 74 6f 20 55 54 46 2d 38 2e 20 20  code to UTF-8.  
1790: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
17a0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
17b0: 67 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64  g is.** obtained
17c0: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a   from malloc()..
17d0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
17e0: 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 63 6f  unicodeToUtf8(co
17f0: 6e 73 74 20 57 43 48 41 52 20 2a 7a 57 69 64 65  nst WCHAR *zWide
1800: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74  Filename){.  int
1810: 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a   nByte;.  char *
1820: 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42  zFilename;..  nB
1830: 79 74 65 20 3d 20 57 69 64 65 43 68 61 72 54 6f  yte = WideCharTo
1840: 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46  MultiByte(CP_UTF
1850: 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e  8, 0, zWideFilen
1860: 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30  ame, -1, 0, 0, 0
1870: 2c 20 30 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d  , 0);.  zFilenam
1880: 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74  e = malloc( nByt
1890: 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65  e );.  if( zFile
18a0: 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  name==0 ){.    r
18b0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
18c0: 42 79 74 65 20 3d 20 57 69 64 65 43 68 61 72 54  Byte = WideCharT
18d0: 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54  oMultiByte(CP_UT
18e0: 46 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65  F8, 0, zWideFile
18f0: 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e  name, -1, zFilen
1900: 61 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20  ame, nByte,.    
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b            0, 0);
1930: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20  .  if( nByte == 
1940: 30 20 29 7b 0a 20 20 20 20 66 72 65 65 28 7a 46  0 ){.    free(zF
1950: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46  ilename);.    zF
1960: 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ilename = 0;.  }
1970: 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e  .  return zFilen
1980: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ame;.}../*.** Co
1990: 6e 76 65 72 74 20 61 6e 20 61 6e 73 69 20 73 74  nvert an ansi st
19a0: 72 69 6e 67 20 74 6f 20 6d 69 63 72 6f 73 6f 66  ring to microsof
19b0: 74 20 75 6e 69 63 6f 64 65 2c 20 62 61 73 65 64  t unicode, based
19c0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   on the.** curre
19d0: 6e 74 20 63 6f 64 65 70 61 67 65 20 73 65 74 74  nt codepage sett
19e0: 69 6e 67 73 20 66 6f 72 20 66 69 6c 65 20 61 70  ings for file ap
19f0: 69 73 2e 0a 2a 2a 20 0a 2a 2a 20 53 70 61 63 65  is..** .** Space
1a00: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
1a10: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
1a20: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d  obtained.** from
1a30: 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74   malloc..*/.stat
1a40: 69 63 20 57 43 48 41 52 20 2a 6d 62 63 73 54 6f  ic WCHAR *mbcsTo
1a50: 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68  Unicode(const ch
1a60: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
1a70: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 57    int nByte;.  W
1a80: 43 48 41 52 20 2a 7a 4d 62 63 73 46 69 6c 65 6e  CHAR *zMbcsFilen
1a90: 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70  ame;.  int codep
1aa0: 61 67 65 20 3d 20 41 72 65 46 69 6c 65 41 70 69  age = AreFileApi
1ab0: 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50  sANSI() ? CP_ACP
1ac0: 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20   : CP_OEMCP;..  
1ad0: 6e 42 79 74 65 20 3d 20 4d 75 6c 74 69 42 79 74  nByte = MultiByt
1ae0: 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65  eToWideChar(code
1af0: 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61  page, 0, zFilena
1b00: 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 30 29 2a  me, -1, NULL,0)*
1b10: 73 69 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a 20  sizeof(WCHAR);. 
1b20: 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d   zMbcsFilename =
1b30: 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73   malloc( nByte*s
1b40: 69 7a 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e  izeof(zMbcsFilen
1b50: 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ame[0]) );.  if(
1b60: 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d   zMbcsFilename==
1b70: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1b80: 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  0;.  }.  nByte =
1b90: 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65   MultiByteToWide
1ba0: 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30  Char(codepage, 0
1bb0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
1bc0: 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c 20   zMbcsFilename, 
1bd0: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e 42  nByte);.  if( nB
1be0: 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 72  yte==0 ){.    fr
1bf0: 65 65 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  ee(zMbcsFilename
1c00: 29 3b 0a 20 20 20 20 7a 4d 62 63 73 46 69 6c 65  );.    zMbcsFile
1c10: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  name = 0;.  }.  
1c20: 72 65 74 75 72 6e 20 7a 4d 62 63 73 46 69 6c 65  return zMbcsFile
1c30: 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  name;.}../*.** C
1c40: 6f 6e 76 65 72 74 20 6d 69 63 72 6f 73 6f 66 74  onvert microsoft
1c50: 20 75 6e 69 63 6f 64 65 20 74 6f 20 6d 75 6c 74   unicode to mult
1c60: 69 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20  ibyte character 
1c70: 73 74 72 69 6e 67 2c 20 62 61 73 65 64 20 6f 6e  string, based on
1c80: 20 74 68 65 0a 2a 2a 20 75 73 65 72 27 73 20 41   the.** user's A
1c90: 6e 73 69 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a  nsi codepage..**
1ca0: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
1cb0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
1cc0: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
1cd0: 64 20 66 72 6f 6d 0a 2a 2a 20 6d 61 6c 6c 6f 63  d from.** malloc
1ce0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ()..*/.static ch
1cf0: 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 4d 62 63  ar *unicodeToMbc
1d00: 73 28 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 7a  s(const WCHAR *z
1d10: 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  WideFilename){. 
1d20: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68   int nByte;.  ch
1d30: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  ar *zFilename;. 
1d40: 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20   int codepage = 
1d50: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28  AreFileApisANSI(
1d60: 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f  ) ? CP_ACP : CP_
1d70: 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20  OEMCP;..  nByte 
1d80: 3d 20 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  = WideCharToMult
1d90: 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20  iByte(codepage, 
1da0: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
1db0: 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  , -1, 0, 0, 0, 0
1dc0: 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  );.  zFilename =
1dd0: 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29   malloc( nByte )
1de0: 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  ;.  if( zFilenam
1df0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
1e00: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  rn 0;.  }.  nByt
1e10: 65 20 3d 20 57 69 64 65 43 68 61 72 54 6f 4d 75  e = WideCharToMu
1e20: 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65  ltiByte(codepage
1e30: 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61  , 0, zWideFilena
1e40: 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d  me, -1, zFilenam
1e50: 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20  e, nByte,.      
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20          0, 0);. 
1e80: 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20   if( nByte == 0 
1e90: 29 7b 0a 20 20 20 20 66 72 65 65 28 7a 46 69 6c  ){.    free(zFil
1ea0: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c  ename);.    zFil
1eb0: 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  ename = 0;.  }. 
1ec0: 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d   return zFilenam
1ed0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  e;.}../*.** Conv
1ee0: 65 72 74 20 6d 75 6c 74 69 62 79 74 65 20 63 68  ert multibyte ch
1ef0: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 20 74  aracter string t
1f00: 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20  o UTF-8.  Space 
1f10: 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72  to hold the.** r
1f20: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
1f30: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
1f40: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61  malloc()..*/.cha
1f50: 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  r *sqlite3_win32
1f60: 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f  _mbcs_to_utf8(co
1f70: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1f80: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46  ame){.  char *zF
1f90: 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 20 20 57  ilenameUtf8;.  W
1fa0: 43 48 41 52 20 2a 7a 54 6d 70 57 69 64 65 3b 0a  CHAR *zTmpWide;.
1fb0: 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 6d 62  .  zTmpWide = mb
1fc0: 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c  csToUnicode(zFil
1fd0: 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54  ename);.  if( zT
1fe0: 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20  mpWide==0 ){.   
1ff0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
2000: 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 20 3d   zFilenameUtf8 =
2010: 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a   unicodeToUtf8(z
2020: 54 6d 70 57 69 64 65 29 3b 0a 20 20 66 72 65 65  TmpWide);.  free
2030: 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65  (zTmpWide);.  re
2040: 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74  turn zFilenameUt
2050: 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  f8;.}../*.** Con
2060: 76 65 72 74 20 55 54 46 2d 38 20 74 6f 20 6d 75  vert UTF-8 to mu
2070: 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74 65  ltibyte characte
2080: 72 20 73 74 72 69 6e 67 2e 20 20 53 70 61 63 65  r string.  Space
2090: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a   to hold the .**
20a0: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
20b0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
20c0: 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73  m malloc()..*/.s
20d0: 74 61 74 69 63 20 63 68 61 72 20 2a 75 74 66 38  tatic char *utf8
20e0: 54 6f 4d 62 63 73 28 63 6f 6e 73 74 20 63 68 61  ToMbcs(const cha
20f0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
2100: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2110: 4d 62 63 73 3b 0a 20 20 57 43 48 41 52 20 2a 7a  Mbcs;.  WCHAR *z
2120: 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70  TmpWide;..  zTmp
2130: 57 69 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69  Wide = utf8ToUni
2140: 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  code(zFilename);
2150: 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d  .  if( zTmpWide=
2160: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2170: 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e   0;.  }.  zFilen
2180: 61 6d 65 4d 62 63 73 20 3d 20 75 6e 69 63 6f 64  ameMbcs = unicod
2190: 65 54 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64 65  eToMbcs(zTmpWide
21a0: 29 3b 0a 20 20 66 72 65 65 28 7a 54 6d 70 57 69  );.  free(zTmpWi
21b0: 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46  de);.  return zF
21c0: 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a  ilenameMbcs;.}..
21d0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
21e0: 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  NCE./***********
21f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
2230: 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 63  * This section c
2240: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72  ontains code for
2250: 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a   WinCE only..*/.
2260: 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73 43 45 20  /*.** WindowsCE 
2270: 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20  does not have a 
2280: 6c 6f 63 61 6c 74 69 6d 65 28 29 20 66 75 6e 63  localtime() func
2290: 74 69 6f 6e 2e 20 20 53 6f 20 63 72 65 61 74 65  tion.  So create
22a0: 20 61 0a 2a 2a 20 73 75 62 73 74 69 74 75 74 65   a.** substitute
22b0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 74  ..*/.#include <t
22c0: 69 6d 65 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d  ime.h>.struct tm
22d0: 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74   *__cdecl localt
22e0: 69 6d 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74  ime(const time_t
22f0: 20 2a 74 29 0a 7b 0a 20 20 73 74 61 74 69 63 20   *t).{.  static 
2300: 73 74 72 75 63 74 20 74 6d 20 79 3b 0a 20 20 46  struct tm y;.  F
2310: 49 4c 45 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d  ILETIME uTm, lTm
2320: 3b 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20 70  ;.  SYSTEMTIME p
2330: 54 6d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  Tm;.  sqlite3_in
2340: 74 36 34 20 74 36 34 3b 0a 20 20 74 36 34 20 3d  t64 t64;.  t64 =
2350: 20 2a 74 3b 0a 20 20 74 36 34 20 3d 20 28 74 36   *t;.  t64 = (t6
2360: 34 20 2b 20 31 31 36 34 34 34 37 33 36 30 30 29  4 + 11644473600)
2370: 2a 31 30 30 30 30 30 30 30 3b 0a 20 20 75 54 6d  *10000000;.  uTm
2380: 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d  .dwLowDateTime =
2390: 20 74 36 34 20 26 20 30 78 46 46 46 46 46 46 46   t64 & 0xFFFFFFF
23a0: 46 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68 44  F;.  uTm.dwHighD
23b0: 61 74 65 54 69 6d 65 3d 20 74 36 34 20 3e 3e 20  ateTime= t64 >> 
23c0: 33 32 3b 0a 20 20 46 69 6c 65 54 69 6d 65 54 6f  32;.  FileTimeTo
23d0: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28 26 75  LocalFileTime(&u
23e0: 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 46 69 6c 65  Tm,&lTm);.  File
23f0: 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65  TimeToSystemTime
2400: 28 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79  (&lTm,&pTm);.  y
2410: 2e 74 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77  .tm_year = pTm.w
2420: 59 65 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79  Year - 1900;.  y
2430: 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d  .tm_mon = pTm.wM
2440: 6f 6e 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d  onth - 1;.  y.tm
2450: 5f 77 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79  _wday = pTm.wDay
2460: 4f 66 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d  OfWeek;.  y.tm_m
2470: 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a  day = pTm.wDay;.
2480: 20 20 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54    y.tm_hour = pT
2490: 6d 2e 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f  m.wHour;.  y.tm_
24a0: 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74  min = pTm.wMinut
24b0: 65 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20  e;.  y.tm_sec = 
24c0: 70 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72  pTm.wSecond;.  r
24d0: 65 74 75 72 6e 20 26 79 3b 0a 7d 0a 0a 2f 2a 20  eturn &y;.}../* 
24e0: 54 68 69 73 20 77 69 6c 6c 20 6e 65 76 65 72 20  This will never 
24f0: 62 65 20 63 61 6c 6c 65 64 2c 20 62 75 74 20 64  be called, but d
2500: 65 66 69 6e 65 64 20 74 6f 20 6d 61 6b 65 20 74  efined to make t
2510: 68 65 20 63 6f 64 65 20 63 6f 6d 70 69 6c 65 20  he code compile 
2520: 2a 2f 0a 23 64 65 66 69 6e 65 20 47 65 74 54 65  */.#define GetTe
2530: 6d 70 50 61 74 68 41 28 61 2c 62 29 0a 0a 23 64  mpPathA(a,b)..#d
2540: 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 28 61  efine LockFile(a
2550: 2c 62 2c 63 2c 64 2c 65 29 20 20 20 20 20 20 20  ,b,c,d,e)       
2560: 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26 61  winceLockFile(&a
2570: 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23 64  , b, c, d, e).#d
2580: 65 66 69 6e 65 20 55 6e 6c 6f 63 6b 46 69 6c 65  efine UnlockFile
2590: 28 61 2c 62 2c 63 2c 64 2c 65 29 20 20 20 20 20  (a,b,c,d,e)     
25a0: 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28  winceUnlockFile(
25b0: 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a  &a, b, c, d, e).
25c0: 23 64 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65  #define LockFile
25d0: 45 78 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20  Ex(a,b,c,d,e,f) 
25e0: 20 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45    winceLockFileE
25f0: 78 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65  x(&a, b, c, d, e
2600: 2c 20 66 29 0a 0a 23 64 65 66 69 6e 65 20 48 41  , f)..#define HA
2610: 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28  NDLE_TO_WINFILE(
2620: 61 29 20 28 77 69 6e 46 69 6c 65 2a 29 26 28 28  a) (winFile*)&((
2630: 63 68 61 72 2a 29 61 29 5b 2d 6f 66 66 73 65 74  char*)a)[-offset
2640: 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a  of(winFile,h)]..
2650: 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
2660: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64  lock on the hand
2670: 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76  le h.*/.static v
2680: 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41 63  oid winceMutexAc
2690: 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29 7b  quire(HANDLE h){
26a0: 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72 72 3b  .   DWORD dwErr;
26b0: 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64 77  .   do {.     dw
26c0: 45 72 72 20 3d 20 57 61 69 74 46 6f 72 53 69 6e  Err = WaitForSin
26d0: 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e 46  gleObject(h, INF
26e0: 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77 68 69  INITE);.   } whi
26f0: 6c 65 20 28 64 77 45 72 72 20 21 3d 20 57 41 49  le (dwErr != WAI
2700: 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20 64 77  T_OBJECT_0 && dw
2710: 45 72 72 20 21 3d 20 57 41 49 54 5f 41 42 41 4e  Err != WAIT_ABAN
2720: 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  DONED);.}./*.** 
2730: 52 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20 61  Release a lock a
2740: 63 71 75 69 72 65 64 20 62 79 20 77 69 6e 63 65  cquired by wince
2750: 4d 75 74 65 78 41 63 71 75 69 72 65 28 29 0a 2a  MutexAcquire().*
2760: 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 63 65 4d  /.#define winceM
2770: 75 74 65 78 52 65 6c 65 61 73 65 28 68 29 20 52  utexRelease(h) R
2780: 65 6c 65 61 73 65 4d 75 74 65 78 28 68 29 0a 0a  eleaseMutex(h)..
2790: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65  /*.** Create the
27a0: 20 6d 75 74 65 78 20 61 6e 64 20 73 68 61 72 65   mutex and share
27b0: 64 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 66 6f  d memory used fo
27c0: 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 65  r locking in the
27d0: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
27e0: 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74 61  tor pFile.*/.sta
27f0: 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 43 72  tic BOOL winceCr
2800: 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63  eateLock(const c
2810: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
2820: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
2830: 0a 20 20 57 43 48 41 52 20 2a 7a 54 6f 6b 3b 0a  .  WCHAR *zTok;.
2840: 20 20 57 43 48 41 52 20 2a 7a 4e 61 6d 65 20 3d    WCHAR *zName =
2850: 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a   utf8ToUnicode(z
2860: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 42 4f 4f  Filename);.  BOO
2870: 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45 3b 0a  L bInit = TRUE;.
2880: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
2890: 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 64   the local lockd
28a0: 61 74 61 20 2a 2f 0a 20 20 5a 65 72 6f 4d 65 6d  ata */.  ZeroMem
28b0: 6f 72 79 28 26 70 46 69 6c 65 2d 3e 6c 6f 63 61  ory(&pFile->loca
28c0: 6c 2c 20 73 69 7a 65 6f 66 28 70 46 69 6c 65 2d  l, sizeof(pFile-
28d0: 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20 20 2f 2a 20  >local));..  /* 
28e0: 52 65 70 6c 61 63 65 20 74 68 65 20 62 61 63 6b  Replace the back
28f0: 73 6c 61 73 68 65 73 20 66 72 6f 6d 20 74 68 65  slashes from the
2900: 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 6c 6f   filename and lo
2910: 77 65 72 63 61 73 65 20 69 74 0a 20 20 2a 2a 20  wercase it.  ** 
2920: 74 6f 20 64 65 72 69 76 65 20 61 20 6d 75 74 65  to derive a mute
2930: 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a 54 6f  x name. */.  zTo
2940: 6b 20 3d 20 43 68 61 72 4c 6f 77 65 72 57 28 7a  k = CharLowerW(z
2950: 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 20 28 3b 2a  Name);.  for (;*
2960: 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20  zTok;zTok++){.  
2970: 20 20 69 66 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27    if (*zTok == '
2980: 5c 5c 27 29 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27  \\') *zTok = '_'
2990: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61  ;.  }..  /* Crea
29a0: 74 65 2f 6f 70 65 6e 20 74 68 65 20 6e 61 6d 65  te/open the name
29b0: 64 20 6d 75 74 65 78 20 2a 2f 0a 20 20 70 46 69  d mutex */.  pFi
29c0: 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 43 72 65  le->hMutex = Cre
29d0: 61 74 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c 20  ateMutexW(NULL, 
29e0: 46 41 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20  FALSE, zName);. 
29f0: 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75   if (!pFile->hMu
2a00: 74 65 78 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  tex){.    pFile-
2a10: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65 74  >lastErrno = Get
2a20: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
2a30: 20 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20   free(zName);.  
2a40: 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a    return FALSE;.
2a50: 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
2a60: 65 20 74 68 65 20 6d 75 74 65 78 20 62 65 66 6f  e the mutex befo
2a70: 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f  re continuing */
2a80: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
2a90: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
2aa0: 65 78 29 3b 0a 20 20 0a 20 20 2f 2a 20 53 69 6e  ex);.  .  /* Sin
2ab0: 63 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ce the names of 
2ac0: 6e 61 6d 65 64 20 6d 75 74 65 78 65 73 2c 20 73  named mutexes, s
2ad0: 65 6d 61 70 68 6f 72 65 73 2c 20 66 69 6c 65 20  emaphores, file 
2ae0: 6d 61 70 70 69 6e 67 73 20 65 74 63 20 61 72 65  mappings etc are
2af0: 20 0a 20 20 2a 2a 20 63 61 73 65 2d 73 65 6e 73   .  ** case-sens
2b00: 69 74 69 76 65 2c 20 74 61 6b 65 20 61 64 76 61  itive, take adva
2b10: 6e 74 61 67 65 20 6f 66 20 74 68 61 74 20 62 79  ntage of that by
2b20: 20 75 70 70 65 72 63 61 73 69 6e 67 20 74 68 65   uppercasing the
2b30: 20 6d 75 74 65 78 20 6e 61 6d 65 0a 20 20 2a 2a   mutex name.  **
2b40: 20 61 6e 64 20 75 73 69 6e 67 20 74 68 61 74 20   and using that 
2b50: 61 73 20 74 68 65 20 73 68 61 72 65 64 20 66 69  as the shared fi
2b60: 6c 65 6d 61 70 70 69 6e 67 20 6e 61 6d 65 2e 0a  lemapping name..
2b70: 20 20 2a 2f 0a 20 20 43 68 61 72 55 70 70 65 72    */.  CharUpper
2b80: 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c  W(zName);.  pFil
2b90: 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 43 72 65  e->hShared = Cre
2ba0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28  ateFileMappingW(
2bb0: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
2bc0: 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20  ALUE, NULL,.    
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf0: 20 20 20 50 41 47 45 5f 52 45 41 44 57 52 49 54     PAGE_READWRIT
2c00: 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e  E, 0, sizeof(win
2c10: 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20  ceLock),.       
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c40: 7a 4e 61 6d 65 29 3b 20 20 0a 0a 20 20 2f 2a 20  zName);  ..  /* 
2c50: 53 65 74 20 61 20 66 6c 61 67 20 74 68 61 74 20  Set a flag that 
2c60: 69 6e 64 69 63 61 74 65 73 20 77 65 27 72 65 20  indicates we're 
2c70: 74 68 65 20 66 69 72 73 74 20 74 6f 20 63 72 65  the first to cre
2c80: 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73  ate the memory s
2c90: 6f 20 69 74 20 0a 20 20 2a 2a 20 6d 75 73 74 20  o it .  ** must 
2ca0: 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69  be zero-initiali
2cb0: 7a 65 64 20 2a 2f 0a 20 20 69 66 20 28 47 65 74  zed */.  if (Get
2cc0: 4c 61 73 74 45 72 72 6f 72 28 29 20 3d 3d 20 45  LastError() == E
2cd0: 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58 49  RROR_ALREADY_EXI
2ce0: 53 54 53 29 7b 0a 20 20 20 20 62 49 6e 69 74 20  STS){.    bInit 
2cf0: 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20  = FALSE;.  }..  
2d00: 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20  free(zName);..  
2d10: 2f 2a 20 49 66 20 77 65 20 73 75 63 63 65 65 64  /* If we succeed
2d20: 65 64 20 69 6e 20 6d 61 6b 69 6e 67 20 74 68 65  ed in making the
2d30: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68   shared memory h
2d40: 61 6e 64 6c 65 2c 20 6d 61 70 20 69 74 2e 20 2a  andle, map it. *
2d50: 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68  /.  if (pFile->h
2d60: 53 68 61 72 65 64 29 7b 0a 20 20 20 20 70 46 69  Shared){.    pFi
2d70: 6c 65 2d 3e 73 68 61 72 65 64 20 3d 20 28 77 69  le->shared = (wi
2d80: 6e 63 65 4c 6f 63 6b 2a 29 4d 61 70 56 69 65 77  nceLock*)MapView
2d90: 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 53  OfFile(pFile->hS
2da0: 68 61 72 65 64 2c 20 0a 20 20 20 20 20 20 20 20  hared, .        
2db0: 20 20 20 20 20 46 49 4c 45 5f 4d 41 50 5f 52 45       FILE_MAP_RE
2dc0: 41 44 7c 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54  AD|FILE_MAP_WRIT
2dd0: 45 2c 20 30 2c 20 30 2c 20 73 69 7a 65 6f 66 28  E, 0, 0, sizeof(
2de0: 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 20  winceLock));.   
2df0: 20 2f 2a 20 49 66 20 6d 61 70 70 69 6e 67 20 66   /* If mapping f
2e00: 61 69 6c 65 64 2c 20 63 6c 6f 73 65 20 74 68 65  ailed, close the
2e10: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68   shared memory h
2e20: 61 6e 64 6c 65 20 61 6e 64 20 65 72 61 73 65 20  andle and erase 
2e30: 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 70  it */.    if (!p
2e40: 46 69 6c 65 2d 3e 73 68 61 72 65 64 29 7b 0a 20  File->shared){. 
2e50: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
2e60: 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45  Errno = GetLastE
2e70: 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 43 6c  rror();.      Cl
2e80: 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
2e90: 3e 68 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  >hShared);.     
2ea0: 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20   pFile->hShared 
2eb0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  = NULL;.    }.  
2ec0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61 72 65  }..  /* If share
2ed0: 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e  d memory could n
2ee0: 6f 74 20 62 65 20 63 72 65 61 74 65 64 2c 20 74  ot be created, t
2ef0: 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d 75  hen close the mu
2f00: 74 65 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a  tex and fail */.
2f10: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 53 68    if (pFile->hSh
2f20: 61 72 65 64 20 3d 3d 20 4e 55 4c 4c 29 7b 0a 20  ared == NULL){. 
2f30: 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c     winceMutexRel
2f40: 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
2f50: 65 78 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48 61  ex);.    CloseHa
2f60: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ndle(pFile->hMut
2f70: 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ex);.    pFile->
2f80: 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20  hMutex = NULL;. 
2f90: 20 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b     return FALSE;
2fa0: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 6e 69  .  }.  .  /* Ini
2fb0: 74 69 61 6c 69 7a 65 20 74 68 65 20 73 68 61 72  tialize the shar
2fc0: 65 64 20 6d 65 6d 6f 72 79 20 69 66 20 77 65 27  ed memory if we'
2fd0: 72 65 20 73 75 70 70 6f 73 65 64 20 74 6f 20 2a  re supposed to *
2fe0: 2f 0a 20 20 69 66 20 28 62 49 6e 69 74 29 20 7b  /.  if (bInit) {
2ff0: 0a 20 20 20 20 5a 65 72 6f 4d 65 6d 6f 72 79 28  .    ZeroMemory(
3000: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 73  pFile->shared, s
3010: 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29  izeof(winceLock)
3020: 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d  );.  }..  winceM
3030: 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
3040: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65  e->hMutex);.  re
3050: 74 75 72 6e 20 54 52 55 45 3b 0a 7d 0a 0a 2f 2a  turn TRUE;.}../*
3060: 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74 68 65 20  .** Destroy the 
3070: 70 61 72 74 20 6f 66 20 77 69 6e 46 69 6c 65 20  part of winFile 
3080: 74 68 61 74 20 64 65 61 6c 73 20 77 69 74 68 20  that deals with 
3090: 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73  wince locks.*/.s
30a0: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65  tatic void wince
30b0: 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46  DestroyLock(winF
30c0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
30d0: 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  f (pFile->hMutex
30e0: 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75 69 72  ){.    /* Acquir
30f0: 65 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20  e the mutex */. 
3100: 20 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71     winceMutexAcq
3110: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
3120: 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ex);..    /* The
3130: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
3140: 73 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c  s should probabl
3150: 79 20 61 73 73 65 72 74 20 69 6e 20 64 65 62 75  y assert in debu
3160: 67 20 6d 6f 64 65 2c 20 62 75 74 20 74 68 65 79  g mode, but they
3170: 0a 20 20 20 20 20 20 20 61 72 65 20 74 6f 20 63  .       are to c
3180: 6c 65 61 6e 75 70 20 69 6e 20 63 61 73 65 20 61  leanup in case a
3190: 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65  ny locks remaine
31a0: 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66  d open */.    if
31b0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
31c0: 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20  Readers){.      
31d0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e  pFile->shared->n
31e0: 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20  Readers --;.    
31f0: 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  }.    if (pFile-
3200: 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
3210: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
3220: 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65  shared->bReserve
3230: 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d  d = FALSE;.    }
3240: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
3250: 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b  local.bPending){
3260: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
3270: 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d  ared->bPending =
3280: 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20   FALSE;.    }.  
3290: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
32a0: 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a  al.bExclusive){.
32b0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
32c0: 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
32d0: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a  = FALSE;.    }..
32e0: 20 20 20 20 2f 2a 20 44 65 2d 72 65 66 65 72 65      /* De-refere
32f0: 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75  nce and close ou
3300: 72 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 68  r copy of the sh
3310: 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64  ared memory hand
3320: 6c 65 20 2a 2f 0a 20 20 20 20 55 6e 6d 61 70 56  le */.    UnmapV
3330: 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d  iewOfFile(pFile-
3340: 3e 73 68 61 72 65 64 29 3b 0a 20 20 20 20 43 6c  >shared);.    Cl
3350: 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
3360: 3e 68 53 68 61 72 65 64 29 3b 0a 0a 20 20 20 20  >hShared);..    
3370: 2f 2a 20 44 6f 6e 65 20 77 69 74 68 20 74 68 65  /* Done with the
3380: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69   mutex */.    wi
3390: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
33a0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 20  pFile->hMutex); 
33b0: 20 20 20 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e     .    CloseHan
33c0: 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  dle(pFile->hMute
33d0: 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68  x);.    pFile->h
33e0: 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20  Mutex = NULL;.  
33f0: 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e 20 69  }.}../* .** An i
3400: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
3410: 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 28 29 20   the LockFile() 
3420: 41 50 49 20 6f 66 20 77 69 6e 64 6f 77 73 20 66  API of windows f
3430: 6f 72 20 77 69 6e 63 65 0a 2a 2f 0a 73 74 61 74  or wince.*/.stat
3440: 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63  ic BOOL winceLoc
3450: 6b 46 69 6c 65 28 0a 20 20 48 41 4e 44 4c 45 20  kFile(.  HANDLE 
3460: 2a 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44  *phFile,.  DWORD
3470: 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77   dwFileOffsetLow
3480: 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65  ,.  DWORD dwFile
3490: 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  OffsetHigh,.  DW
34a0: 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
34b0: 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44  esToLockLow,.  D
34c0: 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
34d0: 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b  tesToLockHigh.){
34e0: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
34f0: 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49  e = HANDLE_TO_WI
3500: 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20  NFILE(phFile);. 
3510: 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20   BOOL bReturn = 
3520: 46 41 4c 53 45 3b 0a 0a 20 20 69 66 20 28 21 70  FALSE;..  if (!p
3530: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65  File->hMutex) re
3540: 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e  turn TRUE;.  win
3550: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
3560: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a  File->hMutex);..
3570: 20 20 2f 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20    /* Wanting an 
3580: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20  exclusive lock? 
3590: 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f  */.  if (dwFileO
35a0: 66 66 73 65 74 4c 6f 77 20 3d 3d 20 53 48 41 52  ffsetLow == SHAR
35b0: 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20 20  ED_FIRST.       
35c0: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
35d0: 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 53 48  sToLockLow == SH
35e0: 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20  ARED_SIZE){.    
35f0: 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
3600: 64 2d 3e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30  d->nReaders == 0
3610: 20 26 26 20 70 46 69 6c 65 2d 3e 73 68 61 72 65   && pFile->share
3620: 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d  d->bExclusive ==
3630: 20 30 29 7b 0a 20 20 20 20 20 20 20 70 46 69 6c   0){.       pFil
3640: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
3650: 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20  usive = TRUE;.  
3660: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
3670: 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54  l.bExclusive = T
3680: 52 55 45 3b 0a 20 20 20 20 20 20 20 62 52 65 74  RUE;.       bRet
3690: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
36a0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74  }.  }..  /* Want
36b0: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63   a read-only loc
36c0: 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  k? */.  else if 
36d0: 28 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f  ((dwFileOffsetLo
36e0: 77 20 3e 3d 20 53 48 41 52 45 44 5f 46 49 52 53  w >= SHARED_FIRS
36f0: 54 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  T &&.           
3700: 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77   dwFileOffsetLow
3710: 20 3c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20   < SHARED_FIRST 
3720: 2b 20 53 48 41 52 45 44 5f 53 49 5a 45 29 20 26  + SHARED_SIZE) &
3730: 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 4e  &.            nN
3740: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
3750: 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
3760: 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72   if (pFile->shar
3770: 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
3780: 3d 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  = 0){.      pFil
3790: 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
37a0: 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28  s ++;.      if (
37b0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
37c0: 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20  aders == 1){.   
37d0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
37e0: 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b  ed->nReaders ++;
37f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
3800: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
3810: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
3820: 61 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f  ant a pending lo
3830: 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ck? */.  else if
3840: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
3850: 77 20 3d 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  w == PENDING_BYT
3860: 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79  E && nNumberOfBy
3870: 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
3880: 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f  1){.    /* If no
3890: 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61   pending lock ha
38a0: 73 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 2c  s been acquired,
38b0: 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 69 74   then acquire it
38c0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c   */.    if (pFil
38d0: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64  e->shared->bPend
38e0: 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20  ing == 0) {.    
38f0: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
3900: 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45  >bPending = TRUE
3910: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
3920: 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20  ocal.bPending = 
3930: 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74  TRUE;.      bRet
3940: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
3950: 7d 0a 20 20 7d 0a 20 20 2f 2a 20 57 61 6e 74 20  }.  }.  /* Want 
3960: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 3f  a reserved lock?
3970: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64   */.  else if (d
3980: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
3990: 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20  = RESERVED_BYTE 
39a0: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
39b0: 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  sToLockLow == 1)
39c0: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
39d0: 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
39e0: 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20  ed == 0) {.     
39f0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
3a00: 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45  bReserved = TRUE
3a10: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
3a20: 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d  ocal.bReserved =
3a30: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65   TRUE;.      bRe
3a40: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
3a50: 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d   }.  }..  winceM
3a60: 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
3a70: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65  e->hMutex);.  re
3a80: 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a  turn bReturn;.}.
3a90: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  ./*.** An implem
3aa0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
3ab0: 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f  UnlockFile API o
3ac0: 66 20 77 69 6e 64 6f 77 73 20 66 6f 72 20 77 69  f windows for wi
3ad0: 6e 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f  nce.*/.static BO
3ae0: 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69  OL winceUnlockFi
3af0: 6c 65 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68  le(.  HANDLE *ph
3b00: 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77  File,.  DWORD dw
3b10: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20  FileOffsetLow,. 
3b20: 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66   DWORD dwFileOff
3b30: 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44  setHigh,.  DWORD
3b40: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
3b50: 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57  oUnlockLow,.  DW
3b60: 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
3b70: 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29  esToUnlockHigh.)
3b80: 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
3b90: 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57  le = HANDLE_TO_W
3ba0: 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a  INFILE(phFile);.
3bb0: 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d    BOOL bReturn =
3bc0: 20 46 41 4c 53 45 3b 0a 0a 20 20 69 66 20 28 21   FALSE;..  if (!
3bd0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72  pFile->hMutex) r
3be0: 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69  eturn TRUE;.  wi
3bf0: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
3c00: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
3c10: 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20  .  /* Releasing 
3c20: 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72  a reader lock or
3c30: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
3c40: 63 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69  ck */.  if (dwFi
3c50: 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3e 3d 20 53  leOffsetLow >= S
3c60: 48 41 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20  HARED_FIRST &&. 
3c70: 20 20 20 20 20 20 64 77 46 69 6c 65 4f 66 66 73        dwFileOffs
3c80: 65 74 4c 6f 77 20 3c 20 53 48 41 52 45 44 5f 46  etLow < SHARED_F
3c90: 49 52 53 54 20 2b 20 53 48 41 52 45 44 5f 53 49  IRST + SHARED_SI
3ca0: 5a 45 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20  ZE){.    /* Did 
3cb0: 77 65 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  we have an exclu
3cc0: 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  sive lock? */.  
3cd0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
3ce0: 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a  al.bExclusive){.
3cf0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
3d00: 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  al.bExclusive = 
3d10: 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69  FALSE;.      pFi
3d20: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63  le->shared->bExc
3d30: 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a  lusive = FALSE;.
3d40: 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
3d50: 54 52 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  TRUE;.    }..   
3d60: 20 2f 2a 20 44 69 64 20 77 65 20 6a 75 73 74 20   /* Did we just 
3d70: 68 61 76 65 20 61 20 72 65 61 64 65 72 20 6c 6f  have a reader lo
3d80: 63 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  ck? */.    else 
3d90: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
3da0: 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20  .nReaders){.    
3db0: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e    pFile->local.n
3dc0: 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20  Readers --;.    
3dd0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
3de0: 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30  al.nReaders == 0
3df0: 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  ).      {.      
3e00: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
3e10: 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20  >nReaders --;.  
3e20: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74      }.      bRet
3e30: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
3e40: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65  }.  }..  /* Rele
3e50: 61 73 69 6e 67 20 61 20 70 65 6e 64 69 6e 67 20  asing a pending 
3e60: 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69  lock */.  else i
3e70: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
3e80: 6f 77 20 3d 3d 20 50 45 4e 44 49 4e 47 5f 42 59  ow == PENDING_BY
3e90: 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42  TE && nNumberOfB
3ea0: 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
3eb0: 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
3ec0: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e  File->local.bPen
3ed0: 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69  ding){.      pFi
3ee0: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69  le->local.bPendi
3ef0: 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ng = FALSE;.    
3f00: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
3f10: 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53  >bPending = FALS
3f20: 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
3f30: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
3f40: 20 7d 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e   }.  /* Releasin
3f50: 67 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  g a reserved loc
3f60: 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  k */.  else if (
3f70: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
3f80: 3d 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  == RESERVED_BYTE
3f90: 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
3fa0: 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d  esToUnlockLow ==
3fb0: 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
3fc0: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
3fd0: 76 65 64 29 20 7b 0a 20 20 20 20 20 20 70 46 69  ved) {.      pFi
3fe0: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
3ff0: 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ved = FALSE;.   
4000: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
4010: 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41  ->bReserved = FA
4020: 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75  LSE;.      bRetu
4030: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
4040: 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74  .  }..  winceMut
4050: 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
4060: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  >hMutex);.  retu
4070: 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  rn bReturn;.}../
4080: 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e  *.** An implemen
4090: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f  tation of the Lo
40a0: 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 20 6f  ckFileEx() API o
40b0: 66 20 77 69 6e 64 6f 77 73 20 66 6f 72 20 77 69  f windows for wi
40c0: 6e 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f  nce.*/.static BO
40d0: 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65  OL winceLockFile
40e0: 45 78 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68  Ex(.  HANDLE *ph
40f0: 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77  File,.  DWORD dw
4100: 46 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 64  Flags,.  DWORD d
4110: 77 52 65 73 65 72 76 65 64 2c 0a 20 20 44 57 4f  wReserved,.  DWO
4120: 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
4130: 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57  sToLockLow,.  DW
4140: 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
4150: 65 73 54 6f 4c 6f 63 6b 48 69 67 68 2c 0a 20 20  esToLockHigh,.  
4160: 4c 50 4f 56 45 52 4c 41 50 50 45 44 20 6c 70 4f  LPOVERLAPPED lpO
4170: 76 65 72 6c 61 70 70 65 64 0a 29 7b 0a 20 20 2f  verlapped.){.  /
4180: 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  * If the caller 
4190: 77 61 6e 74 73 20 61 20 73 68 61 72 65 64 20 72  wants a shared r
41a0: 65 61 64 20 6c 6f 63 6b 2c 20 66 6f 72 77 61 72  ead lock, forwar
41b0: 64 20 74 68 69 73 20 63 61 6c 6c 0a 20 20 2a 2a  d this call.  **
41c0: 20 74 6f 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c   to winceLockFil
41d0: 65 20 2a 2f 0a 20 20 69 66 20 28 6c 70 4f 76 65  e */.  if (lpOve
41e0: 72 6c 61 70 70 65 64 2d 3e 4f 66 66 73 65 74 20  rlapped->Offset 
41f0: 3d 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 20  == SHARED_FIRST 
4200: 26 26 0a 20 20 20 20 20 20 64 77 46 6c 61 67 73  &&.      dwFlags
4210: 20 3d 3d 20 31 20 26 26 0a 20 20 20 20 20 20 6e   == 1 &&.      n
4220: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
4230: 6f 63 6b 4c 6f 77 20 3d 3d 20 53 48 41 52 45 44  ockLow == SHARED
4240: 5f 53 49 5a 45 29 7b 0a 20 20 20 20 72 65 74 75  _SIZE){.    retu
4250: 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65  rn winceLockFile
4260: 28 70 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  (phFile, SHARED_
4270: 46 49 52 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b  FIRST, 0, 1, 0);
4280: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 46 41  .  }.  return FA
4290: 4c 53 45 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64  LSE;.}./*.** End
42a0: 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
42b0: 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a  code for wince.*
42c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
42d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
42e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
42f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65  ************/.#e
4310: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
4320: 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a  S_WINCE */../***
4330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
4380: 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20  e next group of 
4390: 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65  routines impleme
43a0: 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f  nt the I/O metho
43b0: 64 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  ds specified.** 
43c0: 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  by the sqlite3_i
43d0: 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
43e0: 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**************
43f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4430: 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  /../*.** Close a
4440: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20   file..**.** It 
4450: 69 73 20 72 65 70 6f 72 74 65 64 20 74 68 61 74  is reported that
4460: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 63   an attempt to c
4470: 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6d 69  lose a handle mi
4480: 67 68 74 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a  ght sometimes.**
4490: 20 66 61 69 6c 2e 20 20 54 68 69 73 20 69 73 20   fail.  This is 
44a0: 61 20 76 65 72 79 20 75 6e 72 65 61 73 6f 6e 61  a very unreasona
44b0: 62 6c 65 20 72 65 73 75 6c 74 2c 20 62 75 74 20  ble result, but 
44c0: 77 69 6e 64 6f 77 73 20 69 73 20 6e 6f 74 6f 72  windows is notor
44d0: 69 6f 75 73 0a 2a 2a 20 66 6f 72 20 62 65 69 6e  ious.** for bein
44e0: 67 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 73  g unreasonable s
44f0: 6f 20 49 20 64 6f 20 6e 6f 74 20 64 6f 75 62 74  o I do not doubt
4500: 20 74 68 61 74 20 69 74 20 6d 69 67 68 74 20 68   that it might h
4510: 61 70 70 65 6e 2e 20 20 49 66 0a 2a 2a 20 74 68  appen.  If.** th
4520: 65 20 63 6c 6f 73 65 20 66 61 69 6c 73 2c 20 77  e close fails, w
4530: 65 20 70 61 75 73 65 20 66 6f 72 20 31 30 30 20  e pause for 100 
4540: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64  milliseconds and
4550: 20 74 72 79 20 61 67 61 69 6e 2e 20 20 41 73 0a   try again.  As.
4560: 2a 2a 20 6d 61 6e 79 20 61 73 20 4d 58 5f 43 4c  ** many as MX_CL
4570: 4f 53 45 5f 41 54 54 45 4d 50 54 20 61 74 74 65  OSE_ATTEMPT atte
4580: 6d 70 74 73 20 74 6f 20 63 6c 6f 73 65 20 74 68  mpts to close th
4590: 65 20 68 61 6e 64 6c 65 20 61 72 65 20 6d 61 64  e handle are mad
45a0: 65 20 62 65 66 6f 72 65 0a 2a 2a 20 67 69 76 69  e before.** givi
45b0: 6e 67 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e  ng up and return
45c0: 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f  ing an error..*/
45d0: 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43 4c 4f 53  .#define MX_CLOS
45e0: 45 5f 41 54 54 45 4d 50 54 20 33 0a 73 74 61 74  E_ATTEMPT 3.stat
45f0: 69 63 20 69 6e 74 20 77 69 6e 43 6c 6f 73 65 28  ic int winClose(
4600: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
4610: 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 63 6e 74  ){.  int rc, cnt
4620: 20 3d 20 30 3b 0a 20 20 77 69 6e 46 69 6c 65 20   = 0;.  winFile 
4630: 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
4640: 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74  e*)id;..  assert
4650: 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54  ( id!=0 );.  OST
4660: 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c  RACE2("CLOSE %d\
4670: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  n", pFile->h);. 
4680: 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d 20 43 6c   do{.    rc = Cl
4690: 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
46a0: 3e 68 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72  >h);.  }while( r
46b0: 63 3d 3d 30 20 26 26 20 2b 2b 63 6e 74 20 3c 20  c==0 && ++cnt < 
46c0: 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54  MX_CLOSE_ATTEMPT
46d0: 20 26 26 20 28 53 6c 65 65 70 28 31 30 30 29 2c   && (Sleep(100),
46e0: 20 31 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 54   1) );.#if SQLIT
46f0: 45 5f 4f 53 5f 57 49 4e 43 45 0a 23 64 65 66 69  E_OS_WINCE.#defi
4700: 6e 65 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f  ne WINCE_DELETIO
4710: 4e 5f 41 54 54 45 4d 50 54 53 20 33 0a 20 20 77  N_ATTEMPTS 3.  w
4720: 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28  inceDestroyLock(
4730: 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 46  pFile);.  if( pF
4740: 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
4750: 6f 73 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  ose ){.    int c
4760: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  nt = 0;.    whil
4770: 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 44 65  e(.           De
4780: 6c 65 74 65 46 69 6c 65 57 28 70 46 69 6c 65 2d  leteFileW(pFile-
4790: 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29  >zDeleteOnClose)
47a0: 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 47  ==0.        && G
47b0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
47c0: 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65  W(pFile->zDelete
47d0: 4f 6e 43 6c 6f 73 65 29 21 3d 30 78 66 66 66 66  OnClose)!=0xffff
47e0: 66 66 66 66 20 0a 20 20 20 20 20 20 20 20 26 26  ffff .        &&
47f0: 20 63 6e 74 2b 2b 20 3c 20 57 49 4e 43 45 5f 44   cnt++ < WINCE_D
4800: 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53  ELETION_ATTEMPTS
4810: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 53  .    ){.       S
4820: 6c 65 65 70 28 31 30 30 29 3b 20 20 2f 2a 20 57  leep(100);  /* W
4830: 61 69 74 20 61 20 6c 69 74 74 6c 65 20 62 65 66  ait a little bef
4840: 6f 72 65 20 74 72 79 69 6e 67 20 61 67 61 69 6e  ore trying again
4850: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 66 72   */.    }.    fr
4860: 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74  ee(pFile->zDelet
4870: 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 23  eOnClose);.  }.#
4880: 65 6e 64 69 66 0a 20 20 4f 70 65 6e 43 6f 75 6e  endif.  OpenCoun
4890: 74 65 72 28 2d 31 29 3b 0a 20 20 72 65 74 75 72  ter(-1);.  retur
48a0: 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  n rc ? SQLITE_OK
48b0: 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b   : SQLITE_IOERR;
48c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 6d  .}../*.** Some m
48d0: 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65  icrosoft compile
48e0: 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66  rs lack this def
48f0: 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  inition..*/.#ifn
4900: 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f  def INVALID_SET_
4910: 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23 20 64  FILE_POINTER.# d
4920: 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 53 45  efine INVALID_SE
4930: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 28  T_FILE_POINTER (
4940: 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69  (DWORD)-1).#endi
4950: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61  f../*.** Read da
4960: 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69  ta from a file i
4970: 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52  nto a buffer.  R
4980: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
4990: 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20  if all.** bytes 
49a0: 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73  were read succes
49b0: 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54  sfully and SQLIT
49c0: 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68  E_IOERR if anyth
49d0: 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
49e0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
49f0: 20 77 69 6e 52 65 61 64 28 0a 20 20 73 71 6c 69   winRead(.  sqli
4a00: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20  te3_file *id,   
4a10: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74         /* File t
4a20: 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
4a30: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
4a40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
4a50: 72 69 74 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74  rite content int
4a60: 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
4a70: 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20  .  int amt,     
4a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4a90: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
4aa0: 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73 71   to read */.  sq
4ab0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
4ac0: 65 74 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69  et       /* Begi
4ad0: 6e 20 72 65 61 64 69 6e 67 20 61 74 20 74 68 69  n reading at thi
4ae0: 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20  s offset */.){. 
4af0: 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73 20   LONG upperBits 
4b00: 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74  = (LONG)((offset
4b10: 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66  >>32) & 0x7fffff
4b20: 66 66 29 3b 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65  ff);.  LONG lowe
4b30: 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 6f  rBits = (LONG)(o
4b40: 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66  ffset & 0xffffff
4b50: 66 66 29 3b 0a 20 20 44 57 4f 52 44 20 72 63 3b  ff);.  DWORD rc;
4b60: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
4b70: 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
4b80: 3b 0a 20 20 44 57 4f 52 44 20 65 72 72 6f 72 3b  ;.  DWORD error;
4b90: 0a 20 20 44 57 4f 52 44 20 67 6f 74 3b 0a 0a 20  .  DWORD got;.. 
4ba0: 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
4bb0: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
4bc0: 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
4bd0: 45 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b 0a 20  E_IOERR_READ);. 
4be0: 20 4f 53 54 52 41 43 45 33 28 22 52 45 41 44 20   OSTRACE3("READ 
4bf0: 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70  %d lock=%d\n", p
4c00: 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
4c10: 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 72 63 20  locktype);.  rc 
4c20: 3d 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  = SetFilePointer
4c30: 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72  (pFile->h, lower
4c40: 42 69 74 73 2c 20 26 75 70 70 65 72 42 69 74 73  Bits, &upperBits
4c50: 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 20  , FILE_BEGIN);. 
4c60: 20 69 66 28 20 72 63 3d 3d 49 4e 56 41 4c 49 44   if( rc==INVALID
4c70: 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  _SET_FILE_POINTE
4c80: 52 20 26 26 20 28 65 72 72 6f 72 3d 47 65 74 4c  R && (error=GetL
4c90: 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f  astError())!=NO_
4ca0: 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 70 46 69  ERROR ){.    pFi
4cb0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
4cc0: 65 72 72 6f 72 3b 0a 20 20 20 20 72 65 74 75 72  error;.    retur
4cd0: 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
4ce0: 20 7d 0a 20 20 69 66 28 20 21 52 65 61 64 46 69   }.  if( !ReadFi
4cf0: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75  le(pFile->h, pBu
4d00: 66 2c 20 61 6d 74 2c 20 26 67 6f 74 2c 20 30 29  f, amt, &got, 0)
4d10: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
4d20: 61 73 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61  astErrno = GetLa
4d30: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72  stError();.    r
4d40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
4d50: 52 52 5f 52 45 41 44 3b 0a 20 20 7d 0a 20 20 69  RR_READ;.  }.  i
4d60: 66 28 20 67 6f 74 3d 3d 28 44 57 4f 52 44 29 61  f( got==(DWORD)a
4d70: 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  mt ){.    return
4d80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
4d90: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 55 6e 72 65  lse{.    /* Unre
4da0: 61 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20  ad parts of the 
4db0: 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a  buffer must be z
4dc0: 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20  ero-filled */.  
4dd0: 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72    memset(&((char
4de0: 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c  *)pBuf)[got], 0,
4df0: 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72   amt-got);.    r
4e00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
4e10: 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20  RR_SHORT_READ;. 
4e20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74   }.}../*.** Writ
4e30: 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  e data from a bu
4e40: 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65  ffer into a file
4e50: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
4e60: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
4e70: 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
4e80: 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61  error code on fa
4e90: 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
4ea0: 20 69 6e 74 20 77 69 6e 57 72 69 74 65 28 0a 20   int winWrite(. 
4eb0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
4ec0: 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  d,         /* Fi
4ed0: 6c 65 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f  le to write into
4ee0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
4ef0: 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
4f00: 2f 2a 20 54 68 65 20 62 79 74 65 73 20 74 6f 20  /* The bytes to 
4f10: 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  be written */.  
4f20: 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20  int amt,        
4f30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4f40: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
4f50: 77 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74  write */.  sqlit
4f60: 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20  e3_int64 offset 
4f70: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
4f80: 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 74 6f 20  nto the file to 
4f90: 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74  begin writing at
4fa0: 20 2a 2f 0a 29 7b 0a 20 20 4c 4f 4e 47 20 75 70   */.){.  LONG up
4fb0: 70 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29  perBits = (LONG)
4fc0: 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20  ((offset>>32) & 
4fd0: 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 4c  0x7fffffff);.  L
4fe0: 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73 20 3d 20  ONG lowerBits = 
4ff0: 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20  (LONG)(offset & 
5000: 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 44  0xffffffff);.  D
5010: 57 4f 52 44 20 72 63 3b 0a 20 20 77 69 6e 46 69  WORD rc;.  winFi
5020: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
5030: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52  File*)id;.  DWOR
5040: 44 20 65 72 72 6f 72 3b 0a 20 20 44 57 4f 52 44  D error;.  DWORD
5050: 20 77 72 6f 74 65 20 3d 20 30 3b 0a 0a 20 20 61   wrote = 0;..  a
5060: 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
5070: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
5080: 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
5090: 49 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a 20 20  IOERR_WRITE);.  
50a0: 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
50b0: 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
50c0: 49 54 45 5f 46 55 4c 4c 29 3b 0a 20 20 4f 53 54  ITE_FULL);.  OST
50d0: 52 41 43 45 33 28 22 57 52 49 54 45 20 25 64 20  RACE3("WRITE %d 
50e0: 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c  lock=%d\n", pFil
50f0: 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
5100: 6b 74 79 70 65 29 3b 0a 20 20 72 63 20 3d 20 53  ktype);.  rc = S
5110: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 70 46  etFilePointer(pF
5120: 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74  ile->h, lowerBit
5130: 73 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20 46  s, &upperBits, F
5140: 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 20 20 69 66  ILE_BEGIN);.  if
5150: 28 20 72 63 3d 3d 49 4e 56 41 4c 49 44 5f 53 45  ( rc==INVALID_SE
5160: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 26  T_FILE_POINTER &
5170: 26 20 28 65 72 72 6f 72 3d 47 65 74 4c 61 73 74  & (error=GetLast
5180: 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52  Error())!=NO_ERR
5190: 4f 52 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OR ){.    pFile-
51a0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
51b0: 6f 72 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  or;.    return S
51c0: 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a  QLITE_FULL;.  }.
51d0: 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
51e0: 29 3b 0a 20 20 77 68 69 6c 65 28 0a 20 20 20 20  );.  while(.    
51f0: 20 61 6d 74 3e 30 0a 20 20 20 20 20 26 26 20 28   amt>0.     && (
5200: 72 63 20 3d 20 57 72 69 74 65 46 69 6c 65 28 70  rc = WriteFile(p
5210: 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61  File->h, pBuf, a
5220: 6d 74 2c 20 26 77 72 6f 74 65 2c 20 30 29 29 21  mt, &wrote, 0))!
5230: 3d 30 0a 20 20 20 20 20 26 26 20 77 72 6f 74 65  =0.     && wrote
5240: 3e 30 0a 20 20 29 7b 0a 20 20 20 20 61 6d 74 20  >0.  ){.    amt 
5250: 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42  -= wrote;.    pB
5260: 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42  uf = &((char*)pB
5270: 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a  uf)[wrote];.  }.
5280: 20 20 69 66 28 20 21 72 63 20 7c 7c 20 61 6d 74    if( !rc || amt
5290: 3e 28 69 6e 74 29 77 72 6f 74 65 20 29 7b 0a 20  >(int)wrote ){. 
52a0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
52b0: 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72  rno = GetLastErr
52c0: 6f 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  or();.    return
52d0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
52e0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
52f0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
5300: 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20  runcate an open 
5310: 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66  file to a specif
5320: 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74  ied size.*/.stat
5330: 69 63 20 69 6e 74 20 77 69 6e 54 72 75 6e 63 61  ic int winTrunca
5340: 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  te(sqlite3_file 
5350: 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  *id, sqlite3_int
5360: 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 4c 4f 4e  64 nByte){.  LON
5370: 47 20 75 70 70 65 72 42 69 74 73 20 3d 20 28 4c  G upperBits = (L
5380: 4f 4e 47 29 28 28 6e 42 79 74 65 3e 3e 33 32 29  ONG)((nByte>>32)
5390: 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a   & 0x7fffffff);.
53a0: 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73    LONG lowerBits
53b0: 20 3d 20 28 4c 4f 4e 47 29 28 6e 42 79 74 65 20   = (LONG)(nByte 
53c0: 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  & 0xffffffff);. 
53d0: 20 44 57 4f 52 44 20 72 63 3b 0a 20 20 77 69 6e   DWORD rc;.  win
53e0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
53f0: 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57  inFile*)id;.  DW
5400: 4f 52 44 20 65 72 72 6f 72 3b 0a 0a 20 20 61 73  ORD error;..  as
5410: 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
5420: 20 4f 53 54 52 41 43 45 33 28 22 54 52 55 4e 43   OSTRACE3("TRUNC
5430: 41 54 45 20 25 64 20 25 6c 6c 64 5c 6e 22 2c 20  ATE %d %lld\n", 
5440: 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29  pFile->h, nByte)
5450: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
5460: 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
5470: 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
5480: 29 3b 0a 20 20 72 63 20 3d 20 53 65 74 46 69 6c  );.  rc = SetFil
5490: 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e  ePointer(pFile->
54a0: 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26 75  h, lowerBits, &u
54b0: 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42  pperBits, FILE_B
54c0: 45 47 49 4e 29 3b 0a 20 20 69 66 28 20 72 63 3d  EGIN);.  if( rc=
54d0: 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c  =INVALID_SET_FIL
54e0: 45 5f 50 4f 49 4e 54 45 52 20 26 26 20 28 65 72  E_POINTER && (er
54f0: 72 6f 72 3d 47 65 74 4c 61 73 74 45 72 72 6f 72  ror=GetLastError
5500: 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 20 29 7b  ())!=NO_ERROR ){
5510: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
5520: 45 72 72 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a 20  Errno = error;. 
5530: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5540: 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3b  _IOERR_TRUNCATE;
5550: 0a 20 20 7d 0a 20 20 2f 2a 20 53 65 74 45 6e 64  .  }.  /* SetEnd
5560: 4f 66 46 69 6c 65 20 77 69 6c 6c 20 66 61 69 6c  OfFile will fail
5570: 20 69 66 20 6e 42 79 74 65 20 69 73 20 6e 65 67   if nByte is neg
5580: 61 74 69 76 65 20 2a 2f 0a 20 20 69 66 28 20 21  ative */.  if( !
5590: 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 70 46 69  SetEndOfFile(pFi
55a0: 6c 65 2d 3e 68 29 20 29 7b 0a 20 20 20 20 70 46  le->h) ){.    pF
55b0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
55c0: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b   GetLastError();
55d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
55e0: 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
55f0: 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
5600: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
5610: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
5620: 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
5630: 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73   number of fulls
5640: 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20  yncs and normal 
5650: 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20  syncs.  This is 
5660: 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20  used to test.** 
5670: 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66  that syncs and f
5680: 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63  ullsyncs are occ
5690: 75 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67  uring at the rig
56a0: 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74  ht times..*/.int
56b0: 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
56c0: 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c  unt = 0;.int sql
56d0: 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
56e0: 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
56f0: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
5700: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61   all writes to a
5710: 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65   particular file
5720: 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74   are committed t
5730: 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  o disk..*/.stati
5740: 63 20 69 6e 74 20 77 69 6e 53 79 6e 63 28 73 71  c int winSync(sq
5750: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
5760: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 23 69 66 6e  int flags){.#ifn
5770: 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
5780: 4e 43 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  NC.  winFile *pF
5790: 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
57a0: 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  id;..  assert( i
57b0: 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43  d!=0 );.  OSTRAC
57c0: 45 33 28 22 53 59 4e 43 20 25 64 20 6c 6f 63 6b  E3("SYNC %d lock
57d0: 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
57e0: 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
57f0: 65 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53  e);.#else.  UNUS
5800: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 29  ED_PARAMETER(id)
5810: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  ;.#endif.#ifndef
5820: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 55   SQLITE_TEST.  U
5830: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
5840: 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65 0a 20 20  flags);.#else.  
5850: 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
5860: 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a  TE_SYNC_FULL ){.
5870: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c      sqlite3_full
5880: 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20  sync_count++;.  
5890: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  }.  sqlite3_sync
58a0: 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
58b0: 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70  .  /* If we comp
58c0: 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51  iled with the SQ
58d0: 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61  LITE_NO_SYNC fla
58e0: 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20  g, then syncing 
58f0: 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a  is a.  ** no-op.
5900: 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
5910: 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 20 20 72  TE_NO_SYNC.    r
5920: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5930: 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 46 6c 75  .#else.  if( Flu
5940: 73 68 46 69 6c 65 42 75 66 66 65 72 73 28 70 46  shFileBuffers(pF
5950: 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20 20 20 72  ile->h) ){.    r
5960: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5970: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
5980: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
5990: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b   GetLastError();
59a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
59b0: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 23 65  TE_IOERR;.  }.#e
59c0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ndif.}../*.** De
59d0: 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72  termine the curr
59e0: 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69  ent size of a fi
59f0: 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73  le in bytes.*/.s
5a00: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c  tatic int winFil
5a10: 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  eSize(sqlite3_fi
5a20: 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f  le *id, sqlite3_
5a30: 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  int64 *pSize){. 
5a40: 20 44 57 4f 52 44 20 75 70 70 65 72 42 69 74 73   DWORD upperBits
5a50: 3b 0a 20 20 44 57 4f 52 44 20 6c 6f 77 65 72 42  ;.  DWORD lowerB
5a60: 69 74 73 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  its;.  winFile *
5a70: 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
5a80: 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 65 72  *)id;.  DWORD er
5a90: 72 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ror;..  assert( 
5aa0: 69 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c  id!=0 );.  Simul
5ab0: 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
5ac0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
5ad0: 53 54 41 54 29 3b 0a 20 20 6c 6f 77 65 72 42 69  STAT);.  lowerBi
5ae0: 74 73 20 3d 20 47 65 74 46 69 6c 65 53 69 7a 65  ts = GetFileSize
5af0: 28 70 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65  (pFile->h, &uppe
5b00: 72 42 69 74 73 29 3b 0a 20 20 69 66 28 20 20 20  rBits);.  if(   
5b10: 28 6c 6f 77 65 72 42 69 74 73 20 3d 3d 20 49 4e  (lowerBits == IN
5b20: 56 41 4c 49 44 5f 46 49 4c 45 5f 53 49 5a 45 29  VALID_FILE_SIZE)
5b30: 0a 20 20 20 20 20 26 26 20 28 28 65 72 72 6f 72  .     && ((error
5b40: 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28   = GetLastError(
5b50: 29 29 20 21 3d 20 4e 4f 5f 45 52 52 4f 52 29 20  )) != NO_ERROR) 
5b60: 29 0a 20 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  ).  {.    pFile-
5b70: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
5b80: 6f 72 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  or;.    return S
5b90: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
5ba0: 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20  T;.  }.  *pSize 
5bb0: 3d 20 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74  = (((sqlite3_int
5bc0: 36 34 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33  64)upperBits)<<3
5bd0: 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a  2) + lowerBits;.
5be0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5bf0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43  OK;.}../*.** LOC
5c00: 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
5c10: 49 41 54 45 4c 59 20 69 73 20 75 6e 64 65 66 69  IATELY is undefi
5c20: 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e 64  ned on some Wind
5c30: 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a  ows systems..*/.
5c40: 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45  #ifndef LOCKFILE
5c50: 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
5c60: 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46  Y.# define LOCKF
5c70: 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
5c80: 54 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a 2f  TELY 1.#endif../
5c90: 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72  *.** Acquire a r
5ca0: 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44  eader lock..** D
5cb0: 69 66 66 65 72 65 6e 74 20 41 50 49 20 72 6f 75  ifferent API rou
5cc0: 74 69 6e 65 73 20 61 72 65 20 63 61 6c 6c 65 64  tines are called
5cd0: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
5ce0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 69  ether or not thi
5cf0: 73 0a 2a 2a 20 69 73 20 57 69 6e 39 35 20 6f 72  s.** is Win95 or
5d00: 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69   WinNT..*/.stati
5d10: 63 20 69 6e 74 20 67 65 74 52 65 61 64 4c 6f 63  c int getReadLoc
5d20: 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  k(winFile *pFile
5d30: 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ){.  int res;.  
5d40: 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
5d50: 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c    OVERLAPPED ovl
5d60: 70 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73  p;.    ovlp.Offs
5d70: 65 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  et = SHARED_FIRS
5d80: 54 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73  T;.    ovlp.Offs
5d90: 65 74 48 69 67 68 20 3d 20 30 3b 0a 20 20 20 20  etHigh = 0;.    
5da0: 6f 76 6c 70 2e 68 45 76 65 6e 74 20 3d 20 30 3b  ovlp.hEvent = 0;
5db0: 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46  .    res = LockF
5dc0: 69 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20  ileEx(pFile->h, 
5dd0: 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
5de0: 4d 45 44 49 41 54 45 4c 59 2c 0a 20 20 20 20 20  MEDIATELY,.     
5df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e00: 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20  0, SHARED_SIZE, 
5e10: 30 2c 20 26 6f 76 6c 70 29 3b 0a 2f 2a 20 69 73  0, &ovlp);./* is
5e20: 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c  NT() is 1 if SQL
5e30: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c  ITE_OS_WINCE==1,
5e40: 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73   so this else is
5e50: 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e   never executed.
5e60: 20 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f   .*/.#if SQLITE_
5e70: 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65  OS_WINCE==0.  }e
5e80: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 3b  lse{.    int lk;
5e90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  .    sqlite3_ran
5ea0: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 6c  domness(sizeof(l
5eb0: 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 70 46  k), &lk);.    pF
5ec0: 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
5ed0: 79 74 65 20 3d 20 28 73 68 6f 72 74 29 28 28 6c  yte = (short)((l
5ee0: 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25  k & 0x7fffffff)%
5ef0: 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31  (SHARED_SIZE - 1
5f00: 29 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f  ));.    res = Lo
5f10: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
5f20: 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46   SHARED_FIRST+pF
5f30: 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
5f40: 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 23  yte, 0, 1, 0);.#
5f50: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20  endif.  }.  if( 
5f60: 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  res == 0 ){.    
5f70: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
5f80: 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28   = GetLastError(
5f90: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
5fa0: 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  res;.}../*.** Un
5fb0: 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f  do a readlock.*/
5fc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 6c 6f  .static int unlo
5fd0: 63 6b 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69  ckReadLock(winFi
5fe0: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e  le *pFile){.  in
5ff0: 74 20 72 65 73 3b 0a 20 20 69 66 28 20 69 73 4e  t res;.  if( isN
6000: 54 28 29 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  T() ){.    res =
6010: 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c   UnlockFile(pFil
6020: 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
6030: 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49  ST, 0, SHARED_SI
6040: 5a 45 2c 20 30 29 3b 0a 2f 2a 20 69 73 4e 54 28  ZE, 0);./* isNT(
6050: 29 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 45  ) is 1 if SQLITE
6060: 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f  _OS_WINCE==1, so
6070: 20 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65   this else is ne
6080: 76 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a  ver executed. .*
6090: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
60a0: 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65  WINCE==0.  }else
60b0: 7b 0a 20 20 20 20 72 65 73 20 3d 20 55 6e 6c 6f  {.    res = Unlo
60c0: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
60d0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20   SHARED_FIRST + 
60e0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
60f0: 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b  kByte, 0, 1, 0);
6100: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66  .#endif.  }.  if
6110: 28 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20 20  ( res == 0 ){.  
6120: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
6130: 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f  no = GetLastErro
6140: 72 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  r();.  }.  retur
6150: 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
6160: 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
6170: 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
6180: 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
6190: 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e  er locktype - on
61a0: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
61b0: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
61c0: 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
61d0: 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
61e0: 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
61f0: 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
6200: 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
6210: 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
6220: 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
6230: 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
6240: 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
6250: 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
6260: 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
6270: 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
6280: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
6290: 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
62a0: 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
62b0: 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
62c0: 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
62d0: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
62e0: 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
62f0: 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
6300: 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
6310: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
6320: 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
6330: 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
6340: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
6350: 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
6360: 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
6370: 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
6380: 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
6390: 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
63a0: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
63b0: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
63c0: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
63d0: 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
63e0: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
63f0: 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
6400: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
6410: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
6420: 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
6430: 65 20 61 20 6c 6f 63 6b 2e 20 20 54 68 65 20 77  e a lock.  The w
6440: 69 6e 55 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69  inUnlock() routi
6450: 6e 65 0a 2a 2a 20 65 72 61 73 65 73 20 61 6c 6c  ne.** erases all
6460: 20 6c 6f 63 6b 73 20 61 74 20 6f 6e 63 65 20 61   locks at once a
6470: 6e 64 20 72 65 74 75 72 6e 73 20 75 73 20 69 6d  nd returns us im
6480: 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6c 6f 63  mediately to loc
6490: 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a  king level 0..**
64a0: 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
64b0: 62 6c 65 20 74 6f 20 6c 6f 77 65 72 20 74 68 65  ble to lower the
64c0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
64d0: 6e 65 20 73 74 65 70 20 61 74 20 61 20 74 69 6d  ne step at a tim
64e0: 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d 75 73 74 20  e.  You.** must 
64f0: 67 6f 20 73 74 72 61 69 67 68 74 20 74 6f 20 6c  go straight to l
6500: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a  ocking level 0..
6510: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
6520: 6e 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nLock(sqlite3_fi
6530: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
6540: 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  type){.  int rc 
6550: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
6560: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
6570: 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20  rom subroutines 
6580: 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31  */.  int res = 1
6590: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
65a0: 65 73 75 6c 74 20 6f 66 20 61 20 77 69 6e 64 6f  esult of a windo
65b0: 77 73 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a  ws lock call */.
65c0: 20 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70    int newLocktyp
65d0: 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  e;       /* Set 
65e0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
65f0: 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 62 65  to this value be
6600: 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a  fore exiting */.
6610: 20 20 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67    int gotPending
6620: 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65  Lock = 0;/* True
6630: 20 69 66 20 77 65 20 61 63 71 75 69 72 65 64 20   if we acquired 
6640: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74  a PENDING lock t
6650: 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20 77 69  his time */.  wi
6660: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
6670: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44  winFile*)id;.  D
6680: 57 4f 52 44 20 65 72 72 6f 72 20 3d 20 4e 4f 5f  WORD error = NO_
6690: 45 52 52 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74  ERROR;..  assert
66a0: 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54  ( id!=0 );.  OST
66b0: 52 41 43 45 35 28 22 4c 4f 43 4b 20 25 64 20 25  RACE5("LOCK %d %
66c0: 64 20 77 61 73 20 25 64 28 25 64 29 5c 6e 22 2c  d was %d(%d)\n",
66d0: 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
66e0: 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 70  ->h, locktype, p
66f0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
6700: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
6710: 6b 42 79 74 65 29 3b 0a 0a 20 20 2f 2a 20 49 66  kByte);..  /* If
6720: 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
6730: 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
6740: 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
6750: 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
6760: 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f  .  ** OsFile, do
6770: 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20   nothing. Don't 
6780: 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b  use the end_lock
6790: 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a  : exit path, as.
67a0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e    ** sqlite3OsEn
67b0: 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
67c0: 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
67d0: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
67e0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c  ile->locktype>=l
67f0: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
6800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6810: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
6820: 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
6830: 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
6840: 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65  rect.  */.  asse
6850: 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
6860: 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ype!=NO_LOCK || 
6870: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
6880: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
6890: 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e  t( locktype!=PEN
68a0: 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
68b0: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
68c0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
68d0: 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  | pFile->locktyp
68e0: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
68f0: 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65  ;..  /* Lock the
6900: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79   PENDING_LOCK by
6910: 74 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  te if we need to
6920: 20 61 63 71 75 69 72 65 20 61 20 50 45 4e 44 49   acquire a PENDI
6930: 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20  NG lock or.  ** 
6940: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20  a SHARED lock.  
6950: 49 66 20 77 65 20 61 72 65 20 61 63 71 75 69 72  If we are acquir
6960: 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
6970: 6b 2c 20 74 68 65 20 61 63 71 75 69 73 69 74 69  k, the acquisiti
6980: 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50  on of.  ** the P
6990: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65  ENDING_LOCK byte
69a0: 20 69 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20   is temporary.. 
69b0: 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70   */.  newLocktyp
69c0: 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  e = pFile->lockt
69d0: 79 70 65 3b 0a 20 20 69 66 28 20 20 20 28 70 46  ype;.  if(   (pF
69e0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e  ile->locktype==N
69f0: 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 7c 7c 20  O_LOCK).     || 
6a00: 28 20 20 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45  (   (locktype==E
6a10: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20  XCLUSIVE_LOCK). 
6a20: 20 20 20 20 20 20 20 20 26 26 20 28 70 46 69 6c          && (pFil
6a30: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53  e->locktype==RES
6a40: 45 52 56 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29  ERVED_LOCK)).  )
6a50: 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20  {.    int cnt = 
6a60: 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6e  3;.    while( cn
6a70: 74 2d 2d 3e 30 20 26 26 20 28 72 65 73 20 3d 20  t-->0 && (res = 
6a80: 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e  LockFile(pFile->
6a90: 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  h, PENDING_BYTE,
6aa0: 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b   0, 1, 0))==0 ){
6ab0: 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 33 20  .      /* Try 3 
6ac0: 74 69 6d 65 73 20 74 6f 20 67 65 74 20 74 68 65  times to get the
6ad0: 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20   pending lock.  
6ae0: 54 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  The pending lock
6af0: 20 6d 69 67 68 74 20 62 65 0a 20 20 20 20 20 20   might be.      
6b00: 2a 2a 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68  ** held by anoth
6b10: 65 72 20 72 65 61 64 65 72 20 70 72 6f 63 65 73  er reader proces
6b20: 73 20 77 68 6f 20 77 69 6c 6c 20 72 65 6c 65 61  s who will relea
6b30: 73 65 20 69 74 20 6d 6f 6d 65 6e 74 61 72 69 6c  se it momentaril
6b40: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
6b50: 20 20 4f 53 54 52 41 43 45 32 28 22 63 6f 75 6c    OSTRACE2("coul
6b60: 64 20 6e 6f 74 20 67 65 74 20 61 20 50 45 4e 44  d not get a PEND
6b70: 49 4e 47 20 6c 6f 63 6b 2e 20 63 6e 74 3d 25 64  ING lock. cnt=%d
6b80: 5c 6e 22 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20  \n", cnt);.     
6b90: 20 53 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d   Sleep(1);.    }
6ba0: 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c  .    gotPendingL
6bb0: 6f 63 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20 69  ock = res;.    i
6bc0: 66 28 20 21 72 65 73 20 29 7b 0a 20 20 20 20 20  f( !res ){.     
6bd0: 20 65 72 72 6f 72 20 3d 20 47 65 74 4c 61 73 74   error = GetLast
6be0: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20  Error();.    }. 
6bf0: 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
6c00: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20   a shared lock. 
6c10: 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
6c20: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
6c30: 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73  && res ){.    as
6c40: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
6c50: 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  ktype==NO_LOCK )
6c60: 3b 0a 20 20 20 20 72 65 73 20 3d 20 67 65 74 52  ;.    res = getR
6c70: 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  eadLock(pFile);.
6c80: 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20      if( res ){. 
6c90: 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65       newLocktype
6ca0: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
6cb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6cc0: 20 65 72 72 6f 72 20 3d 20 47 65 74 4c 61 73 74   error = GetLast
6cd0: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20  Error();.    }. 
6ce0: 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
6cf0: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
6d00: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
6d10: 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c  type==RESERVED_L
6d20: 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20  OCK && res ){.  
6d30: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
6d40: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  >locktype==SHARE
6d50: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65  D_LOCK );.    re
6d60: 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69  s = LockFile(pFi
6d70: 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f  le->h, RESERVED_
6d80: 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
6d90: 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20      if( res ){. 
6da0: 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65       newLocktype
6db0: 20 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b   = RESERVED_LOCK
6dc0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6dd0: 20 20 20 65 72 72 6f 72 20 3d 20 47 65 74 4c 61     error = GetLa
6de0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d  stError();.    }
6df0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
6e00: 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  re a PENDING loc
6e10: 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  k.  */.  if( loc
6e20: 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
6e30: 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
6e40: 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20      newLocktype 
6e50: 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
6e60: 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f      gotPendingLo
6e70: 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ck = 0;.  }..  /
6e80: 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58 43  * Acquire an EXC
6e90: 4c 55 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f  LUSIVE lock.  */
6ea0: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
6eb0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
6ec0: 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73  && res ){.    as
6ed0: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
6ee0: 6b 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f  ktype>=SHARED_LO
6ef0: 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  CK );.    res = 
6f00: 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70  unlockReadLock(p
6f10: 46 69 6c 65 29 3b 0a 20 20 20 20 4f 53 54 52 41  File);.    OSTRA
6f20: 43 45 32 28 22 75 6e 72 65 61 64 6c 6f 63 6b 20  CE2("unreadlock 
6f30: 3d 20 25 64 5c 6e 22 2c 20 72 65 73 29 3b 0a 20  = %d\n", res);. 
6f40: 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c     res = LockFil
6f50: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  e(pFile->h, SHAR
6f60: 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41  ED_FIRST, 0, SHA
6f70: 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
6f80: 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
6f90: 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d     newLocktype =
6fa0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b   EXCLUSIVE_LOCK;
6fb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6fc0: 20 20 65 72 72 6f 72 20 3d 20 47 65 74 4c 61 73    error = GetLas
6fd0: 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
6fe0: 4f 53 54 52 41 43 45 32 28 22 65 72 72 6f 72 2d  OSTRACE2("error-
6ff0: 63 6f 64 65 20 3d 20 25 64 5c 6e 22 2c 20 65 72  code = %d\n", er
7000: 72 6f 72 29 3b 0a 20 20 20 20 20 20 67 65 74 52  ror);.      getR
7010: 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  eadLock(pFile);.
7020: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
7030: 49 66 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e  If we are holdin
7040: 67 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  g a PENDING lock
7050: 20 74 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62   that ought to b
7060: 65 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e  e released, then
7070: 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74  .  ** release it
7080: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
7090: 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
70a0: 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  && locktype==SHA
70b0: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
70c0: 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65  UnlockFile(pFile
70d0: 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ->h, PENDING_BYT
70e0: 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  E, 0, 1, 0);.  }
70f0: 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
7100: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 6c  e state of the l
7110: 6f 63 6b 20 68 61 73 20 68 65 6c 64 20 69 6e 20  ock has held in 
7120: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
7130: 74 6f 72 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65  tor then.  ** re
7140: 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72  turn the appropr
7150: 69 61 74 65 20 72 65 73 75 6c 74 20 63 6f 64 65  iate result code
7160: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73  ..  */.  if( res
7170: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
7180: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
7190: 0a 20 20 20 20 4f 53 54 52 41 43 45 34 28 22 4c  .    OSTRACE4("L
71a0: 4f 43 4b 20 46 41 49 4c 45 44 20 25 64 20 74 72  OCK FAILED %d tr
71b0: 79 69 6e 67 20 66 6f 72 20 25 64 20 62 75 74 20  ying for %d but 
71c0: 67 6f 74 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65  got %d\n", pFile
71d0: 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
71e0: 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63  locktype, newLoc
71f0: 6b 74 79 70 65 29 3b 0a 20 20 20 20 70 46 69 6c  ktype);.    pFil
7200: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
7210: 72 72 6f 72 3b 0a 20 20 20 20 72 63 20 3d 20 53  rror;.    rc = S
7220: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
7230: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
7240: 65 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74  e = (u8)newLockt
7250: 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ype;.  return rc
7260: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
7270: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
7280: 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
7290: 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
72a0: 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
72b0: 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
72c0: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
72d0: 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
72e0: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72   lock is held, r
72f0: 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
7300: 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65 72  o, otherwise zer
7310: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
7320: 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65   winCheckReserve
7330: 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
7340: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
7350: 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  sOut){.  int rc;
7360: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
7370: 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
7380: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ;..  assert( id!
7390: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  =0 );.  if( pFil
73a0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53  e->locktype>=RES
73b0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
73c0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 4f 53    rc = 1;.    OS
73d0: 54 52 41 43 45 33 28 22 54 45 53 54 20 57 52 2d  TRACE3("TEST WR-
73e0: 4c 4f 43 4b 20 25 64 20 25 64 20 28 6c 6f 63 61  LOCK %d %d (loca
73f0: 6c 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  l)\n", pFile->h,
7400: 20 72 63 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   rc);.  }else{. 
7410: 20 20 20 72 63 20 3d 20 4c 6f 63 6b 46 69 6c 65     rc = LockFile
7420: 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52  (pFile->h, RESER
7430: 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  VED_BYTE, 0, 1, 
7440: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
7450: 7b 0a 20 20 20 20 20 20 55 6e 6c 6f 63 6b 46 69  {.      UnlockFi
7460: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53  le(pFile->h, RES
7470: 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31  ERVED_BYTE, 0, 1
7480: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
7490: 72 63 20 3d 20 21 72 63 3b 0a 20 20 20 20 4f 53  rc = !rc;.    OS
74a0: 54 52 41 43 45 33 28 22 54 45 53 54 20 57 52 2d  TRACE3("TEST WR-
74b0: 4c 4f 43 4b 20 25 64 20 25 64 20 28 72 65 6d 6f  LOCK %d %d (remo
74c0: 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  te)\n", pFile->h
74d0: 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 2a 70 52  , rc);.  }.  *pR
74e0: 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 72 65  esOut = rc;.  re
74f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7500: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
7510: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
7520: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
7530: 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79  tor id to lockty
7540: 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a  pe.  locktype.**
7550: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
7560: 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
7570: 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
7580: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
7590: 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
75a0: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
75b0: 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
75c0: 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
75d0: 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
75e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
75f0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
7600: 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
7610: 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74  le for this rout
7620: 69 6e 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74  ine to fail if t
7630: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
7640: 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b  nt.** is NO_LOCK
7650: 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
7660: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41   argument is SHA
7670: 52 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68  RED_LOCK then th
7680: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69  is routine.** mi
7690: 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ght return SQLIT
76a0: 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74  E_IOERR;.*/.stat
76b0: 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b  ic int winUnlock
76c0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
76d0: 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
76e0: 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20  {.  int type;.  
76f0: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
7700: 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
7710: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
7720: 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
7730: 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  File!=0 );.  ass
7740: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53  ert( locktype<=S
7750: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
7760: 4f 53 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b  OSTRACE5("UNLOCK
7770: 20 25 64 20 74 6f 20 25 64 20 77 61 73 20 25 64   %d to %d was %d
7780: 28 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  (%d)\n", pFile->
7790: 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20  h, locktype,.   
77a0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f         pFile->lo
77b0: 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73  cktype, pFile->s
77c0: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 29 3b 0a  haredLockByte);.
77d0: 20 20 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e    type = pFile->
77e0: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20  locktype;.  if( 
77f0: 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f  type>=EXCLUSIVE_
7800: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f  LOCK ){.    Unlo
7810: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
7820: 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
7830: 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30  , SHARED_SIZE, 0
7840: 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74  );.    if( lockt
7850: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
7860: 20 26 26 20 21 67 65 74 52 65 61 64 4c 6f 63 6b   && !getReadLock
7870: 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20  (pFile) ){.     
7880: 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20   /* This should 
7890: 6e 65 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57  never happen.  W
78a0: 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  e should always 
78b0: 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20  be able to.     
78c0: 20 2a 2a 20 72 65 61 63 71 75 69 72 65 20 74 68   ** reacquire th
78d0: 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  e read lock */. 
78e0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
78f0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
7900: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74     }.  }.  if( t
7910: 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype>=RESERVED_LO
7920: 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b  CK ){.    Unlock
7930: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52  File(pFile->h, R
7940: 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c  ESERVED_BYTE, 0,
7950: 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   1, 0);.  }.  if
7960: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ( locktype==NO_L
7970: 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53 48 41  OCK && type>=SHA
7980: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
7990: 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70  unlockReadLock(p
79a0: 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  File);.  }.  if(
79b0: 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c   type>=PENDING_L
79c0: 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63  OCK ){.    Unloc
79d0: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
79e0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c  PENDING_BYTE, 0,
79f0: 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 46   1, 0);.  }.  pF
7a00: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
7a10: 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  (u8)locktype;.  
7a20: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7a30: 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e 64 20  .** Control and 
7a40: 71 75 65 72 79 20 6f 66 20 74 68 65 20 6f 70 65  query of the ope
7a50: 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a  n file handle..*
7a60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
7a70: 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69  FileControl(sqli
7a80: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
7a90: 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
7aa0: 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  ){.  switch( op 
7ab0: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
7ac0: 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41  TE_FCNTL_LOCKSTA
7ad0: 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e  TE: {.      *(in
7ae0: 74 2a 29 70 41 72 67 20 3d 20 28 28 77 69 6e 46  t*)pArg = ((winF
7af0: 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74 79  ile*)id)->lockty
7b00: 70 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  pe;.      return
7b10: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
7b20: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
7b30: 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a  E_LAST_ERRNO: {.
7b40: 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
7b50: 67 20 3d 20 28 69 6e 74 29 28 28 77 69 6e 46 69  g = (int)((winFi
7b60: 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
7b70: 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  no;.      return
7b80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
7b90: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
7ba0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
7bb0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
7bc0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20   sector size in 
7bd0: 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64  bytes of the und
7be0: 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65  erlying block de
7bf0: 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  vice for.** the 
7c00: 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20  specified file. 
7c10: 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61  This is almost a
7c20: 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c  lways 512 bytes,
7c30: 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c   but may be.** l
7c40: 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64  arger for some d
7c50: 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51  evices..**.** SQ
7c60: 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65  Lite code assume
7c70: 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
7c80: 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20  cannot fail. It 
7c90: 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61  also assumes tha
7ca0: 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65  t.** if two file
7cb0: 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e  s are created in
7cc0: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73   the same file-s
7cd0: 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20  ystem directory 
7ce0: 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62  (i.e..** a datab
7cf0: 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72  ase and its jour
7d00: 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74  nal file) that t
7d10: 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77  he sector size w
7d20: 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61  ill be the.** sa
7d30: 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a  me for both..*/.
7d40: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65  static int winSe
7d50: 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
7d60: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 61 73  _file *id){.  as
7d70: 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
7d80: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28 28 28   return (int)(((
7d90: 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 73 65  winFile*)id)->se
7da0: 63 74 6f 72 53 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a  ctorSize);.}../*
7db0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65 63  .** Return a vec
7dc0: 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63 68  tor of device ch
7dd0: 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a 2a  aracteristics..*
7de0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
7df0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
7e00: 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69  stics(sqlite3_fi
7e10: 6c 65 20 2a 69 64 29 7b 0a 20 20 55 4e 55 53 45  le *id){.  UNUSE
7e20: 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b  D_PARAMETER(id);
7e30: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
7e40: 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f  /*.** This vecto
7e50: 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68  r defines all th
7e60: 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63  e methods that c
7e70: 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e  an operate on an
7e80: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  .** sqlite3_file
7e90: 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73   for win32..*/.s
7ea0: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
7eb0: 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77  te3_io_methods w
7ec0: 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20  inIoMethod = {. 
7ed0: 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
7ee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
7ef0: 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43  ersion */.  winC
7f00: 6c 6f 73 65 2c 0a 20 20 77 69 6e 52 65 61 64 2c  lose,.  winRead,
7f10: 0a 20 20 77 69 6e 57 72 69 74 65 2c 0a 20 20 77  .  winWrite,.  w
7f20: 69 6e 54 72 75 6e 63 61 74 65 2c 0a 20 20 77 69  inTruncate,.  wi
7f30: 6e 53 79 6e 63 2c 0a 20 20 77 69 6e 46 69 6c 65  nSync,.  winFile
7f40: 53 69 7a 65 2c 0a 20 20 77 69 6e 4c 6f 63 6b 2c  Size,.  winLock,
7f50: 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 0a 20 20  .  winUnlock,.  
7f60: 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64  winCheckReserved
7f70: 4c 6f 63 6b 2c 0a 20 20 77 69 6e 46 69 6c 65 43  Lock,.  winFileC
7f80: 6f 6e 74 72 6f 6c 2c 0a 20 20 77 69 6e 53 65 63  ontrol,.  winSec
7f90: 74 6f 72 53 69 7a 65 2c 0a 20 20 77 69 6e 44 65  torSize,.  winDe
7fa0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
7fb0: 69 63 73 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ics.};../*******
7fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8000: 2a 2a 2a 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64  ****.** Here end
8010: 73 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64  s the I/O method
8020: 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  s that form the 
8030: 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
8040: 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  ds object..**.**
8050: 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20   The next block 
8060: 6f 66 20 63 6f 64 65 20 69 6d 70 6c 65 6d 65 6e  of code implemen
8070: 74 73 20 74 68 65 20 56 46 53 20 6d 65 74 68 6f  ts the VFS metho
8080: 64 73 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds..************
8090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80d0: 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  /../*.** Convert
80e0: 20 61 20 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d   a UTF-8 filenam
80f0: 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20  e into whatever 
8100: 66 6f 72 6d 20 74 68 65 20 75 6e 64 65 72 6c 79  form the underly
8110: 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67  ing.** operating
8120: 20 73 79 73 74 65 6d 20 77 61 6e 74 73 20 66 69   system wants fi
8130: 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20 53 70 61  lenames in.  Spa
8140: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
8150: 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61  esult.** is obta
8160: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
8170: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
8180: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
8190: 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  g.** function..*
81a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 63  /.static void *c
81b0: 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61  onvertUtf8Filena
81c0: 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  me(const char *z
81d0: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69  Filename){.  voi
81e0: 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  d *zConverted = 
81f0: 30 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  0;.  if( isNT() 
8200: 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65  ){.    zConverte
8210: 64 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64  d = utf8ToUnicod
8220: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 2f 2a  e(zFilename);./*
8230: 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20   isNT() is 1 if 
8240: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
8250: 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65  =1, so this else
8260: 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74   is never execut
8270: 65 64 2e 20 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  ed. .*/.#if SQLI
8280: 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20  TE_OS_WINCE==0. 
8290: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e   }else{.    zCon
82a0: 76 65 72 74 65 64 20 3d 20 75 74 66 38 54 6f 4d  verted = utf8ToM
82b0: 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  bcs(zFilename);.
82c0: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 2f 2a 20  #endif.  }.  /* 
82d0: 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64  caller will hand
82e0: 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  le out of memory
82f0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f   */.  return zCo
8300: 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  nverted;.}../*.*
8310: 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f  * Create a tempo
8320: 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69  rary file name i
8330: 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75  n zBuf.  zBuf mu
8340: 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68  st be big enough
8350: 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 70   to.** hold at p
8360: 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
8370: 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73  characters..*/.s
8380: 74 61 74 69 63 20 69 6e 74 20 67 65 74 54 65 6d  tatic int getTem
8390: 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20  pname(int nBuf, 
83a0: 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73  char *zBuf){.  s
83b0: 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61 72  tatic char zChar
83c0: 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65  s[] =.    "abcde
83d0: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
83e0: 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44  vwxyz".    "ABCD
83f0: 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
8400: 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32  UVWXYZ".    "012
8410: 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a 65  3456789";.  size
8420: 5f 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20  _t i, j;.  char 
8430: 7a 54 65 6d 70 50 61 74 68 5b 4d 41 58 5f 50 41  zTempPath[MAX_PA
8440: 54 48 2b 31 5d 3b 0a 20 20 69 66 28 20 73 71 6c  TH+1];.  if( sql
8450: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
8460: 6f 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ory ){.    sqlit
8470: 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f  e3_snprintf(MAX_
8480: 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61  PATH-30, zTempPa
8490: 74 68 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  th, "%s", sqlite
84a0: 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
84b0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  );.  }else if( i
84c0: 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61  sNT() ){.    cha
84d0: 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 57  r *zMulti;.    W
84e0: 43 48 41 52 20 7a 57 69 64 65 50 61 74 68 5b 4d  CHAR zWidePath[M
84f0: 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 47 65  AX_PATH];.    Ge
8500: 74 54 65 6d 70 50 61 74 68 57 28 4d 41 58 5f 50  tTempPathW(MAX_P
8510: 41 54 48 2d 33 30 2c 20 7a 57 69 64 65 50 61 74  ATH-30, zWidePat
8520: 68 29 3b 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d  h);.    zMulti =
8530: 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a   unicodeToUtf8(z
8540: 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 69  WidePath);.    i
8550: 66 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20  f( zMulti ){.   
8560: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8570: 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c  ntf(MAX_PATH-30,
8580: 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22   zTempPath, "%s"
8590: 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20  , zMulti);.     
85a0: 20 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20   free(zMulti);. 
85b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
85c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
85d0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 2f 2a 20 69 73  MEM;.    }./* is
85e0: 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c  NT() is 1 if SQL
85f0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c  ITE_OS_WINCE==1,
8600: 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73   so this else is
8610: 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e   never executed.
8620: 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41   .** Since the A
8630: 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f 66 20  SCII version of 
8640: 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50  these Windows AP
8650: 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66  I do not exist f
8660: 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27  or WINCE,.** it'
8670: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e  s important to n
8680: 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ot reference the
8690: 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c  m for WINCE buil
86a0: 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ds..*/.#if SQLIT
86b0: 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20  E_OS_WINCE==0.  
86c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
86d0: 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63 68 61 72  *zUtf8;.    char
86e0: 20 7a 4d 62 63 73 50 61 74 68 5b 4d 41 58 5f 50   zMbcsPath[MAX_P
86f0: 41 54 48 5d 3b 0a 20 20 20 20 47 65 74 54 65 6d  ATH];.    GetTem
8700: 70 50 61 74 68 41 28 4d 41 58 5f 50 41 54 48 2d  pPathA(MAX_PATH-
8710: 33 30 2c 20 7a 4d 62 63 73 50 61 74 68 29 3b 0a  30, zMbcsPath);.
8720: 20 20 20 20 7a 55 74 66 38 20 3d 20 73 71 6c 69      zUtf8 = sqli
8730: 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
8740: 6f 5f 75 74 66 38 28 7a 4d 62 63 73 50 61 74 68  o_utf8(zMbcsPath
8750: 29 3b 0a 20 20 20 20 69 66 28 20 7a 55 74 66 38  );.    if( zUtf8
8760: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8770: 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
8780: 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74  ATH-30, zTempPat
8790: 68 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b  h, "%s", zUtf8);
87a0: 0a 20 20 20 20 20 20 66 72 65 65 28 7a 55 74 66  .      free(zUtf
87b0: 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  8);.    }else{. 
87c0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
87d0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
87e0: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 66 6f 72  #endif.  }.  for
87f0: 28 69 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  (i=sqlite3Strlen
8800: 33 30 28 7a 54 65 6d 70 50 61 74 68 29 3b 20 69  30(zTempPath); i
8810: 3e 30 20 26 26 20 7a 54 65 6d 70 50 61 74 68 5b  >0 && zTempPath[
8820: 69 2d 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d 2d 29  i-1]=='\\'; i--)
8830: 7b 7d 0a 20 20 7a 54 65 6d 70 50 61 74 68 5b 69  {}.  zTempPath[i
8840: 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
8850: 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 33  _snprintf(nBuf-3
8860: 30 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20  0, zBuf,.       
8870: 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73 5c              "%s\
8880: 5c 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  \"SQLITE_TEMP_FI
8890: 4c 45 5f 50 52 45 46 49 58 2c 20 7a 54 65 6d 70  LE_PREFIX, zTemp
88a0: 50 61 74 68 29 3b 0a 20 20 6a 20 3d 20 73 71 6c  Path);.  j = sql
88b0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75  ite3Strlen30(zBu
88c0: 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61  f);.  sqlite3_ra
88d0: 6e 64 6f 6d 6e 65 73 73 28 32 30 2c 20 26 7a 42  ndomness(20, &zB
88e0: 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  uf[j]);.  for(i=
88f0: 30 3b 20 69 3c 32 30 3b 20 69 2b 2b 2c 20 6a 2b  0; i<20; i++, j+
8900: 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20  +){.    zBuf[j] 
8910: 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20  = (char)zChars[ 
8920: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29  ((unsigned char)
8930: 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66  zBuf[j])%(sizeof
8940: 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20  (zChars)-1) ];. 
8950: 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30   }.  zBuf[j] = 0
8960: 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 54 45  ;.  OSTRACE2("TE
8970: 4d 50 20 46 49 4c 45 4e 41 4d 45 3a 20 25 73 5c  MP FILENAME: %s\
8980: 6e 22 2c 20 7a 42 75 66 29 3b 0a 20 20 72 65 74  n", zBuf);.  ret
8990: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a  urn SQLITE_OK; .
89a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65 74  }../*.** The ret
89b0: 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 67 65 74  urn value of get
89c0: 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a 2a 2a 20  LastErrorMsg.** 
89d0: 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65  is zero if the e
89e0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74  rror message fit
89f0: 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c  s in the buffer,
8a00: 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20   or non-zero.** 
8a10: 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74 68  otherwise (if th
8a20: 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74 72  e message was tr
8a30: 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a 73 74 61  uncated)..*/.sta
8a40: 74 69 63 20 69 6e 74 20 67 65 74 4c 61 73 74 45  tic int getLastE
8a50: 72 72 6f 72 4d 73 67 28 69 6e 74 20 6e 42 75 66  rrorMsg(int nBuf
8a60: 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
8a70: 20 44 57 4f 52 44 20 65 72 72 6f 72 20 3d 20 47   DWORD error = G
8a80: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 0a  etLastError();..
8a90: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
8aa0: 4e 43 45 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  NCE.  sqlite3_sn
8ab0: 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75  printf(nBuf, zBu
8ac0: 66 2c 20 22 4f 73 45 72 72 6f 72 20 30 78 25 78  f, "OsError 0x%x
8ad0: 20 28 25 75 29 22 2c 20 65 72 72 6f 72 2c 20 65   (%u)", error, e
8ae0: 72 72 6f 72 29 3b 0a 23 65 6c 73 65 0a 20 20 2f  rror);.#else.  /
8af0: 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20  * FormatMessage 
8b00: 72 65 74 75 72 6e 73 20 30 20 6f 6e 20 66 61 69  returns 0 on fai
8b10: 6c 75 72 65 2e 20 20 4f 74 68 65 72 77 69 73 65  lure.  Otherwise
8b20: 20 69 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73   it.  ** returns
8b30: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 54   the number of T
8b40: 43 48 41 52 73 20 77 72 69 74 74 65 6e 20 74 6f  CHARs written to
8b50: 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 2a 2a   the output.  **
8b60: 20 62 75 66 66 65 72 2c 20 65 78 63 6c 75 64 69   buffer, excludi
8b70: 6e 67 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69  ng the terminati
8b80: 6e 67 20 6e 75 6c 6c 20 63 68 61 72 2e 0a 20 20  ng null char..  
8b90: 2a 2f 0a 20 20 69 66 20 28 21 46 6f 72 6d 61 74  */.  if (!Format
8ba0: 4d 65 73 73 61 67 65 41 28 46 4f 52 4d 41 54 5f  MessageA(FORMAT_
8bb0: 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53  MESSAGE_FROM_SYS
8bc0: 54 45 4d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  TEM,.           
8bd0: 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c             NULL,
8be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8bf0: 20 20 20 20 20 20 20 65 72 72 6f 72 2c 0a 20 20         error,.  
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c10: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
8c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 42 75               zBu
8c30: 66 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f,.             
8c40: 20 20 20 20 20 20 20 20 20 6e 42 75 66 2d 31 2c           nBuf-1,
8c50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8c60: 20 20 20 20 20 20 20 30 29 29 0a 20 20 7b 0a 20         0)).  {. 
8c70: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8c80: 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20  ntf(nBuf, zBuf, 
8c90: 22 4f 73 45 72 72 6f 72 20 30 78 25 78 20 28 25  "OsError 0x%x (%
8ca0: 75 29 22 2c 20 65 72 72 6f 72 2c 20 65 72 72 6f  u)", error, erro
8cb0: 72 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  r);.  }.#endif..
8cc0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
8cd0: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65  *.** Open a file
8ce0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8cf0: 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  winOpen(.  sqlit
8d00: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
8d10: 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64       /* Not used
8d20: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
8d30: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
8d40: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
8d50: 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20  ile (UTF-8) */. 
8d60: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
8d70: 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  d,         /* Wr
8d80: 69 74 65 20 74 68 65 20 53 51 4c 69 74 65 20 66  ite the SQLite f
8d90: 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20  ile handle here 
8da0: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8dc0: 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67  * Open mode flag
8dd0: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74  s */.  int *pOut
8de0: 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
8df0: 20 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75 72   /* Status retur
8e00: 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  n flags */.){.  
8e10: 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52  HANDLE h;.  DWOR
8e20: 44 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73  D dwDesiredAcces
8e30: 73 3b 0a 20 20 44 57 4f 52 44 20 64 77 53 68 61  s;.  DWORD dwSha
8e40: 72 65 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20  reMode;.  DWORD 
8e50: 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
8e60: 69 74 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64  ition;.  DWORD d
8e70: 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
8e80: 74 65 73 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c  tes = 0;.#if SQL
8e90: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69  ITE_OS_WINCE.  i
8ea0: 6e 74 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23  nt isTemp = 0;.#
8eb0: 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20  endif.  winFile 
8ec0: 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
8ed0: 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a  e*)id;.  void *z
8ee0: 43 6f 6e 76 65 72 74 65 64 3b 20 20 20 20 20 20  Converted;      
8ef0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8f00: 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65 6e 63  lename in OS enc
8f10: 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74  oding */.  const
8f20: 20 63 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65   char *zUtf8Name
8f30: 20 3d 20 7a 4e 61 6d 65 3b 20 20 20 20 2f 2a 20   = zName;    /* 
8f40: 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d  Filename in UTF-
8f50: 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20  8 encoding */.  
8f60: 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41  char zTmpname[MA
8f70: 58 5f 50 41 54 48 2b 31 5d 3b 20 20 20 20 20 20  X_PATH+1];      
8f80: 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64    /* Buffer used
8f90: 20 74 6f 20 63 72 65 61 74 65 20 74 65 6d 70 20   to create temp 
8fa0: 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 0a 20 20 61  filename */..  a
8fb0: 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
8fc0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
8fd0: 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 2f 2a 20  ER(pVfs);..  /* 
8fe0: 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
8ff0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
9000: 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c  unction is NULL,
9010: 20 67 65 6e 65 72 61 74 65 20 61 20 0a 20 20 2a   generate a .  *
9020: 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  * temporary file
9030: 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 0a 20 20   name to use .  
9040: 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e  */.  if( !zUtf8N
9050: 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ame ){.    int r
9060: 63 20 3d 20 67 65 74 54 65 6d 70 6e 61 6d 65 28  c = getTempname(
9070: 4d 41 58 5f 50 41 54 48 2b 31 2c 20 7a 54 6d 70  MAX_PATH+1, zTmp
9080: 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  name);.    if( r
9090: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
90a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
90b0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38  .    }.    zUtf8
90c0: 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b  Name = zTmpname;
90d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65  .  }..  /* Conve
90e0: 72 74 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  rt the filename 
90f0: 74 6f 20 74 68 65 20 73 79 73 74 65 6d 20 65 6e  to the system en
9100: 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f  coding. */.  zCo
9110: 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72  nverted = conver
9120: 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 55  tUtf8Filename(zU
9130: 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  tf8Name);.  if( 
9140: 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
9150: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9160: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
9170: 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
9180: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
9190: 54 45 20 29 7b 0a 20 20 20 20 64 77 44 65 73 69  TE ){.    dwDesi
91a0: 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45  redAccess = GENE
91b0: 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52  RIC_READ | GENER
91c0: 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73  IC_WRITE;.  }els
91d0: 65 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64  e{.    dwDesired
91e0: 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43  Access = GENERIC
91f0: 5f 52 45 41 44 3b 0a 20 20 7d 0a 20 20 69 66 28  _READ;.  }.  if(
9200: 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
9210: 4f 50 45 4e 5f 43 52 45 41 54 45 20 29 7b 0a 20  OPEN_CREATE ){. 
9220: 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
9230: 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f  position = OPEN_
9240: 41 4c 57 41 59 53 3b 0a 20 20 7d 65 6c 73 65 7b  ALWAYS;.  }else{
9250: 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44  .    dwCreationD
9260: 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45  isposition = OPE
9270: 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a  N_EXISTING;.  }.
9280: 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
9290: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
92a0: 42 20 29 7b 0a 20 20 20 20 64 77 53 68 61 72 65  B ){.    dwShare
92b0: 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48 41 52  Mode = FILE_SHAR
92c0: 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48  E_READ | FILE_SH
92d0: 41 52 45 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c  ARE_WRITE;.  }el
92e0: 73 65 7b 0a 20 20 20 20 64 77 53 68 61 72 65 4d  se{.    dwShareM
92f0: 6f 64 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ode = 0;.  }.  i
9300: 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
9310: 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
9320: 4c 4f 53 45 20 29 7b 0a 23 69 66 20 53 51 4c 49  LOSE ){.#if SQLI
9330: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  TE_OS_WINCE.    
9340: 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
9350: 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52  utes = FILE_ATTR
9360: 49 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20  IBUTE_HIDDEN;.  
9370: 20 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65    isTemp = 1;.#e
9380: 6c 73 65 0a 20 20 20 20 64 77 46 6c 61 67 73 41  lse.    dwFlagsA
9390: 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46  ndAttributes = F
93a0: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45  ILE_ATTRIBUTE_TE
93b0: 4d 50 4f 52 41 52 59 0a 20 20 20 20 20 20 20 20  MPORARY.        
93c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93d0: 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 41 54         | FILE_AT
93e0: 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 0a 20  TRIBUTE_HIDDEN. 
93f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
9410: 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45  FILE_FLAG_DELETE
9420: 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69  _ON_CLOSE;.#endi
9430: 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  f.  }else{.    d
9440: 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
9450: 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49  tes = FILE_ATTRI
9460: 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d  BUTE_NORMAL;.  }
9470: 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73 20 66 72  .  /* Reports fr
9480: 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 65 74 20  om the internet 
9490: 61 72 65 20 74 68 61 74 20 70 65 72 66 6f 72 6d  are that perform
94a0: 61 6e 63 65 20 69 73 20 61 6c 77 61 79 73 0a 20  ance is always. 
94b0: 20 2a 2a 20 62 65 74 74 65 72 20 69 66 20 46 49   ** better if FI
94c0: 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
94d0: 43 43 45 53 53 20 69 73 20 75 73 65 64 2e 20 20  CCESS is used.  
94e0: 54 69 63 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f  Ticket #2699. */
94f0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
9500: 49 4e 43 45 0a 20 20 64 77 46 6c 61 67 73 41 6e  INCE.  dwFlagsAn
9510: 64 41 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46  dAttributes |= F
9520: 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f  ILE_FLAG_RANDOM_
9530: 41 43 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a 20  ACCESS;.#endif. 
9540: 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20   if( isNT() ){. 
9550: 20 20 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c     h = CreateFil
9560: 65 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76  eW((WCHAR*)zConv
9570: 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 64 77  erted,.       dw
9580: 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20  DesiredAccess,. 
9590: 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
95a0: 65 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a  e,.       NULL,.
95b0: 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f         dwCreatio
95c0: 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20  nDisposition,.  
95d0: 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41       dwFlagsAndA
95e0: 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20  ttributes,.     
95f0: 20 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 2f 2a    NULL.    );./*
9600: 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20   isNT() is 1 if 
9610: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
9620: 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65  =1, so this else
9630: 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74   is never execut
9640: 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68  ed. .** Since th
9650: 65 20 41 53 43 49 49 20 76 65 72 73 69 6f 6e 20  e ASCII version 
9660: 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73  of these Windows
9670: 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73   API do not exis
9680: 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20  t for WINCE,.** 
9690: 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  it's important t
96a0: 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20  o not reference 
96b0: 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62  them for WINCE b
96c0: 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51  uilds..*/.#if SQ
96d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30  LITE_OS_WINCE==0
96e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68 20  .  }else{.    h 
96f0: 3d 20 43 72 65 61 74 65 46 69 6c 65 41 28 28 63  = CreateFileA((c
9700: 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c  har*)zConverted,
9710: 0a 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65  .       dwDesire
9720: 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20  dAccess,.       
9730: 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20  dwShareMode,.   
9740: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
9750: 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
9760: 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 64  sition,.       d
9770: 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
9780: 74 65 73 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c  tes,.       NULL
9790: 0a 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20  .    );.#endif. 
97a0: 20 7d 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41   }.  if( h==INVA
97b0: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
97c0: 20 29 7b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f   ){.    free(zCo
97d0: 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 69 66  nverted);.    if
97e0: 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
97f0: 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
9800: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
9810: 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e  winOpen(pVfs, zN
9820: 61 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20 20 20  ame, id, .      
9830: 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53         ((flags|S
9840: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
9850: 4e 4c 59 29 26 7e 53 51 4c 49 54 45 5f 4f 50 45  NLY)&~SQLITE_OPE
9860: 4e 5f 52 45 41 44 57 52 49 54 45 29 2c 20 70 4f  N_READWRITE), pO
9870: 75 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65  utFlags);.    }e
9880: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
9890: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
98a0: 4e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  N;.    }.  }.  i
98b0: 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a  f( pOutFlags ){.
98c0: 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
98d0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
98e0: 57 52 49 54 45 20 29 7b 0a 20 20 20 20 20 20 2a  WRITE ){.      *
98f0: 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49  pOutFlags = SQLI
9900: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
9910: 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
9920: 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d      *pOutFlags =
9930: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
9940: 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d  DONLY;.    }.  }
9950: 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c  .  memset(pFile,
9960: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 46 69 6c   0, sizeof(*pFil
9970: 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d  e));.  pFile->pM
9980: 65 74 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65  ethod = &winIoMe
9990: 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 68  thod;.  pFile->h
99a0: 20 3d 20 68 3b 0a 20 20 70 46 69 6c 65 2d 3e 6c   = h;.  pFile->l
99b0: 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52  astErrno = NO_ER
99c0: 52 4f 52 3b 0a 20 20 70 46 69 6c 65 2d 3e 73 65  ROR;.  pFile->se
99d0: 63 74 6f 72 53 69 7a 65 20 3d 20 67 65 74 53 65  ctorSize = getSe
99e0: 63 74 6f 72 53 69 7a 65 28 70 56 66 73 2c 20 7a  ctorSize(pVfs, z
99f0: 55 74 66 38 4e 61 6d 65 29 3b 0a 23 69 66 20 53  Utf8Name);.#if S
9a00: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
9a10: 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 53   if( (flags & (S
9a20: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
9a30: 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
9a40: 5f 4d 41 49 4e 5f 44 42 29 29 20 3d 3d 0a 20 20  _MAIN_DB)) ==.  
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51               (SQ
9a60: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
9a70: 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
9a80: 4d 41 49 4e 5f 44 42 29 0a 20 20 20 20 20 20 20  MAIN_DB).       
9a90: 26 26 20 21 77 69 6e 63 65 43 72 65 61 74 65 4c  && !winceCreateL
9aa0: 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 6c 65  ock(zName, pFile
9ab0: 29 0a 20 20 29 7b 0a 20 20 20 20 43 6c 6f 73 65  ).  ){.    Close
9ac0: 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20 20 66  Handle(h);.    f
9ad0: 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
9ae0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9af0: 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d  TE_CANTOPEN;.  }
9b00: 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b  .  if( isTemp ){
9b10: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c  .    pFile->zDel
9b20: 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f  eteOnClose = zCo
9b30: 6e 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65  nverted;.  }else
9b40: 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20  .#endif.  {.    
9b50: 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
9b60: 3b 0a 20 20 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e  ;.  }.  OpenCoun
9b70: 74 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72  ter(+1);.  retur
9b80: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
9b90: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
9ba0: 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a   named file..**.
9bb0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 69 6e  ** Note that win
9bc0: 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c  dows does not al
9bd0: 6c 6f 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65  low a file to be
9be0: 20 64 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65   deleted if some
9bf0: 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73   other.** proces
9c00: 73 20 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20  s has it open.  
9c10: 53 6f 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75  Sometimes a viru
9c20: 73 20 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64  s scanner or ind
9c30: 65 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a  exing program.**
9c40: 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75   will open a jou
9c50: 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c  rnal file shortl
9c60: 79 20 61 66 74 65 72 20 69 74 20 69 73 20 63 72  y after it is cr
9c70: 65 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74  eated in order t
9c80: 6f 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72  o do.** whatever
9c90: 20 69 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65   it does.  While
9ca0: 20 74 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63   this other proc
9cb0: 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ess is holding t
9cc0: 68 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c  he.** file open,
9cd0: 20 77 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62   we will be unab
9ce0: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e  le to delete it.
9cf0: 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64    To work around
9d00: 20 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d   this.** problem
9d10: 2c 20 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d  , we delay 100 m
9d20: 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20  illiseconds and 
9d30: 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67  try to delete ag
9d40: 61 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d  ain.  Up.** to M
9d50: 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d  X_DELETION_ATTEM
9d60: 50 54 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74  PTs deletion att
9d70: 65 6d 70 74 73 20 61 72 65 20 72 75 6e 20 62 65  empts are run be
9d80: 66 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75  fore giving.** u
9d90: 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20  p and returning 
9da0: 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65  an error..*/.#de
9db0: 66 69 6e 65 20 4d 58 5f 44 45 4c 45 54 49 4f 4e  fine MX_DELETION
9dc0: 5f 41 54 54 45 4d 50 54 53 20 35 0a 73 74 61 74  _ATTEMPTS 5.stat
9dd0: 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65  ic int winDelete
9de0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
9df0: 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
9e00: 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
9e10: 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  in32 */.  const 
9e20: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
9e30: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
9e40: 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20   file to delete 
9e50: 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72  */.  int syncDir
9e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e70: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20   /* Not used on 
9e80: 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e  win32 */.){.  in
9e90: 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 44 57 4f  t cnt = 0;.  DWO
9ea0: 52 44 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 65  RD rc;.  DWORD e
9eb0: 72 72 6f 72 20 3d 20 30 3b 0a 20 20 76 6f 69 64  rror = 0;.  void
9ec0: 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63   *zConverted = c
9ed0: 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61  onvertUtf8Filena
9ee0: 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
9ef0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
9f00: 52 28 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45  R(pVfs);.  UNUSE
9f10: 44 5f 50 41 52 41 4d 45 54 45 52 28 73 79 6e 63  D_PARAMETER(sync
9f20: 44 69 72 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  Dir);.  if( zCon
9f30: 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
9f40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
9f50: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75  OMEM;.  }.  Simu
9f60: 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
9f70: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
9f80: 44 45 4c 45 54 45 29 3b 0a 20 20 69 66 28 20 69  DELETE);.  if( i
9f90: 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 64 6f 7b  sNT() ){.    do{
9fa0: 0a 20 20 20 20 20 20 44 65 6c 65 74 65 46 69 6c  .      DeleteFil
9fb0: 65 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  eW(zConverted);.
9fc0: 20 20 20 20 7d 77 68 69 6c 65 28 20 20 20 28 20      }while(   ( 
9fd0: 20 20 28 28 72 63 20 3d 20 47 65 74 46 69 6c 65    ((rc = GetFile
9fe0: 41 74 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e  AttributesW(zCon
9ff0: 76 65 72 74 65 64 29 29 20 21 3d 20 49 4e 56 41  verted)) != INVA
a000: 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
a010: 54 45 53 29 0a 20 20 20 20 20 20 20 20 20 20 20  TES).           
a020: 20 20 20 20 7c 7c 20 28 28 65 72 72 6f 72 20 3d      || ((error =
a030: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29   GetLastError())
a040: 20 3d 3d 20 45 52 52 4f 52 5f 41 43 43 45 53 53   == ERROR_ACCESS
a050: 5f 44 45 4e 49 45 44 29 29 0a 20 20 20 20 20 20  _DENIED)).      
a060: 20 20 20 20 20 26 26 20 28 2b 2b 63 6e 74 20 3c       && (++cnt <
a070: 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54   MX_DELETION_ATT
a080: 45 4d 50 54 53 29 0a 20 20 20 20 20 20 20 20 20  EMPTS).         
a090: 20 20 26 26 20 28 53 6c 65 65 70 28 31 30 30 29    && (Sleep(100)
a0a0: 2c 20 31 29 20 29 3b 0a 2f 2a 20 69 73 4e 54 28  , 1) );./* isNT(
a0b0: 29 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 45  ) is 1 if SQLITE
a0c0: 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f  _OS_WINCE==1, so
a0d0: 20 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65   this else is ne
a0e0: 76 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a  ver executed. .*
a0f0: 2a 20 53 69 6e 63 65 20 74 68 65 20 41 53 43 49  * Since the ASCI
a100: 49 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  I version of the
a110: 73 65 20 57 69 6e 64 6f 77 73 20 41 50 49 20 64  se Windows API d
a120: 6f 20 6e 6f 74 20 65 78 69 73 74 20 66 6f 72 20  o not exist for 
a130: 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69  WINCE,.** it's i
a140: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20  mportant to not 
a150: 72 65 66 65 72 65 6e 63 65 20 74 68 65 6d 20 66  reference them f
a160: 6f 72 20 57 49 4e 43 45 20 62 75 69 6c 64 73 2e  or WINCE builds.
a170: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
a180: 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c  S_WINCE==0.  }el
a190: 73 65 7b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20  se{.    do{.    
a1a0: 20 20 44 65 6c 65 74 65 46 69 6c 65 41 28 7a 43    DeleteFileA(zC
a1b0: 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7d  onverted);.    }
a1c0: 77 68 69 6c 65 28 20 20 20 28 20 20 20 28 28 72  while(   (   ((r
a1d0: 63 20 3d 20 47 65 74 46 69 6c 65 41 74 74 72 69  c = GetFileAttri
a1e0: 62 75 74 65 73 41 28 7a 43 6f 6e 76 65 72 74 65  butesA(zConverte
a1f0: 64 29 29 20 21 3d 20 49 4e 56 41 4c 49 44 5f 46  d)) != INVALID_F
a200: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 29 0a  ILE_ATTRIBUTES).
a210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
a220: 7c 20 28 28 65 72 72 6f 72 20 3d 20 47 65 74 4c  | ((error = GetL
a230: 61 73 74 45 72 72 6f 72 28 29 29 20 3d 3d 20 45  astError()) == E
a240: 52 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e 49  RROR_ACCESS_DENI
a250: 45 44 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  ED)).           
a260: 26 26 20 28 2b 2b 63 6e 74 20 3c 20 4d 58 5f 44  && (++cnt < MX_D
a270: 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53  ELETION_ATTEMPTS
a280: 29 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  ).           && 
a290: 28 53 6c 65 65 70 28 31 30 30 29 2c 20 31 29 20  (Sleep(100), 1) 
a2a0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
a2b0: 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
a2c0: 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 44 45  ;.  OSTRACE2("DE
a2d0: 4c 45 54 45 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  LETE \"%s\"\n", 
a2e0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65  zFilename);.  re
a2f0: 74 75 72 6e 20 28 20 20 20 28 72 63 20 3d 3d 20  turn (   (rc == 
a300: 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
a310: 52 49 42 55 54 45 53 29 20 0a 20 20 20 20 20 20  RIBUTES) .      
a320: 20 20 20 20 26 26 20 28 65 72 72 6f 72 20 3d 3d      && (error ==
a330: 20 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f   ERROR_FILE_NOT_
a340: 46 4f 55 4e 44 29 29 20 3f 20 53 51 4c 49 54 45  FOUND)) ? SQLITE
a350: 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45  _OK : SQLITE_IOE
a360: 52 52 5f 44 45 4c 45 54 45 3b 0a 7d 0a 0a 2f 2a  RR_DELETE;.}../*
a370: 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 65 78  .** Check the ex
a380: 69 73 74 61 6e 63 65 20 61 6e 64 20 73 74 61 74  istance and stat
a390: 75 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f  us of a file..*/
a3a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 41  .static int winA
a3b0: 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33  ccess(.  sqlite3
a3c0: 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
a3d0: 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20      /* Not used 
a3e0: 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f  on win32 */.  co
a3f0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
a400: 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame,     /* Name
a410: 20 6f 66 20 66 69 6c 65 20 74 6f 20 63 68 65 63   of file to chec
a420: 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  k */.  int flags
a430: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a440: 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 73    /* Type of tes
a450: 74 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69  t to make on thi
a460: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
a470: 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20  *pResOut        
a480: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
a490: 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57  esult */.){.  DW
a4a0: 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20  ORD attr;.  int 
a4b0: 72 63 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a  rc = 0;.  void *
a4c0: 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e  zConverted = con
a4d0: 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65  vertUtf8Filename
a4e0: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55  (zFilename);.  U
a4f0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
a500: 70 56 66 73 29 3b 0a 20 20 69 66 28 20 7a 43 6f  pVfs);.  if( zCo
a510: 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
a520: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a530: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
a540: 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 61   isNT() ){.    a
a550: 74 74 72 20 3d 20 47 65 74 46 69 6c 65 41 74 74  ttr = GetFileAtt
a560: 72 69 62 75 74 65 73 57 28 28 57 43 48 41 52 2a  ributesW((WCHAR*
a570: 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 2f 2a  )zConverted);./*
a580: 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20   isNT() is 1 if 
a590: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
a5a0: 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65  =1, so this else
a5b0: 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74   is never execut
a5c0: 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68  ed. .** Since th
a5d0: 65 20 41 53 43 49 49 20 76 65 72 73 69 6f 6e 20  e ASCII version 
a5e0: 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73  of these Windows
a5f0: 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73   API do not exis
a600: 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20  t for WINCE,.** 
a610: 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  it's important t
a620: 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20  o not reference 
a630: 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62  them for WINCE b
a640: 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51  uilds..*/.#if SQ
a650: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30  LITE_OS_WINCE==0
a660: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 74  .  }else{.    at
a670: 74 72 20 3d 20 47 65 74 46 69 6c 65 41 74 74 72  tr = GetFileAttr
a680: 69 62 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a  ibutesA((char*)z
a690: 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64  Converted);.#end
a6a0: 69 66 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a 43  if.  }.  free(zC
a6b0: 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 73 77 69  onverted);.  swi
a6c0: 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20  tch( flags ){.  
a6d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
a6e0: 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 63  CESS_READ:.    c
a6f0: 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
a700: 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20  S_EXISTS:.      
a710: 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c  rc = attr!=INVAL
a720: 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
a730: 45 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ES;.      break;
a740: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
a750: 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
a760: 45 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 28 61  E:.      rc = (a
a770: 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49  ttr & FILE_ATTRI
a780: 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d  BUTE_READONLY)==
a790: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
a7a0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
a7b0: 20 20 20 61 73 73 65 72 74 28 21 22 49 6e 76 61     assert(!"Inva
a7c0: 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65  lid flags argume
a7d0: 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  nt");.  }.  *pRe
a7e0: 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 72 65 74  sOut = rc;.  ret
a7f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
a800: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20  .../*.** Turn a 
a810: 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
a820: 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61  e into a full pa
a830: 74 68 6e 61 6d 65 2e 20 20 57 72 69 74 65 20 74  thname.  Write t
a840: 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e  he full.** pathn
a850: 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e  ame into zOut[].
a860: 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65    zOut[] will be
a870: 20 61 74 20 6c 65 61 73 74 20 70 56 66 73 2d 3e   at least pVfs->
a880: 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a 20 62 79  mxPathname.** by
a890: 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a  tes in size..*/.
a8a0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 75  static int winFu
a8b0: 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71  llPathname(.  sq
a8c0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
a8d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
a8e0: 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
a8f0: 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
a900: 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c  char *zRelative,
a910: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69          /* Possi
a920: 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70  bly relative inp
a930: 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74  ut path */.  int
a940: 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20 20 20 20   nFull,         
a950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
a960: 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66  ze of output buf
a970: 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  fer in bytes */.
a980: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 20 20    char *zFull   
a990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9a0: 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72  /* Output buffer
a9b0: 20 2a 2f 0a 29 7b 0a 20 20 0a 23 69 66 20 64 65   */.){.  .#if de
a9c0: 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
a9d0: 29 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ).  UNUSED_PARAM
a9e0: 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 63  ETER(nFull);.  c
a9f0: 79 67 77 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 66 75  ygwin_conv_to_fu
aa00: 6c 6c 5f 77 69 6e 33 32 5f 70 61 74 68 28 7a 52  ll_win32_path(zR
aa10: 65 6c 61 74 69 76 65 2c 20 7a 46 75 6c 6c 29 3b  elative, zFull);
aa20: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
aa30: 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  _OK;.#endif..#if
aa40: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
aa50: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
aa60: 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 2f 2a  TER(nFull);.  /*
aa70: 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20 63 6f   WinCE has no co
aa80: 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c 61 74  ncept of a relat
aa90: 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f 72  ive pathname, or
aaa0: 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20 2a   so I am told. *
aab0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  /.  sqlite3_snpr
aac0: 69 6e 74 66 28 70 56 66 73 2d 3e 6d 78 50 61 74  intf(pVfs->mxPat
aad0: 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 2c 20 22 25  hname, zFull, "%
aae0: 73 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  s", zRelative);.
aaf0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ab00: 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  OK;.#endif..#if 
ab10: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
ab20: 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43   && !defined(__C
ab30: 59 47 57 49 4e 5f 5f 29 0a 20 20 69 6e 74 20 6e  YGWIN__).  int n
ab40: 42 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43  Byte;.  void *zC
ab50: 6f 6e 76 65 72 74 65 64 3b 0a 20 20 63 68 61 72  onverted;.  char
ab60: 20 2a 7a 4f 75 74 3b 0a 20 20 55 4e 55 53 45 44   *zOut;.  UNUSED
ab70: 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c  _PARAMETER(nFull
ab80: 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  );.  zConverted 
ab90: 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c  = convertUtf8Fil
aba0: 65 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29  ename(zRelative)
abb0: 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  ;.  if( isNT() )
abc0: 7b 0a 20 20 20 20 57 43 48 41 52 20 2a 7a 54 65  {.    WCHAR *zTe
abd0: 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  mp;.    nByte = 
abe0: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
abf0: 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72  ((WCHAR*)zConver
ac00: 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 20 2b 20  ted, 0, 0, 0) + 
ac10: 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 6d  3;.    zTemp = m
ac20: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a  alloc( nByte*siz
ac30: 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b  eof(zTemp[0]) );
ac40: 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d  .    if( zTemp==
ac50: 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28  0 ){.      free(
ac60: 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
ac70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ac80: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
ac90: 20 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d    GetFullPathNam
aca0: 65 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76  eW((WCHAR*)zConv
acb0: 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54  erted, nByte, zT
acc0: 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 66 72 65  emp, 0);.    fre
acd0: 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
ace0: 20 20 20 7a 4f 75 74 20 3d 20 75 6e 69 63 6f 64     zOut = unicod
acf0: 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 29 3b 0a  eToUtf8(zTemp);.
ad00: 20 20 20 20 66 72 65 65 28 7a 54 65 6d 70 29 3b      free(zTemp);
ad10: 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20  ./* isNT() is 1 
ad20: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
ad30: 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65  CE==1, so this e
ad40: 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65  lse is never exe
ad50: 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65  cuted. .** Since
ad60: 20 74 68 65 20 41 53 43 49 49 20 76 65 72 73 69   the ASCII versi
ad70: 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64  on of these Wind
ad80: 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65  ows API do not e
ad90: 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a  xist for WINCE,.
ada0: 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e  ** it's importan
adb0: 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e  t to not referen
adc0: 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43  ce them for WINC
add0: 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66  E builds..*/.#if
ade0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
adf0: 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ==0.  }else{.   
ae00: 20 63 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20   char *zTemp;.  
ae10: 20 20 6e 42 79 74 65 20 3d 20 47 65 74 46 75 6c    nByte = GetFul
ae20: 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72  lPathNameA((char
ae30: 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c  *)zConverted, 0,
ae40: 20 30 2c 20 30 29 20 2b 20 33 3b 0a 20 20 20 20   0, 0) + 3;.    
ae50: 7a 54 65 6d 70 20 3d 20 6d 61 6c 6c 6f 63 28 20  zTemp = malloc( 
ae60: 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65  nByte*sizeof(zTe
ae70: 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  mp[0]) );.    if
ae80: 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  ( zTemp==0 ){.  
ae90: 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72      free(zConver
aea0: 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
aeb0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
aec0: 0a 20 20 20 20 7d 0a 20 20 20 20 47 65 74 46 75  .    }.    GetFu
aed0: 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61  llPathNameA((cha
aee0: 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e  r*)zConverted, n
aef0: 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b  Byte, zTemp, 0);
af00: 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65  .    free(zConve
af10: 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20  rted);.    zOut 
af20: 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
af30: 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65  mbcs_to_utf8(zTe
af40: 6d 70 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 54  mp);.    free(zT
af50: 65 6d 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  emp);.#endif.  }
af60: 0a 20 20 69 66 28 20 7a 4f 75 74 20 29 7b 0a 20  .  if( zOut ){. 
af70: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
af80: 6e 74 66 28 70 56 66 73 2d 3e 6d 78 50 61 74 68  ntf(pVfs->mxPath
af90: 6e 61 6d 65 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  name, zFull, "%s
afa0: 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 66 72  ", zOut);.    fr
afb0: 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65  ee(zOut);.    re
afc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
afd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
afe0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
aff0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
b000: 2f 2a 0a 2a 2a 20 47 65 74 20 74 68 65 20 73 65  /*.** Get the se
b010: 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 74 68 65  ctor size of the
b020: 20 64 65 76 69 63 65 20 75 73 65 64 20 74 6f 20   device used to 
b030: 73 74 6f 72 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a  store.** file..*
b040: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
b050: 53 65 63 74 6f 72 53 69 7a 65 28 0a 20 20 20 20  SectorSize(.    
b060: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
b070: 73 2c 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  s,.    const cha
b080: 72 20 2a 7a 52 65 6c 61 74 69 76 65 20 20 20 20  r *zRelative    
b090: 20 2f 2a 20 55 54 46 2d 38 20 66 69 6c 65 20 6e   /* UTF-8 file n
b0a0: 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52  ame */.){.  DWOR
b0b0: 44 20 62 79 74 65 73 50 65 72 53 65 63 74 6f 72  D bytesPerSector
b0c0: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
b0d0: 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  T_SECTOR_SIZE;. 
b0e0: 20 63 68 61 72 20 7a 46 75 6c 6c 70 61 74 68 5b   char zFullpath[
b0f0: 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 0a 20 20 69  MAX_PATH+1];.  i
b100: 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 64  nt rc;.  DWORD d
b110: 77 52 65 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 0a  wRet = 0;..  /*.
b120: 20 20 2a 2a 20 57 65 20 6e 65 65 64 20 74 6f 20    ** We need to 
b130: 67 65 74 20 74 68 65 20 66 75 6c 6c 20 70 61 74  get the full pat
b140: 68 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  h name of the fi
b150: 6c 65 0a 20 20 2a 2a 20 74 6f 20 67 65 74 20 74  le.  ** to get t
b160: 68 65 20 64 72 69 76 65 20 6c 65 74 74 65 72 20  he drive letter 
b170: 74 6f 20 6c 6f 6f 6b 20 75 70 20 74 68 65 20 73  to look up the s
b180: 65 63 74 6f 72 0a 20 20 2a 2a 20 73 69 7a 65 2e  ector.  ** size.
b190: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 77 69 6e  .  */.  rc = win
b1a0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
b1b0: 73 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 4d 41  s, zRelative, MA
b1c0: 58 5f 50 41 54 48 2c 20 7a 46 75 6c 6c 70 61 74  X_PATH, zFullpat
b1d0: 68 29 3b 0a 20 20 69 66 28 20 72 63 20 3d 3d 20  h);.  if( rc == 
b1e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 0a 20 20 7b 0a  SQLITE_OK ).  {.
b1f0: 20 20 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65      void *zConve
b200: 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74  rted = convertUt
b210: 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 75 6c 6c  f8Filename(zFull
b220: 70 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a  path);.    if( z
b230: 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20  Converted ){.   
b240: 20 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b     if( isNT() ){
b250: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
b260: 20 20 20 20 20 20 20 20 2f 2a 20 74 72 69 6d 20          /* trim 
b270: 70 61 74 68 20 74 6f 20 6a 75 73 74 20 64 72 69  path to just dri
b280: 76 65 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  ve reference */.
b290: 20 20 20 20 20 20 20 20 57 43 48 41 52 20 2a 70          WCHAR *p
b2a0: 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20   = zConverted;. 
b2b0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 69         for(i=0;i
b2c0: 3c 4d 41 58 5f 50 41 54 48 3b 69 2b 2b 29 7b 0a  <MAX_PATH;i++){.
b2d0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 5b            if( p[
b2e0: 69 5d 20 3d 3d 20 27 5c 5c 27 20 29 7b 0a 20 20  i] == '\\' ){.  
b2f0: 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
b300: 20 20 20 20 20 20 20 20 20 20 20 70 5b 69 5d 20             p[i] 
b310: 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  = '\0';.        
b320: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b330: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
b340: 0a 20 20 20 20 20 20 20 20 64 77 52 65 74 20 3d  .        dwRet =
b350: 20 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63   GetDiskFreeSpac
b360: 65 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76  eW((WCHAR*)zConv
b370: 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
b380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b390: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20           NULL,. 
b3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3c0: 20 26 62 79 74 65 73 50 65 72 53 65 63 74 6f 72   &bytesPerSector
b3d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3f0: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
b400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b410: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
b420: 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  );.#if SQLITE_OS
b430: 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 20 20 20 20  _WINCE==0.      
b440: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
b450: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 2f 2a  nt i;.        /*
b460: 20 74 72 69 6d 20 70 61 74 68 20 74 6f 20 6a 75   trim path to ju
b470: 73 74 20 64 72 69 76 65 20 72 65 66 65 72 65 6e  st drive referen
b480: 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 48  ce */.        CH
b490: 41 52 20 2a 70 20 3d 20 28 43 48 41 52 20 2a 29  AR *p = (CHAR *)
b4a0: 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 20 20  zConverted;.    
b4b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 69 3c 4d 41      for(i=0;i<MA
b4c0: 58 5f 50 41 54 48 3b 69 2b 2b 29 7b 0a 20 20 20  X_PATH;i++){.   
b4d0: 20 20 20 20 20 20 20 69 66 28 20 70 5b 69 5d 20         if( p[i] 
b4e0: 3d 3d 20 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20  == '\\' ){.     
b4f0: 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
b500: 20 20 20 20 20 20 20 20 70 5b 69 5d 20 3d 20 27          p[i] = '
b510: 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20  \0';.           
b520: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
b530: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
b540: 20 20 20 20 20 20 64 77 52 65 74 20 3d 20 47 65        dwRet = Ge
b550: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 28  tDiskFreeSpaceA(
b560: 28 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65  (CHAR*)zConverte
b570: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
b580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b590: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
b5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 62 79               &by
b5c0: 74 65 73 50 65 72 53 65 63 74 6f 72 2c 0a 20 20  tesPerSector,.  
b5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5f0: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
b600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b610: 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 3b 0a 23          NULL);.#
b620: 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
b630: 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72      free(zConver
b640: 74 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ted);.    }.    
b650: 69 66 28 20 21 64 77 52 65 74 20 29 7b 0a 20 20  if( !dwRet ){.  
b660: 20 20 20 20 62 79 74 65 73 50 65 72 53 65 63 74      bytesPerSect
b670: 6f 72 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  or = SQLITE_DEFA
b680: 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  ULT_SECTOR_SIZE;
b690: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
b6a0: 75 72 6e 20 28 69 6e 74 29 20 62 79 74 65 73 50  urn (int) bytesP
b6b0: 65 72 53 65 63 74 6f 72 3b 20 0a 7d 0a 0a 23 69  erSector; .}..#i
b6c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b6d0: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
b6e0: 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
b6f0: 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20  s for opening a 
b700: 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
b710: 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f  finding entry po
b720: 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ints.** within t
b730: 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
b740: 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74  y, and closing t
b750: 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
b760: 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  y..*/./*.** Inte
b770: 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69  rfaces for openi
b780: 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72  ng a shared libr
b790: 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74  ary, finding ent
b7a0: 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74  ry points.** wit
b7b0: 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  hin the shared l
b7c0: 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73  ibrary, and clos
b7d0: 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
b7e0: 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ibrary..*/.stati
b7f0: 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65  c void *winDlOpe
b800: 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  n(sqlite3_vfs *p
b810: 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Vfs, const char 
b820: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48  *zFilename){.  H
b830: 41 4e 44 4c 45 20 68 3b 0a 20 20 76 6f 69 64 20  ANDLE h;.  void 
b840: 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f  *zConverted = co
b850: 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d  nvertUtf8Filenam
b860: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
b870: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
b880: 28 70 56 66 73 29 3b 0a 20 20 69 66 28 20 7a 43  (pVfs);.  if( zC
b890: 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
b8a0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
b8b0: 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
b8c0: 0a 20 20 20 20 68 20 3d 20 4c 6f 61 64 4c 69 62  .    h = LoadLib
b8d0: 72 61 72 79 57 28 28 57 43 48 41 52 2a 29 7a 43  raryW((WCHAR*)zC
b8e0: 6f 6e 76 65 72 74 65 64 29 3b 0a 2f 2a 20 69 73  onverted);./* is
b8f0: 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c  NT() is 1 if SQL
b900: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c  ITE_OS_WINCE==1,
b910: 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73   so this else is
b920: 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e   never executed.
b930: 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41   .** Since the A
b940: 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f 66 20  SCII version of 
b950: 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50  these Windows AP
b960: 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66  I do not exist f
b970: 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27  or WINCE,.** it'
b980: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e  s important to n
b990: 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ot reference the
b9a0: 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c  m for WINCE buil
b9b0: 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ds..*/.#if SQLIT
b9c0: 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20  E_OS_WINCE==0.  
b9d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20 4c  }else{.    h = L
b9e0: 6f 61 64 4c 69 62 72 61 72 79 41 28 28 63 68 61  oadLibraryA((cha
b9f0: 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  r*)zConverted);.
ba00: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 66 72 65  #endif.  }.  fre
ba10: 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
ba20: 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 68   return (void*)h
ba30: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
ba40: 77 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c 69 74  winDlError(sqlit
ba50: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
ba60: 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
ba70: 75 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44  ufOut){.  UNUSED
ba80: 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
ba90: 3b 0a 20 20 67 65 74 4c 61 73 74 45 72 72 6f 72  ;.  getLastError
baa0: 4d 73 67 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75  Msg(nBuf, zBufOu
bab0: 74 29 3b 0a 7d 0a 76 6f 69 64 20 28 2a 77 69 6e  t);.}.void (*win
bac0: 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66  DlSym(sqlite3_vf
bad0: 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70  s *pVfs, void *p
bae0: 48 61 6e 64 6c 65 2c 20 63 6f 6e 73 74 20 63 68  Handle, const ch
baf0: 61 72 20 2a 7a 53 79 6d 62 6f 6c 29 29 28 76 6f  ar *zSymbol))(vo
bb00: 69 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  id){.  UNUSED_PA
bb10: 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23  RAMETER(pVfs);.#
bb20: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
bb30: 43 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74 50  CE.  /* The GetP
bb40: 72 6f 63 41 64 64 72 65 73 73 41 28 29 20 72 6f  rocAddressA() ro
bb50: 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76  utine is only av
bb60: 61 69 6c 61 62 6c 65 20 6f 6e 20 77 69 6e 63 65  ailable on wince
bb70: 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 76  . */.  return (v
bb80: 6f 69 64 28 2a 29 28 76 6f 69 64 29 29 47 65 74  oid(*)(void))Get
bb90: 50 72 6f 63 41 64 64 72 65 73 73 41 28 28 48 41  ProcAddressA((HA
bba0: 4e 44 4c 45 29 70 48 61 6e 64 6c 65 2c 20 7a 53  NDLE)pHandle, zS
bbb0: 79 6d 62 6f 6c 29 3b 0a 23 65 6c 73 65 0a 20 20  ymbol);.#else.  
bbc0: 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 77 69 6e  /* All other win
bbd0: 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20 65  dows platforms e
bbe0: 78 70 65 63 74 20 47 65 74 50 72 6f 63 41 64 64  xpect GetProcAdd
bbf0: 72 65 73 73 28 29 20 74 6f 20 74 61 6b 65 0a 20  ress() to take. 
bc00: 20 2a 2a 20 61 6e 20 41 6e 73 69 20 73 74 72 69   ** an Ansi stri
bc10: 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  ng regardless of
bc20: 20 74 68 65 20 5f 55 4e 49 43 4f 44 45 20 73 65   the _UNICODE se
bc30: 74 74 69 6e 67 20 2a 2f 0a 20 20 72 65 74 75 72  tting */.  retur
bc40: 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29  n (void(*)(void)
bc50: 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 28  )GetProcAddress(
bc60: 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 2c  (HANDLE)pHandle,
bc70: 20 7a 53 79 6d 62 6f 6c 29 3b 0a 23 65 6e 64 69   zSymbol);.#endi
bc80: 66 0a 7d 0a 76 6f 69 64 20 77 69 6e 44 6c 43 6c  f.}.void winDlCl
bc90: 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ose(sqlite3_vfs 
bca0: 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61  *pVfs, void *pHa
bcb0: 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ndle){.  UNUSED_
bcc0: 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
bcd0: 0a 20 20 46 72 65 65 4c 69 62 72 61 72 79 28 28  .  FreeLibrary((
bce0: 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b  HANDLE)pHandle);
bcf0: 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53  .}.#else /* if S
bd00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
bd10: 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66  EXTENSION is def
bd20: 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69  ined: */.  #defi
bd30: 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a  ne winDlOpen  0.
bd40: 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 45    #define winDlE
bd50: 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65  rror 0.  #define
bd60: 20 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20   winDlSym   0.  
bd70: 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f  #define winDlClo
bd80: 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  se 0.#endif.../*
bd90: 0a 2a 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20  .** Write up to 
bda0: 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61  nBuf bytes of ra
bdb0: 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42  ndomness into zB
bdc0: 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  uf..*/.static in
bdd0: 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28  t winRandomness(
bde0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
bdf0: 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
be00: 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e 74 20  r *zBuf){.  int 
be10: 6e 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f  n = 0;.  UNUSED_
be20: 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
be30: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
be40: 49 54 45 5f 54 45 53 54 29 0a 20 20 6e 20 3d 20  ITE_TEST).  n = 
be50: 6e 42 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 7a  nBuf;.  memset(z
be60: 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23  Buf, 0, nBuf);.#
be70: 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f  else.  if( sizeo
be80: 66 28 53 59 53 54 45 4d 54 49 4d 45 29 3c 3d 6e  f(SYSTEMTIME)<=n
be90: 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 53 59 53  Buf-n ){.    SYS
bea0: 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20 47  TEMTIME x;.    G
beb0: 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26 78 29  etSystemTime(&x)
bec0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
bed0: 75 66 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a 65 6f  uf[n], &x, sizeo
bee0: 66 28 78 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  f(x));.    n += 
bef0: 73 69 7a 65 6f 66 28 78 29 3b 0a 20 20 7d 0a 20  sizeof(x);.  }. 
bf00: 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52   if( sizeof(DWOR
bf10: 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20  D)<=nBuf-n ){.  
bf20: 20 20 44 57 4f 52 44 20 70 69 64 20 3d 20 47 65    DWORD pid = Ge
bf30: 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
bf40: 64 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  d();.    memcpy(
bf50: 26 7a 42 75 66 5b 6e 5d 2c 20 26 70 69 64 2c 20  &zBuf[n], &pid, 
bf60: 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20  sizeof(pid));.  
bf70: 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 70 69    n += sizeof(pi
bf80: 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69  d);.  }.  if( si
bf90: 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75  zeof(DWORD)<=nBu
bfa0: 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44  f-n ){.    DWORD
bfb0: 20 63 6e 74 20 3d 20 47 65 74 54 69 63 6b 43 6f   cnt = GetTickCo
bfc0: 75 6e 74 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70  unt();.    memcp
bfd0: 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74  y(&zBuf[n], &cnt
bfe0: 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a  , sizeof(cnt));.
bff0: 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
c000: 63 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  cnt);.  }.  if( 
c010: 73 69 7a 65 6f 66 28 4c 41 52 47 45 5f 49 4e 54  sizeof(LARGE_INT
c020: 45 47 45 52 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b  EGER)<=nBuf-n ){
c030: 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47  .    LARGE_INTEG
c040: 45 52 20 69 3b 0a 20 20 20 20 51 75 65 72 79 50  ER i;.    QueryP
c050: 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65  erformanceCounte
c060: 72 28 26 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70  r(&i);.    memcp
c070: 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c 20  y(&zBuf[n], &i, 
c080: 73 69 7a 65 6f 66 28 69 29 29 3b 0a 20 20 20 20  sizeof(i));.    
c090: 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 69 29 3b 0a  n += sizeof(i);.
c0a0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
c0b0: 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn n;.}.../*.**
c0c0: 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74   Sleep for a lit
c0d0: 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75  tle while.  Retu
c0e0: 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  rn the amount of
c0f0: 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a   time slept..*/.
c100: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 6c  static int winSl
c110: 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20  eep(sqlite3_vfs 
c120: 2a 70 56 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f  *pVfs, int micro
c130: 73 65 63 29 7b 0a 20 20 53 6c 65 65 70 28 28 6d  sec){.  Sleep((m
c140: 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30  icrosec+999)/100
c150: 30 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  0);.  UNUSED_PAR
c160: 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
c170: 72 65 74 75 72 6e 20 28 28 6d 69 63 72 6f 73 65  return ((microse
c180: 63 2b 39 39 39 29 2f 31 30 30 30 29 2a 31 30 30  c+999)/1000)*100
c190: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  0;.}../*.** The 
c1a0: 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
c1b0: 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20  le, if set to a 
c1c0: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20  non-zero value, 
c1d0: 62 65 63 6f 6d 65 73 20 74 68 65 20 72 65 73 75  becomes the resu
c1e0: 6c 74 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 66  lt.** returned f
c1f0: 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 43 75 72  rom sqlite3OsCur
c200: 72 65 6e 74 54 69 6d 65 28 29 2e 20 20 54 68 69  rentTime().  Thi
c210: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  s is used for te
c220: 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66  sting..*/.#ifdef
c230: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
c240: 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
c250: 5f 74 69 6d 65 20 3d 20 30 3b 0a 23 65 6e 64 69  _time = 0;.#endi
c260: 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  f../*.** Find th
c270: 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28  e current time (
c280: 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f  in Universal Coo
c290: 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20  rdinated Time). 
c2a0: 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75   Write the.** cu
c2b0: 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64  rrent time and d
c2c0: 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ate as a Julian 
c2d0: 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  Day number into 
c2e0: 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65  *prNow and.** re
c2f0: 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20  turn 0.  Return 
c300: 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e  1 if the time an
c310: 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65  d date cannot be
c320: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 77   found..*/.int w
c330: 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71  inCurrentTime(sq
c340: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
c350: 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b   double *prNow){
c360: 0a 20 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a  .  FILETIME ft;.
c370: 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74    /* FILETIME st
c380: 72 75 63 74 75 72 65 20 69 73 20 61 20 36 34 2d  ructure is a 64-
c390: 62 69 74 20 76 61 6c 75 65 20 72 65 70 72 65 73  bit value repres
c3a0: 65 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  enting the numbe
c3b0: 72 20 6f 66 20 0a 20 20 20 20 20 31 30 30 2d 6e  r of .     100-n
c3c0: 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76  anosecond interv
c3d0: 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72  als since Januar
c3e0: 79 20 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20  y 1, 1601 (= JD 
c3f0: 32 33 30 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a  2305813.5). .  *
c400: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
c410: 34 20 74 69 6d 65 57 3b 20 20 20 2f 2a 20 57 68  4 timeW;   /* Wh
c420: 6f 6c 65 20 64 61 79 73 20 2a 2f 0a 20 20 73 71  ole days */.  sq
c430: 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 69 6d 65  lite3_int64 time
c440: 46 3b 20 20 20 2f 2a 20 46 72 61 63 74 69 6f 6e  F;   /* Fraction
c450: 61 6c 20 44 61 79 73 20 2a 2f 0a 0a 20 20 2f 2a  al Days */..  /*
c460: 20 4e 75 6d 62 65 72 20 6f 66 20 31 30 30 2d 6e   Number of 100-n
c470: 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76  anosecond interv
c480: 61 6c 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20  als in a single 
c490: 64 61 79 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  day */.  static 
c4a0: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e  const sqlite3_in
c4b0: 74 36 34 20 6e 74 75 50 65 72 44 61 79 20 3d 20  t64 ntuPerDay = 
c4c0: 0a 20 20 20 20 20 20 31 30 30 30 30 30 30 30 2a  .      10000000*
c4d0: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38  (sqlite3_int64)8
c4e0: 36 34 30 30 3b 0a 0a 20 20 2f 2a 20 4e 75 6d 62  6400;..  /* Numb
c4f0: 65 72 20 6f 66 20 31 30 30 2d 6e 61 6e 6f 73 65  er of 100-nanose
c500: 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 20 69  cond intervals i
c510: 6e 20 68 61 6c 66 20 6f 66 20 61 20 64 61 79 20  n half of a day 
c520: 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  */.  static cons
c530: 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  t sqlite3_int64 
c540: 6e 74 75 50 65 72 48 61 6c 66 44 61 79 20 3d 20  ntuPerHalfDay = 
c550: 0a 20 20 20 20 20 20 31 30 30 30 30 30 30 30 2a  .      10000000*
c560: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 34  (sqlite3_int64)4
c570: 33 32 30 30 3b 0a 0a 0a 23 69 66 20 53 51 4c 49  3200;...#if SQLI
c580: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59  TE_OS_WINCE.  SY
c590: 53 54 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20  STEMTIME time;. 
c5a0: 20 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26   GetSystemTime(&
c5b0: 74 69 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53  time);.  /* if S
c5c0: 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
c5d0: 69 6d 65 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ime() fails, it 
c5e0: 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f  returns zero. */
c5f0: 0a 20 20 69 66 20 28 21 53 79 73 74 65 6d 54 69  .  if (!SystemTi
c600: 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 26 74 69  meToFileTime(&ti
c610: 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20 20 72 65  me,&ft)){.    re
c620: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6c 73  turn 1;.  }.#els
c630: 65 0a 20 20 47 65 74 53 79 73 74 65 6d 54 69 6d  e.  GetSystemTim
c640: 65 41 73 46 69 6c 65 54 69 6d 65 28 20 26 66 74  eAsFileTime( &ft
c650: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55   );.#endif.  UNU
c660: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
c670: 66 73 29 3b 0a 20 20 74 69 6d 65 57 20 3d 20 28  fs);.  timeW = (
c680: 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  ((sqlite3_int64)
c690: 66 74 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d  ft.dwHighDateTim
c6a0: 65 29 2a 34 32 39 34 39 36 37 32 39 36 29 20 2b  e)*4294967296) +
c6b0: 20 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d   ft.dwLowDateTim
c6c0: 65 3b 0a 20 20 74 69 6d 65 46 20 3d 20 74 69 6d  e;.  timeF = tim
c6d0: 65 57 20 25 20 6e 74 75 50 65 72 44 61 79 3b 20  eW % ntuPerDay; 
c6e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 66 72 61 63           /* frac
c6f0: 74 69 6f 6e 61 6c 20 64 61 79 73 20 28 31 30 30  tional days (100
c700: 2d 6e 61 6e 6f 73 65 63 6f 6e 64 73 29 20 2a 2f  -nanoseconds) */
c710: 0a 20 20 74 69 6d 65 57 20 3d 20 74 69 6d 65 57  .  timeW = timeW
c720: 20 2f 20 6e 74 75 50 65 72 44 61 79 3b 20 20 20   / ntuPerDay;   
c730: 20 20 20 20 20 20 20 2f 2a 20 77 68 6f 6c 65 20         /* whole 
c740: 64 61 79 73 20 2a 2f 0a 20 20 74 69 6d 65 57 20  days */.  timeW 
c750: 3d 20 74 69 6d 65 57 20 2b 20 32 33 30 35 38 31  = timeW + 230581
c760: 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  3;            /*
c770: 20 61 64 64 20 77 68 6f 6c 65 20 64 61 79 73 20   add whole days 
c780: 28 66 72 6f 6d 20 32 33 30 35 38 31 33 2e 35 29  (from 2305813.5)
c790: 20 2a 2f 0a 20 20 74 69 6d 65 46 20 3d 20 74 69   */.  timeF = ti
c7a0: 6d 65 46 20 2b 20 6e 74 75 50 65 72 48 61 6c 66  meF + ntuPerHalf
c7b0: 44 61 79 3b 20 20 20 20 20 20 2f 2a 20 61 64 64  Day;      /* add
c7c0: 20 68 61 6c 66 20 61 20 64 61 79 20 28 66 72 6f   half a day (fro
c7d0: 6d 20 32 33 30 35 38 31 33 2e 35 29 20 2a 2f 0a  m 2305813.5) */.
c7e0: 20 20 74 69 6d 65 57 20 3d 20 74 69 6d 65 57 20    timeW = timeW 
c7f0: 2b 20 28 74 69 6d 65 46 2f 6e 74 75 50 65 72 44  + (timeF/ntuPerD
c800: 61 79 29 3b 20 20 2f 2a 20 61 64 64 20 77 68 6f  ay);  /* add who
c810: 6c 65 20 64 61 79 20 69 66 20 68 61 6c 66 20 64  le day if half d
c820: 61 79 20 6d 61 64 65 20 6f 6e 65 20 2a 2f 0a 20  ay made one */. 
c830: 20 74 69 6d 65 46 20 3d 20 74 69 6d 65 46 20 25   timeF = timeF %
c840: 20 6e 74 75 50 65 72 44 61 79 3b 20 20 20 20 20   ntuPerDay;     
c850: 20 20 20 20 20 2f 2a 20 63 6f 6d 70 75 74 65 20       /* compute 
c860: 6e 65 77 20 66 72 61 63 74 69 6f 6e 61 6c 20 64  new fractional d
c870: 61 79 73 20 2a 2f 0a 20 20 2a 70 72 4e 6f 77 20  ays */.  *prNow 
c880: 3d 20 28 64 6f 75 62 6c 65 29 74 69 6d 65 57 20  = (double)timeW 
c890: 2b 20 28 28 64 6f 75 62 6c 65 29 74 69 6d 65 46  + ((double)timeF
c8a0: 20 2f 20 28 64 6f 75 62 6c 65 29 6e 74 75 50 65   / (double)ntuPe
c8b0: 72 44 61 79 29 3b 0a 23 69 66 64 65 66 20 53 51  rDay);.#ifdef SQ
c8c0: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
c8d0: 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
c8e0: 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 72 4e  time ){.    *prN
c8f0: 6f 77 20 3d 20 28 28 64 6f 75 62 6c 65 29 73 71  ow = ((double)sq
c900: 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
c910: 6d 65 20 2b 20 28 64 6f 75 62 6c 65 29 34 33 32  me + (double)432
c920: 30 30 29 20 2f 20 28 64 6f 75 62 6c 65 29 38 36  00) / (double)86
c930: 34 30 30 20 2b 20 28 64 6f 75 62 6c 65 29 32 34  400 + (double)24
c940: 34 30 35 38 37 3b 0a 20 20 7d 0a 23 65 6e 64 69  40587;.  }.#endi
c950: 66 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  f.  return 0;.}.
c960: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65 61 20  ./*.** The idea 
c970: 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e  is that this fun
c980: 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65  ction works like
c990: 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f   a combination o
c9a0: 66 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f  f.** GetLastErro
c9b0: 72 28 29 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65  r() and FormatMe
c9c0: 73 73 61 67 65 28 29 20 6f 6e 20 77 69 6e 64 6f  ssage() on windo
c9d0: 77 73 20 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64  ws (or errno and
c9e0: 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29  .** strerror_r()
c9f0: 20 6f 6e 20 75 6e 69 78 29 2e 20 41 66 74 65 72   on unix). After
ca00: 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
ca10: 75 72 6e 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a  urned by an OS.*
ca20: 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69  * function, SQLi
ca30: 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  te calls this fu
ca40: 6e 63 74 69 6f 6e 20 77 69 74 68 20 7a 42 75 66  nction with zBuf
ca50: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20   pointing to.** 
ca60: 61 20 62 75 66 66 65 72 20 6f 66 20 6e 42 75 66  a buffer of nBuf
ca70: 20 62 79 74 65 73 2e 20 54 68 65 20 4f 53 20 6c   bytes. The OS l
ca80: 61 79 65 72 20 73 68 6f 75 6c 64 20 70 6f 70 75  ayer should popu
ca90: 6c 61 74 65 20 74 68 65 0a 2a 2a 20 62 75 66 66  late the.** buff
caa0: 65 72 20 77 69 74 68 20 61 20 6e 75 6c 2d 74 65  er with a nul-te
cab0: 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 65  rminated UTF-8 e
cac0: 6e 63 6f 64 65 64 20 65 72 72 6f 72 20 6d 65 73  ncoded error mes
cad0: 73 61 67 65 0a 2a 2a 20 64 65 73 63 72 69 62 69  sage.** describi
cae0: 6e 67 20 74 68 65 20 6c 61 73 74 20 49 4f 20 65  ng the last IO e
caf0: 72 72 6f 72 20 74 6f 20 68 61 76 65 20 6f 63 63  rror to have occ
cb00: 75 72 72 65 64 20 77 69 74 68 69 6e 20 74 68 65  urred within the
cb10: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65   calling.** thre
cb20: 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ad..**.** If the
cb30: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
cb40: 73 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20  s too large for 
cb50: 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66  the supplied buf
cb60: 66 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c  fer,.** it shoul
cb70: 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 2e 20  d be truncated. 
cb80: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
cb90: 20 6f 66 20 78 47 65 74 4c 61 73 74 45 72 72 6f   of xGetLastErro
cba0: 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20  r.** is zero if 
cbb0: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
cbc0: 65 20 66 69 74 73 20 69 6e 20 74 68 65 20 62 75  e fits in the bu
cbd0: 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72  ffer, or non-zer
cbe0: 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28  o.** otherwise (
cbf0: 69 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 77  if the message w
cc00: 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e 20 49  as truncated). I
cc10: 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65  f non-zero is re
cc20: 74 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  turned,.** then 
cc30: 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
cc40: 61 72 79 20 74 6f 20 69 6e 63 6c 75 64 65 20 74  ary to include t
cc50: 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  he nul-terminato
cc60: 72 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 69  r character.** i
cc70: 6e 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  n the output buf
cc80: 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73  fer..**.** Not s
cc90: 75 70 70 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f  upplying an erro
cca0: 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 68  r message will h
ccb0: 61 76 65 20 6e 6f 20 61 64 76 65 72 73 65 20 65  ave no adverse e
ccc0: 66 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69  ffect.** on SQLi
ccd0: 74 65 2e 20 49 74 20 69 73 20 66 69 6e 65 20 74  te. It is fine t
cce0: 6f 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d  o have an implem
ccf0: 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 20 6e 65  entation that ne
cd00: 76 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61  ver.** returns a
cd10: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 3a  n error message:
cd20: 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65  .**.**   int xGe
cd30: 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74  tLastError(sqlit
cd40: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
cd50: 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
cd60: 75 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65  uf){.**     asse
cd70: 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27  rt(zBuf[0]=='\0'
cd80: 29 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e  );.**     return
cd90: 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a   0;.**   }.**.**
cda0: 20 48 6f 77 65 76 65 72 20 69 66 20 61 6e 20 65   However if an e
cdb0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
cdc0: 73 75 70 70 6c 69 65 64 2c 20 69 74 20 77 69 6c  supplied, it wil
cdd0: 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72 61 74 65  l be incorporate
cde0: 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 20 69  d.** by sqlite i
cdf0: 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65  nto the error me
ce00: 73 73 61 67 65 20 61 76 61 69 6c 61 62 6c 65 20  ssage available 
ce10: 74 6f 20 74 68 65 20 75 73 65 72 20 75 73 69 6e  to the user usin
ce20: 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72 72  g.** sqlite3_err
ce30: 6d 73 67 28 29 2c 20 70 6f 73 73 69 62 6c 79 20  msg(), possibly 
ce40: 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f 72 73  making IO errors
ce50: 20 65 61 73 69 65 72 20 74 6f 20 64 65 62 75 67   easier to debug
ce60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ce70: 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 28  winGetLastError(
ce80: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
ce90: 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
cea0: 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53  r *zBuf){.  UNUS
ceb0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
cec0: 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74  s);.  return get
ced0: 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6e 42 75  LastErrorMsg(nBu
cee0: 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a  f, zBuf);.}../*.
cef0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e  ** Initialize an
cf00: 64 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74  d deinitialize t
cf10: 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
cf20: 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  tem interface..*
cf30: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  /.int sqlite3_os
cf40: 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73  _init(void){.  s
cf50: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66  tatic sqlite3_vf
cf60: 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20  s winVfs = {.   
cf70: 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
cf80: 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
cf90: 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69  */.    sizeof(wi
cfa0: 6e 46 69 6c 65 29 2c 20 20 20 2f 2a 20 73 7a 4f  nFile),   /* szO
cfb0: 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 4d 41 58  sFile */.    MAX
cfc0: 5f 50 41 54 48 2c 20 20 20 20 20 20 20 20 20 20  _PATH,          
cfd0: 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f  /* mxPathname */
cfe0: 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
cff0: 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74          /* pNext
d000: 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22 2c   */.    "win32",
d010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e             /* zN
d020: 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ame */.    0,   
d030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d040: 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 0a 20   pAppData */. . 
d050: 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20     winOpen,     
d060: 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
d070: 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c  /.    winDelete,
d080: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c           /* xDel
d090: 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63  ete */.    winAc
d0a0: 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 2f 2a  cess,         /*
d0b0: 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20   xAccess */.    
d0c0: 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  winFullPathname,
d0d0: 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e     /* xFullPathn
d0e0: 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ame */.    winDl
d0f0: 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 2f 2a  Open,         /*
d100: 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20   xDlOpen */.    
d110: 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20  winDlError,     
d120: 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a     /* xDlError *
d130: 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20  /.    winDlSym, 
d140: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53           /* xDlS
d150: 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43  ym */.    winDlC
d160: 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  lose,        /* 
d170: 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20  xDlClose */.    
d180: 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20  winRandomness,  
d190: 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73     /* xRandomnes
d1a0: 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65  s */.    winSlee
d1b0: 70 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  p,          /* x
d1c0: 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e  Sleep */.    win
d1d0: 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20  CurrentTime,    
d1e0: 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20  /* xCurrentTime 
d1f0: 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73  */.    winGetLas
d200: 74 45 72 72 6f 72 20 20 20 20 2f 2a 20 78 47 65  tError    /* xGe
d210: 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20  tLastError */.  
d220: 7d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  };.  sqlite3_vfs
d230: 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e 56 66  _register(&winVf
d240: 73 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  s, 1);.  return 
d250: 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 69 6e  SQLITE_OK; .}.in
d260: 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64  t sqlite3_os_end
d270: 28 76 6f 69 64 29 7b 20 0a 20 20 72 65 74 75 72  (void){ .  retur
d280: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d290: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
d2a0: 5f 4f 53 5f 57 49 4e 20 2a 2f 0a                 _OS_WIN */.