/ Hex Artifact Content
Login

Artifact d42d591be8669de0ecf3a0433108d31a8eadcbb3:


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 34 34 20 32 30 30  in.c,v 1.144 200
01d0: 38 2f 31 32 2f 31 30 20 32 32 3a 33 30 3a 32 35  8/12/10 22:30:25
01e0: 20 73 68 61 6e 65 20 45 78 70 20 24 0a 2a 2f 0a   shane Exp $.*/.
01f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0200: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0210: 45 5f 4f 53 5f 57 49 4e 20 20 20 20 20 20 20 20  E_OS_WIN        
0220: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0230: 69 6c 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ile is used for 
0240: 77 69 6e 64 6f 77 73 20 6f 6e 6c 79 20 2a 2f 0a  windows only */.
0250: 0a 0a 2f 2a 0a 2a 2a 20 41 20 4e 6f 74 65 20 41  ../*.** A Note A
0260: 62 6f 75 74 20 4d 65 6d 6f 72 79 20 41 6c 6c 6f  bout Memory Allo
0270: 63 61 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 54 68  cation:.**.** Th
0280: 69 73 20 64 72 69 76 65 72 20 75 73 65 73 20 6d  is driver uses m
0290: 61 6c 6c 6f 63 28 29 2f 66 72 65 65 28 29 20 64  alloc()/free() d
02a0: 69 72 65 63 74 6c 79 20 72 61 74 68 65 72 20 74  irectly rather t
02b0: 68 61 6e 20 67 6f 69 6e 67 20 74 68 72 6f 75 67  han going throug
02c0: 68 0a 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 2d  h.** the SQLite-
02d0: 77 72 61 70 70 65 72 73 20 73 71 6c 69 74 65 33  wrappers sqlite3
02e0: 5f 6d 61 6c 6c 6f 63 28 29 2f 73 71 6c 69 74 65  _malloc()/sqlite
02f0: 33 5f 66 72 65 65 28 29 2e 20 20 54 68 6f 73 65  3_free().  Those
0300: 20 77 72 61 70 70 65 72 73 0a 2a 2a 20 61 72 65   wrappers.** are
0310: 20 64 65 73 69 67 6e 65 64 20 66 6f 72 20 75 73   designed for us
0320: 65 20 6f 6e 20 65 6d 62 65 64 64 65 64 20 73 79  e on embedded sy
0330: 73 74 65 6d 73 20 77 68 65 72 65 20 6d 65 6d 6f  stems where memo
0340: 72 79 20 69 73 20 73 63 61 72 63 65 20 61 6e 64  ry is scarce and
0350: 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  .** malloc failu
0360: 72 65 73 20 68 61 70 70 65 6e 20 66 72 65 71 75  res happen frequ
0370: 65 6e 74 6c 79 2e 20 20 57 69 6e 33 32 20 64 6f  ently.  Win32 do
0380: 65 73 20 6e 6f 74 20 74 79 70 69 63 61 6c 6c 79  es not typically
0390: 20 72 75 6e 20 6f 6e 0a 2a 2a 20 65 6d 62 65 64   run on.** embed
03a0: 64 65 64 20 73 79 73 74 65 6d 73 2c 20 61 6e 64  ded systems, and
03b0: 20 77 68 65 6e 20 69 74 20 64 6f 65 73 20 74 68   when it does th
03c0: 65 20 64 65 76 65 6c 6f 70 65 72 73 20 6e 6f 72  e developers nor
03d0: 6d 61 6c 6c 79 20 68 61 76 65 20 62 69 67 67 65  mally have bigge
03e0: 72 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 74 6f  r.** problems to
03f0: 20 77 6f 72 72 79 20 61 62 6f 75 74 20 74 68 61   worry about tha
0400: 6e 20 72 75 6e 6e 69 6e 67 20 6f 75 74 20 6f 66  n running out of
0410: 20 6d 65 6d 6f 72 79 2e 20 20 53 6f 20 74 68 65   memory.  So the
0420: 72 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 63  re is not.** a c
0430: 6f 6d 70 65 6c 6c 69 6e 67 20 6e 65 65 64 20 74  ompelling need t
0440: 6f 20 75 73 65 20 74 68 65 20 77 72 61 70 70 65  o use the wrappe
0450: 72 73 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 74 68  rs..**.** But th
0460: 65 72 65 20 69 73 20 61 20 67 6f 6f 64 20 72 65  ere is a good re
0470: 61 73 6f 6e 20 74 6f 20 6e 6f 74 20 75 73 65 20  ason to not use 
0480: 74 68 65 20 77 72 61 70 70 65 72 73 2e 20 20 49  the wrappers.  I
0490: 66 20 77 65 20 75 73 65 20 74 68 65 0a 2a 2a 20  f we use the.** 
04a0: 77 72 61 70 70 65 72 73 20 74 68 65 6e 20 77 65  wrappers then we
04b0: 20 77 69 6c 6c 20 67 65 74 20 73 69 6d 75 6c 61   will get simula
04c0: 74 65 64 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  ted malloc() fai
04d0: 6c 75 72 65 73 20 77 69 74 68 69 6e 20 74 68 69  lures within thi
04e0: 73 0a 2a 2a 20 64 72 69 76 65 72 2e 20 20 41 6e  s.** driver.  An
04f0: 64 20 74 68 61 74 20 63 61 75 73 65 73 20 61 6c  d that causes al
0500: 6c 20 6b 69 6e 64 73 20 6f 66 20 70 72 6f 62 6c  l kinds of probl
0510: 65 6d 73 20 66 6f 72 20 6f 75 72 20 74 65 73 74  ems for our test
0520: 73 2e 20 20 57 65 0a 2a 2a 20 63 6f 75 6c 64 20  s.  We.** could 
0530: 65 6e 68 61 6e 63 65 20 53 51 4c 69 74 65 20 74  enhance SQLite t
0540: 6f 20 64 65 61 6c 20 77 69 74 68 20 73 69 6d 75  o deal with simu
0550: 6c 61 74 65 64 20 6d 61 6c 6c 6f 63 20 66 61 69  lated malloc fai
0560: 6c 75 72 65 73 20 77 69 74 68 69 6e 0a 2a 2a 20  lures within.** 
0570: 74 68 65 20 4f 53 20 64 72 69 76 65 72 2c 20 62  the OS driver, b
0580: 75 74 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64  ut the code to d
0590: 65 61 6c 20 77 69 74 68 20 74 68 6f 73 65 20 66  eal with those f
05a0: 61 69 6c 75 72 65 20 77 6f 75 6c 64 20 6e 6f 74  ailure would not
05b0: 0a 2a 2a 20 62 65 20 65 78 65 72 63 69 73 65 64  .** be exercised
05c0: 20 6f 6e 20 4c 69 6e 75 78 20 28 77 68 69 63 68   on Linux (which
05d0: 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
05e0: 6f 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 20 74 68  o malloc() in th
05f0: 65 20 64 72 69 76 65 72 29 0a 2a 2a 20 61 6e 64  e driver).** and
0600: 20 73 6f 20 77 65 20 77 6f 75 6c 64 20 68 61 76   so we would hav
0610: 65 20 64 69 66 66 69 63 75 6c 74 79 20 77 72 69  e difficulty wri
0620: 74 69 6e 67 20 63 6f 76 65 72 61 67 65 20 74 65  ting coverage te
0630: 73 74 73 20 66 6f 72 20 74 68 61 74 0a 2a 2a 20  sts for that.** 
0640: 63 6f 64 65 2e 20 20 42 65 74 74 65 72 20 74 6f  code.  Better to
0650: 20 6c 65 61 76 65 20 74 68 65 20 63 6f 64 65 20   leave the code 
0660: 6f 75 74 2c 20 77 65 20 74 68 69 6e 6b 2e 0a 2a  out, we think..*
0670: 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 20 6f  *.** The point o
0680: 66 20 74 68 69 73 20 64 69 73 63 75 73 73 69 6f  f this discussio
0690: 6e 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  n is as follows:
06a0: 20 20 57 68 65 6e 20 63 72 65 61 74 69 6e 67 20    When creating 
06b0: 61 20 6e 65 77 0a 2a 2a 20 4f 53 20 6c 61 79 65  a new.** OS laye
06c0: 72 20 66 6f 72 20 61 6e 20 65 6d 62 65 64 64 65  r for an embedde
06d0: 64 20 73 79 73 74 65 6d 2c 20 69 66 20 79 6f 75  d system, if you
06e0: 20 75 73 65 20 74 68 69 73 20 66 69 6c 65 20 61   use this file a
06f0: 73 20 61 6e 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a  s an example,.**
0700: 20 61 76 6f 69 64 20 74 68 65 20 75 73 65 20 6f   avoid the use o
0710: 66 20 6d 61 6c 6c 6f 63 28 29 2f 66 72 65 65 28  f malloc()/free(
0720: 29 2e 20 20 54 68 6f 73 65 20 72 6f 75 74 69 6e  ).  Those routin
0730: 65 73 20 77 6f 72 6b 20 6f 6b 20 6f 6e 20 77 69  es work ok on wi
0740: 6e 64 6f 77 73 0a 2a 2a 20 64 65 73 6b 74 6f 70  ndows.** desktop
0750: 73 20 62 75 74 20 6e 6f 74 20 73 6f 20 77 65 6c  s but not so wel
0760: 6c 20 69 6e 20 65 6d 62 65 64 64 65 64 20 73 79  l in embedded sy
0770: 73 74 65 6d 73 2e 0a 2a 2f 0a 0a 23 69 6e 63 6c  stems..*/..#incl
0780: 75 64 65 20 3c 77 69 6e 62 61 73 65 2e 68 3e 0a  ude <winbase.h>.
0790: 0a 23 69 66 64 65 66 20 5f 5f 43 59 47 57 49 4e  .#ifdef __CYGWIN
07a0: 5f 5f 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79  __.# include <sy
07b0: 73 2f 63 79 67 77 69 6e 2e 68 3e 0a 23 65 6e 64  s/cygwin.h>.#end
07c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73  if../*.** Macros
07d0: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
07e0: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
07f0: 74 20 74 6f 20 75 73 65 20 74 68 72 65 61 64 73  t to use threads
0800: 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
0810: 28 54 48 52 45 41 44 53 41 46 45 29 20 26 26 20  (THREADSAFE) && 
0820: 54 48 52 45 41 44 53 41 46 45 0a 23 20 64 65 66  THREADSAFE.# def
0830: 69 6e 65 20 53 51 4c 49 54 45 5f 57 33 32 5f 54  ine SQLITE_W32_T
0840: 48 52 45 41 44 53 20 31 0a 23 65 6e 64 69 66 0a  HREADS 1.#endif.
0850: 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63  ./*.** Include c
0860: 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d  ode that is comm
0870: 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63  on to all os_*.c
0880: 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75   files.*/.#inclu
0890: 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22  de "os_common.h"
08a0: 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 6d 69 63  ../*.** Some mic
08b0: 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73  rosoft compilers
08c0: 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66 69 6e   lack this defin
08d0: 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ition..*/.#ifnde
08e0: 66 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  f INVALID_FILE_A
08f0: 54 54 52 49 42 55 54 45 53 0a 23 20 64 65 66 69  TTRIBUTES.# defi
0900: 6e 65 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  ne INVALID_FILE_
0910: 41 54 54 52 49 42 55 54 45 53 20 28 28 44 57 4f  ATTRIBUTES ((DWO
0920: 52 44 29 2d 31 29 20 0a 23 65 6e 64 69 66 0a 0a  RD)-1) .#endif..
0930: 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
0940: 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  if we are dealin
0950: 67 20 77 69 74 68 20 57 69 6e 64 6f 77 73 43 45  g with WindowsCE
0960: 20 2d 20 77 68 69 63 68 20 68 61 73 20 61 20 6d   - which has a m
0970: 75 63 68 0a 2a 2a 20 72 65 64 75 63 65 64 20 41  uch.** reduced A
0980: 50 49 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  PI..*/.#if SQLIT
0990: 45 5f 4f 53 5f 57 49 4e 43 45 0a 23 20 64 65 66  E_OS_WINCE.# def
09a0: 69 6e 65 20 41 72 65 46 69 6c 65 41 70 69 73 41  ine AreFileApisA
09b0: 4e 53 49 28 29 20 31 0a 23 65 6e 64 69 66 0a 0a  NSI() 1.#endif..
09c0: 2f 2a 0a 2a 2a 20 57 69 6e 43 45 20 6c 61 63 6b  /*.** WinCE lack
09d0: 73 20 6e 61 74 69 76 65 20 73 75 70 70 6f 72 74  s native support
09e0: 20 66 6f 72 20 66 69 6c 65 20 6c 6f 63 6b 69 6e   for file lockin
09f0: 67 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20  g so we have to 
0a00: 66 61 6b 65 20 69 74 0a 2a 2a 20 77 69 74 68 20  fake it.** with 
0a10: 73 6f 6d 65 20 63 6f 64 65 20 6f 66 20 6f 75 72  some code of our
0a20: 20 6f 77 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c   own..*/.#if SQL
0a30: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 74 79 70  ITE_OS_WINCE.typ
0a40: 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 63  edef struct winc
0a50: 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e 74 20 6e 52  eLock {.  int nR
0a60: 65 61 64 65 72 73 3b 20 20 20 20 20 20 20 2f 2a  eaders;       /*
0a70: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 61 64 65   Number of reade
0a80: 72 20 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64  r locks obtained
0a90: 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 50 65 6e 64   */.  BOOL bPend
0aa0: 69 6e 67 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64  ing;      /* Ind
0ab0: 69 63 61 74 65 73 20 61 20 70 65 6e 64 69 6e 67  icates a pending
0ac0: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f   lock has been o
0ad0: 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f  btained */.  BOO
0ae0: 4c 20 62 52 65 73 65 72 76 65 64 3b 20 20 20 20  L bReserved;    
0af0: 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20   /* Indicates a 
0b00: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 68 61  reserved lock ha
0b10: 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  s been obtained 
0b20: 2a 2f 0a 20 20 42 4f 4f 4c 20 62 45 78 63 6c 75  */.  BOOL bExclu
0b30: 73 69 76 65 3b 20 20 20 20 2f 2a 20 49 6e 64 69  sive;    /* Indi
0b40: 63 61 74 65 73 20 61 6e 20 65 78 63 6c 75 73 69  cates an exclusi
0b50: 76 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  ve lock has been
0b60: 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 7d 20 77   obtained */.} w
0b70: 69 6e 63 65 4c 6f 63 6b 3b 0a 23 65 6e 64 69 66  inceLock;.#endif
0b80: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 46  ../*.** The winF
0b90: 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ile structure is
0ba0: 20 61 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73   a subclass of s
0bb0: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 20 73 70 65  qlite3_file* spe
0bc0: 63 69 66 69 63 20 74 6f 20 74 68 65 20 77 69 6e  cific to the win
0bd0: 33 32 0a 2a 2a 20 70 6f 72 74 61 62 69 6c 69 74  32.** portabilit
0be0: 79 20 6c 61 79 65 72 2e 0a 2a 2f 0a 74 79 70 65  y layer..*/.type
0bf0: 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 46 69  def struct winFi
0c00: 6c 65 20 77 69 6e 46 69 6c 65 3b 0a 73 74 72 75  le winFile;.stru
0c10: 63 74 20 77 69 6e 46 69 6c 65 20 7b 0a 20 20 63  ct winFile {.  c
0c20: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
0c30: 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64  methods *pMethod
0c40: 3b 2f 2a 20 4d 75 73 74 20 62 65 20 66 69 72 73  ;/* Must be firs
0c50: 74 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b  t */.  HANDLE h;
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0c70: 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61 63 63  * Handle for acc
0c80: 65 73 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20  essing the file 
0c90: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
0ca0: 61 72 20 6c 6f 63 6b 74 79 70 65 3b 20 2f 2a 20  ar locktype; /* 
0cb0: 54 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63 75 72  Type of lock cur
0cc0: 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 20 74  rently held on t
0cd0: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 73 68  his file */.  sh
0ce0: 6f 72 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  ort sharedLockBy
0cf0: 74 65 3b 20 20 20 2f 2a 20 52 61 6e 64 6f 6d 6c  te;   /* Randoml
0d00: 79 20 63 68 6f 73 65 6e 20 62 79 74 65 20 75 73  y chosen byte us
0d10: 65 64 20 61 73 20 61 20 73 68 61 72 65 64 20 6c  ed as a shared l
0d20: 6f 63 6b 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ock */.#if SQLIT
0d30: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 57 43 48  E_OS_WINCE.  WCH
0d40: 41 52 20 2a 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  AR *zDeleteOnClo
0d50: 73 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  se;  /* Name of 
0d60: 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 77  file to delete w
0d70: 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20  hen closing */. 
0d80: 20 48 41 4e 44 4c 45 20 68 4d 75 74 65 78 3b 20   HANDLE hMutex; 
0d90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 74 65           /* Mute
0da0: 78 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f  x used to contro
0db0: 6c 20 61 63 63 65 73 73 20 74 6f 20 73 68 61 72  l access to shar
0dc0: 65 64 20 6c 6f 63 6b 20 2a 2f 20 20 0a 20 20 48  ed lock */  .  H
0dd0: 41 4e 44 4c 45 20 68 53 68 61 72 65 64 3b 20 20  ANDLE hShared;  
0de0: 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
0df0: 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20   memory segment 
0e00: 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
0e10: 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20   */.  winceLock 
0e20: 6c 6f 63 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a  local;        /*
0e30: 20 4c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20   Locks obtained 
0e40: 62 79 20 74 68 69 73 20 69 6e 73 74 61 6e 63 65  by this instance
0e50: 20 6f 66 20 77 69 6e 46 69 6c 65 20 2a 2f 0a 20   of winFile */. 
0e60: 20 77 69 6e 63 65 4c 6f 63 6b 20 2a 73 68 61 72   winceLock *shar
0e70: 65 64 3b 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62  ed;      /* Glob
0e80: 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6d  al shared lock m
0e90: 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 66 69  emory for the fi
0ea0: 6c 65 20 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  le  */.#endif.};
0eb0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  .../*.** The fol
0ec0: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20  lowing variable 
0ed0: 69 73 20 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65  is (normally) se
0ee0: 74 20 6f 6e 63 65 20 61 6e 64 20 6e 65 76 65 72  t once and never
0ef0: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72   changes.** ther
0f00: 65 61 66 74 65 72 2e 20 20 49 74 20 72 65 63 6f  eafter.  It reco
0f10: 72 64 73 20 77 68 65 74 68 65 72 20 74 68 65 20  rds whether the 
0f20: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
0f30: 20 69 73 20 57 69 6e 39 35 0a 2a 2a 20 6f 72 20   is Win95.** or 
0f40: 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20  WinNT..**.** 0: 
0f50: 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74    Operating syst
0f60: 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31  em unknown..** 1
0f70: 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79  :   Operating sy
0f80: 73 74 65 6d 20 69 73 20 57 69 6e 39 35 2e 0a 2a  stem is Win95..*
0f90: 2a 20 32 3a 20 20 20 4f 70 65 72 61 74 69 6e 67  * 2:   Operating
0fa0: 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 4e 54   system is WinNT
0fb0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72  ..**.** In order
0fc0: 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74   to facilitate t
0fd0: 65 73 74 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e  esting on a WinN
0fe0: 54 20 73 79 73 74 65 6d 2c 20 74 68 65 20 74 65  T system, the te
0ff0: 73 74 20 66 69 78 74 75 72 65 0a 2a 2a 20 63 61  st fixture.** ca
1000: 6e 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20 74  n manually set t
1010: 68 69 73 20 76 61 6c 75 65 20 74 6f 20 31 20 74  his value to 1 t
1020: 6f 20 65 6d 75 6c 61 74 65 20 57 69 6e 39 38 20  o emulate Win98 
1030: 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66  behavior..*/.#if
1040: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1050: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74  int sqlite3_os_t
1060: 79 70 65 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73  ype = 0;.#else.s
1070: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
1080: 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23  3_os_type = 0;.#
1090: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
10a0: 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65  urn true (non-ze
10b0: 72 6f 29 20 69 66 20 77 65 20 61 72 65 20 72 75  ro) if we are ru
10c0: 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e  nning under WinN
10d0: 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58 50 2c  T, Win2K, WinXP,
10e0: 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20 20 52  .** or WinCE.  R
10f0: 65 74 75 72 6e 20 66 61 6c 73 65 20 28 7a 65 72  eturn false (zer
1100: 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c 20 57 69  o) for Win95, Wi
1110: 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a  n98, or WinME..*
1120: 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 61 6e 20  *.** Here is an 
1130: 69 6e 74 65 72 65 73 74 69 6e 67 20 6f 62 73 65  interesting obse
1140: 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c  rvation:  Win95,
1150: 20 57 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d   Win98, and WinM
1160: 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f  E lack.** the Lo
1170: 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 20  ckFileEx() API. 
1180: 20 42 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c   But we can stil
1190: 6c 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e  l statically lin
11a0: 6b 20 61 67 61 69 6e 73 74 20 74 68 61 74 0a 2a  k against that.*
11b0: 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67 20 61 73  * API as long as
11c0: 20 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69   we don't call i
11d0: 74 20 77 69 6e 20 72 75 6e 6e 69 6e 67 20 57 69  t win running Wi
11e0: 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61  n95/98/ME.  A ca
11f0: 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f  ll to.** this ro
1200: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
1210: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
1220: 65 20 68 6f 73 74 20 69 73 20 57 69 6e 39 35 2f  e host is Win95/
1230: 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e  98/ME or.** WinN
1240: 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61 74 20  T/2K/XP so that 
1250: 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65  we will know whe
1260: 74 68 65 72 20 6f 72 20 6e 6f 74 20 77 65 20 63  ther or not we c
1270: 61 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a  an safely call.*
1280: 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  * the LockFileEx
1290: 28 29 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 20 53  () API..*/.#if S
12a0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23  QLITE_OS_WINCE.#
12b0: 20 64 65 66 69 6e 65 20 69 73 4e 54 28 29 20 20   define isNT()  
12c0: 28 31 29 0a 23 65 6c 73 65 0a 20 20 73 74 61 74  (1).#else.  stat
12d0: 69 63 20 69 6e 74 20 69 73 4e 54 28 76 6f 69 64  ic int isNT(void
12e0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
12f0: 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 30 20 29 7b  e3_os_type==0 ){
1300: 0a 20 20 20 20 20 20 4f 53 56 45 52 53 49 4f 4e  .      OSVERSION
1310: 49 4e 46 4f 20 73 49 6e 66 6f 3b 0a 20 20 20 20  INFO sInfo;.    
1320: 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73    sInfo.dwOSVers
1330: 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69  ionInfoSize = si
1340: 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20  zeof(sInfo);.   
1350: 20 20 20 47 65 74 56 65 72 73 69 6f 6e 45 78 28     GetVersionEx(
1360: 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  &sInfo);.      s
1370: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d  qlite3_os_type =
1380: 20 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72   sInfo.dwPlatfor
1390: 6d 49 64 3d 3d 56 45 52 5f 50 4c 41 54 46 4f 52  mId==VER_PLATFOR
13a0: 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f 20 32 20 3a  M_WIN32_NT ? 2 :
13b0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   1;.    }.    re
13c0: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6f 73 5f  turn sqlite3_os_
13d0: 74 79 70 65 3d 3d 32 3b 0a 20 20 7d 0a 23 65 6e  type==2;.  }.#en
13e0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53  dif /* SQLITE_OS
13f0: 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _WINCE */../*.**
1400: 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38   Convert a UTF-8
1410: 20 73 74 72 69 6e 67 20 74 6f 20 6d 69 63 72 6f   string to micro
1420: 73 6f 66 74 20 75 6e 69 63 6f 64 65 20 28 55 54  soft unicode (UT
1430: 46 2d 31 36 3f 29 2e 20 0a 2a 2a 0a 2a 2a 20 53  F-16?). .**.** S
1440: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
1450: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
1460: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
1470: 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61  m malloc..*/.sta
1480: 74 69 63 20 57 43 48 41 52 20 2a 75 74 66 38 54  tic WCHAR *utf8T
1490: 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63  oUnicode(const c
14a0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
14b0: 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20  .  int nChar;.  
14c0: 57 43 48 41 52 20 2a 7a 57 69 64 65 46 69 6c 65  WCHAR *zWideFile
14d0: 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20 3d  name;..  nChar =
14e0: 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65   MultiByteToWide
14f0: 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c  Char(CP_UTF8, 0,
1500: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20   zFilename, -1, 
1510: 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 7a 57 69 64  NULL, 0);.  zWid
1520: 65 46 69 6c 65 6e 61 6d 65 20 3d 20 6d 61 6c 6c  eFilename = mall
1530: 6f 63 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66  oc( nChar*sizeof
1540: 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30  (zWideFilename[0
1550: 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64  ]) );.  if( zWid
1560: 65 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a  eFilename==0 ){.
1570: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1580: 7d 0a 20 20 6e 43 68 61 72 20 3d 20 4d 75 6c 74  }.  nChar = Mult
1590: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
15a0: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c  CP_UTF8, 0, zFil
15b0: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64 65  ename, -1, zWide
15c0: 46 69 6c 65 6e 61 6d 65 2c 20 6e 43 68 61 72 29  Filename, nChar)
15d0: 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30  ;.  if( nChar==0
15e0: 20 29 7b 0a 20 20 20 20 66 72 65 65 28 7a 57 69   ){.    free(zWi
15f0: 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  deFilename);.   
1600: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d   zWideFilename =
1610: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1620: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a   zWideFilename;.
1630: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
1640: 20 6d 69 63 72 6f 73 6f 66 74 20 75 6e 69 63 6f   microsoft unico
1650: 64 65 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70  de to UTF-8.  Sp
1660: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
1670: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
1680: 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66  is.** obtained f
1690: 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  rom malloc()..*/
16a0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 6e  .static char *un
16b0: 69 63 6f 64 65 54 6f 55 74 66 38 28 63 6f 6e 73  icodeToUtf8(cons
16c0: 74 20 57 43 48 41 52 20 2a 7a 57 69 64 65 46 69  t WCHAR *zWideFi
16d0: 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e  lename){.  int n
16e0: 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46  Byte;.  char *zF
16f0: 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42 79 74  ilename;..  nByt
1700: 65 20 3d 20 57 69 64 65 43 68 61 72 54 6f 4d 75  e = WideCharToMu
1710: 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c  ltiByte(CP_UTF8,
1720: 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d   0, zWideFilenam
1730: 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20  e, -1, 0, 0, 0, 
1740: 30 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20  0);.  zFilename 
1750: 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  = malloc( nByte 
1760: 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  );.  if( zFilena
1770: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
1780: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
1790: 74 65 20 3d 20 57 69 64 65 43 68 61 72 54 6f 4d  te = WideCharToM
17a0: 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38  ultiByte(CP_UTF8
17b0: 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61  , 0, zWideFilena
17c0: 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d  me, -1, zFilenam
17d0: 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20  e, nByte,.      
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f0: 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20          0, 0);. 
1800: 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20   if( nByte == 0 
1810: 29 7b 0a 20 20 20 20 66 72 65 65 28 7a 46 69 6c  ){.    free(zFil
1820: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c  ename);.    zFil
1830: 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  ename = 0;.  }. 
1840: 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d   return zFilenam
1850: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  e;.}../*.** Conv
1860: 65 72 74 20 61 6e 20 61 6e 73 69 20 73 74 72 69  ert an ansi stri
1870: 6e 67 20 74 6f 20 6d 69 63 72 6f 73 6f 66 74 20  ng to microsoft 
1880: 75 6e 69 63 6f 64 65 2c 20 62 61 73 65 64 20 6f  unicode, based o
1890: 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  n the.** current
18a0: 20 63 6f 64 65 70 61 67 65 20 73 65 74 74 69 6e   codepage settin
18b0: 67 73 20 66 6f 72 20 66 69 6c 65 20 61 70 69 73  gs for file apis
18c0: 2e 0a 2a 2a 20 0a 2a 2a 20 53 70 61 63 65 20 74  ..** .** Space t
18d0: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
18e0: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
18f0: 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 6d  tained.** from m
1900: 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  alloc..*/.static
1910: 20 57 43 48 41 52 20 2a 6d 62 63 73 54 6f 55 6e   WCHAR *mbcsToUn
1920: 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72  icode(const char
1930: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
1940: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 57 43 48  int nByte;.  WCH
1950: 41 52 20 2a 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  AR *zMbcsFilenam
1960: 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67  e;.  int codepag
1970: 65 20 3d 20 41 72 65 46 69 6c 65 41 70 69 73 41  e = AreFileApisA
1980: 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a  NSI() ? CP_ACP :
1990: 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42   CP_OEMCP;..  nB
19a0: 79 74 65 20 3d 20 4d 75 6c 74 69 42 79 74 65 54  yte = MultiByteT
19b0: 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61  oWideChar(codepa
19c0: 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  ge, 0, zFilename
19d0: 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 30 29 2a 73 69  , -1, NULL,0)*si
19e0: 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 20 7a  zeof(WCHAR);.  z
19f0: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 6d  MbcsFilename = m
1a00: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a  alloc( nByte*siz
1a10: 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  eof(zMbcsFilenam
1a20: 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a  e[0]) );.  if( z
1a30: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  MbcsFilename==0 
1a40: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1a50: 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 4d  .  }.  nByte = M
1a60: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
1a70: 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20  ar(codepage, 0, 
1a80: 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a  zFilename, -1, z
1a90: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c 20 6e 42  MbcsFilename, nB
1aa0: 79 74 65 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  yte);.  if( nByt
1ab0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 72 65 65  e==0 ){.    free
1ac0: 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 29 3b  (zMbcsFilename);
1ad0: 0a 20 20 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61  .    zMbcsFilena
1ae0: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
1af0: 74 75 72 6e 20 7a 4d 62 63 73 46 69 6c 65 6e 61  turn zMbcsFilena
1b00: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
1b10: 76 65 72 74 20 6d 69 63 72 6f 73 6f 66 74 20 75  vert microsoft u
1b20: 6e 69 63 6f 64 65 20 74 6f 20 6d 75 6c 74 69 62  nicode to multib
1b30: 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74  yte character st
1b40: 72 69 6e 67 2c 20 62 61 73 65 64 20 6f 6e 20 74  ring, based on t
1b50: 68 65 0a 2a 2a 20 75 73 65 72 27 73 20 41 6e 73  he.** user's Ans
1b60: 69 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a 0a 2a  i codepage..**.*
1b70: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
1b80: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
1b90: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ing is obtained 
1ba0: 66 72 6f 6d 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29  from.** malloc()
1bb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
1bc0: 20 2a 75 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28   *unicodeToMbcs(
1bd0: 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 7a 57 69  const WCHAR *zWi
1be0: 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69  deFilename){.  i
1bf0: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72  nt nByte;.  char
1c00: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69   *zFilename;.  i
1c10: 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 41 72  nt codepage = Ar
1c20: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20  eFileApisANSI() 
1c30: 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45  ? CP_ACP : CP_OE
1c40: 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20  MCP;..  nByte = 
1c50: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
1c60: 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  yte(codepage, 0,
1c70: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20   zWideFilename, 
1c80: 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  -1, 0, 0, 0, 0);
1c90: 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 6d  .  zFilename = m
1ca0: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a  alloc( nByte );.
1cb0: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
1cc0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1cd0: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
1ce0: 3d 20 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  = WideCharToMult
1cf0: 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20  iByte(codepage, 
1d00: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
1d10: 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  , -1, zFilename,
1d20: 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20   nByte,.        
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 69        0, 0);.  i
1d50: 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b  f( nByte == 0 ){
1d60: 0a 20 20 20 20 66 72 65 65 28 7a 46 69 6c 65 6e  .    free(zFilen
1d70: 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e  ame);.    zFilen
1d80: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ame = 0;.  }.  r
1d90: 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b  eturn zFilename;
1da0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
1db0: 74 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72  t multibyte char
1dc0: 61 63 74 65 72 20 73 74 72 69 6e 67 20 74 6f 20  acter string to 
1dd0: 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f  UTF-8.  Space to
1de0: 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74   hold the.** ret
1df0: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
1e00: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
1e10: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20  lloc()..*/.char 
1e20: 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d  *sqlite3_win32_m
1e30: 62 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73  bcs_to_utf8(cons
1e40: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1e50: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  e){.  char *zFil
1e60: 65 6e 61 6d 65 55 74 66 38 3b 0a 20 20 57 43 48  enameUtf8;.  WCH
1e70: 41 52 20 2a 7a 54 6d 70 57 69 64 65 3b 0a 0a 20  AR *zTmpWide;.. 
1e80: 20 7a 54 6d 70 57 69 64 65 20 3d 20 6d 62 63 73   zTmpWide = mbcs
1e90: 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
1ea0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70  ame);.  if( zTmp
1eb0: 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Wide==0 ){.    r
1ec0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
1ed0: 46 69 6c 65 6e 61 6d 65 55 74 66 38 20 3d 20 75  FilenameUtf8 = u
1ee0: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 6d  nicodeToUtf8(zTm
1ef0: 70 57 69 64 65 29 3b 0a 20 20 66 72 65 65 28 7a  pWide);.  free(z
1f00: 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75  TmpWide);.  retu
1f10: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38  rn zFilenameUtf8
1f20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
1f30: 72 74 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74  rt UTF-8 to mult
1f40: 69 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20  ibyte character 
1f50: 73 74 72 69 6e 67 2e 20 20 53 70 61 63 65 20 74  string.  Space t
1f60: 6f 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72  o hold the .** r
1f70: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
1f80: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
1f90: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61  malloc()..*/.sta
1fa0: 74 69 63 20 63 68 61 72 20 2a 75 74 66 38 54 6f  tic char *utf8To
1fb0: 4d 62 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20  Mbcs(const char 
1fc0: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63  *zFilename){.  c
1fd0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62  har *zFilenameMb
1fe0: 63 73 3b 0a 20 20 57 43 48 41 52 20 2a 7a 54 6d  cs;.  WCHAR *zTm
1ff0: 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69  pWide;..  zTmpWi
2000: 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f  de = utf8ToUnico
2010: 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
2020: 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30   if( zTmpWide==0
2030: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
2040: 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d  ;.  }.  zFilenam
2050: 65 4d 62 63 73 20 3d 20 75 6e 69 63 6f 64 65 54  eMbcs = unicodeT
2060: 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64 65 29 3b  oMbcs(zTmpWide);
2070: 0a 20 20 66 72 65 65 28 7a 54 6d 70 57 69 64 65  .  free(zTmpWide
2080: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c  );.  return zFil
2090: 65 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 23 69  enameMbcs;.}..#i
20a0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
20b0: 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  E./*************
20c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
2100: 54 68 69 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e  This section con
2110: 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 57  tains code for W
2120: 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 2f 2a  inCE only..*/./*
2130: 0a 2a 2a 20 57 69 6e 64 6f 77 73 43 45 20 64 6f  .** WindowsCE do
2140: 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f  es not have a lo
2150: 63 61 6c 74 69 6d 65 28 29 20 66 75 6e 63 74 69  caltime() functi
2160: 6f 6e 2e 20 20 53 6f 20 63 72 65 61 74 65 20 61  on.  So create a
2170: 0a 2a 2a 20 73 75 62 73 74 69 74 75 74 65 2e 0a  .** substitute..
2180: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d  */.#include <tim
2190: 65 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a  e.h>.struct tm *
21a0: 5f 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d  __cdecl localtim
21b0: 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a  e(const time_t *
21c0: 74 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 73 74  t).{.  static st
21d0: 72 75 63 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c  ruct tm y;.  FIL
21e0: 45 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a  ETIME uTm, lTm;.
21f0: 20 20 53 59 53 54 45 4d 54 49 4d 45 20 70 54 6d    SYSTEMTIME pTm
2200: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
2210: 34 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a  4 t64;.  t64 = *
2220: 74 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34 20  t;.  t64 = (t64 
2230: 2b 20 31 31 36 34 34 34 37 33 36 30 30 29 2a 31  + 11644473600)*1
2240: 30 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64  0000000;.  uTm.d
2250: 77 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20 74  wLowDateTime = t
2260: 36 34 20 26 20 30 78 46 46 46 46 46 46 46 46 3b  64 & 0xFFFFFFFF;
2270: 0a 20 20 75 54 6d 2e 64 77 48 69 67 68 44 61 74  .  uTm.dwHighDat
2280: 65 54 69 6d 65 3d 20 74 36 34 20 3e 3e 20 33 32  eTime= t64 >> 32
2290: 3b 0a 20 20 46 69 6c 65 54 69 6d 65 54 6f 4c 6f  ;.  FileTimeToLo
22a0: 63 61 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d  calFileTime(&uTm
22b0: 2c 26 6c 54 6d 29 3b 0a 20 20 46 69 6c 65 54 69  ,&lTm);.  FileTi
22c0: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26  meToSystemTime(&
22d0: 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74  lTm,&pTm);.  y.t
22e0: 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65  m_year = pTm.wYe
22f0: 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74  ar - 1900;.  y.t
2300: 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e  m_mon = pTm.wMon
2310: 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77  th - 1;.  y.tm_w
2320: 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66  day = pTm.wDayOf
2330: 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61  Week;.  y.tm_mda
2340: 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20  y = pTm.wDay;.  
2350: 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e  y.tm_hour = pTm.
2360: 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69  wHour;.  y.tm_mi
2370: 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b  n = pTm.wMinute;
2380: 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54  .  y.tm_sec = pT
2390: 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74  m.wSecond;.  ret
23a0: 75 72 6e 20 26 79 3b 0a 7d 0a 0a 2f 2a 20 54 68  urn &y;.}../* Th
23b0: 69 73 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  is will never be
23c0: 20 63 61 6c 6c 65 64 2c 20 62 75 74 20 64 65 66   called, but def
23d0: 69 6e 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  ined to make the
23e0: 20 63 6f 64 65 20 63 6f 6d 70 69 6c 65 20 2a 2f   code compile */
23f0: 0a 23 64 65 66 69 6e 65 20 47 65 74 54 65 6d 70  .#define GetTemp
2400: 50 61 74 68 41 28 61 2c 62 29 0a 0a 23 64 65 66  PathA(a,b)..#def
2410: 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 28 61 2c 62  ine LockFile(a,b
2420: 2c 63 2c 64 2c 65 29 20 20 20 20 20 20 20 77 69  ,c,d,e)       wi
2430: 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26 61 2c 20  nceLockFile(&a, 
2440: 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23 64 65 66  b, c, d, e).#def
2450: 69 6e 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 61  ine UnlockFile(a
2460: 2c 62 2c 63 2c 64 2c 65 29 20 20 20 20 20 77 69  ,b,c,d,e)     wi
2470: 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 61  nceUnlockFile(&a
2480: 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23 64  , b, c, d, e).#d
2490: 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 45 78  efine LockFileEx
24a0: 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 20 20  (a,b,c,d,e,f)   
24b0: 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45 78 28  winceLockFileEx(
24c0: 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 2c 20  &a, b, c, d, e, 
24d0: 66 29 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44  f)..#define HAND
24e0: 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29  LE_TO_WINFILE(a)
24f0: 20 28 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68   (winFile*)&((ch
2500: 61 72 2a 29 61 29 5b 2d 6f 66 66 73 65 74 6f 66  ar*)a)[-offsetof
2510: 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f 2a  (winFile,h)]../*
2520: 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 6c 6f  .** Acquire a lo
2530: 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64 6c 65  ck on the handle
2540: 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69   h.*/.static voi
2550: 64 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75  d winceMutexAcqu
2560: 69 72 65 28 48 41 4e 44 4c 45 20 68 29 7b 0a 20  ire(HANDLE h){. 
2570: 20 20 44 57 4f 52 44 20 64 77 45 72 72 3b 0a 20    DWORD dwErr;. 
2580: 20 20 64 6f 20 7b 0a 20 20 20 20 20 64 77 45 72    do {.     dwEr
2590: 72 20 3d 20 57 61 69 74 46 6f 72 53 69 6e 67 6c  r = WaitForSingl
25a0: 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e 46 49 4e  eObject(h, INFIN
25b0: 49 54 45 29 3b 0a 20 20 20 7d 20 77 68 69 6c 65  ITE);.   } while
25c0: 20 28 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f   (dwErr != WAIT_
25d0: 4f 42 4a 45 43 54 5f 30 20 26 26 20 64 77 45 72  OBJECT_0 && dwEr
25e0: 72 20 21 3d 20 57 41 49 54 5f 41 42 41 4e 44 4f  r != WAIT_ABANDO
25f0: 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65  NED);.}./*.** Re
2600: 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20 61 63 71  lease a lock acq
2610: 75 69 72 65 64 20 62 79 20 77 69 6e 63 65 4d 75  uired by winceMu
2620: 74 65 78 41 63 71 75 69 72 65 28 29 0a 2a 2f 0a  texAcquire().*/.
2630: 23 64 65 66 69 6e 65 20 77 69 6e 63 65 4d 75 74  #define winceMut
2640: 65 78 52 65 6c 65 61 73 65 28 68 29 20 52 65 6c  exRelease(h) Rel
2650: 65 61 73 65 4d 75 74 65 78 28 68 29 0a 0a 2f 2a  easeMutex(h)../*
2660: 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 6d  .** Create the m
2670: 75 74 65 78 20 61 6e 64 20 73 68 61 72 65 64 20  utex and shared 
2680: 6d 65 6d 6f 72 79 20 75 73 65 64 20 66 6f 72 20  memory used for 
2690: 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 65 20 66  locking in the f
26a0: 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
26b0: 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69  r pFile.*/.stati
26c0: 63 20 42 4f 4f 4c 20 77 69 6e 63 65 43 72 65 61  c BOOL winceCrea
26d0: 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61  teLock(const cha
26e0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 77 69  r *zFilename, wi
26f0: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
2700: 20 57 43 48 41 52 20 2a 7a 54 6f 6b 3b 0a 20 20   WCHAR *zTok;.  
2710: 57 43 48 41 52 20 2a 7a 4e 61 6d 65 20 3d 20 75  WCHAR *zName = u
2720: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
2730: 6c 65 6e 61 6d 65 29 3b 0a 20 20 42 4f 4f 4c 20  lename);.  BOOL 
2740: 62 49 6e 69 74 20 3d 20 54 52 55 45 3b 0a 0a 20  bInit = TRUE;.. 
2750: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
2760: 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74  he local lockdat
2770: 61 20 2a 2f 0a 20 20 5a 65 72 6f 4d 65 6d 6f 72  a */.  ZeroMemor
2780: 79 28 26 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2c  y(&pFile->local,
2790: 20 73 69 7a 65 6f 66 28 70 46 69 6c 65 2d 3e 6c   sizeof(pFile->l
27a0: 6f 63 61 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52 65  ocal));..  /* Re
27b0: 70 6c 61 63 65 20 74 68 65 20 62 61 63 6b 73 6c  place the backsl
27c0: 61 73 68 65 73 20 66 72 6f 6d 20 74 68 65 20 66  ashes from the f
27d0: 69 6c 65 6e 61 6d 65 20 61 6e 64 20 6c 6f 77 65  ilename and lowe
27e0: 72 63 61 73 65 20 69 74 0a 20 20 2a 2a 20 74 6f  rcase it.  ** to
27f0: 20 64 65 72 69 76 65 20 61 20 6d 75 74 65 78 20   derive a mutex 
2800: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20  name. */.  zTok 
2810: 3d 20 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61  = CharLowerW(zNa
2820: 6d 65 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54  me);.  for (;*zT
2830: 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20  ok;zTok++){.    
2840: 69 66 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c  if (*zTok == '\\
2850: 27 29 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a  ') *zTok = '_';.
2860: 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65    }..  /* Create
2870: 2f 6f 70 65 6e 20 74 68 65 20 6e 61 6d 65 64 20  /open the named 
2880: 6d 75 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65  mutex */.  pFile
2890: 2d 3e 68 4d 75 74 65 78 20 3d 20 43 72 65 61 74  ->hMutex = Creat
28a0: 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41  eMutexW(NULL, FA
28b0: 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69  LSE, zName);.  i
28c0: 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65  f (!pFile->hMute
28d0: 78 29 7b 0a 20 20 20 20 66 72 65 65 28 7a 4e 61  x){.    free(zNa
28e0: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
28f0: 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  FALSE;.  }..  /*
2900: 20 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74   Acquire the mut
2910: 65 78 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e  ex before contin
2920: 75 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d  uing */.  winceM
2930: 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c  utexAcquire(pFil
2940: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 0a 20  e->hMutex);.  . 
2950: 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 6e 61   /* Since the na
2960: 6d 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74  mes of named mut
2970: 65 78 65 73 2c 20 73 65 6d 61 70 68 6f 72 65 73  exes, semaphores
2980: 2c 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 73 20  , file mappings 
2990: 65 74 63 20 61 72 65 20 0a 20 20 2a 2a 20 63 61  etc are .  ** ca
29a0: 73 65 2d 73 65 6e 73 69 74 69 76 65 2c 20 74 61  se-sensitive, ta
29b0: 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20  ke advantage of 
29c0: 74 68 61 74 20 62 79 20 75 70 70 65 72 63 61 73  that by uppercas
29d0: 69 6e 67 20 74 68 65 20 6d 75 74 65 78 20 6e 61  ing the mutex na
29e0: 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e  me.  ** and usin
29f0: 67 20 74 68 61 74 20 61 73 20 74 68 65 20 73 68  g that as the sh
2a00: 61 72 65 64 20 66 69 6c 65 6d 61 70 70 69 6e 67  ared filemapping
2a10: 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 43 68   name..  */.  Ch
2a20: 61 72 55 70 70 65 72 57 28 7a 4e 61 6d 65 29 3b  arUpperW(zName);
2a30: 0a 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  .  pFile->hShare
2a40: 64 20 3d 20 43 72 65 61 74 65 46 69 6c 65 4d 61  d = CreateFileMa
2a50: 70 70 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48  ppingW(INVALID_H
2a60: 41 4e 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c  ANDLE_VALUE, NUL
2a70: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a90: 20 20 20 20 20 20 20 20 20 20 50 41 47 45 5f 52            PAGE_R
2aa0: 45 41 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a  EADWRITE, 0, siz
2ab0: 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a  eof(winceLock),.
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b 20 20         zName);  
2af0: 0a 0a 20 20 2f 2a 20 53 65 74 20 61 20 66 6c 61  ..  /* Set a fla
2b00: 67 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73  g that indicates
2b10: 20 77 65 27 72 65 20 74 68 65 20 66 69 72 73 74   we're the first
2b20: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 6d   to create the m
2b30: 65 6d 6f 72 79 20 73 6f 20 69 74 20 0a 20 20 2a  emory so it .  *
2b40: 2a 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 69  * must be zero-i
2b50: 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
2b60: 69 66 20 28 47 65 74 4c 61 73 74 45 72 72 6f 72  if (GetLastError
2b70: 28 29 20 3d 3d 20 45 52 52 4f 52 5f 41 4c 52 45  () == ERROR_ALRE
2b80: 41 44 59 5f 45 58 49 53 54 53 29 7b 0a 20 20 20  ADY_EXISTS){.   
2b90: 20 62 49 6e 69 74 20 3d 20 46 41 4c 53 45 3b 0a   bInit = FALSE;.
2ba0: 20 20 7d 0a 0a 20 20 66 72 65 65 28 7a 4e 61 6d    }..  free(zNam
2bb0: 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  e);..  /* If we 
2bc0: 73 75 63 63 65 65 64 65 64 20 69 6e 20 6d 61 6b  succeeded in mak
2bd0: 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
2be0: 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61  emory handle, ma
2bf0: 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66 20 28 70  p it. */.  if (p
2c00: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 7b 0a  File->hShared){.
2c10: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
2c20: 64 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29  d = (winceLock*)
2c30: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46  MapViewOfFile(pF
2c40: 69 6c 65 2d 3e 68 53 68 61 72 65 64 2c 20 0a 20  ile->hShared, . 
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 46 49 4c 45              FILE
2c60: 5f 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d  _MAP_READ|FILE_M
2c70: 41 50 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c 20  AP_WRITE, 0, 0, 
2c80: 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b  sizeof(winceLock
2c90: 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61  ));.    /* If ma
2ca0: 70 70 69 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c  pping failed, cl
2cb0: 6f 73 65 20 74 68 65 20 73 68 61 72 65 64 20 6d  ose the shared m
2cc0: 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e 64  emory handle and
2cd0: 20 65 72 61 73 65 20 69 74 20 2a 2f 0a 20 20 20   erase it */.   
2ce0: 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 73 68 61   if (!pFile->sha
2cf0: 72 65 64 29 7b 0a 20 20 20 20 20 20 43 6c 6f 73  red){.      Clos
2d00: 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
2d10: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70  Shared);.      p
2d20: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20  File->hShared = 
2d30: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  NULL;.    }.  }.
2d40: 0a 20 20 2f 2a 20 49 66 20 73 68 61 72 65 64 20  .  /* If shared 
2d50: 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74  memory could not
2d60: 20 62 65 20 63 72 65 61 74 65 64 2c 20 74 68 65   be created, the
2d70: 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d 75 74 65  n close the mute
2d80: 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20  x and fail */.  
2d90: 69 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61 72  if (pFile->hShar
2da0: 65 64 20 3d 3d 20 4e 55 4c 4c 29 7b 0a 20 20 20  ed == NULL){.   
2db0: 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
2dc0: 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  se(pFile->hMutex
2dd0: 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64  );.    CloseHand
2de0: 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  le(pFile->hMutex
2df0: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d  );.    pFile->hM
2e00: 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  utex = NULL;.   
2e10: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 20   return FALSE;. 
2e20: 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69   }.  .  /* Initi
2e30: 61 6c 69 7a 65 20 74 68 65 20 73 68 61 72 65 64  alize the shared
2e40: 20 6d 65 6d 6f 72 79 20 69 66 20 77 65 27 72 65   memory if we're
2e50: 20 73 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a   supposed to */.
2e60: 20 20 69 66 20 28 62 49 6e 69 74 29 20 7b 0a 20    if (bInit) {. 
2e70: 20 20 20 5a 65 72 6f 4d 65 6d 6f 72 79 28 70 46     ZeroMemory(pF
2e80: 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 73 69 7a  ile->shared, siz
2e90: 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b  eof(winceLock));
2ea0: 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74  .  }..  winceMut
2eb0: 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
2ec0: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  >hMutex);.  retu
2ed0: 72 6e 20 54 52 55 45 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn TRUE;.}../*.*
2ee0: 2a 20 44 65 73 74 72 6f 79 20 74 68 65 20 70 61  * Destroy the pa
2ef0: 72 74 20 6f 66 20 77 69 6e 46 69 6c 65 20 74 68  rt of winFile th
2f00: 61 74 20 64 65 61 6c 73 20 77 69 74 68 20 77 69  at deals with wi
2f10: 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61  nce locks.*/.sta
2f20: 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 44 65  tic void winceDe
2f30: 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46 69 6c  stroyLock(winFil
2f40: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66 20  e *pFile){.  if 
2f50: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b  (pFile->hMutex){
2f60: 0a 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20  .    /* Acquire 
2f70: 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20  the mutex */.   
2f80: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
2f90: 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  re(pFile->hMutex
2fa0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  );..    /* The f
2fb0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20  ollowing blocks 
2fc0: 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20  should probably 
2fd0: 61 73 73 65 72 74 20 69 6e 20 64 65 62 75 67 20  assert in debug 
2fe0: 6d 6f 64 65 2c 20 62 75 74 20 74 68 65 79 0a 20  mode, but they. 
2ff0: 20 20 20 20 20 20 61 72 65 20 74 6f 20 63 6c 65        are to cle
3000: 61 6e 75 70 20 69 6e 20 63 61 73 65 20 61 6e 79  anup in case any
3010: 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65 64 20   locks remained 
3020: 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28  open */.    if (
3030: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
3040: 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 70 46  aders){.      pF
3050: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65  ile->shared->nRe
3060: 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a  aders --;.    }.
3070: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
3080: 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 7b  ocal.bReserved){
3090: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
30a0: 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20  ared->bReserved 
30b0: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20  = FALSE;.    }. 
30c0: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
30d0: 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20  cal.bPending){. 
30e0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
30f0: 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46  ed->bPending = F
3100: 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ALSE;.    }.    
3110: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
3120: 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20  .bExclusive){.  
3130: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
3140: 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  d->bExclusive = 
3150: 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  FALSE;.    }..  
3160: 20 20 2f 2a 20 44 65 2d 72 65 66 65 72 65 6e 63    /* De-referenc
3170: 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75 72 20  e and close our 
3180: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 68 61 72  copy of the shar
3190: 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65  ed memory handle
31a0: 20 2a 2f 0a 20 20 20 20 55 6e 6d 61 70 56 69 65   */.    UnmapVie
31b0: 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73  wOfFile(pFile->s
31c0: 68 61 72 65 64 29 3b 0a 20 20 20 20 43 6c 6f 73  hared);.    Clos
31d0: 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
31e0: 53 68 61 72 65 64 29 3b 0a 0a 20 20 20 20 2f 2a  Shared);..    /*
31f0: 20 44 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d   Done with the m
3200: 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63  utex */.    winc
3210: 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46  eMutexRelease(pF
3220: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 20 20 20  ile->hMutex);   
3230: 20 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c   .    CloseHandl
3240: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
3250: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75  ;.    pFile->hMu
3260: 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  tex = NULL;.  }.
3270: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e 20 69 6d 70  }../* .** An imp
3280: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
3290: 68 65 20 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50  he LockFile() AP
32a0: 49 20 6f 66 20 77 69 6e 64 6f 77 73 20 66 6f 72  I of windows for
32b0: 20 77 69 6e 63 65 0a 2a 2f 0a 73 74 61 74 69 63   wince.*/.static
32c0: 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46   BOOL winceLockF
32d0: 69 6c 65 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70  ile(.  HANDLE *p
32e0: 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64  hFile,.  DWORD d
32f0: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a  wFileOffsetLow,.
3300: 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66    DWORD dwFileOf
3310: 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52  fsetHigh,.  DWOR
3320: 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
3330: 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f  ToLockLow,.  DWO
3340: 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
3350: 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20  sToLockHigh.){. 
3360: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
3370: 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46  = HANDLE_TO_WINF
3380: 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42  ILE(phFile);.  B
3390: 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41  OOL bReturn = FA
33a0: 4c 53 45 3b 0a 0a 20 20 69 66 20 28 21 70 46 69  LSE;..  if (!pFi
33b0: 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75  le->hMutex) retu
33c0: 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65  rn TRUE;.  wince
33d0: 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69  MutexAcquire(pFi
33e0: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20  le->hMutex);..  
33f0: 2f 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20 65 78  /* Wanting an ex
3400: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f  clusive lock? */
3410: 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  .  if (dwFileOff
3420: 73 65 74 4c 6f 77 20 3d 3d 20 53 48 41 52 45 44  setLow == SHARED
3430: 5f 46 49 52 53 54 0a 20 20 20 20 20 20 20 26 26  _FIRST.       &&
3440: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
3450: 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 53 48 41 52  oLockLow == SHAR
3460: 45 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69 66  ED_SIZE){.    if
3470: 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
3480: 3e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 20 26  >nReaders == 0 &
3490: 26 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d  & pFile->shared-
34a0: 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30  >bExclusive == 0
34b0: 29 7b 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ){.       pFile-
34c0: 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
34d0: 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ive = TRUE;.    
34e0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
34f0: 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55  bExclusive = TRU
3500: 45 3b 0a 20 20 20 20 20 20 20 62 52 65 74 75 72  E;.       bRetur
3510: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
3520: 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61    }..  /* Want a
3530: 20 72 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f   read-only lock?
3540: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 28   */.  else if ((
3550: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
3560: 3e 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 20  >= SHARED_FIRST 
3570: 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  &&.            d
3580: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3c  wFileOffsetLow <
3590: 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20   SHARED_FIRST + 
35a0: 53 48 41 52 45 44 5f 53 49 5a 45 29 20 26 26 0a  SHARED_SIZE) &&.
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 4e 75 6d              nNum
35c0: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
35d0: 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
35e0: 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
35f0: 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20  ->bExclusive == 
3600: 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  0){.      pFile-
3610: 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
3620: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46  ++;.      if (pF
3630: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
3640: 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20  ers == 1){.     
3650: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
3660: 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20  ->nReaders ++;. 
3670: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65       }.      bRe
3680: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
3690: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e   }.  }..  /* Wan
36a0: 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  t a pending lock
36b0: 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  ? */.  else if (
36c0: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
36d0: 3d 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  == PENDING_BYTE 
36e0: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
36f0: 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  sToLockLow == 1)
3700: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70  {.    /* If no p
3710: 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20  ending lock has 
3720: 62 65 65 6e 20 61 63 71 75 69 72 65 64 2c 20 74  been acquired, t
3730: 68 65 6e 20 61 63 71 75 69 72 65 20 69 74 20 2a  hen acquire it *
3740: 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  /.    if (pFile-
3750: 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
3760: 67 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20  g == 0) {.      
3770: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
3780: 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a  Pending = TRUE;.
3790: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
37a0: 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52  al.bPending = TR
37b0: 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  UE;.      bRetur
37c0: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
37d0: 20 20 7d 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20    }.  /* Want a 
37e0: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 3f 20 2a  reserved lock? *
37f0: 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
3800: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
3810: 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 26 26  RESERVED_BYTE &&
3820: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
3830: 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  oLockLow == 1){.
3840: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73      if (pFile->s
3850: 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64  hared->bReserved
3860: 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70   == 0) {.      p
3870: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
3880: 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a  eserved = TRUE;.
3890: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
38a0: 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20 54  al.bReserved = T
38b0: 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75  RUE;.      bRetu
38c0: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
38d0: 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74  .  }..  winceMut
38e0: 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
38f0: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  >hMutex);.  retu
3900: 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  rn bReturn;.}../
3910: 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e  *.** An implemen
3920: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 55 6e  tation of the Un
3930: 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f 66 20  lockFile API of 
3940: 77 69 6e 64 6f 77 73 20 66 6f 72 20 77 69 6e 63  windows for winc
3950: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  e.*/.static BOOL
3960: 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65   winceUnlockFile
3970: 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69  (.  HANDLE *phFi
3980: 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69  le,.  DWORD dwFi
3990: 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  leOffsetLow,.  D
39a0: 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
39b0: 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e  tHigh,.  DWORD n
39c0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
39d0: 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52  nlockLow,.  DWOR
39e0: 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
39f0: 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a  ToUnlockHigh.){.
3a00: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
3a10: 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e   = HANDLE_TO_WIN
3a20: 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20  FILE(phFile);.  
3a30: 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46  BOOL bReturn = F
3a40: 41 4c 53 45 3b 0a 0a 20 20 69 66 20 28 21 70 46  ALSE;..  if (!pF
3a50: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74  ile->hMutex) ret
3a60: 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63  urn TRUE;.  winc
3a70: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46  eMutexAcquire(pF
3a80: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20  ile->hMutex);.. 
3a90: 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20   /* Releasing a 
3aa0: 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20 61  reader lock or a
3ab0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
3ac0: 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65   */.  if (dwFile
3ad0: 4f 66 66 73 65 74 4c 6f 77 20 3e 3d 20 53 48 41  OffsetLow >= SHA
3ae0: 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20 20 20  RED_FIRST &&.   
3af0: 20 20 20 20 64 77 46 69 6c 65 4f 66 66 73 65 74      dwFileOffset
3b00: 4c 6f 77 20 3c 20 53 48 41 52 45 44 5f 46 49 52  Low < SHARED_FIR
3b10: 53 54 20 2b 20 53 48 41 52 45 44 5f 53 49 5a 45  ST + SHARED_SIZE
3b20: 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65  ){.    /* Did we
3b30: 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
3b40: 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20  ve lock? */.    
3b50: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
3b60: 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20  .bExclusive){.  
3b70: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
3b80: 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41  .bExclusive = FA
3b90: 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  LSE;.      pFile
3ba0: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
3bb0: 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20  sive = FALSE;.  
3bc0: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
3bd0: 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  UE;.    }..    /
3be0: 2a 20 44 69 64 20 77 65 20 6a 75 73 74 20 68 61  * Did we just ha
3bf0: 76 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b  ve a reader lock
3c00: 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  ? */.    else if
3c10: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
3c20: 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20  Readers){.      
3c30: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
3c40: 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20  aders --;.      
3c50: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
3c60: 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 29 0a  .nReaders == 0).
3c70: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
3c80: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e  pFile->shared->n
3c90: 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20  Readers --;.    
3ca0: 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72    }.      bRetur
3cb0: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
3cc0: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73    }..  /* Releas
3cd0: 69 6e 67 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f  ing a pending lo
3ce0: 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  ck */.  else if 
3cf0: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
3d00: 20 3d 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45   == PENDING_BYTE
3d10: 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
3d20: 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d  esToUnlockLow ==
3d30: 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
3d40: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69  le->local.bPendi
3d50: 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ng){.      pFile
3d60: 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67  ->local.bPending
3d70: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
3d80: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
3d90: 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b  Pending = FALSE;
3da0: 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
3db0: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
3dc0: 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20  .  /* Releasing 
3dd0: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  a reserved lock 
3de0: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
3df0: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
3e00: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 26   RESERVED_BYTE &
3e10: 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
3e20: 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  ToUnlockLow == 1
3e30: 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
3e40: 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
3e50: 64 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  d) {.      pFile
3e60: 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
3e70: 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  d = FALSE;.     
3e80: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
3e90: 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53  bReserved = FALS
3ea0: 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
3eb0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
3ec0: 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78   }..  winceMutex
3ed0: 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
3ee0: 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  Mutex);.  return
3ef0: 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a   bReturn;.}../*.
3f00: 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ** An implementa
3f10: 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b  tion of the Lock
3f20: 46 69 6c 65 45 78 28 29 20 41 50 49 20 6f 66 20  FileEx() API of 
3f30: 77 69 6e 64 6f 77 73 20 66 6f 72 20 77 69 6e 63  windows for winc
3f40: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  e.*/.static BOOL
3f50: 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45 78   winceLockFileEx
3f60: 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69  (.  HANDLE *phFi
3f70: 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 6c  le,.  DWORD dwFl
3f80: 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 64 77 52  ags,.  DWORD dwR
3f90: 65 73 65 72 76 65 64 2c 0a 20 20 44 57 4f 52 44  eserved,.  DWORD
3fa0: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
3fb0: 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52  oLockLow,.  DWOR
3fc0: 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
3fd0: 54 6f 4c 6f 63 6b 48 69 67 68 2c 0a 20 20 4c 50  ToLockHigh,.  LP
3fe0: 4f 56 45 52 4c 41 50 50 45 44 20 6c 70 4f 76 65  OVERLAPPED lpOve
3ff0: 72 6c 61 70 70 65 64 0a 29 7b 0a 20 20 2f 2a 20  rlapped.){.  /* 
4000: 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 77 61  If the caller wa
4010: 6e 74 73 20 61 20 73 68 61 72 65 64 20 72 65 61  nts a shared rea
4020: 64 20 6c 6f 63 6b 2c 20 66 6f 72 77 61 72 64 20  d lock, forward 
4030: 74 68 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20 74  this call.  ** t
4040: 6f 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 20  o winceLockFile 
4050: 2a 2f 0a 20 20 69 66 20 28 6c 70 4f 76 65 72 6c  */.  if (lpOverl
4060: 61 70 70 65 64 2d 3e 4f 66 66 73 65 74 20 3d 3d  apped->Offset ==
4070: 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 26 26   SHARED_FIRST &&
4080: 0a 20 20 20 20 20 20 64 77 46 6c 61 67 73 20 3d  .      dwFlags =
4090: 3d 20 31 20 26 26 0a 20 20 20 20 20 20 6e 4e 75  = 1 &&.      nNu
40a0: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
40b0: 6b 4c 6f 77 20 3d 3d 20 53 48 41 52 45 44 5f 53  kLow == SHARED_S
40c0: 49 5a 45 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  IZE){.    return
40d0: 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70   winceLockFile(p
40e0: 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  hFile, SHARED_FI
40f0: 52 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  RST, 0, 1, 0);. 
4100: 20 7d 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53   }.  return FALS
4110: 45 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f  E;.}./*.** End o
4120: 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f  f the special co
4130: 64 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a  de for wince.***
4140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64  **********/.#end
4190: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f  if /* SQLITE_OS_
41a0: 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  WINCE */../*****
41b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
41c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
41d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
41e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
41f0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20  ********.** The 
4200: 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20 72 6f  next group of ro
4210: 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74  utines implement
4220: 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73   the I/O methods
4230: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79   specified.** by
4240: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
4250: 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a  methods object..
4260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
42a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
42b0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
42c0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  ile..**.** It is
42d0: 20 72 65 70 6f 72 74 65 64 20 74 68 61 74 20 61   reported that a
42e0: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f  n attempt to clo
42f0: 73 65 20 61 20 68 61 6e 64 6c 65 20 6d 69 67 68  se a handle migh
4300: 74 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 66  t sometimes.** f
4310: 61 69 6c 2e 20 20 54 68 69 73 20 69 73 20 61 20  ail.  This is a 
4320: 76 65 72 79 20 75 6e 72 65 61 73 6f 6e 61 62 6c  very unreasonabl
4330: 65 20 72 65 73 75 6c 74 2c 20 62 75 74 20 77 69  e result, but wi
4340: 6e 64 6f 77 73 20 69 73 20 6e 6f 74 6f 72 69 6f  ndows is notorio
4350: 75 73 0a 2a 2a 20 66 6f 72 20 62 65 69 6e 67 20  us.** for being 
4360: 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 73 6f 20  unreasonable so 
4370: 49 20 64 6f 20 6e 6f 74 20 64 6f 75 62 74 20 74  I do not doubt t
4380: 68 61 74 20 69 74 20 6d 69 67 68 74 20 68 61 70  hat it might hap
4390: 70 65 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20  pen.  If.** the 
43a0: 63 6c 6f 73 65 20 66 61 69 6c 73 2c 20 77 65 20  close fails, we 
43b0: 70 61 75 73 65 20 66 6f 72 20 31 30 30 20 6d 69  pause for 100 mi
43c0: 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74  lliseconds and t
43d0: 72 79 20 61 67 61 69 6e 2e 20 20 41 73 0a 2a 2a  ry again.  As.**
43e0: 20 6d 61 6e 79 20 61 73 20 4d 58 5f 43 4c 4f 53   many as MX_CLOS
43f0: 45 5f 41 54 54 45 4d 50 54 20 61 74 74 65 6d 70  E_ATTEMPT attemp
4400: 74 73 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20  ts to close the 
4410: 68 61 6e 64 6c 65 20 61 72 65 20 6d 61 64 65 20  handle are made 
4420: 62 65 66 6f 72 65 0a 2a 2a 20 67 69 76 69 6e 67  before.** giving
4430: 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e   up and returnin
4440: 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23  g an error..*/.#
4450: 64 65 66 69 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f  define MX_CLOSE_
4460: 41 54 54 45 4d 50 54 20 33 0a 73 74 61 74 69 63  ATTEMPT 3.static
4470: 20 69 6e 74 20 77 69 6e 43 6c 6f 73 65 28 73 71   int winClose(sq
4480: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
4490: 0a 20 20 69 6e 74 20 72 63 2c 20 63 6e 74 20 3d  .  int rc, cnt =
44a0: 20 30 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70   0;.  winFile *p
44b0: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
44c0: 29 69 64 3b 0a 20 20 4f 53 54 52 41 43 45 32 28  )id;.  OSTRACE2(
44d0: 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 70 46  "CLOSE %d\n", pF
44e0: 69 6c 65 2d 3e 68 29 3b 0a 20 20 64 6f 7b 0a 20  ile->h);.  do{. 
44f0: 20 20 20 72 63 20 3d 20 43 6c 6f 73 65 48 61 6e     rc = CloseHan
4500: 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  dle(pFile->h);. 
4510: 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20 26   }while( rc==0 &
4520: 26 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f  & ++cnt < MX_CLO
4530: 53 45 5f 41 54 54 45 4d 50 54 20 26 26 20 28 53  SE_ATTEMPT && (S
4540: 6c 65 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b  leep(100), 1) );
4550: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
4560: 49 4e 43 45 0a 23 64 65 66 69 6e 65 20 57 49 4e  INCE.#define WIN
4570: 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45  CE_DELETION_ATTE
4580: 4d 50 54 53 20 33 0a 20 20 77 69 6e 63 65 44 65  MPTS 3.  winceDe
4590: 73 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29  stroyLock(pFile)
45a0: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a  ;.  if( pFile->z
45b0: 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b  DeleteOnClose ){
45c0: 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  .    int cnt = 0
45d0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 0a 20 20 20  ;.    while(.   
45e0: 20 20 20 20 20 20 20 20 44 65 6c 65 74 65 46 69          DeleteFi
45f0: 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  leW(pFile->zDele
4600: 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20 20  teOnClose)==0.  
4610: 20 20 20 20 20 20 26 26 20 47 65 74 46 69 6c 65        && GetFile
4620: 41 74 74 72 69 62 75 74 65 73 57 28 70 46 69 6c  AttributesW(pFil
4630: 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
4640: 65 29 21 3d 30 78 66 66 66 66 66 66 66 66 20 0a  e)!=0xffffffff .
4650: 20 20 20 20 20 20 20 20 26 26 20 63 6e 74 2b 2b          && cnt++
4660: 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f   < WINCE_DELETIO
4670: 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20 20 20 29  N_ATTEMPTS.    )
4680: 7b 0a 20 20 20 20 20 20 20 53 6c 65 65 70 28 31  {.       Sleep(1
4690: 30 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61 20  00);  /* Wait a 
46a0: 6c 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74 72  little before tr
46b0: 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20 20  ying again */.  
46c0: 20 20 7d 0a 20 20 20 20 66 72 65 65 28 70 46 69    }.    free(pFi
46d0: 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
46e0: 73 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  se);.  }.#endif.
46f0: 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31    OpenCounter(-1
4700: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f  );.  return rc ?
4710: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
4720: 49 54 45 5f 49 4f 45 52 52 3b 0a 7d 0a 0a 2f 2a  ITE_IOERR;.}../*
4730: 0a 2a 2a 20 53 6f 6d 65 20 6d 69 63 72 6f 73 6f  .** Some microso
4740: 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63  ft compilers lac
4750: 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f  k this definitio
4760: 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e  n..*/.#ifndef IN
4770: 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
4780: 4f 49 4e 54 45 52 0a 23 20 64 65 66 69 6e 65 20  OINTER.# define 
4790: 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
47a0: 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 4f 52 44  _POINTER ((DWORD
47b0: 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  )-1).#endif../*.
47c0: 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
47d0: 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20  m a file into a 
47e0: 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20  buffer.  Return 
47f0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
4800: 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72  .** bytes were r
4810: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
4820: 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52   and SQLITE_IOER
4830: 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  R if anything go
4840: 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a  es.** wrong..*/.
4850: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65  static int winRe
4860: 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ad(.  sqlite3_fi
4870: 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
4880: 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65 61 64   /* File to read
4890: 20 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64 20   from */.  void 
48a0: 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
48b0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63        /* Write c
48c0: 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68 69 73  ontent into this
48d0: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
48e0: 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
48f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4900: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65  r of bytes to re
4910: 61 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ad */.  sqlite3_
4920: 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20 20  int64 offset    
4930: 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64     /* Begin read
4940: 69 6e 67 20 61 74 20 74 68 69 73 20 6f 66 66 73  ing at this offs
4950: 65 74 20 2a 2f 0a 29 7b 0a 20 20 4c 4f 4e 47 20  et */.){.  LONG 
4960: 75 70 70 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e  upperBits = (LON
4970: 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20  G)((offset>>32) 
4980: 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20  & 0x7fffffff);. 
4990: 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73 20   LONG lowerBits 
49a0: 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20  = (LONG)(offset 
49b0: 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  & 0xffffffff);. 
49c0: 20 44 57 4f 52 44 20 72 63 3b 0a 20 20 44 57 4f   DWORD rc;.  DWO
49d0: 52 44 20 67 6f 74 3b 0a 20 20 77 69 6e 46 69 6c  RD got;.  winFil
49e0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
49f0: 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73 65 72  ile*)id;.  asser
4a00: 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53 69  t( id!=0 );.  Si
4a10: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
4a20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
4a30: 52 5f 52 45 41 44 29 3b 0a 20 20 4f 53 54 52 41  R_READ);.  OSTRA
4a40: 43 45 33 28 22 52 45 41 44 20 25 64 20 6c 6f 63  CE3("READ %d loc
4a50: 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  k=%d\n", pFile->
4a60: 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
4a70: 70 65 29 3b 0a 20 20 72 63 20 3d 20 53 65 74 46  pe);.  rc = SetF
4a80: 69 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65  ilePointer(pFile
4a90: 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20  ->h, lowerBits, 
4aa0: 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45  &upperBits, FILE
4ab0: 5f 42 45 47 49 4e 29 3b 0a 20 20 69 66 28 20 72  _BEGIN);.  if( r
4ac0: 63 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  c==INVALID_SET_F
4ad0: 49 4c 45 5f 50 4f 49 4e 54 45 52 20 26 26 20 47  ILE_POINTER && G
4ae0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21 3d 4e  etLastError()!=N
4af0: 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 72  O_ERROR ){.    r
4b00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
4b10: 4c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 52 65  L;.  }.  if( !Re
4b20: 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  adFile(pFile->h,
4b30: 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 67 6f 74   pBuf, amt, &got
4b40: 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , 0) ){.    retu
4b50: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
4b60: 52 45 41 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20  READ;.  }.  if( 
4b70: 67 6f 74 3d 3d 28 44 57 4f 52 44 29 61 6d 74 20  got==(DWORD)amt 
4b80: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
4b90: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
4ba0: 7b 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20  {.    /* Unread 
4bb0: 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66  parts of the buf
4bc0: 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  fer must be zero
4bd0: 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  -filled */.    m
4be0: 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70  emset(&((char*)p
4bf0: 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d  Buf)[got], 0, am
4c00: 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75  t-got);.    retu
4c10: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
4c20: 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a  SHORT_READ;.  }.
4c30: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  }../*.** Write d
4c40: 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65  ata from a buffe
4c50: 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20  r into a file.  
4c60: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
4c70: 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f   on success.** o
4c80: 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
4c90: 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75  or code on failu
4ca0: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
4cb0: 74 20 77 69 6e 57 72 69 74 65 28 0a 20 20 73 71  t winWrite(.  sq
4cc0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
4cd0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
4ce0: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f  to write into */
4cf0: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
4d00: 42 75 66 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Buf,         /* 
4d10: 54 68 65 20 62 79 74 65 73 20 74 6f 20 62 65 20  The bytes to be 
4d20: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74  written */.  int
4d30: 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
4d40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4d50: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77 72 69   of bytes to wri
4d60: 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  te */.  sqlite3_
4d70: 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20 20  int64 offset    
4d80: 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
4d90: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67   the file to beg
4da0: 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f  in writing at */
4db0: 0a 29 7b 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72  .){.  LONG upper
4dc0: 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28 6f  Bits = (LONG)((o
4dd0: 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37  ffset>>32) & 0x7
4de0: 66 66 66 66 66 66 66 29 3b 0a 20 20 4c 4f 4e 47  fffffff);.  LONG
4df0: 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 28 4c 4f   lowerBits = (LO
4e00: 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66  NG)(offset & 0xf
4e10: 66 66 66 66 66 66 66 29 3b 0a 20 20 44 57 4f 52  fffffff);.  DWOR
4e20: 44 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 77 72  D rc;.  DWORD wr
4e30: 6f 74 65 20 3d 20 30 3b 0a 20 20 77 69 6e 46 69  ote = 0;.  winFi
4e40: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
4e50: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73 65  File*)id;.  asse
4e60: 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53  rt( id!=0 );.  S
4e70: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
4e80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
4e90: 52 52 5f 57 52 49 54 45 29 3b 0a 20 20 53 69 6d  RR_WRITE);.  Sim
4ea0: 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
4eb0: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
4ec0: 5f 46 55 4c 4c 29 3b 0a 20 20 4f 53 54 52 41 43  _FULL);.  OSTRAC
4ed0: 45 33 28 22 57 52 49 54 45 20 25 64 20 6c 6f 63  E3("WRITE %d loc
4ee0: 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  k=%d\n", pFile->
4ef0: 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
4f00: 70 65 29 3b 0a 20 20 72 63 20 3d 20 53 65 74 46  pe);.  rc = SetF
4f10: 69 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65  ilePointer(pFile
4f20: 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20  ->h, lowerBits, 
4f30: 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45  &upperBits, FILE
4f40: 5f 42 45 47 49 4e 29 3b 0a 20 20 69 66 28 20 72  _BEGIN);.  if( r
4f50: 63 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  c==INVALID_SET_F
4f60: 49 4c 45 5f 50 4f 49 4e 54 45 52 20 26 26 20 47  ILE_POINTER && G
4f70: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21 3d 4e  etLastError()!=N
4f80: 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 72  O_ERROR ){.    r
4f90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
4fa0: 4c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  L;.  }.  assert(
4fb0: 20 61 6d 74 3e 30 20 29 3b 0a 20 20 77 68 69 6c   amt>0 );.  whil
4fc0: 65 28 0a 20 20 20 20 20 61 6d 74 3e 30 0a 20 20  e(.     amt>0.  
4fd0: 20 20 20 26 26 20 28 72 63 20 3d 20 57 72 69 74     && (rc = Writ
4fe0: 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  eFile(pFile->h, 
4ff0: 70 42 75 66 2c 20 61 6d 74 2c 20 26 77 72 6f 74  pBuf, amt, &wrot
5000: 65 2c 20 30 29 29 21 3d 30 0a 20 20 20 20 20 26  e, 0))!=0.     &
5010: 26 20 77 72 6f 74 65 3e 30 0a 20 20 29 7b 0a 20  & wrote>0.  ){. 
5020: 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b     amt -= wrote;
5030: 0a 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 63  .    pBuf = &((c
5040: 68 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65  har*)pBuf)[wrote
5050: 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 72 63  ];.  }.  if( !rc
5060: 20 7c 7c 20 61 6d 74 3e 28 69 6e 74 29 77 72 6f   || amt>(int)wro
5070: 74 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  te ){.    return
5080: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
5090: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
50a0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
50b0: 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20  runcate an open 
50c0: 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66  file to a specif
50d0: 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74  ied size.*/.stat
50e0: 69 63 20 69 6e 74 20 77 69 6e 54 72 75 6e 63 61  ic int winTrunca
50f0: 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  te(sqlite3_file 
5100: 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  *id, sqlite3_int
5110: 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 44 57 4f  64 nByte){.  DWO
5120: 52 44 20 72 63 3b 0a 20 20 4c 4f 4e 47 20 75 70  RD rc;.  LONG up
5130: 70 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29  perBits = (LONG)
5140: 28 28 6e 42 79 74 65 3e 3e 33 32 29 20 26 20 30  ((nByte>>32) & 0
5150: 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 4c 4f  x7fffffff);.  LO
5160: 4e 47 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 28  NG lowerBits = (
5170: 4c 4f 4e 47 29 28 6e 42 79 74 65 20 26 20 30 78  LONG)(nByte & 0x
5180: 66 66 66 66 66 66 66 66 29 3b 0a 20 20 77 69 6e  ffffffff);.  win
5190: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
51a0: 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 4f 53  inFile*)id;.  OS
51b0: 54 52 41 43 45 33 28 22 54 52 55 4e 43 41 54 45  TRACE3("TRUNCATE
51c0: 20 25 64 20 25 6c 6c 64 5c 6e 22 2c 20 70 46 69   %d %lld\n", pFi
51d0: 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 3b 0a 20  le->h, nByte);. 
51e0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
51f0: 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
5200: 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 29 3b 0a  OERR_TRUNCATE);.
5210: 20 20 72 63 20 3d 20 53 65 74 46 69 6c 65 50 6f    rc = SetFilePo
5220: 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20  inter(pFile->h, 
5230: 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70 70 65  lowerBits, &uppe
5240: 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49  rBits, FILE_BEGI
5250: 4e 29 3b 0a 20 20 69 66 28 20 49 4e 56 41 4c 49  N);.  if( INVALI
5260: 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
5270: 45 52 20 21 3d 20 72 63 20 29 7b 0a 20 20 20 20  ER != rc ){.    
5280: 2f 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 20  /* SetEndOfFile 
5290: 77 69 6c 6c 20 66 61 69 6c 20 69 66 20 6e 42 79  will fail if nBy
52a0: 74 65 20 69 73 20 6e 65 67 61 74 69 76 65 20 2a  te is negative *
52b0: 2f 0a 20 20 20 20 69 66 28 20 53 65 74 45 6e 64  /.    if( SetEnd
52c0: 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29  OfFile(pFile->h)
52d0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
52e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
52f0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
5300: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
5310: 43 41 54 45 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  CATE;.}..#ifdef 
5320: 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
5330: 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
5340: 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20  er of fullsyncs 
5350: 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73  and normal syncs
5360: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
5370: 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20  to test.** that 
5380: 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79  syncs and fullsy
5390: 6e 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67  ncs are occuring
53a0: 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69   at the right ti
53b0: 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mes..*/.int sqli
53c0: 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  te3_sync_count =
53d0: 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   0;.int sqlite3_
53e0: 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  fullsync_count =
53f0: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
5400: 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
5410: 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74  writes to a part
5420: 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20  icular file are 
5430: 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73  committed to dis
5440: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
5450: 20 77 69 6e 53 79 6e 63 28 73 71 6c 69 74 65 33   winSync(sqlite3
5460: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66  _file *id, int f
5470: 6c 61 67 73 29 7b 0a 23 69 66 6e 64 65 66 20 53  lags){.#ifndef S
5480: 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
5490: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
54a0: 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 23   (winFile*)id;.#
54b0: 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
54c0: 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 23 65 6e  RAMETER(id);.#en
54d0: 64 69 66 0a 20 20 4f 53 54 52 41 43 45 33 28 22  dif.  OSTRACE3("
54e0: 53 59 4e 43 20 25 64 20 6c 6f 63 6b 3d 25 64 5c  SYNC %d lock=%d\
54f0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46  n", pFile->h, pF
5500: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 3b 0a  ile->locktype);.
5510: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
5520: 53 54 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  ST.  if( flags &
5530: 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
5540: 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  L ){.    sqlite3
5550: 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b  _fullsync_count+
5560: 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  +;.  }.  sqlite3
5570: 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  _sync_count++;.#
5580: 65 6e 64 69 66 0a 20 20 2f 2a 20 49 66 20 77 65  endif.  /* If we
5590: 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74   compiled with t
55a0: 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
55b0: 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e  C flag, then syn
55c0: 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e  cing is a.  ** n
55d0: 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66  o-op.  */.#ifdef
55e0: 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
55f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5600: 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 66  E_OK;.#else.  if
5610: 28 20 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65  ( FlushFileBuffe
5620: 72 73 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a  rs(pFile->h) ){.
5630: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5640: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
5650: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5660: 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 23 65 6e 64  _IOERR;.  }.#end
5670: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  if.}../*.** Dete
5680: 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e  rmine the curren
5690: 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65  t size of a file
56a0: 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61   in bytes.*/.sta
56b0: 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 53  tic int winFileS
56c0: 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
56d0: 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e   *id, sqlite3_in
56e0: 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 77  t64 *pSize){.  w
56f0: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
5700: 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
5710: 44 57 4f 52 44 20 75 70 70 65 72 42 69 74 73 2c  DWORD upperBits,
5720: 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 53 69   lowerBits;.  Si
5730: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
5740: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
5750: 52 5f 46 53 54 41 54 29 3b 0a 20 20 6c 6f 77 65  R_FSTAT);.  lowe
5760: 72 42 69 74 73 20 3d 20 47 65 74 46 69 6c 65 53  rBits = GetFileS
5770: 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26 75  ize(pFile->h, &u
5780: 70 70 65 72 42 69 74 73 29 3b 0a 20 20 2a 70 53  pperBits);.  *pS
5790: 69 7a 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33  ize = (((sqlite3
57a0: 5f 69 6e 74 36 34 29 75 70 70 65 72 42 69 74 73  _int64)upperBits
57b0: 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69  )<<32) + lowerBi
57c0: 74 73 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ts;.  return SQL
57d0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
57e0: 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
57f0: 4d 4d 45 44 49 41 54 45 4c 59 20 69 73 20 75 6e  MMEDIATELY is un
5800: 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20  defined on some 
5810: 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e  Windows systems.
5820: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b  .*/.#ifndef LOCK
5830: 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
5840: 41 54 45 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c  ATELY.# define L
5850: 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
5860: 45 44 49 41 54 45 4c 59 20 31 0a 23 65 6e 64 69  EDIATELY 1.#endi
5870: 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  f../*.** Acquire
5880: 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a   a reader lock..
5890: 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50 49  ** Different API
58a0: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61   routines are ca
58b0: 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f  lled depending o
58c0: 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
58d0: 20 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39   this.** is Win9
58e0: 35 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73  5 or WinNT..*/.s
58f0: 74 61 74 69 63 20 69 6e 74 20 67 65 74 52 65 61  tatic int getRea
5900: 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70  dLock(winFile *p
5910: 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73  File){.  int res
5920: 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  ;.  if( isNT() )
5930: 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44  {.    OVERLAPPED
5940: 20 6f 76 6c 70 3b 0a 20 20 20 20 6f 76 6c 70 2e   ovlp;.    ovlp.
5950: 4f 66 66 73 65 74 20 3d 20 53 48 41 52 45 44 5f  Offset = SHARED_
5960: 46 49 52 53 54 3b 0a 20 20 20 20 6f 76 6c 70 2e  FIRST;.    ovlp.
5970: 4f 66 66 73 65 74 48 69 67 68 20 3d 20 30 3b 0a  OffsetHigh = 0;.
5980: 20 20 20 20 6f 76 6c 70 2e 68 45 76 65 6e 74 20      ovlp.hEvent 
5990: 3d 20 30 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c  = 0;.    res = L
59a0: 6f 63 6b 46 69 6c 65 45 78 28 70 46 69 6c 65 2d  ockFileEx(pFile-
59b0: 3e 68 2c 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  >h, LOCKFILE_FAI
59c0: 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 2c 0a 20  L_IMMEDIATELY,. 
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59e0: 20 20 20 20 30 2c 20 53 48 41 52 45 44 5f 53 49      0, SHARED_SI
59f0: 5a 45 2c 20 30 2c 20 26 6f 76 6c 70 29 3b 0a 2f  ZE, 0, &ovlp);./
5a00: 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66  * isNT() is 1 if
5a10: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
5a20: 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73  ==1, so this els
5a30: 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75  e is never execu
5a40: 74 65 64 2e 20 0a 2a 2f 0a 23 69 66 20 53 51 4c  ted. .*/.#if SQL
5a50: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a  ITE_OS_WINCE==0.
5a60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
5a70: 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   lk;.    sqlite3
5a80: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
5a90: 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20  of(lk), &lk);.  
5aa0: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c    pFile->sharedL
5ab0: 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72 74  ockByte = (short
5ac0: 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66  )((lk & 0x7fffff
5ad0: 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45  ff)%(SHARED_SIZE
5ae0: 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73 20   - 1));.    res 
5af0: 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65  = LockFile(pFile
5b00: 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
5b10: 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  T+pFile->sharedL
5b20: 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30  ockByte, 0, 1, 0
5b30: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
5b40: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
5b50: 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 72 65 61 64  *.** Undo a read
5b60: 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lock.*/.static i
5b70: 6e 74 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63  nt unlockReadLoc
5b80: 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  k(winFile *pFile
5b90: 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ){.  int res;.  
5ba0: 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
5bb0: 20 20 72 65 73 20 3d 20 55 6e 6c 6f 63 6b 46 69    res = UnlockFi
5bc0: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  le(pFile->h, SHA
5bd0: 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48  RED_FIRST, 0, SH
5be0: 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 2f  ARED_SIZE, 0);./
5bf0: 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66  * isNT() is 1 if
5c00: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
5c10: 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73  ==1, so this els
5c20: 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75  e is never execu
5c30: 74 65 64 2e 20 0a 2a 2f 0a 23 69 66 20 53 51 4c  ted. .*/.#if SQL
5c40: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a  ITE_OS_WINCE==0.
5c50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 73    }else{.    res
5c60: 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46   = UnlockFile(pF
5c70: 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
5c80: 49 52 53 54 20 2b 20 70 46 69 6c 65 2d 3e 73 68  IRST + pFile->sh
5c90: 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c  aredLockByte, 0,
5ca0: 20 31 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20   1, 0);.#endif. 
5cb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b   }.  return res;
5cc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
5cd0: 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
5ce0: 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
5cf0: 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63  by parameter loc
5d00: 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  ktype - one.** o
5d10: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
5d20: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
5d30: 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
5d40: 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
5d50: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
5d60: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
5d70: 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
5d80: 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
5d90: 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
5da0: 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
5db0: 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
5dc0: 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
5dd0: 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
5de0: 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
5df0: 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
5e00: 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
5e10: 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
5e20: 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
5e30: 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
5e40: 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
5e50: 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
5e60: 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
5e70: 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
5e80: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
5e90: 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
5ea0: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
5eb0: 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
5ec0: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
5ed0: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
5ee0: 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
5ef0: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
5f00: 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
5f10: 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
5f20: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
5f30: 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
5f40: 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
5f50: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
5f60: 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
5f70: 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
5f80: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
5f90: 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
5fa0: 63 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f  ck.  The winUnlo
5fb0: 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  ck() routine.** 
5fc0: 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73  erases all locks
5fd0: 20 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65 74   at once and ret
5fe0: 75 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61 74  urns us immediat
5ff0: 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c  ely to locking l
6000: 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73  evel 0..** It is
6010: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
6020: 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   lower the locki
6030: 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65  ng level one ste
6040: 70 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59 6f  p at a time.  Yo
6050: 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72  u.** must go str
6060: 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67  aight to locking
6070: 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61   level 0..*/.sta
6080: 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28  tic int winLock(
6090: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
60a0: 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
60b0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
60c0: 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74  TE_OK;    /* Ret
60d0: 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  urn code from su
60e0: 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69  broutines */.  i
60f0: 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20  nt res = 1;     
6100: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
6110: 6f 66 20 61 20 77 69 6e 64 6f 77 73 20 6c 6f 63  of a windows loc
6120: 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  k call */.  int 
6130: 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20  newLocktype;    
6140: 20 20 20 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d     /* Set pFile-
6150: 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68 69  >locktype to thi
6160: 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 65  s value before e
6170: 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  xiting */.  int 
6180: 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d  gotPendingLock =
6190: 20 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77 65   0;/* True if we
61a0: 20 61 63 71 75 69 72 65 64 20 61 20 50 45 4e 44   acquired a PEND
61b0: 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74 69  ING lock this ti
61c0: 6d 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20  me */.  winFile 
61d0: 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
61e0: 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74  e*)id;..  assert
61f0: 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20  ( pFile!=0 );.  
6200: 4f 53 54 52 41 43 45 35 28 22 4c 4f 43 4b 20 25  OSTRACE5("LOCK %
6210: 64 20 25 64 20 77 61 73 20 25 64 28 25 64 29 5c  d %d was %d(%d)\
6220: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 46  n",.          pF
6230: 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
6240: 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
6250: 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  e, pFile->shared
6260: 4c 6f 63 6b 42 79 74 65 29 3b 0a 0a 20 20 2f 2a  LockByte);..  /*
6270: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
6280: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
6290: 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
62a0: 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
62b0: 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c  the.  ** OsFile,
62c0: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
62d0: 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c  't use the end_l
62e0: 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20  ock: exit path, 
62f0: 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f  as.  ** sqlite3O
6300: 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61  sEnterMutex() ha
6310: 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64  sn't been called
6320: 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   yet..  */.  if(
6330: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
6340: 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
6350: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6360: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  OK;.  }..  /* Ma
6370: 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
6380: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
6390: 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61  correct.  */.  a
63a0: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
63b0: 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20  cktype!=NO_LOCK 
63c0: 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  || locktype==SHA
63d0: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
63e0: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d  sert( locktype!=
63f0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a  PENDING_LOCK );.
6400: 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
6410: 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe!=RESERVED_LOC
6420: 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  K || pFile->lock
6430: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
6440: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20  K );..  /* Lock 
6450: 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  the PENDING_LOCK
6460: 20 62 79 74 65 20 69 66 20 77 65 20 6e 65 65 64   byte if we need
6470: 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 50 45   to acquire a PE
6480: 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20  NDING lock or.  
6490: 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ** a SHARED lock
64a0: 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 63 71  .  If we are acq
64b0: 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
64c0: 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69 73  lock, the acquis
64d0: 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68  ition of.  ** th
64e0: 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62  e PENDING_LOCK b
64f0: 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72 79  yte is temporary
6500: 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b  ..  */.  newLock
6510: 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f  type = pFile->lo
6520: 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 70 46  cktype;.  if( pF
6530: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e  ile->locktype==N
6540: 4f 5f 4c 4f 43 4b 0a 20 20 20 7c 7c 20 28 6c 6f  O_LOCK.   || (lo
6550: 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
6560: 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  E_LOCK && pFile-
6570: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52  >locktype==RESER
6580: 56 45 44 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20  VED_LOCK).  ){. 
6590: 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a     int cnt = 3;.
65a0: 20 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d      while( cnt--
65b0: 3e 30 20 26 26 20 28 72 65 73 20 3d 20 4c 6f 63  >0 && (res = Loc
65c0: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
65d0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c  PENDING_BYTE, 0,
65e0: 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20   1, 0))==0 ){.  
65f0: 20 20 20 20 2f 2a 20 54 72 79 20 33 20 74 69 6d      /* Try 3 tim
6600: 65 73 20 74 6f 20 67 65 74 20 74 68 65 20 70 65  es to get the pe
6610: 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68 65  nding lock.  The
6620: 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 6d 69   pending lock mi
6630: 67 68 74 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  ght be.      ** 
6640: 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20  held by another 
6650: 72 65 61 64 65 72 20 70 72 6f 63 65 73 73 20 77  reader process w
6660: 68 6f 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  ho will release 
6670: 69 74 20 6d 6f 6d 65 6e 74 61 72 69 6c 79 2e 0a  it momentarily..
6680: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4f        */.      O
6690: 53 54 52 41 43 45 32 28 22 63 6f 75 6c 64 20 6e  STRACE2("could n
66a0: 6f 74 20 67 65 74 20 61 20 50 45 4e 44 49 4e 47  ot get a PENDING
66b0: 20 6c 6f 63 6b 2e 20 63 6e 74 3d 25 64 5c 6e 22   lock. cnt=%d\n"
66c0: 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 53 6c  , cnt);.      Sl
66d0: 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  eep(1);.    }.  
66e0: 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b    gotPendingLock
66f0: 20 3d 20 72 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f   = res;.  }..  /
6700: 2a 20 41 63 71 75 69 72 65 20 61 20 73 68 61 72  * Acquire a shar
6710: 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  ed lock.  */.  i
6720: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
6730: 52 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20  RED_LOCK && res 
6740: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
6750: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
6760: 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  NO_LOCK );.    r
6770: 65 73 20 3d 20 67 65 74 52 65 61 64 4c 6f 63 6b  es = getReadLock
6780: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28  (pFile);.    if(
6790: 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65   res ){.      ne
67a0: 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52  wLocktype = SHAR
67b0: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  ED_LOCK;.    }. 
67c0: 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
67d0: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
67e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
67f0: 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c  type==RESERVED_L
6800: 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20  OCK && res ){.  
6810: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
6820: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  >locktype==SHARE
6830: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65  D_LOCK );.    re
6840: 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69  s = LockFile(pFi
6850: 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f  le->h, RESERVED_
6860: 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
6870: 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20      if( res ){. 
6880: 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65       newLocktype
6890: 20 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b   = RESERVED_LOCK
68a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
68b0: 2a 20 41 63 71 75 69 72 65 20 61 20 50 45 4e 44  * Acquire a PEND
68c0: 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  ING lock.  */.  
68d0: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
68e0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
68f0: 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c 6f  res ){.    newLo
6900: 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47  cktype = PENDING
6910: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50 65  _LOCK;.    gotPe
6920: 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ndingLock = 0;. 
6930: 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
6940: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
6950: 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
6960: 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
6970: 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  E_LOCK && res ){
6980: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
6990: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48  le->locktype>=SH
69a0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
69b0: 20 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52 65 61   res = unlockRea
69c0: 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
69d0: 20 20 4f 53 54 52 41 43 45 32 28 22 75 6e 72 65    OSTRACE2("unre
69e0: 61 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22 2c 20  adlock = %d\n", 
69f0: 72 65 73 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  res);.    res = 
6a00: 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e  LockFile(pFile->
6a10: 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  h, SHARED_FIRST,
6a20: 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c   0, SHARED_SIZE,
6a30: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73   0);.    if( res
6a40: 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
6a50: 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49 56  ktype = EXCLUSIV
6a60: 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  E_LOCK;.    }els
6a70: 65 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  e{.      OSTRACE
6a80: 32 28 22 65 72 72 6f 72 2d 63 6f 64 65 20 3d 20  2("error-code = 
6a90: 25 64 5c 6e 22 2c 20 47 65 74 4c 61 73 74 45 72  %d\n", GetLastEr
6aa0: 72 6f 72 28 29 29 3b 0a 20 20 20 20 20 20 67 65  ror());.      ge
6ab0: 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  tReadLock(pFile)
6ac0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
6ad0: 2a 20 49 66 20 77 65 20 61 72 65 20 68 6f 6c 64  * If we are hold
6ae0: 69 6e 67 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ing a PENDING lo
6af0: 63 6b 20 74 68 61 74 20 6f 75 67 68 74 20 74 6f  ck that ought to
6b00: 20 62 65 20 72 65 6c 65 61 73 65 64 2c 20 74 68   be released, th
6b10: 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20  en.  ** release 
6b20: 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69  it now..  */.  i
6b30: 66 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63  f( gotPendingLoc
6b40: 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  k && locktype==S
6b50: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
6b60: 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69    UnlockFile(pFi
6b70: 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42  le->h, PENDING_B
6b80: 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
6b90: 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
6ba0: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
6bb0: 20 6c 6f 63 6b 20 68 61 73 20 68 65 6c 64 20 69   lock has held i
6bc0: 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  n the file descr
6bd0: 69 70 74 6f 72 20 74 68 65 6e 0a 20 20 2a 2a 20  iptor then.  ** 
6be0: 72 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f  return the appro
6bf0: 70 72 69 61 74 65 20 72 65 73 75 6c 74 20 63 6f  priate result co
6c00: 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  de..  */.  if( r
6c10: 65 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  es ){.    rc = S
6c20: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
6c30: 65 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 34 28  e{.    OSTRACE4(
6c40: 22 4c 4f 43 4b 20 46 41 49 4c 45 44 20 25 64 20  "LOCK FAILED %d 
6c50: 74 72 79 69 6e 67 20 66 6f 72 20 25 64 20 62 75  trying for %d bu
6c60: 74 20 67 6f 74 20 25 64 5c 6e 22 2c 20 70 46 69  t got %d\n", pFi
6c70: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
6c80: 20 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c    locktype, newL
6c90: 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 72 63  ocktype);.    rc
6ca0: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
6cb0: 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63    }.  pFile->loc
6cc0: 6b 74 79 70 65 20 3d 20 28 75 38 29 6e 65 77 4c  ktype = (u8)newL
6cd0: 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72  ocktype;.  retur
6ce0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
6cf0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
6d00: 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
6d10: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
6d20: 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
6d30: 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
6d40: 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
6d50: 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
6d60: 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
6d70: 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  d, return.** non
6d80: 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65  -zero, otherwise
6d90: 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
6da0: 20 69 6e 74 20 77 69 6e 43 68 65 63 6b 52 65 73   int winCheckRes
6db0: 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
6dc0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
6dd0: 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
6de0: 20 72 63 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a   rc;.  winFile *
6df0: 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
6e00: 2a 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20  *)id;.  assert( 
6e10: 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66  pFile!=0 );.  if
6e20: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
6e30: 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e>=RESERVED_LOCK
6e40: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a   ){.    rc = 1;.
6e50: 20 20 20 20 4f 53 54 52 41 43 45 33 28 22 54 45      OSTRACE3("TE
6e60: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
6e70: 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69   (local)\n", pFi
6e80: 6c 65 2d 3e 68 2c 20 72 63 29 3b 0a 20 20 7d 65  le->h, rc);.  }e
6e90: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 4c 6f  lse{.    rc = Lo
6ea0: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
6eb0: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
6ec0: 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 1, 0);.    if
6ed0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 55 6e  ( rc ){.      Un
6ee0: 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e  lockFile(pFile->
6ef0: 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
6f00: 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  , 0, 1, 0);.    
6f10: 7d 0a 20 20 20 20 72 63 20 3d 20 21 72 63 3b 0a  }.    rc = !rc;.
6f20: 20 20 20 20 4f 53 54 52 41 43 45 33 28 22 54 45      OSTRACE3("TE
6f30: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
6f40: 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 70 46   (remote)\n", pF
6f50: 69 6c 65 2d 3e 68 2c 20 72 63 29 3b 0a 20 20 7d  ile->h, rc);.  }
6f60: 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63  .  *pResOut = rc
6f70: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
6f80: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  E_OK;.}../*.** L
6f90: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
6fa0: 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
6fb0: 65 73 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20  escriptor id to 
6fc0: 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74  locktype.  lockt
6fd0: 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ype.** must be e
6fe0: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
6ff0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
7000: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
7010: 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
7020: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
7030: 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
7040: 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
7050: 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
7060: 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
7070: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
7080: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20  **.** It is not 
7090: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69  possible for thi
70a0: 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69  s routine to fai
70b0: 6c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  l if the second 
70c0: 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e  argument.** is N
70d0: 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20  O_LOCK.  If the 
70e0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
70f0: 69 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74  is SHARED_LOCK t
7100: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
7110: 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e  .** might return
7120: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a   SQLITE_IOERR;.*
7130: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
7140: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
7150: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
7160: 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 74 79  ktype){.  int ty
7170: 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  pe;.  winFile *p
7180: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
7190: 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  )id;.  int rc = 
71a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
71b0: 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b  ert( pFile!=0 );
71c0: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
71d0: 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype<=SHARED_LOCK
71e0: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22   );.  OSTRACE5("
71f0: 55 4e 4c 4f 43 4b 20 25 64 20 74 6f 20 25 64 20  UNLOCK %d to %d 
7200: 77 61 73 20 25 64 28 25 64 29 5c 6e 22 2c 20 70  was %d(%d)\n", p
7210: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
7220: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  e,.          pFi
7230: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46  le->locktype, pF
7240: 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
7250: 79 74 65 29 3b 0a 20 20 74 79 70 65 20 3d 20 70  yte);.  type = p
7260: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a  File->locktype;.
7270: 20 20 69 66 28 20 74 79 70 65 3e 3d 45 58 43 4c    if( type>=EXCL
7280: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
7290: 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69    UnlockFile(pFi
72a0: 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
72b0: 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53  RST, 0, SHARED_S
72c0: 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  IZE, 0);.    if(
72d0: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
72e0: 44 5f 4c 4f 43 4b 20 26 26 20 21 67 65 74 52 65  D_LOCK && !getRe
72f0: 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 20 29 7b  adLock(pFile) ){
7300: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73  .      /* This s
7310: 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70  hould never happ
7320: 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c 64 20 61  en.  We should a
7330: 6c 77 61 79 73 20 62 65 20 61 62 6c 65 20 74 6f  lways be able to
7340: 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 63 71 75  .      ** reacqu
7350: 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
7360: 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  k */.      rc = 
7370: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
7380: 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  OCK;.    }.  }. 
7390: 20 69 66 28 20 74 79 70 65 3e 3d 52 45 53 45 52   if( type>=RESER
73a0: 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  VED_LOCK ){.    
73b0: 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65  UnlockFile(pFile
73c0: 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ->h, RESERVED_BY
73d0: 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
73e0: 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  }.  if( locktype
73f0: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70  ==NO_LOCK && typ
7400: 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e>=SHARED_LOCK )
7410: 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 52 65 61 64  {.    unlockRead
7420: 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 7d  Lock(pFile);.  }
7430: 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50 45 4e  .  if( type>=PEN
7440: 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  DING_LOCK ){.   
7450: 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c   UnlockFile(pFil
7460: 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59  e->h, PENDING_BY
7470: 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
7480: 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  }.  pFile->lockt
7490: 79 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79  ype = (u8)lockty
74a0: 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  pe;.  return rc;
74b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f  .}../*.** Contro
74c0: 6c 20 61 6e 64 20 71 75 65 72 79 20 6f 66 20 74  l and query of t
74d0: 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e  he open file han
74e0: 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
74f0: 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f  nt winFileContro
7500: 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
7510: 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64  id, int op, void
7520: 20 2a 70 41 72 67 29 7b 0a 20 20 73 77 69 74 63   *pArg){.  switc
7530: 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
7540: 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
7550: 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20  OCKSTATE: {.    
7560: 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
7570: 28 28 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e  ((winFile*)id)->
7580: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20  locktype;.      
7590: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
75a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
75b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
75c0: 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  R;.}../*.** Retu
75d0: 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  rn the sector si
75e0: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74  ze in bytes of t
75f0: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c  he underlying bl
7600: 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a  ock device for.*
7610: 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  * the specified 
7620: 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
7630: 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20  most always 512 
7640: 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62  bytes, but may b
7650: 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20  e.** larger for 
7660: 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a  some devices..**
7670: 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20  .** SQLite code 
7680: 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e  assumes this fun
7690: 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69  ction cannot fai
76a0: 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d  l. It also assum
76b0: 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77  es that.** if tw
76c0: 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  o files are crea
76d0: 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ted in the same 
76e0: 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65  file-system dire
76f0: 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61  ctory (i.e..** a
7700: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74   database and it
7710: 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  s journal file) 
7720: 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20  that the sector 
7730: 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65  size will be the
7740: 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74  .** same for bot
7750: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h..*/.static int
7760: 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 28 73   winSectorSize(s
7770: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
7780: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
7790: 45 54 45 52 28 69 64 29 3b 0a 20 20 72 65 74 75  ETER(id);.  retu
77a0: 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  rn SQLITE_DEFAUL
77b0: 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d  T_SECTOR_SIZE;.}
77c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
77d0: 20 76 65 63 74 6f 72 20 6f 66 20 64 65 76 69 63   vector of devic
77e0: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
77f0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
7800: 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63   winDeviceCharac
7810: 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65  teristics(sqlite
7820: 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 55  3_file *id){.  U
7830: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
7840: 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  id);.  return 0;
7850: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  .}../*.** This v
7860: 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c  ector defines al
7870: 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68  l the methods th
7880: 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f  at can operate o
7890: 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  n an.** sqlite3_
78a0: 66 69 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a  file for win32..
78b0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
78c0: 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
78d0: 64 73 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d  ds winIoMethod =
78e0: 20 7b 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20   {.  1,         
78f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7900: 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20  * iVersion */.  
7910: 77 69 6e 43 6c 6f 73 65 2c 0a 20 20 77 69 6e 52  winClose,.  winR
7920: 65 61 64 2c 0a 20 20 77 69 6e 57 72 69 74 65 2c  ead,.  winWrite,
7930: 0a 20 20 77 69 6e 54 72 75 6e 63 61 74 65 2c 0a  .  winTruncate,.
7940: 20 20 77 69 6e 53 79 6e 63 2c 0a 20 20 77 69 6e    winSync,.  win
7950: 46 69 6c 65 53 69 7a 65 2c 0a 20 20 77 69 6e 4c  FileSize,.  winL
7960: 6f 63 6b 2c 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b  ock,.  winUnlock
7970: 2c 0a 20 20 77 69 6e 43 68 65 63 6b 52 65 73 65  ,.  winCheckRese
7980: 72 76 65 64 4c 6f 63 6b 2c 0a 20 20 77 69 6e 46  rvedLock,.  winF
7990: 69 6c 65 43 6f 6e 74 72 6f 6c 2c 0a 20 20 77 69  ileControl,.  wi
79a0: 6e 53 65 63 74 6f 72 53 69 7a 65 2c 0a 20 20 77  nSectorSize,.  w
79b0: 69 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65  inDeviceCharacte
79c0: 72 69 73 74 69 63 73 0a 7d 3b 0a 0a 2f 2a 2a 2a  ristics.};../***
79d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
79e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
79f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a10: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 48 65 72 65  ********.** Here
7a20: 20 65 6e 64 73 20 74 68 65 20 49 2f 4f 20 6d 65   ends the I/O me
7a30: 74 68 6f 64 73 20 74 68 61 74 20 66 6f 72 6d 20  thods that form 
7a40: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
7a50: 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a  ethods object..*
7a60: 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 62 6c  *.** The next bl
7a70: 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 6d 70 6c  ock of code impl
7a80: 65 6d 65 6e 74 73 20 74 68 65 20 56 46 53 20 6d  ements the VFS m
7a90: 65 74 68 6f 64 73 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a  ethods..********
7aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ae0: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  ****/../*.** Con
7af0: 76 65 72 74 20 61 20 55 54 46 2d 38 20 66 69 6c  vert a UTF-8 fil
7b00: 65 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61 74 65  ename into whate
7b10: 76 65 72 20 66 6f 72 6d 20 74 68 65 20 75 6e 64  ver form the und
7b20: 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  erlying.** opera
7b30: 74 69 6e 67 20 73 79 73 74 65 6d 20 77 61 6e 74  ting system want
7b40: 73 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20  s filenames in. 
7b50: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
7b60: 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20  he result.** is 
7b70: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
7b80: 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65  lloc and must be
7b90: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
7ba0: 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
7bb0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
7bc0: 64 20 2a 63 6f 6e 76 65 72 74 55 74 66 38 46 69  d *convertUtf8Fi
7bd0: 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61  lename(const cha
7be0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
7bf0: 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
7c00: 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 73 4e  d = 0;.  if( isN
7c10: 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76  T() ){.    zConv
7c20: 65 72 74 65 64 20 3d 20 75 74 66 38 54 6f 55 6e  erted = utf8ToUn
7c30: 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
7c40: 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31  ;./* isNT() is 1
7c50: 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   if SQLITE_OS_WI
7c60: 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20  NCE==1, so this 
7c70: 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78  else is never ex
7c80: 65 63 75 74 65 64 2e 20 0a 2a 2f 0a 23 69 66 20  ecuted. .*/.#if 
7c90: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
7ca0: 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  =0.  }else{.    
7cb0: 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 75 74 66  zConverted = utf
7cc0: 38 54 6f 4d 62 63 73 28 7a 46 69 6c 65 6e 61 6d  8ToMbcs(zFilenam
7cd0: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  e);.#endif.  }. 
7ce0: 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20   /* caller will 
7cf0: 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65  handle out of me
7d00: 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e  mory */.  return
7d10: 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a   zConverted;.}..
7d20: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74  /*.** Create a t
7d30: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61  emporary file na
7d40: 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75  me in zBuf.  zBu
7d50: 66 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e  f must be big en
7d60: 6f 75 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20  ough to.** hold 
7d70: 61 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  at pVfs->mxPathn
7d80: 61 6d 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a  ame characters..
7d90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
7da0: 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42  tTempname(int nB
7db0: 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
7dc0: 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a  .  static char z
7dd0: 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61  Chars[] =.    "a
7de0: 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
7df0: 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22  rstuvwxyz".    "
7e00: 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
7e10: 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20  QRSTUVWXYZ".    
7e20: 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20  "0123456789";.  
7e30: 73 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 63  size_t i, j;.  c
7e40: 68 61 72 20 7a 54 65 6d 70 50 61 74 68 5b 4d 41  har zTempPath[MA
7e50: 58 5f 50 41 54 48 2b 31 5d 3b 0a 20 20 69 66 28  X_PATH+1];.  if(
7e60: 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
7e70: 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73  rectory ){.    s
7e80: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7e90: 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65  MAX_PATH-30, zTe
7ea0: 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20 73 71  mpPath, "%s", sq
7eb0: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
7ec0: 74 6f 72 79 29 3b 0a 20 20 7d 65 6c 73 65 20 69  tory);.  }else i
7ed0: 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
7ee0: 20 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20   char *zMulti;. 
7ef0: 20 20 20 57 43 48 41 52 20 7a 57 69 64 65 50 61     WCHAR zWidePa
7f00: 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20  th[MAX_PATH];.  
7f10: 20 20 47 65 74 54 65 6d 70 50 61 74 68 57 28 4d    GetTempPathW(M
7f20: 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 57 69 64  AX_PATH-30, zWid
7f30: 65 50 61 74 68 29 3b 0a 20 20 20 20 7a 4d 75 6c  ePath);.    zMul
7f40: 74 69 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74  ti = unicodeToUt
7f50: 66 38 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20  f8(zWidePath);. 
7f60: 20 20 20 69 66 28 20 7a 4d 75 6c 74 69 20 29 7b     if( zMulti ){
7f70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
7f80: 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
7f90: 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20  -30, zTempPath, 
7fa0: 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20  "%s", zMulti);. 
7fb0: 20 20 20 20 20 66 72 65 65 28 7a 4d 75 6c 74 69       free(zMulti
7fc0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
7fd0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7fe0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 2f  E_NOMEM;.    }./
7ff0: 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66  * isNT() is 1 if
8000: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
8010: 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73  ==1, so this els
8020: 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75  e is never execu
8030: 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74  ted. .** Since t
8040: 68 65 20 41 53 43 49 49 20 76 65 72 73 69 6f 6e  he ASCII version
8050: 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77   of these Window
8060: 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69  s API do not exi
8070: 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a  st for WINCE,.**
8080: 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20   it's important 
8090: 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65  to not reference
80a0: 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20   them for WINCE 
80b0: 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53  builds..*/.#if S
80c0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
80d0: 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  0.  }else{.    c
80e0: 68 61 72 20 2a 7a 55 74 66 38 3b 0a 20 20 20 20  har *zUtf8;.    
80f0: 63 68 61 72 20 7a 4d 62 63 73 50 61 74 68 5b 4d  char zMbcsPath[M
8100: 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 47 65  AX_PATH];.    Ge
8110: 74 54 65 6d 70 50 61 74 68 41 28 4d 41 58 5f 50  tTempPathA(MAX_P
8120: 41 54 48 2d 33 30 2c 20 7a 4d 62 63 73 50 61 74  ATH-30, zMbcsPat
8130: 68 29 3b 0a 20 20 20 20 7a 55 74 66 38 20 3d 20  h);.    zUtf8 = 
8140: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62  sqlite3_win32_mb
8150: 63 73 5f 74 6f 5f 75 74 66 38 28 7a 4d 62 63 73  cs_to_utf8(zMbcs
8160: 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a  Path);.    if( z
8170: 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 73 71  Utf8 ){.      sq
8180: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
8190: 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d  AX_PATH-30, zTem
81a0: 70 50 61 74 68 2c 20 22 25 73 22 2c 20 7a 55 74  pPath, "%s", zUt
81b0: 66 38 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28  f8);.      free(
81c0: 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73  zUtf8);.    }els
81d0: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
81e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
81f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
8200: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 33 53 74   for(i=sqlite3St
8210: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 50 61 74 68  rlen30(zTempPath
8220: 29 3b 20 69 3e 30 20 26 26 20 7a 54 65 6d 70 50  ); i>0 && zTempP
8230: 61 74 68 5b 69 2d 31 5d 3d 3d 27 5c 5c 27 3b 20  ath[i-1]=='\\'; 
8240: 69 2d 2d 29 7b 7d 0a 20 20 7a 54 65 6d 70 50 61  i--){}.  zTempPa
8250: 74 68 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  th[i] = 0;.  sql
8260: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
8270: 75 66 2d 33 30 2c 20 7a 42 75 66 2c 0a 20 20 20  uf-30, zBuf,.   
8280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8290: 22 25 73 5c 5c 22 53 51 4c 49 54 45 5f 54 45 4d  "%s\\"SQLITE_TEM
82a0: 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a  P_FILE_PREFIX, z
82b0: 54 65 6d 70 50 61 74 68 29 3b 0a 20 20 6a 20 3d  TempPath);.  j =
82c0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
82d0: 28 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65  (zBuf);.  sqlite
82e0: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 32 30 2c  3_randomness(20,
82f0: 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f   &zBuf[j]);.  fo
8300: 72 28 69 3d 30 3b 20 69 3c 32 30 3b 20 69 2b 2b  r(i=0; i<20; i++
8310: 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66  , j++){.    zBuf
8320: 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61  [j] = (char)zCha
8330: 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63  rs[ ((unsigned c
8340: 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69  har)zBuf[j])%(si
8350: 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20  zeof(zChars)-1) 
8360: 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d  ];.  }.  zBuf[j]
8370: 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 32   = 0;.  OSTRACE2
8380: 28 22 54 45 4d 50 20 46 49 4c 45 4e 41 4d 45 3a  ("TEMP FILENAME:
8390: 20 25 73 5c 6e 22 2c 20 7a 42 75 66 29 3b 0a 20   %s\n", zBuf);. 
83a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
83b0: 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  K; .}../*.** The
83c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
83d0: 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67   getLastErrorMsg
83e0: 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74  .** is zero if t
83f0: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
8400: 20 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66   fits in the buf
8410: 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  fer, or non-zero
8420: 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69  .** otherwise (i
8430: 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61  f the message wa
8440: 73 20 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f  s truncated)..*/
8450: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4c  .static int getL
8460: 61 73 74 45 72 72 6f 72 4d 73 67 28 69 6e 74 20  astErrorMsg(int 
8470: 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
8480: 29 7b 0a 20 20 44 57 4f 52 44 20 65 72 72 6f 72  ){.  DWORD error
8490: 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28   = GetLastError(
84a0: 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  );..#if SQLITE_O
84b0: 53 5f 57 49 4e 43 45 0a 20 20 73 71 6c 69 74 65  S_WINCE.  sqlite
84c0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c  3_snprintf(nBuf,
84d0: 20 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f 72 20   zBuf, "OsError 
84e0: 30 78 25 78 20 28 25 75 29 22 2c 20 65 72 72 6f  0x%x (%u)", erro
84f0: 72 2c 20 65 72 72 6f 72 29 3b 0a 23 65 6c 73 65  r, error);.#else
8500: 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73 73  .  /* FormatMess
8510: 61 67 65 20 72 65 74 75 72 6e 73 20 30 20 6f 6e  age returns 0 on
8520: 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68 65 72   failure.  Other
8530: 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72 65 74  wise it.  ** ret
8540: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
8550: 6f 66 20 54 43 48 41 52 73 20 77 72 69 74 74 65  of TCHARs writte
8560: 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  n to the output.
8570: 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65 78 63    ** buffer, exc
8580: 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72 6d 69  luding the termi
8590: 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61 72  nating null char
85a0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 21 46 6f  ..  */.  if (!Fo
85b0: 72 6d 61 74 4d 65 73 73 61 67 65 41 28 46 4f 52  rmatMessageA(FOR
85c0: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d  MAT_MESSAGE_FROM
85d0: 5f 53 59 53 54 45 4d 2c 0a 20 20 20 20 20 20 20  _SYSTEM,.       
85e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
85f0: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
8600: 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
8610: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8620: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
8630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8640: 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20 20 20   zBuf,.         
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 75               nBu
8660: 66 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  f-1,.           
8670: 20 20 20 20 20 20 20 20 20 20 20 30 29 29 0a 20             0)). 
8680: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73   {.    sqlite3_s
8690: 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42  nprintf(nBuf, zB
86a0: 75 66 2c 20 22 4f 73 45 72 72 6f 72 20 30 78 25  uf, "OsError 0x%
86b0: 78 20 28 25 75 29 22 2c 20 65 72 72 6f 72 2c 20  x (%u)", error, 
86c0: 65 72 72 6f 72 29 3b 0a 20 20 7d 0a 23 65 6e 64  error);.  }.#end
86d0: 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  if..  return 0;.
86e0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  }.../*.** Open a
86f0: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
8700: 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20 20   int winOpen(.  
8710: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
8720: 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74  s,        /* Not
8730: 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74   used */.  const
8740: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
8750: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
8760: 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29  the file (UTF-8)
8770: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
8780: 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
8790: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 53 51 4c  /* Write the SQL
87a0: 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  ite file handle 
87b0: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
87c0: 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
87d0: 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65      /* Open mode
87e0: 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20   flags */.  int 
87f0: 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20  *pOutFlags      
8800: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20        /* Status 
8810: 72 65 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f 0a  return flags */.
8820: 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20  ){.  HANDLE h;. 
8830: 20 44 57 4f 52 44 20 64 77 44 65 73 69 72 65 64   DWORD dwDesired
8840: 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52 44 20  Access;.  DWORD 
8850: 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44  dwShareMode;.  D
8860: 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e 44  WORD dwCreationD
8870: 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57  isposition;.  DW
8880: 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64 41 74  ORD dwFlagsAndAt
8890: 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a 23 69  tributes = 0;.#i
88a0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
88b0: 45 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d  E.  int isTemp =
88c0: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e   0;.#endif.  win
88d0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
88e0: 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f  inFile*)id;.  vo
88f0: 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20  id *zConverted; 
8900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8910: 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f  /* Filename in O
8920: 53 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20  S encoding */.  
8930: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66  const char *zUtf
8940: 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 20  8Name = zName;  
8950: 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e    /* Filename in
8960: 20 55 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20   UTF-8 encoding 
8970: 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61  */.  char zTmpna
8980: 6d 65 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 20  me[MAX_PATH+1]; 
8990: 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
89a0: 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20   used to create 
89b0: 74 65 6d 70 20 66 69 6c 65 6e 61 6d 65 20 2a 2f  temp filename */
89c0: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
89d0: 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 2f  ETER(pVfs);..  /
89e0: 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
89f0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
8a00: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c   function is NUL
8a10: 4c 2c 20 67 65 6e 65 72 61 74 65 20 61 20 0a 20  L, generate a . 
8a20: 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69   ** temporary fi
8a30: 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 0a  le name to use .
8a40: 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74 66    */.  if( !zUtf
8a50: 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e 74  8Name ){.    int
8a60: 20 72 63 20 3d 20 67 65 74 54 65 6d 70 6e 61 6d   rc = getTempnam
8a70: 65 28 4d 41 58 5f 50 41 54 48 2b 31 2c 20 7a 54  e(MAX_PATH+1, zT
8a80: 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  mpname);.    if(
8a90: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8aa0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
8ab0: 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74  c;.    }.    zUt
8ac0: 66 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d  f8Name = zTmpnam
8ad0: 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e  e;.  }..  /* Con
8ae0: 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e 61 6d  vert the filenam
8af0: 65 20 74 6f 20 74 68 65 20 73 79 73 74 65 6d 20  e to the system 
8b00: 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a  encoding. */.  z
8b10: 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
8b20: 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
8b30: 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66  zUtf8Name);.  if
8b40: 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
8b50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8b60: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
8b70: 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
8b80: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
8b90: 52 49 54 45 20 29 7b 0a 20 20 20 20 64 77 44 65  RITE ){.    dwDe
8ba0: 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47 45  siredAccess = GE
8bb0: 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e  NERIC_READ | GEN
8bc0: 45 52 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65  ERIC_WRITE;.  }e
8bd0: 6c 73 65 7b 0a 20 20 20 20 64 77 44 65 73 69 72  lse{.    dwDesir
8be0: 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52  edAccess = GENER
8bf0: 49 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 20 20 69  IC_READ;.  }.  i
8c00: 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
8c10: 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 29 7b  E_OPEN_CREATE ){
8c20: 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44  .    dwCreationD
8c30: 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45  isposition = OPE
8c40: 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d 65 6c 73  N_ALWAYS;.  }els
8c50: 65 7b 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f  e{.    dwCreatio
8c60: 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f  nDisposition = O
8c70: 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20  PEN_EXISTING;.  
8c80: 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  }.  if( flags & 
8c90: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
8ca0: 5f 44 42 20 29 7b 0a 20 20 20 20 64 77 53 68 61  _DB ){.    dwSha
8cb0: 72 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48  reMode = FILE_SH
8cc0: 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f  ARE_READ | FILE_
8cd0: 53 48 41 52 45 5f 57 52 49 54 45 3b 0a 20 20 7d  SHARE_WRITE;.  }
8ce0: 65 6c 73 65 7b 0a 20 20 20 20 64 77 53 68 61 72  else{.    dwShar
8cf0: 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  eMode = 0;.  }. 
8d00: 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
8d10: 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
8d20: 4e 43 4c 4f 53 45 20 29 7b 0a 23 69 66 20 53 51  NCLOSE ){.#if SQ
8d30: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
8d40: 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
8d50: 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54  ibutes = FILE_AT
8d60: 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a  TRIBUTE_HIDDEN;.
8d70: 20 20 20 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a      isTemp = 1;.
8d80: 23 65 6c 73 65 0a 20 20 20 20 64 77 46 6c 61 67  #else.    dwFlag
8d90: 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
8da0: 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
8db0: 54 45 4d 50 4f 52 41 52 59 0a 20 20 20 20 20 20  TEMPORARY.      
8dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8dd0: 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f           | FILE_
8de0: 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e  ATTRIBUTE_HIDDEN
8df0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e10: 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45  | FILE_FLAG_DELE
8e20: 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e  TE_ON_CLOSE;.#en
8e30: 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
8e40: 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
8e50: 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54  butes = FILE_ATT
8e60: 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20  RIBUTE_NORMAL;. 
8e70: 20 7d 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73 20   }.  /* Reports 
8e80: 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 65  from the interne
8e90: 74 20 61 72 65 20 74 68 61 74 20 70 65 72 66 6f  t are that perfo
8ea0: 72 6d 61 6e 63 65 20 69 73 20 61 6c 77 61 79 73  rmance is always
8eb0: 0a 20 20 2a 2a 20 62 65 74 74 65 72 20 69 66 20  .  ** better if 
8ec0: 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d  FILE_FLAG_RANDOM
8ed0: 5f 41 43 43 45 53 53 20 69 73 20 75 73 65 64 2e  _ACCESS is used.
8ee0: 20 20 54 69 63 6b 65 74 20 23 32 36 39 39 2e 20    Ticket #2699. 
8ef0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
8f00: 5f 57 49 4e 43 45 0a 20 20 64 77 46 6c 61 67 73  _WINCE.  dwFlags
8f10: 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 7c 3d  AndAttributes |=
8f20: 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f   FILE_FLAG_RANDO
8f30: 4d 5f 41 43 43 45 53 53 3b 0a 23 65 6e 64 69 66  M_ACCESS;.#endif
8f40: 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
8f50: 0a 20 20 20 20 68 20 3d 20 43 72 65 61 74 65 46  .    h = CreateF
8f60: 69 6c 65 57 28 28 57 43 48 41 52 2a 29 7a 43 6f  ileW((WCHAR*)zCo
8f70: 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
8f80: 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c  dwDesiredAccess,
8f90: 0a 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d  .       dwShareM
8fa0: 6f 64 65 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c  ode,.       NULL
8fb0: 2c 0a 20 20 20 20 20 20 20 64 77 43 72 65 61 74  ,.       dwCreat
8fc0: 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a  ionDisposition,.
8fd0: 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e         dwFlagsAn
8fe0: 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20  dAttributes,.   
8ff0: 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a      NULL.    );.
9000: 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69  /* isNT() is 1 i
9010: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
9020: 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c  E==1, so this el
9030: 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63  se is never exec
9040: 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20  uted. .** Since 
9050: 74 68 65 20 41 53 43 49 49 20 76 65 72 73 69 6f  the ASCII versio
9060: 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f  n of these Windo
9070: 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78  ws API do not ex
9080: 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a  ist for WINCE,.*
9090: 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74  * it's important
90a0: 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63   to not referenc
90b0: 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45  e them for WINCE
90c0: 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20   builds..*/.#if 
90d0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
90e0: 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  =0.  }else{.    
90f0: 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 41 28  h = CreateFileA(
9100: 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
9110: 64 2c 0a 20 20 20 20 20 20 20 64 77 44 65 73 69  d,.       dwDesi
9120: 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20  redAccess,.     
9130: 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a 20    dwShareMode,. 
9140: 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20        NULL,.    
9150: 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
9160: 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20  position,.      
9170: 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
9180: 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 4e 55  butes,.       NU
9190: 4c 4c 0a 20 20 20 20 29 3b 0a 23 65 6e 64 69 66  LL.    );.#endif
91a0: 0a 20 20 7d 0a 20 20 69 66 28 20 68 3d 3d 49 4e  .  }.  if( h==IN
91b0: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
91c0: 55 45 20 29 7b 0a 20 20 20 20 66 72 65 65 28 7a  UE ){.    free(z
91d0: 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
91e0: 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
91f0: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
9200: 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E ){.      retur
9210: 6e 20 77 69 6e 4f 70 65 6e 28 30 2c 20 7a 4e 61  n winOpen(0, zNa
9220: 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20 20 20 20  me, id, .       
9230: 20 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53 51        ((flags|SQ
9240: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
9250: 4c 59 29 26 7e 53 51 4c 49 54 45 5f 4f 50 45 4e  LY)&~SQLITE_OPEN
9260: 5f 52 45 41 44 57 52 49 54 45 29 2c 20 70 4f 75  _READWRITE), pOu
9270: 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c  tFlags);.    }el
9280: 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
9290: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
92a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
92b0: 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20  ( pOutFlags ){. 
92c0: 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53     if( flags & S
92d0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
92e0: 52 49 54 45 20 29 7b 0a 20 20 20 20 20 20 2a 70  RITE ){.      *p
92f0: 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  OutFlags = SQLIT
9300: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
9310: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9320: 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20     *pOutFlags = 
9330: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
9340: 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ONLY;.    }.  }.
9350: 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20    memset(pFile, 
9360: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 46 69 6c 65  0, sizeof(*pFile
9370: 29 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65  ));.  pFile->pMe
9380: 74 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74  thod = &winIoMet
9390: 68 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20  hod;.  pFile->h 
93a0: 3d 20 68 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  = h;.#if SQLITE_
93b0: 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66 28 20 28  OS_WINCE.  if( (
93c0: 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  flags & (SQLITE_
93d0: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
93e0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
93f0: 44 42 29 29 20 3d 3d 0a 20 20 20 20 20 20 20 20  DB)) ==.        
9400: 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f         (SQLITE_O
9410: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
9420: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
9430: 42 29 0a 20 20 20 20 20 20 20 26 26 20 21 77 69  B).       && !wi
9440: 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e  nceCreateLock(zN
9450: 61 6d 65 2c 20 70 46 69 6c 65 29 0a 20 20 29 7b  ame, pFile).  ){
9460: 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65  .    CloseHandle
9470: 28 68 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 43  (h);.    free(zC
9480: 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 72  onverted);.    r
9490: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
94a0: 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 69 66 28  TOPEN;.  }.  if(
94b0: 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 70   isTemp ){.    p
94c0: 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
94d0: 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65  lose = zConverte
94e0: 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  d;.  }else.#endi
94f0: 66 0a 20 20 7b 0a 20 20 20 20 66 72 65 65 28 7a  f.  {.    free(z
9500: 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a  Converted);.  }.
9510: 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31    OpenCounter(+1
9520: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
9530: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
9540: 44 65 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64  Delete the named
9550: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   file..**.** Not
9560: 65 20 74 68 61 74 20 77 69 6e 64 6f 77 73 20 64  e that windows d
9570: 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20  oes not allow a 
9580: 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74  file to be delet
9590: 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ed if some other
95a0: 0a 2a 2a 20 70 72 6f 63 65 73 73 20 68 61 73 20  .** process has 
95b0: 69 74 20 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69  it open.  Someti
95c0: 6d 65 73 20 61 20 76 69 72 75 73 20 73 63 61 6e  mes a virus scan
95d0: 6e 65 72 20 6f 72 20 69 6e 64 65 78 69 6e 67 20  ner or indexing 
95e0: 70 72 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20  program.** will 
95f0: 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66  open a journal f
9600: 69 6c 65 20 73 68 6f 72 74 6c 79 20 61 66 74 65  ile shortly afte
9610: 72 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20  r it is created 
9620: 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a  in order to do.*
9630: 2a 20 77 68 61 74 65 76 65 72 20 69 74 20 64 6f  * whatever it do
9640: 65 73 2e 20 20 57 68 69 6c 65 20 74 68 69 73 20  es.  While this 
9650: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
9660: 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20   holding the.** 
9670: 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20 77 69  file open, we wi
9680: 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20  ll be unable to 
9690: 64 65 6c 65 74 65 20 69 74 2e 20 20 54 6f 20 77  delete it.  To w
96a0: 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 0a  ork around this.
96b0: 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64  ** problem, we d
96c0: 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c 69 73 65  elay 100 millise
96d0: 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 74 6f  conds and try to
96e0: 20 64 65 6c 65 74 65 20 61 67 61 69 6e 2e 20 20   delete again.  
96f0: 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c 45  Up.** to MX_DELE
9700: 54 49 4f 4e 5f 41 54 54 45 4d 50 54 73 20 64 65  TION_ATTEMPTs de
9710: 6c 65 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  letion attempts 
9720: 61 72 65 20 72 75 6e 20 62 65 66 6f 72 65 20 67  are run before g
9730: 69 76 69 6e 67 0a 2a 2a 20 75 70 20 61 6e 64 20  iving.** up and 
9740: 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  returning an err
9750: 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  or..*/.#define M
9760: 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d  X_DELETION_ATTEM
9770: 50 54 53 20 35 0a 73 74 61 74 69 63 20 69 6e 74  PTS 5.static int
9780: 20 77 69 6e 44 65 6c 65 74 65 28 0a 20 20 73 71   winDelete(.  sq
9790: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
97a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74            /* Not
97b0: 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a   used on win32 *
97c0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
97d0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20  zFilename,      
97e0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
97f0: 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69  to delete */.  i
9800: 6e 74 20 73 79 6e 63 44 69 72 20 20 20 20 20 20  nt syncDir      
9810: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
9820: 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20  t used on win32 
9830: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20  */.){.  int cnt 
9840: 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 72 63 3b  = 0;.  DWORD rc;
9850: 0a 20 20 44 57 4f 52 44 20 65 72 72 6f 72 20 3d  .  DWORD error =
9860: 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e   0;.  void *zCon
9870: 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74  verted = convert
9880: 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69  Utf8Filename(zFi
9890: 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45  lename);.  UNUSE
98a0: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
98b0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
98c0: 4d 45 54 45 52 28 73 79 6e 63 44 69 72 29 3b 0a  METER(syncDir);.
98d0: 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
98e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
98f0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
9900: 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f    }.  SimulateIO
9910: 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
9920: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
9930: 29 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  );.  if( isNT() 
9940: 29 7b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  ){.    do{.     
9950: 20 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f   DeleteFileW(zCo
9960: 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7d 77  nverted);.    }w
9970: 68 69 6c 65 28 20 20 20 28 20 20 20 28 28 72 63  hile(   (   ((rc
9980: 20 3d 20 47 65 74 46 69 6c 65 41 74 74 72 69 62   = GetFileAttrib
9990: 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74 65 64  utesW(zConverted
99a0: 29 29 20 21 3d 20 49 4e 56 41 4c 49 44 5f 46 49  )) != INVALID_FI
99b0: 4c 45 5f 41 54 54 52 49 42 55 54 45 53 29 0a 20  LE_ATTRIBUTES). 
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
99d0: 20 28 28 65 72 72 6f 72 20 3d 20 47 65 74 4c 61   ((error = GetLa
99e0: 73 74 45 72 72 6f 72 28 29 29 20 3d 3d 20 45 52  stError()) == ER
99f0: 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e 49 45  ROR_ACCESS_DENIE
9a00: 44 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 26  D)).           &
9a10: 26 20 28 2b 2b 63 6e 74 20 3c 20 4d 58 5f 44 45  & (++cnt < MX_DE
9a20: 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 29  LETION_ATTEMPTS)
9a30: 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
9a40: 53 6c 65 65 70 28 31 30 30 29 2c 20 31 29 20 29  Sleep(100), 1) )
9a50: 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31  ;./* isNT() is 1
9a60: 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   if SQLITE_OS_WI
9a70: 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20  NCE==1, so this 
9a80: 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78  else is never ex
9a90: 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63  ecuted. .** Sinc
9aa0: 65 20 74 68 65 20 41 53 43 49 49 20 76 65 72 73  e the ASCII vers
9ab0: 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e  ion of these Win
9ac0: 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20  dows API do not 
9ad0: 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c  exist for WINCE,
9ae0: 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61  .** it's importa
9af0: 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65  nt to not refere
9b00: 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e  nce them for WIN
9b10: 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69  CE builds..*/.#i
9b20: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
9b30: 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E==0.  }else{.  
9b40: 20 20 64 6f 7b 0a 20 20 20 20 20 20 44 65 6c 65    do{.      Dele
9b50: 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74  teFileA(zConvert
9b60: 65 64 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  ed);.    }while(
9b70: 20 20 20 28 20 20 20 28 28 72 63 20 3d 20 47 65     (   ((rc = Ge
9b80: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
9b90: 28 7a 43 6f 6e 76 65 72 74 65 64 29 29 20 21 3d  (zConverted)) !=
9ba0: 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54   INVALID_FILE_AT
9bb0: 54 52 49 42 55 54 45 53 29 0a 20 20 20 20 20 20  TRIBUTES).      
9bc0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 65 72           || ((er
9bd0: 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72 72  ror = GetLastErr
9be0: 6f 72 28 29 29 20 3d 3d 20 45 52 52 4f 52 5f 41  or()) == ERROR_A
9bf0: 43 43 45 53 53 5f 44 45 4e 49 45 44 29 29 0a 20  CCESS_DENIED)). 
9c00: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 2b 2b            && (++
9c10: 63 6e 74 20 3c 20 4d 58 5f 44 45 4c 45 54 49 4f  cnt < MX_DELETIO
9c20: 4e 5f 41 54 54 45 4d 50 54 53 29 0a 20 20 20 20  N_ATTEMPTS).    
9c30: 20 20 20 20 20 20 20 26 26 20 28 53 6c 65 65 70         && (Sleep
9c40: 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23 65 6e  (100), 1) );.#en
9c50: 64 69 66 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a  dif.  }.  free(z
9c60: 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 4f 53  Converted);.  OS
9c70: 54 52 41 43 45 32 28 22 44 45 4c 45 54 45 20 5c  TRACE2("DELETE \
9c80: 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 6e  "%s\"\n", zFilen
9c90: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  ame);.  return (
9ca0: 20 20 20 28 72 63 20 3d 3d 20 49 4e 56 41 4c 49     (rc == INVALI
9cb0: 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
9cc0: 53 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  S) .          &&
9cd0: 20 28 65 72 72 6f 72 20 3d 3d 20 45 52 52 4f 52   (error == ERROR
9ce0: 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 29  _FILE_NOT_FOUND)
9cf0: 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  ) ? SQLITE_OK : 
9d00: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
9d10: 45 54 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ETE;.}../*.** Ch
9d20: 65 63 6b 20 74 68 65 20 65 78 69 73 74 61 6e 63  eck the existanc
9d30: 65 20 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20  e and status of 
9d40: 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
9d50: 63 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28  c int winAccess(
9d60: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
9d70: 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a  pVfs,         /*
9d80: 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e   Not used on win
9d90: 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  32 */.  const ch
9da0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
9db0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
9dc0: 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  le to check */. 
9dd0: 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
9de0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9df0: 79 70 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d  ype of test to m
9e00: 61 6b 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ake on this file
9e10: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f   */.  int *pResO
9e20: 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
9e30: 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20   /* OUT: Result 
9e40: 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61 74  */.){.  DWORD at
9e50: 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  tr;.  int rc = 0
9e60: 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
9e70: 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74  rted = convertUt
9e80: 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65  f8Filename(zFile
9e90: 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  name);.  UNUSED_
9ea0: 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
9eb0: 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
9ec0: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d==0 ){.    retu
9ed0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
9ee0: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28  .  }.  if( isNT(
9ef0: 29 20 29 7b 0a 20 20 20 20 61 74 74 72 20 3d 20  ) ){.    attr = 
9f00: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
9f10: 73 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76  sW((WCHAR*)zConv
9f20: 65 72 74 65 64 29 3b 0a 2f 2a 20 69 73 4e 54 28  erted);./* isNT(
9f30: 29 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 45  ) is 1 if SQLITE
9f40: 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f  _OS_WINCE==1, so
9f50: 20 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65   this else is ne
9f60: 76 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a  ver executed. .*
9f70: 2a 20 53 69 6e 63 65 20 74 68 65 20 41 53 43 49  * Since the ASCI
9f80: 49 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  I version of the
9f90: 73 65 20 57 69 6e 64 6f 77 73 20 41 50 49 20 64  se Windows API d
9fa0: 6f 20 6e 6f 74 20 65 78 69 73 74 20 66 6f 72 20  o not exist for 
9fb0: 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69  WINCE,.** it's i
9fc0: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20  mportant to not 
9fd0: 72 65 66 65 72 65 6e 63 65 20 74 68 65 6d 20 66  reference them f
9fe0: 6f 72 20 57 49 4e 43 45 20 62 75 69 6c 64 73 2e  or WINCE builds.
9ff0: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
a000: 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c  S_WINCE==0.  }el
a010: 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 47  se{.    attr = G
a020: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
a030: 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
a040: 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  ted);.#endif.  }
a050: 0a 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  .  free(zConvert
a060: 65 64 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66  ed);.  switch( f
a070: 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65  lags ){.    case
a080: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
a090: 45 41 44 3a 0a 20 20 20 20 63 61 73 65 20 53 51  EAD:.    case SQ
a0a0: 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
a0b0: 54 53 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61  TS:.      rc = a
a0c0: 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ttr!=INVALID_FIL
a0d0: 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20  E_ATTRIBUTES;.  
a0e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
a0f0: 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
a100: 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20  S_READWRITE:.   
a110: 20 20 20 72 63 20 3d 20 28 61 74 74 72 20 26 20     rc = (attr & 
a120: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52  FILE_ATTRIBUTE_R
a130: 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20  EADONLY)==0;.   
a140: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
a150: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73  fault:.      ass
a160: 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c  ert(!"Invalid fl
a170: 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a  ags argument");.
a180: 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d    }.  *pResOut =
a190: 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 53 51   rc;.  return SQ
a1a0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
a1b0: 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69  ** Turn a relati
a1c0: 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f  ve pathname into
a1d0: 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65   a full pathname
a1e0: 2e 20 20 57 72 69 74 65 20 74 68 65 20 66 75 6c  .  Write the ful
a1f0: 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e  l.** pathname in
a200: 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74  to zOut[].  zOut
a210: 5b 5d 20 77 69 6c 6c 20 62 65 20 61 74 20 6c 65  [] will be at le
a220: 61 73 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ast pVfs->mxPath
a230: 6e 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e  name.** bytes in
a240: 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
a250: 20 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61 74 68   int winFullPath
a260: 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  name(.  sqlite3_
a270: 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
a280: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
a290: 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a   to vfs object *
a2a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
a2b0: 7a 52 65 6c 61 74 69 76 65 2c 20 20 20 20 20 20  zRelative,      
a2c0: 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65    /* Possibly re
a2d0: 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74  lative input pat
a2e0: 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c  h */.  int nFull
a2f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a300: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
a310: 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e  output buffer in
a320: 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72   bytes */.  char
a330: 20 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20 20 20   *zFull         
a340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
a350: 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b  put buffer */.){
a360: 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .  .#if defined(
a370: 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 55 4e  __CYGWIN__).  UN
a380: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
a390: 46 75 6c 6c 29 3b 0a 20 20 63 79 67 77 69 6e 5f  Full);.  cygwin_
a3a0: 63 6f 6e 76 5f 74 6f 5f 66 75 6c 6c 5f 77 69 6e  conv_to_full_win
a3b0: 33 32 5f 70 61 74 68 28 7a 52 65 6c 61 74 69 76  32_path(zRelativ
a3c0: 65 2c 20 7a 46 75 6c 6c 29 3b 0a 20 20 72 65 74  e, zFull);.  ret
a3d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
a3e0: 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
a3f0: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 55 4e 55  E_OS_WINCE.  UNU
a400: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46  SED_PARAMETER(nF
a410: 75 6c 6c 29 3b 0a 20 20 2f 2a 20 57 69 6e 43 45  ull);.  /* WinCE
a420: 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20   has no concept 
a430: 6f 66 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  of a relative pa
a440: 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20  thname, or so I 
a450: 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 73 71  am told. */.  sq
a460: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 70  lite3_snprintf(p
a470: 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c  Vfs->mxPathname,
a480: 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52   zFull, "%s", zR
a490: 65 6c 61 74 69 76 65 29 3b 0a 20 20 72 65 74 75  elative);.  retu
a4a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
a4b0: 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54  ndif..#if !SQLIT
a4c0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64  E_OS_WINCE && !d
a4d0: 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
a4e0: 5f 29 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  _).  int nByte;.
a4f0: 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
a500: 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74  ed;.  char *zOut
a510: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
a520: 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 7a  ETER(nFull);.  z
a530: 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
a540: 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
a550: 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 69 66  zRelative);.  if
a560: 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
a570: 57 43 48 41 52 20 2a 7a 54 65 6d 70 3b 0a 20 20  WCHAR *zTemp;.  
a580: 20 20 6e 42 79 74 65 20 3d 20 47 65 74 46 75 6c    nByte = GetFul
a590: 6c 50 61 74 68 4e 61 6d 65 57 28 28 57 43 48 41  lPathNameW((WCHA
a5a0: 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30  R*)zConverted, 0
a5b0: 2c 20 30 2c 20 30 29 20 2b 20 33 3b 0a 20 20 20  , 0, 0) + 3;.   
a5c0: 20 7a 54 65 6d 70 20 3d 20 6d 61 6c 6c 6f 63 28   zTemp = malloc(
a5d0: 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54   nByte*sizeof(zT
a5e0: 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  emp[0]) );.    i
a5f0: 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20  f( zTemp==0 ){. 
a600: 20 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65       free(zConve
a610: 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
a620: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
a630: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 47 65 74 46  ;.    }.    GetF
a640: 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 57 43  ullPathNameW((WC
a650: 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c  HAR*)zConverted,
a660: 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30   nByte, zTemp, 0
a670: 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e  );.    free(zCon
a680: 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75  verted);.    zOu
a690: 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66  t = unicodeToUtf
a6a0: 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 66 72  8(zTemp);.    fr
a6b0: 65 65 28 7a 54 65 6d 70 29 3b 0a 2f 2a 20 69 73  ee(zTemp);./* is
a6c0: 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c  NT() is 1 if SQL
a6d0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c  ITE_OS_WINCE==1,
a6e0: 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73   so this else is
a6f0: 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e   never executed.
a700: 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41   .** Since the A
a710: 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f 66 20  SCII version of 
a720: 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50  these Windows AP
a730: 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66  I do not exist f
a740: 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27  or WINCE,.** it'
a750: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e  s important to n
a760: 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ot reference the
a770: 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c  m for WINCE buil
a780: 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ds..*/.#if SQLIT
a790: 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20  E_OS_WINCE==0.  
a7a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
a7b0: 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74  *zTemp;.    nByt
a7c0: 65 20 3d 20 47 65 74 46 75 6c 6c 50 61 74 68 4e  e = GetFullPathN
a7d0: 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  ameA((char*)zCon
a7e0: 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29  verted, 0, 0, 0)
a7f0: 20 2b 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20   + 3;.    zTemp 
a800: 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a  = malloc( nByte*
a810: 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29  sizeof(zTemp[0])
a820: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d   );.    if( zTem
a830: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72  p==0 ){.      fr
a840: 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
a850: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a860: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
a870: 0a 20 20 20 20 47 65 74 46 75 6c 6c 50 61 74 68  .    GetFullPath
a880: 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f  NameA((char*)zCo
a890: 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20  nverted, nByte, 
a8a0: 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 66  zTemp, 0);.    f
a8b0: 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
a8c0: 0a 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69  .    zOut = sqli
a8d0: 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
a8e0: 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20  o_utf8(zTemp);. 
a8f0: 20 20 20 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a     free(zTemp);.
a900: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28  #endif.  }.  if(
a910: 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c   zOut ){.    sql
a920: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 70 56  ite3_snprintf(pV
a930: 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20  fs->mxPathname, 
a940: 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75  zFull, "%s", zOu
a950: 74 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 4f 75  t);.    free(zOu
a960: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
a970: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
a980: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
a990: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
a9a0: 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 6e 64 65  #endif.}..#ifnde
a9b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
a9c0: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a  AD_EXTENSION./*.
a9d0: 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f  ** Interfaces fo
a9e0: 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72  r opening a shar
a9f0: 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64  ed library, find
aa00: 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  ing entry points
aa10: 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73  .** within the s
aa20: 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61  hared library, a
aa30: 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73  nd closing the s
aa40: 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a  hared library..*
aa50: 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  /./*.** Interfac
aa60: 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61  es for opening a
aa70: 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
aa80: 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70   finding entry p
aa90: 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20  oints.** within 
aaa0: 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
aab0: 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20  ry, and closing 
aac0: 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
aad0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
aae0: 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e 28 73 71  id *winDlOpen(sq
aaf0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
ab00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
ab10: 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e 44 4c  lename){.  HANDL
ab20: 45 20 68 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  E h;.  void *zCo
ab30: 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72  nverted = conver
ab40: 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  tUtf8Filename(zF
ab50: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53  ilename);.  UNUS
ab60: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
ab70: 73 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  s);.  if( zConve
ab80: 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rted==0 ){.    r
ab90: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
aba0: 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
abb0: 20 68 20 3d 20 4c 6f 61 64 4c 69 62 72 61 72 79   h = LoadLibrary
abc0: 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65  W((WCHAR*)zConve
abd0: 72 74 65 64 29 3b 0a 2f 2a 20 69 73 4e 54 28 29  rted);./* isNT()
abe0: 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f   is 1 if SQLITE_
abf0: 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20  OS_WINCE==1, so 
ac00: 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76  this else is nev
ac10: 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a  er executed. .**
ac20: 20 53 69 6e 63 65 20 74 68 65 20 41 53 43 49 49   Since the ASCII
ac30: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73   version of thes
ac40: 65 20 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f  e Windows API do
ac50: 20 6e 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57   not exist for W
ac60: 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d  INCE,.** it's im
ac70: 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72  portant to not r
ac80: 65 66 65 72 65 6e 63 65 20 74 68 65 6d 20 66 6f  eference them fo
ac90: 72 20 57 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a  r WINCE builds..
aca0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
acb0: 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73  _WINCE==0.  }els
acc0: 65 7b 0a 20 20 20 20 68 20 3d 20 4c 6f 61 64 4c  e{.    h = LoadL
acd0: 69 62 72 61 72 79 41 28 28 63 68 61 72 2a 29 7a  ibraryA((char*)z
ace0: 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64  Converted);.#end
acf0: 69 66 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a 43  if.  }.  free(zC
ad00: 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74  onverted);.  ret
ad10: 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a  urn (void*)h;.}.
ad20: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44  static void winD
ad30: 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  lError(sqlite3_v
ad40: 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
ad50: 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75  uf, char *zBufOu
ad60: 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
ad70: 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
ad80: 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28  getLastErrorMsg(
ad90: 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b 0a  nBuf, zBufOut);.
ada0: 7d 0a 76 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79  }.void (*winDlSy
adb0: 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  m(sqlite3_vfs *p
adc0: 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  Vfs, void *pHand
add0: 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  le, const char *
ade0: 7a 53 79 6d 62 6f 6c 29 29 28 76 6f 69 64 29 7b  zSymbol))(void){
adf0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
ae00: 54 45 52 28 70 56 66 73 29 3b 0a 23 69 66 20 53  TER(pVfs);.#if S
ae10: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
ae20: 20 2f 2a 20 54 68 65 20 47 65 74 50 72 6f 63 41   /* The GetProcA
ae30: 64 64 72 65 73 73 41 28 29 20 72 6f 75 74 69 6e  ddressA() routin
ae40: 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  e is only availa
ae50: 62 6c 65 20 6f 6e 20 77 69 6e 63 65 2e 20 2a 2f  ble on wince. */
ae60: 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 28  .  return (void(
ae70: 2a 29 28 76 6f 69 64 29 29 47 65 74 50 72 6f 63  *)(void))GetProc
ae80: 41 64 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45  AddressA((HANDLE
ae90: 29 70 48 61 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f  )pHandle, zSymbo
aea0: 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 41  l);.#else.  /* A
aeb0: 6c 6c 20 6f 74 68 65 72 20 77 69 6e 64 6f 77 73  ll other windows
aec0: 20 70 6c 61 74 66 6f 72 6d 73 20 65 78 70 65 63   platforms expec
aed0: 74 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  t GetProcAddress
aee0: 28 29 20 74 6f 20 74 61 6b 65 0a 20 20 2a 2a 20  () to take.  ** 
aef0: 61 6e 20 41 6e 73 69 20 73 74 72 69 6e 67 20 72  an Ansi string r
af00: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
af10: 20 5f 55 4e 49 43 4f 44 45 20 73 65 74 74 69 6e   _UNICODE settin
af20: 67 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 76  g */.  return (v
af30: 6f 69 64 28 2a 29 28 76 6f 69 64 29 29 47 65 74  oid(*)(void))Get
af40: 50 72 6f 63 41 64 64 72 65 73 73 28 28 48 41 4e  ProcAddress((HAN
af50: 44 4c 45 29 70 48 61 6e 64 6c 65 2c 20 7a 53 79  DLE)pHandle, zSy
af60: 6d 62 6f 6c 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  mbol);.#endif.}.
af70: 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28  void winDlClose(
af80: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
af90: 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65  s, void *pHandle
afa0: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
afb0: 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 46  METER(pVfs);.  F
afc0: 72 65 65 4c 69 62 72 61 72 79 28 28 48 41 4e 44  reeLibrary((HAND
afd0: 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23  LE)pHandle);.}.#
afe0: 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54  else /* if SQLIT
aff0: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
b000: 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64  NSION is defined
b010: 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 77  : */.  #define w
b020: 69 6e 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64  inDlOpen  0.  #d
b030: 65 66 69 6e 65 20 77 69 6e 44 6c 45 72 72 6f 72  efine winDlError
b040: 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e   0.  #define win
b050: 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66  DlSym   0.  #def
b060: 69 6e 65 20 77 69 6e 44 6c 43 6c 6f 73 65 20 30  ine winDlClose 0
b070: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
b080: 57 72 69 74 65 20 75 70 20 74 6f 20 6e 42 75 66  Write up to nBuf
b090: 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d   bytes of random
b0a0: 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e 0a  ness into zBuf..
b0b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
b0c0: 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69  nRandomness(sqli
b0d0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
b0e0: 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
b0f0: 42 75 66 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  Buf){.  int n = 
b100: 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  0;.  UNUSED_PARA
b110: 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23 69 66  METER(pVfs);.#if
b120: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
b130: 54 45 53 54 29 0a 20 20 6e 20 3d 20 6e 42 75 66  TEST).  n = nBuf
b140: 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c  ;.  memset(zBuf,
b150: 20 30 2c 20 6e 42 75 66 29 3b 0a 23 65 6c 73 65   0, nBuf);.#else
b160: 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 53 59  .  if( sizeof(SY
b170: 53 54 45 4d 54 49 4d 45 29 3c 3d 6e 42 75 66 2d  STEMTIME)<=nBuf-
b180: 6e 20 29 7b 0a 20 20 20 20 53 59 53 54 45 4d 54  n ){.    SYSTEMT
b190: 49 4d 45 20 78 3b 0a 20 20 20 20 47 65 74 53 79  IME x;.    GetSy
b1a0: 73 74 65 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20  stemTime(&x);.  
b1b0: 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e    memcpy(&zBuf[n
b1c0: 5d 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29  ], &x, sizeof(x)
b1d0: 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65  );.    n += size
b1e0: 6f 66 28 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28  of(x);.  }.  if(
b1f0: 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d   sizeof(DWORD)<=
b200: 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57  nBuf-n ){.    DW
b210: 4f 52 44 20 70 69 64 20 3d 20 47 65 74 43 75 72  ORD pid = GetCur
b220: 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 3b  rentProcessId();
b230: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
b240: 66 5b 6e 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65  f[n], &pid, size
b250: 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20 6e 20  of(pid));.    n 
b260: 2b 3d 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a  += sizeof(pid);.
b270: 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66    }.  if( sizeof
b280: 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20  (DWORD)<=nBuf-n 
b290: 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 63 6e 74  ){.    DWORD cnt
b2a0: 20 3d 20 47 65 74 54 69 63 6b 43 6f 75 6e 74 28   = GetTickCount(
b2b0: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
b2c0: 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69  Buf[n], &cnt, si
b2d0: 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20  zeof(cnt));.    
b2e0: 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29  n += sizeof(cnt)
b2f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65  ;.  }.  if( size
b300: 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52  of(LARGE_INTEGER
b310: 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
b320: 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69   LARGE_INTEGER i
b330: 3b 0a 20 20 20 20 51 75 65 72 79 50 65 72 66 6f  ;.    QueryPerfo
b340: 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28 26 69  rmanceCounter(&i
b350: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
b360: 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a 65  Buf[n], &i, size
b370: 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  of(i));.    n +=
b380: 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20 7d 0a   sizeof(i);.  }.
b390: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
b3a0: 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65  n;.}.../*.** Sle
b3b0: 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20  ep for a little 
b3c0: 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74  while.  Return t
b3d0: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d  he amount of tim
b3e0: 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74  e slept..*/.stat
b3f0: 69 63 20 69 6e 74 20 77 69 6e 53 6c 65 65 70 28  ic int winSleep(
b400: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
b410: 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 29  s, int microsec)
b420: 7b 0a 20 20 53 6c 65 65 70 28 28 6d 69 63 72 6f  {.  Sleep((micro
b430: 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a  sec+999)/1000);.
b440: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
b450: 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75  ER(pVfs);.  retu
b460: 72 6e 20 28 28 6d 69 63 72 6f 73 65 63 2b 39 39  rn ((microsec+99
b470: 39 29 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d  9)/1000)*1000;.}
b480: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
b490: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20  owing variable, 
b4a0: 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d  if set to a non-
b4b0: 7a 65 72 6f 20 76 61 6c 75 65 2c 20 62 65 63 6f  zero value, beco
b4c0: 6d 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  mes the result.*
b4d0: 2a 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20  * returned from 
b4e0: 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74  sqlite3OsCurrent
b4f0: 54 69 6d 65 28 29 2e 20 20 54 68 69 73 20 69 73  Time().  This is
b500: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
b510: 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  g..*/.#ifdef SQL
b520: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
b530: 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
b540: 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  e = 0;.#endif../
b550: 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
b560: 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
b570: 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
b580: 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
b590: 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  te the.** curren
b5a0: 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
b5b0: 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
b5c0: 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e  number into *prN
b5d0: 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ow and.** return
b5e0: 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66   0.  Return 1 if
b5f0: 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
b600: 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  te cannot be fou
b610: 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 77 69 6e 43 75  nd..*/.int winCu
b620: 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65  rrentTime(sqlite
b630: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75  3_vfs *pVfs, dou
b640: 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 46  ble *prNow){.  F
b650: 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 2f 2a  ILETIME ft;.  /*
b660: 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74   FILETIME struct
b670: 75 72 65 20 69 73 20 61 20 36 34 2d 62 69 74 20  ure is a 64-bit 
b680: 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74 69  value representi
b690: 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
b6a0: 20 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73   .     100-nanos
b6b0: 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 20  econd intervals 
b6c0: 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31 2c  since January 1,
b6d0: 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30 35   1601 (= JD 2305
b6e0: 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20 20  813.5). .  */.  
b6f0: 64 6f 75 62 6c 65 20 6e 6f 77 3b 0a 23 69 66 20  double now;.#if 
b700: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
b710: 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69 6d    SYSTEMTIME tim
b720: 65 3b 0a 20 20 47 65 74 53 79 73 74 65 6d 54 69  e;.  GetSystemTi
b730: 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f 2a 20  me(&time);.  /* 
b740: 69 66 20 53 79 73 74 65 6d 54 69 6d 65 54 6f 46  if SystemTimeToF
b750: 69 6c 65 54 69 6d 65 28 29 20 66 61 69 6c 73 2c  ileTime() fails,
b760: 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f   it returns zero
b770: 2e 20 2a 2f 0a 20 20 69 66 20 28 21 53 79 73 74  . */.  if (!Syst
b780: 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
b790: 28 26 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20 20  (&time,&ft)){.  
b7a0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
b7b0: 23 65 6c 73 65 0a 20 20 47 65 74 53 79 73 74 65  #else.  GetSyste
b7c0: 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 28  mTimeAsFileTime(
b7d0: 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a 20   &ft );.#endif. 
b7e0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
b7f0: 52 28 70 56 66 73 29 3b 0a 20 20 6e 6f 77 20 3d  R(pVfs);.  now =
b800: 20 28 28 64 6f 75 62 6c 65 29 66 74 2e 64 77 48   ((double)ft.dwH
b810: 69 67 68 44 61 74 65 54 69 6d 65 29 20 2a 20 34  ighDateTime) * 4
b820: 32 39 34 39 36 37 32 39 36 2e 30 3b 20 0a 20 20  294967296.0; .  
b830: 2a 70 72 4e 6f 77 20 3d 20 28 6e 6f 77 20 2b 20  *prNow = (now + 
b840: 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65  ft.dwLowDateTime
b850: 29 2f 38 36 34 30 30 30 30 30 30 30 30 30 2e 30  )/864000000000.0
b860: 20 2b 20 32 33 30 35 38 31 33 2e 35 3b 0a 23 69   + 2305813.5;.#i
b870: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
b880: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63  .  if( sqlite3_c
b890: 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20  urrent_time ){. 
b8a0: 20 20 20 2a 70 72 4e 6f 77 20 3d 20 73 71 6c 69     *prNow = sqli
b8b0: 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
b8c0: 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30 35  /86400.0 + 24405
b8d0: 38 37 2e 35 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  87.5;.  }.#endif
b8e0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
b8f0: 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 69  /*.** The idea i
b900: 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  s that this func
b910: 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20  tion works like 
b920: 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  a combination of
b930: 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72  .** GetLastError
b940: 28 29 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73  () and FormatMes
b950: 73 61 67 65 28 29 20 6f 6e 20 77 69 6e 64 6f 77  sage() on window
b960: 73 20 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a  s (or errno and.
b970: 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20  ** strerror_r() 
b980: 6f 6e 20 75 6e 69 78 29 2e 20 41 66 74 65 72 20  on unix). After 
b990: 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
b9a0: 72 6e 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a  rned by an OS.**
b9b0: 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74   function, SQLit
b9c0: 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e  e calls this fun
b9d0: 63 74 69 6f 6e 20 77 69 74 68 20 7a 42 75 66 20  ction with zBuf 
b9e0: 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61  pointing to.** a
b9f0: 20 62 75 66 66 65 72 20 6f 66 20 6e 42 75 66 20   buffer of nBuf 
ba00: 62 79 74 65 73 2e 20 54 68 65 20 4f 53 20 6c 61  bytes. The OS la
ba10: 79 65 72 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c  yer should popul
ba20: 61 74 65 20 74 68 65 0a 2a 2a 20 62 75 66 66 65  ate the.** buffe
ba30: 72 20 77 69 74 68 20 61 20 6e 75 6c 2d 74 65 72  r with a nul-ter
ba40: 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 65 6e  minated UTF-8 en
ba50: 63 6f 64 65 64 20 65 72 72 6f 72 20 6d 65 73 73  coded error mess
ba60: 61 67 65 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e  age.** describin
ba70: 67 20 74 68 65 20 6c 61 73 74 20 49 4f 20 65 72  g the last IO er
ba80: 72 6f 72 20 74 6f 20 68 61 76 65 20 6f 63 63 75  ror to have occu
ba90: 72 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63  red within the c
baa0: 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64  alling.** thread
bab0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
bac0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
bad0: 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20 74 68  too large for th
bae0: 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65  e supplied buffe
baf0: 72 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20  r,.** it should 
bb00: 62 65 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68  be truncated. Th
bb10: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
bb20: 66 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 0a  f xGetLastError.
bb30: 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  ** is zero if th
bb40: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
bb50: 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66  fits in the buff
bb60: 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a  er, or non-zero.
bb70: 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66  ** otherwise (if
bb80: 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73   the message was
bb90: 20 74 72 75 6e 63 61 74 65 64 29 2e 20 49 66 20   truncated). If 
bba0: 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75  non-zero is retu
bbb0: 72 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74  rned,.** then it
bbc0: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
bbd0: 79 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65  y to include the
bbe0: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
bbf0: 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20  character.** in 
bc00: 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
bc10: 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70  r..**.** Not sup
bc20: 70 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  plying an error 
bc30: 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 68 61 76  message will hav
bc40: 65 20 6e 6f 20 61 64 76 65 72 73 65 20 65 66 66  e no adverse eff
bc50: 65 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65  ect.** on SQLite
bc60: 2e 20 49 74 20 69 73 20 66 69 6e 65 20 74 6f 20  . It is fine to 
bc70: 68 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e  have an implemen
bc80: 74 61 74 69 6f 6e 20 74 68 61 74 20 6e 65 76 65  tation that neve
bc90: 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20  r.** returns an 
bca0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a  error message:.*
bcb0: 2a 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65 74 4c  *.**   int xGetL
bcc0: 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33  astError(sqlite3
bcd0: 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
bce0: 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
bcf0: 29 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ){.**     assert
bd00: 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b  (zBuf[0]=='\0');
bd10: 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20 30  .**     return 0
bd20: 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48  ;.**   }.**.** H
bd30: 6f 77 65 76 65 72 20 69 66 20 61 6e 20 65 72 72  owever if an err
bd40: 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 75  or message is su
bd50: 70 70 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c 20  pplied, it will 
bd60: 62 65 20 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a  be incorporated.
bd70: 2a 2a 20 62 79 20 73 71 6c 69 74 65 20 69 6e 74  ** by sqlite int
bd80: 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  o the error mess
bd90: 61 67 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  age available to
bda0: 20 74 68 65 20 75 73 65 72 20 75 73 69 6e 67 0a   the user using.
bdb0: 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ** sqlite3_errms
bdc0: 67 28 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61  g(), possibly ma
bdd0: 6b 69 6e 67 20 49 4f 20 65 72 72 6f 72 73 20 65  king IO errors e
bde0: 61 73 69 65 72 20 74 6f 20 64 65 62 75 67 2e 0a  asier to debug..
bdf0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
be00: 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71  nGetLastError(sq
be10: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
be20: 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
be30: 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44  *zBuf){.  UNUSED
be40: 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
be50: 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 4c 61  ;.  return getLa
be60: 73 74 45 72 72 6f 72 4d 73 67 28 6e 42 75 66 2c  stErrorMsg(nBuf,
be70: 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zBuf);.}../*.**
be80: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20   Initialize and 
be90: 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  deinitialize the
bea0: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
beb0: 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  m interface..*/.
bec0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69  int sqlite3_os_i
bed0: 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  nit(void){.  sta
bee0: 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20  tic sqlite3_vfs 
bef0: 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20 31  winVfs = {.    1
bf00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
bf10: 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
bf20: 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46  .    sizeof(winF
bf30: 69 6c 65 29 2c 20 20 20 2f 2a 20 73 7a 4f 73 46  ile),   /* szOsF
bf40: 69 6c 65 20 2a 2f 0a 20 20 20 20 4d 41 58 5f 50  ile */.    MAX_P
bf50: 41 54 48 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ATH,          /*
bf60: 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20   mxPathname */. 
bf70: 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
bf80: 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a        /* pNext *
bf90: 2f 0a 20 20 20 20 22 77 69 6e 33 32 22 2c 20 20  /.    "win32",  
bfa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d           /* zNam
bfb0: 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
bfd0: 41 70 70 44 61 74 61 20 2a 2f 0a 20 0a 20 20 20  AppData */. .   
bfe0: 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20   winOpen,       
bff0: 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a      /* xOpen */.
c000: 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20      winDelete,  
c010: 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74         /* xDelet
c020: 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65  e */.    winAcce
c030: 73 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ss,         /* x
c040: 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  Access */.    wi
c050: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  nFullPathname,  
c060: 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d   /* xFullPathnam
c070: 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70  e */.    winDlOp
c080: 65 6e 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78  en,         /* x
c090: 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69  DlOpen */.    wi
c0a0: 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20  nDlError,       
c0b0: 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a   /* xDlError */.
c0c0: 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20      winDlSym,   
c0d0: 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d         /* xDlSym
c0e0: 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f   */.    winDlClo
c0f0: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 44  se,        /* xD
c100: 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69  lClose */.    wi
c110: 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20  nRandomness,    
c120: 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20   /* xRandomness 
c130: 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c  */.    winSleep,
c140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c            /* xSl
c150: 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75  eep */.    winCu
c160: 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 2f 2a  rrentTime,    /*
c170: 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f   xCurrentTime */
c180: 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45  .    winGetLastE
c190: 72 72 6f 72 20 20 20 20 2f 2a 20 78 47 65 74 4c  rror    /* xGetL
c1a0: 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 7d 3b  astError */.  };
c1b0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  .  sqlite3_vfs_r
c1c0: 65 67 69 73 74 65 72 28 26 77 69 6e 56 66 73 2c  egister(&winVfs,
c1d0: 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51   1);.  return SQ
c1e0: 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 69 6e 74 20  LITE_OK; .}.int 
c1f0: 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76  sqlite3_os_end(v
c200: 6f 69 64 29 7b 20 0a 20 20 72 65 74 75 72 6e 20  oid){ .  return 
c210: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
c220: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
c230: 53 5f 57 49 4e 20 2a 2f 0a                       S_WIN */.