/ Hex Artifact Content
Login

Artifact 13bed718f62d64031b17bb3685adcf994dbf0232:


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 33 35 20 32 30 30  in.c,v 1.135 200
01d0: 38 2f 31 30 2f 31 32 20 30 32 3a 32 37 3a 33 39  8/10/12 02:27:39
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 64 65 66 69 6e  PI..*/.#if defin
0990: 65 64 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  ed(SQLITE_OS_WIN
09a0: 43 45 29 0a 23 20 64 65 66 69 6e 65 20 41 72 65  CE).# define Are
09b0: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 31  FileApisANSI() 1
09c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
09d0: 69 6e 43 45 20 6c 61 63 6b 73 20 6e 61 74 69 76  inCE lacks nativ
09e0: 65 20 73 75 70 70 6f 72 74 20 66 6f 72 20 66 69  e support for fi
09f0: 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 6f 20 77 65  le locking so we
0a00: 20 68 61 76 65 20 74 6f 20 66 61 6b 65 20 69 74   have to fake it
0a10: 0a 2a 2a 20 77 69 74 68 20 73 6f 6d 65 20 63 6f  .** with some co
0a20: 64 65 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a  de of our own..*
0a30: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
0a40: 57 49 4e 43 45 0a 74 79 70 65 64 65 66 20 73 74  WINCE.typedef st
0a50: 72 75 63 74 20 77 69 6e 63 65 4c 6f 63 6b 20 7b  ruct winceLock {
0a60: 0a 20 20 69 6e 74 20 6e 52 65 61 64 65 72 73 3b  .  int nReaders;
0a70: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0a80: 20 6f 66 20 72 65 61 64 65 72 20 6c 6f 63 6b 73   of reader locks
0a90: 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42   obtained */.  B
0aa0: 4f 4f 4c 20 62 50 65 6e 64 69 6e 67 3b 20 20 20  OOL bPending;   
0ab0: 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20     /* Indicates 
0ac0: 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68  a pending lock h
0ad0: 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  as been obtained
0ae0: 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 73 65   */.  BOOL bRese
0af0: 72 76 65 64 3b 20 20 20 20 20 2f 2a 20 49 6e 64  rved;     /* Ind
0b00: 69 63 61 74 65 73 20 61 20 72 65 73 65 72 76 65  icates a reserve
0b10: 64 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  d lock has been 
0b20: 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f  obtained */.  BO
0b30: 4f 4c 20 62 45 78 63 6c 75 73 69 76 65 3b 20 20  OL bExclusive;  
0b40: 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61    /* Indicates a
0b50: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
0b60: 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e   has been obtain
0b70: 65 64 20 2a 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63  ed */.} winceLoc
0b80: 6b 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  k;.#endif../*.**
0b90: 20 54 68 65 20 77 69 6e 46 69 6c 65 20 73 74 72   The winFile str
0ba0: 75 63 74 75 72 65 20 69 73 20 61 20 73 75 62 63  ucture is a subc
0bb0: 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f  lass of sqlite3_
0bc0: 66 69 6c 65 2a 20 73 70 65 63 69 66 69 63 20 74  file* specific t
0bd0: 6f 20 74 68 65 20 77 69 6e 33 32 0a 2a 2a 20 70  o the win32.** p
0be0: 6f 72 74 61 62 69 6c 69 74 79 20 6c 61 79 65 72  ortability layer
0bf0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
0c00: 75 63 74 20 77 69 6e 46 69 6c 65 20 77 69 6e 46  uct winFile winF
0c10: 69 6c 65 3b 0a 73 74 72 75 63 74 20 77 69 6e 46  ile;.struct winF
0c20: 69 6c 65 20 7b 0a 20 20 63 6f 6e 73 74 20 73 71  ile {.  const sq
0c30: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0c40: 20 2a 70 4d 65 74 68 6f 64 3b 2f 2a 20 4d 75 73   *pMethod;/* Mus
0c50: 74 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20  t be first */.  
0c60: 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20 20  HANDLE h;       
0c70: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
0c80: 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20  e for accessing 
0c90: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
0ca0: 73 69 67 6e 65 64 20 63 68 61 72 20 6c 6f 63 6b  signed char lock
0cb0: 74 79 70 65 3b 20 2f 2a 20 54 79 70 65 20 6f 66  type; /* Type of
0cc0: 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79 20   lock currently 
0cd0: 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 69 6c  held on this fil
0ce0: 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73 68 61  e */.  short sha
0cf0: 72 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20 20 2f  redLockByte;   /
0d00: 2a 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f 73 65  * Randomly chose
0d10: 6e 20 62 79 74 65 20 75 73 65 64 20 61 73 20 61  n byte used as a
0d20: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a   shared lock */.
0d30: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
0d40: 4e 43 45 0a 20 20 57 43 48 41 52 20 2a 7a 44 65  NCE.  WCHAR *zDe
0d50: 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20 20 2f 2a  leteOnClose;  /*
0d60: 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f   Name of file to
0d70: 20 64 65 6c 65 74 65 20 77 68 65 6e 20 63 6c 6f   delete when clo
0d80: 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e 44 4c 45  sing */.  HANDLE
0d90: 20 68 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20   hMutex;        
0da0: 20 20 2f 2a 20 4d 75 74 65 78 20 75 73 65 64 20    /* Mutex used 
0db0: 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73  to control acces
0dc0: 73 20 74 6f 20 73 68 61 72 65 64 20 6c 6f 63 6b  s to shared lock
0dd0: 20 2a 2f 20 20 0a 20 20 48 41 4e 44 4c 45 20 68   */  .  HANDLE h
0de0: 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20 20  Shared;         
0df0: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
0e00: 20 73 65 67 6d 65 6e 74 20 75 73 65 64 20 66 6f   segment used fo
0e10: 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 77  r locking */.  w
0e20: 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c 3b 20  inceLock local; 
0e30: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 73 20         /* Locks 
0e40: 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68 69 73  obtained by this
0e50: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 77 69 6e   instance of win
0e60: 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 63 65 4c  File */.  winceL
0e70: 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20 20 20 20  ock *shared;    
0e80: 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 68 61 72    /* Global shar
0e90: 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79 20 66  ed lock memory f
0ea0: 6f 72 20 74 68 65 20 66 69 6c 65 20 20 2a 2f 0a  or the file  */.
0eb0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a  #endif.};.../*.*
0ec0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
0ed0: 76 61 72 69 61 62 6c 65 20 69 73 20 28 6e 6f 72  variable is (nor
0ee0: 6d 61 6c 6c 79 29 20 73 65 74 20 6f 6e 63 65 20  mally) set once 
0ef0: 61 6e 64 20 6e 65 76 65 72 20 63 68 61 6e 67 65  and never change
0f00: 73 0a 2a 2a 20 74 68 65 72 65 61 66 74 65 72 2e  s.** thereafter.
0f10: 20 20 49 74 20 72 65 63 6f 72 64 73 20 77 68 65    It records whe
0f20: 74 68 65 72 20 74 68 65 20 6f 70 65 72 61 74 69  ther the operati
0f30: 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e  ng system is Win
0f40: 39 35 0a 2a 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a  95.** or WinNT..
0f50: 2a 2a 0a 2a 2a 20 30 3a 20 20 20 4f 70 65 72 61  **.** 0:   Opera
0f60: 74 69 6e 67 20 73 79 73 74 65 6d 20 75 6e 6b 6e  ting system unkn
0f70: 6f 77 6e 2e 0a 2a 2a 20 31 3a 20 20 20 4f 70 65  own..** 1:   Ope
0f80: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73  rating system is
0f90: 20 57 69 6e 39 35 2e 0a 2a 2a 20 32 3a 20 20 20   Win95..** 2:   
0fa0: 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  Operating system
0fb0: 20 69 73 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a   is WinNT..**.**
0fc0: 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63   In order to fac
0fd0: 69 6c 69 74 61 74 65 20 74 65 73 74 69 6e 67 20  ilitate testing 
0fe0: 6f 6e 20 61 20 57 69 6e 4e 54 20 73 79 73 74 65  on a WinNT syste
0ff0: 6d 2c 20 74 68 65 20 74 65 73 74 20 66 69 78 74  m, the test fixt
1000: 75 72 65 0a 2a 2a 20 63 61 6e 20 6d 61 6e 75 61  ure.** can manua
1010: 6c 6c 79 20 73 65 74 20 74 68 69 73 20 76 61 6c  lly set this val
1020: 75 65 20 74 6f 20 31 20 74 6f 20 65 6d 75 6c 61  ue to 1 to emula
1030: 74 65 20 57 69 6e 39 38 20 62 65 68 61 76 69 6f  te Win98 behavio
1040: 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  r..*/.#ifdef SQL
1050: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
1060: 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30  ite3_os_type = 0
1070: 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 69  ;.#else.static i
1080: 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  nt sqlite3_os_ty
1090: 70 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  pe = 0;.#endif..
10a0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
10b0: 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20  e (non-zero) if 
10c0: 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 75  we are running u
10d0: 6e 64 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32  nder WinNT, Win2
10e0: 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20  K, WinXP,.** or 
10f0: 57 69 6e 43 45 2e 20 20 52 65 74 75 72 6e 20 66  WinCE.  Return f
1100: 61 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 20  alse (zero) for 
1110: 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72  Win95, Win98, or
1120: 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65   WinME..**.** He
1130: 72 65 20 69 73 20 61 6e 20 69 6e 74 65 72 65 73  re is an interes
1140: 74 69 6e 67 20 6f 62 73 65 72 76 61 74 69 6f 6e  ting observation
1150: 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c  :  Win95, Win98,
1160: 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a   and WinME lack.
1170: 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45  ** the LockFileE
1180: 78 28 29 20 41 50 49 2e 20 20 42 75 74 20 77 65  x() API.  But we
1190: 20 63 61 6e 20 73 74 69 6c 6c 20 73 74 61 74 69   can still stati
11a0: 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e  cally link again
11b0: 73 74 20 74 68 61 74 0a 2a 2a 20 41 50 49 20 61  st that.** API a
11c0: 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e  s long as we don
11d0: 27 74 20 63 61 6c 6c 20 69 74 20 77 69 6e 20 72  't call it win r
11e0: 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f  unning Win95/98/
11f0: 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a  ME.  A call to.*
1200: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
1210: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
1220: 69 6e 65 20 69 66 20 74 68 65 20 68 6f 73 74 20  ine if the host 
1230: 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f  is Win95/98/ME o
1240: 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50  r.** WinNT/2K/XP
1250: 20 73 6f 20 74 68 61 74 20 77 65 20 77 69 6c 6c   so that we will
1260: 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72   know whether or
1270: 20 6e 6f 74 20 77 65 20 63 61 6e 20 73 61 66 65   not we can safe
1280: 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c  ly call.** the L
1290: 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e  ockFileEx() API.
12a0: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
12b0: 53 5f 57 49 4e 43 45 0a 23 20 64 65 66 69 6e 65  S_WINCE.# define
12c0: 20 69 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c   isNT()  (1).#el
12d0: 73 65 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  se.  static int 
12e0: 69 73 4e 54 28 76 6f 69 64 29 7b 0a 20 20 20 20  isNT(void){.    
12f0: 69 66 28 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74  if( sqlite3_os_t
1300: 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ype==0 ){.      
1310: 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 20 73 49  OSVERSIONINFO sI
1320: 6e 66 6f 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f  nfo;.      sInfo
1330: 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f  .dwOSVersionInfo
1340: 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49  Size = sizeof(sI
1350: 6e 66 6f 29 3b 0a 20 20 20 20 20 20 47 65 74 56  nfo);.      GetV
1360: 65 72 73 69 6f 6e 45 78 28 26 73 49 6e 66 6f 29  ersionEx(&sInfo)
1370: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1380: 6f 73 5f 74 79 70 65 20 3d 20 73 49 6e 66 6f 2e  os_type = sInfo.
1390: 64 77 50 6c 61 74 66 6f 72 6d 49 64 3d 3d 56 45  dwPlatformId==VE
13a0: 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32  R_PLATFORM_WIN32
13b0: 5f 4e 54 20 3f 20 32 20 3a 20 31 3b 0a 20 20 20  _NT ? 2 : 1;.   
13c0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71   }.    return sq
13d0: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32  lite3_os_type==2
13e0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
13f0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
1400: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  */../*.** Conver
1410: 74 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67  t a UTF-8 string
1420: 20 74 6f 20 6d 69 63 72 6f 73 6f 66 74 20 75 6e   to microsoft un
1430: 69 63 6f 64 65 20 28 55 54 46 2d 31 36 3f 29 2e  icode (UTF-16?).
1440: 20 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f   .**.** Space to
1450: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
1460: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
1470: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
1480: 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 43 48  c..*/.static WCH
1490: 41 52 20 2a 75 74 66 38 54 6f 55 6e 69 63 6f 64  AR *utf8ToUnicod
14a0: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
14b0: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ilename){.  int 
14c0: 6e 43 68 61 72 3b 0a 20 20 57 43 48 41 52 20 2a  nChar;.  WCHAR *
14d0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a  zWideFilename;..
14e0: 20 20 6e 43 68 61 72 20 3d 20 4d 75 6c 74 69 42    nChar = MultiB
14f0: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50  yteToWideChar(CP
1500: 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e  _UTF8, 0, zFilen
1510: 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30  ame, -1, NULL, 0
1520: 29 3b 0a 20 20 7a 57 69 64 65 46 69 6c 65 6e 61  );.  zWideFilena
1530: 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 43 68  me = malloc( nCh
1540: 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65 46  ar*sizeof(zWideF
1550: 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20  ilename[0]) );. 
1560: 20 69 66 28 20 7a 57 69 64 65 46 69 6c 65 6e 61   if( zWideFilena
1570: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
1580: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68  urn 0;.  }.  nCh
1590: 61 72 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f  ar = MultiByteTo
15a0: 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38  WideChar(CP_UTF8
15b0: 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  , 0, zFilename, 
15c0: 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  -1, zWideFilenam
15d0: 65 2c 20 6e 43 68 61 72 29 3b 0a 20 20 69 66 28  e, nChar);.  if(
15e0: 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20   nChar==0 ){.   
15f0: 20 66 72 65 65 28 7a 57 69 64 65 46 69 6c 65 6e   free(zWideFilen
1600: 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69 64 65 46  ame);.    zWideF
1610: 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ilename = 0;.  }
1620: 0a 20 20 72 65 74 75 72 6e 20 7a 57 69 64 65 46  .  return zWideF
1630: 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
1640: 2a 20 43 6f 6e 76 65 72 74 20 6d 69 63 72 6f 73  * Convert micros
1650: 6f 66 74 20 75 6e 69 63 6f 64 65 20 74 6f 20 55  oft unicode to U
1660: 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20  TF-8.  Space to 
1670: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
1680: 64 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f  d string is.** o
1690: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
16a0: 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  loc()..*/.static
16b0: 20 63 68 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f   char *unicodeTo
16c0: 55 74 66 38 28 63 6f 6e 73 74 20 57 43 48 41 52  Utf8(const WCHAR
16d0: 20 2a 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29   *zWideFilename)
16e0: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  {.  int nByte;. 
16f0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1700: 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 57 69 64  ;..  nByte = Wid
1710: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
1720: 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69  (CP_UTF8, 0, zWi
1730: 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20  deFilename, -1, 
1740: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7a  0, 0, 0, 0);.  z
1750: 46 69 6c 65 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f  Filename = mallo
1760: 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  c( nByte );.  if
1770: 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  ( zFilename==0 )
1780: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
1790: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 57 69    }.  nByte = Wi
17a0: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
17b0: 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57  e(CP_UTF8, 0, zW
17c0: 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  ideFilename, -1,
17d0: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 42 79 74   zFilename, nByt
17e0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1800: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42   0, 0);.  if( nB
1810: 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  yte == 0 ){.    
1820: 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  free(zFilename);
1830: 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  .    zFilename =
1840: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1850: 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f   zFilename;.}../
1860: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20  *.** Convert an 
1870: 61 6e 73 69 20 73 74 72 69 6e 67 20 74 6f 20 6d  ansi string to m
1880: 69 63 72 6f 73 6f 66 74 20 75 6e 69 63 6f 64 65  icrosoft unicode
1890: 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a  , based on the.*
18a0: 2a 20 63 75 72 72 65 6e 74 20 63 6f 64 65 70 61  * current codepa
18b0: 67 65 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20  ge settings for 
18c0: 66 69 6c 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a  file apis..** .*
18d0: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
18e0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
18f0: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ing is obtained.
1900: 2a 2a 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a  ** from malloc..
1910: 2a 2f 0a 73 74 61 74 69 63 20 57 43 48 41 52 20  */.static WCHAR 
1920: 2a 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 63  *mbcsToUnicode(c
1930: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1940: 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79  name){.  int nBy
1950: 74 65 3b 0a 20 20 57 43 48 41 52 20 2a 7a 4d 62  te;.  WCHAR *zMb
1960: 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e  csFilename;.  in
1970: 74 20 63 6f 64 65 70 61 67 65 20 3d 20 41 72 65  t codepage = Are
1980: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f  FileApisANSI() ?
1990: 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d   CP_ACP : CP_OEM
19a0: 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 4d  CP;..  nByte = M
19b0: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
19c0: 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20  ar(codepage, 0, 
19d0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e  zFilename, -1, N
19e0: 55 4c 4c 2c 30 29 2a 73 69 7a 65 6f 66 28 57 43  ULL,0)*sizeof(WC
19f0: 48 41 52 29 3b 0a 20 20 7a 4d 62 63 73 46 69 6c  HAR);.  zMbcsFil
1a00: 65 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20  ename = malloc( 
1a10: 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62  nByte*sizeof(zMb
1a20: 63 73 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29  csFilename[0]) )
1a30: 3b 0a 20 20 69 66 28 20 7a 4d 62 63 73 46 69 6c  ;.  if( zMbcsFil
1a40: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ename==0 ){.    
1a50: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1a60: 6e 42 79 74 65 20 3d 20 4d 75 6c 74 69 42 79 74  nByte = MultiByt
1a70: 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65  eToWideChar(code
1a80: 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61  page, 0, zFilena
1a90: 6d 65 2c 20 2d 31 2c 20 7a 4d 62 63 73 46 69 6c  me, -1, zMbcsFil
1aa0: 65 6e 61 6d 65 2c 20 6e 42 79 74 65 29 3b 0a 20  ename, nByte);. 
1ab0: 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b   if( nByte==0 ){
1ac0: 0a 20 20 20 20 66 72 65 65 28 7a 4d 62 63 73 46  .    free(zMbcsF
1ad0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 4d  ilename);.    zM
1ae0: 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b  bcsFilename = 0;
1af0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4d  .  }.  return zM
1b00: 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  bcsFilename;.}..
1b10: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 69  /*.** Convert mi
1b20: 63 72 6f 73 6f 66 74 20 75 6e 69 63 6f 64 65 20  crosoft unicode 
1b30: 74 6f 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61  to multibyte cha
1b40: 72 61 63 74 65 72 20 73 74 72 69 6e 67 2c 20 62  racter string, b
1b50: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 75  ased on the.** u
1b60: 73 65 72 27 73 20 41 6e 73 69 20 63 6f 64 65 70  ser's Ansi codep
1b70: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  age..**.** Space
1b80: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
1b90: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
1ba0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
1bb0: 20 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74   malloc()..*/.st
1bc0: 61 74 69 63 20 63 68 61 72 20 2a 75 6e 69 63 6f  atic char *unico
1bd0: 64 65 54 6f 4d 62 63 73 28 63 6f 6e 73 74 20 57  deToMbcs(const W
1be0: 43 48 41 52 20 2a 7a 57 69 64 65 46 69 6c 65 6e  CHAR *zWideFilen
1bf0: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ame){.  int nByt
1c00: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  e;.  char *zFile
1c10: 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65  name;.  int code
1c20: 70 61 67 65 20 3d 20 41 72 65 46 69 6c 65 41 70  page = AreFileAp
1c30: 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43  isANSI() ? CP_AC
1c40: 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20  P : CP_OEMCP;.. 
1c50: 20 6e 42 79 74 65 20 3d 20 57 69 64 65 43 68 61   nByte = WideCha
1c60: 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64  rToMultiByte(cod
1c70: 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46  epage, 0, zWideF
1c80: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20  ilename, -1, 0, 
1c90: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7a 46 69 6c  0, 0, 0);.  zFil
1ca0: 65 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20  ename = malloc( 
1cb0: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a  nByte );.  if( z
1cc0: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
1cd0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1ce0: 0a 20 20 6e 42 79 74 65 20 3d 20 57 69 64 65 43  .  nByte = WideC
1cf0: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63  harToMultiByte(c
1d00: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64  odepage, 0, zWid
1d10: 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a  eFilename, -1, z
1d20: 46 69 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c  Filename, nByte,
1d30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
1d50: 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  , 0);.  if( nByt
1d60: 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 66 72  e == 0 ){.    fr
1d70: 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ee(zFilename);. 
1d80: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30     zFilename = 0
1d90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
1da0: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
1db0: 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 75 6c 74 69  ** Convert multi
1dc0: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
1dd0: 74 72 69 6e 67 20 74 6f 20 55 54 46 2d 38 2e 20  tring to UTF-8. 
1de0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
1df0: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73  he.** returned s
1e00: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
1e10: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e  d from malloc().
1e20: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1e30: 2a 6d 62 63 73 54 6f 55 74 66 38 28 63 6f 6e 73  *mbcsToUtf8(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 6f 66 66  upperBits = (off
4970: 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66  set>>32) & 0x7ff
4980: 66 66 66 66 66 3b 0a 20 20 4c 4f 4e 47 20 6c 6f  fffff;.  LONG lo
4990: 77 65 72 42 69 74 73 20 3d 20 6f 66 66 73 65 74  werBits = offset
49a0: 20 26 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20   & 0xffffffff;. 
49b0: 20 44 57 4f 52 44 20 72 63 3b 0a 20 20 44 57 4f   DWORD rc;.  DWO
49c0: 52 44 20 67 6f 74 3b 0a 20 20 77 69 6e 46 69 6c  RD got;.  winFil
49d0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
49e0: 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73 65 72  ile*)id;.  asser
49f0: 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53 69  t( id!=0 );.  Si
4a00: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
4a10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
4a20: 52 5f 52 45 41 44 29 3b 0a 20 20 4f 53 54 52 41  R_READ);.  OSTRA
4a30: 43 45 33 28 22 52 45 41 44 20 25 64 20 6c 6f 63  CE3("READ %d loc
4a40: 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  k=%d\n", pFile->
4a50: 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
4a60: 70 65 29 3b 0a 20 20 72 63 20 3d 20 53 65 74 46  pe);.  rc = SetF
4a70: 69 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65  ilePointer(pFile
4a80: 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20  ->h, lowerBits, 
4a90: 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45  &upperBits, FILE
4aa0: 5f 42 45 47 49 4e 29 3b 0a 20 20 69 66 28 20 72  _BEGIN);.  if( r
4ab0: 63 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  c==INVALID_SET_F
4ac0: 49 4c 45 5f 50 4f 49 4e 54 45 52 20 26 26 20 47  ILE_POINTER && G
4ad0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21 3d 4e  etLastError()!=N
4ae0: 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 72  O_ERROR ){.    r
4af0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
4b00: 4c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 52 65  L;.  }.  if( !Re
4b10: 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  adFile(pFile->h,
4b20: 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 67 6f 74   pBuf, amt, &got
4b30: 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , 0) ){.    retu
4b40: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
4b50: 52 45 41 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20  READ;.  }.  if( 
4b60: 67 6f 74 3d 3d 28 44 57 4f 52 44 29 61 6d 74 20  got==(DWORD)amt 
4b70: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
4b80: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
4b90: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28  {.    memset(&((
4ba0: 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d  char*)pBuf)[got]
4bb0: 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20  , 0, amt-got);. 
4bc0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4bd0: 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
4be0: 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  D;.  }.}../*.** 
4bf0: 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20  Write data from 
4c00: 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20  a buffer into a 
4c10: 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  file.  Return SQ
4c20: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
4c30: 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  ss.** or some ot
4c40: 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  her error code o
4c50: 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74  n failure..*/.st
4c60: 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69 74  atic int winWrit
4c70: 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  e(.  sqlite3_fil
4c80: 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 2f  e *id,         /
4c90: 2a 20 46 69 6c 65 20 74 6f 20 77 72 69 74 65 20  * File to write 
4ca0: 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  into */.  const 
4cb0: 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
4cc0: 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 73      /* The bytes
4cd0: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a   to be written *
4ce0: 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20  /.  int amt,    
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4d00: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
4d10: 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 73   to write */.  s
4d20: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
4d30: 73 65 74 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  set      /* Offs
4d40: 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  et into the file
4d50: 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e   to begin writin
4d60: 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20 4c 4f 4e  g at */.){.  LON
4d70: 47 20 75 70 70 65 72 42 69 74 73 20 3d 20 28 6f  G upperBits = (o
4d80: 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37  ffset>>32) & 0x7
4d90: 66 66 66 66 66 66 66 3b 0a 20 20 4c 4f 4e 47 20  fffffff;.  LONG 
4da0: 6c 6f 77 65 72 42 69 74 73 20 3d 20 6f 66 66 73  lowerBits = offs
4db0: 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 3b  et & 0xffffffff;
4dc0: 0a 20 20 44 57 4f 52 44 20 72 63 3b 0a 20 20 44  .  DWORD rc;.  D
4dd0: 57 4f 52 44 20 77 72 6f 74 65 3b 0a 20 20 77 69  WORD wrote;.  wi
4de0: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
4df0: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61  winFile*)id;.  a
4e00: 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
4e10: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
4e20: 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
4e30: 49 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a 20 20  IOERR_WRITE);.  
4e40: 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
4e50: 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
4e60: 49 54 45 5f 46 55 4c 4c 29 3b 0a 20 20 4f 53 54  ITE_FULL);.  OST
4e70: 52 41 43 45 33 28 22 57 52 49 54 45 20 25 64 20  RACE3("WRITE %d 
4e80: 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c  lock=%d\n", pFil
4e90: 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
4ea0: 6b 74 79 70 65 29 3b 0a 20 20 72 63 20 3d 20 53  ktype);.  rc = S
4eb0: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 70 46  etFilePointer(pF
4ec0: 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74  ile->h, lowerBit
4ed0: 73 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20 46  s, &upperBits, F
4ee0: 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 20 20 69 66  ILE_BEGIN);.  if
4ef0: 28 20 72 63 3d 3d 49 4e 56 41 4c 49 44 5f 53 45  ( rc==INVALID_SE
4f00: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 26  T_FILE_POINTER &
4f10: 26 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  & GetLastError()
4f20: 21 3d 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20  !=NO_ERROR ){.  
4f30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4f40: 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 61 73 73 65  FULL;.  }.  asse
4f50: 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 77  rt( amt>0 );.  w
4f60: 68 69 6c 65 28 0a 20 20 20 20 20 61 6d 74 3e 30  hile(.     amt>0
4f70: 0a 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 57  .     && (rc = W
4f80: 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e  riteFile(pFile->
4f90: 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 77  h, pBuf, amt, &w
4fa0: 72 6f 74 65 2c 20 30 29 29 21 3d 30 0a 20 20 20  rote, 0))!=0.   
4fb0: 20 20 26 26 20 77 72 6f 74 65 3e 30 0a 20 20 29    && wrote>0.  )
4fc0: 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f  {.    amt -= wro
4fd0: 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26  te;.    pBuf = &
4fe0: 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72  ((char*)pBuf)[wr
4ff0: 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ote];.  }.  if( 
5000: 21 72 63 20 7c 7c 20 61 6d 74 3e 28 69 6e 74 29  !rc || amt>(int)
5010: 77 72 6f 74 65 20 29 7b 0a 20 20 20 20 72 65 74  wrote ){.    ret
5020: 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  urn SQLITE_FULL;
5030: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
5040: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
5050: 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
5060: 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
5070: 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
5080: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 54 72 75  tatic int winTru
5090: 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69  ncate(sqlite3_fi
50a0: 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f  le *id, sqlite3_
50b0: 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  int64 nByte){.  
50c0: 44 57 4f 52 44 20 72 63 3b 0a 20 20 4c 4f 4e 47  DWORD rc;.  LONG
50d0: 20 75 70 70 65 72 42 69 74 73 20 3d 20 28 6e 42   upperBits = (nB
50e0: 79 74 65 3e 3e 33 32 29 20 26 20 30 78 37 66 66  yte>>32) & 0x7ff
50f0: 66 66 66 66 66 3b 0a 20 20 4c 4f 4e 47 20 6c 6f  fffff;.  LONG lo
5100: 77 65 72 42 69 74 73 20 3d 20 6e 42 79 74 65 20  werBits = nByte 
5110: 26 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20  & 0xffffffff;.  
5120: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
5130: 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
5140: 20 4f 53 54 52 41 43 45 33 28 22 54 52 55 4e 43   OSTRACE3("TRUNC
5150: 41 54 45 20 25 64 20 25 6c 6c 64 5c 6e 22 2c 20  ATE %d %lld\n", 
5160: 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29  pFile->h, nByte)
5170: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
5180: 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
5190: 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
51a0: 29 3b 0a 20 20 72 63 20 3d 20 53 65 74 46 69 6c  );.  rc = SetFil
51b0: 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e  ePointer(pFile->
51c0: 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26 75  h, lowerBits, &u
51d0: 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42  pperBits, FILE_B
51e0: 45 47 49 4e 29 3b 0a 20 20 69 66 28 20 49 4e 56  EGIN);.  if( INV
51f0: 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f  ALID_SET_FILE_PO
5200: 49 4e 54 45 52 20 21 3d 20 72 63 20 29 7b 0a 20  INTER != rc ){. 
5210: 20 20 20 2f 2a 20 53 65 74 45 6e 64 4f 66 46 69     /* SetEndOfFi
5220: 6c 65 20 77 69 6c 6c 20 66 61 69 6c 20 69 66 20  le will fail if 
5230: 6e 42 79 74 65 20 69 73 20 6e 65 67 61 74 69 76  nByte is negativ
5240: 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 65 74  e */.    if( Set
5250: 45 6e 64 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d  EndOfFile(pFile-
5260: 3e 68 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  >h) ){.      ret
5270: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
5280: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5290: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  n SQLITE_IOERR_T
52a0: 52 55 4e 43 41 54 45 3b 0a 7d 0a 0a 23 69 66 64  RUNCATE;.}..#ifd
52b0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
52c0: 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
52d0: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e  umber of fullsyn
52e0: 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79  cs and normal sy
52f0: 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  ncs.  This is us
5300: 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68  ed to test.** th
5310: 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c  at syncs and ful
5320: 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72  lsyncs are occur
5330: 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74  ing at the right
5340: 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   times..*/.int s
5350: 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
5360: 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74  t = 0;.int sqlit
5370: 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
5380: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
5390: 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61  *.** Make sure a
53a0: 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70  ll writes to a p
53b0: 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61  articular file a
53c0: 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20  re committed to 
53d0: 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  disk..*/.static 
53e0: 69 6e 74 20 77 69 6e 53 79 6e 63 28 73 71 6c 69  int winSync(sqli
53f0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
5400: 74 20 66 6c 61 67 73 29 7b 0a 20 20 77 69 6e 46  t flags){.  winF
5410: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
5420: 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 4f 53 54  nFile*)id;.  OST
5430: 52 41 43 45 33 28 22 53 59 4e 43 20 25 64 20 6c  RACE3("SYNC %d l
5440: 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ock=%d\n", pFile
5450: 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
5460: 74 79 70 65 29 3b 0a 23 69 66 64 65 66 20 53 51  type);.#ifdef SQ
5470: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
5480: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
5490: 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  YNC_FULL ){.    
54a0: 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
54b0: 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20  _count++;.  }.  
54c0: 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
54d0: 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 69  nt++;.#endif.  i
54e0: 66 28 20 46 6c 75 73 68 46 69 6c 65 42 75 66 66  f( FlushFileBuff
54f0: 65 72 73 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b  ers(pFile->h) ){
5500: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5510: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
5520: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5530: 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 7d 0a 0a  E_IOERR;.  }.}..
5540: 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
5550: 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
5560: 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79   of a file in by
5570: 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  tes.*/.static in
5580: 74 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 73 71  t winFileSize(sq
5590: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
55a0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
55b0: 53 69 7a 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65  Size){.  winFile
55c0: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
55d0: 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20  le*)id;.  DWORD 
55e0: 75 70 70 65 72 42 69 74 73 2c 20 6c 6f 77 65 72  upperBits, lower
55f0: 42 69 74 73 3b 0a 20 20 53 69 6d 75 6c 61 74 65  Bits;.  Simulate
5600: 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
5610: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
5620: 54 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74 73 20  T);.  lowerBits 
5630: 3d 20 47 65 74 46 69 6c 65 53 69 7a 65 28 70 46  = GetFileSize(pF
5640: 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65 72 42 69  ile->h, &upperBi
5650: 74 73 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20  ts);.  *pSize = 
5660: 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  (((sqlite3_int64
5670: 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33 32 29  )upperBits)<<32)
5680: 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20   + lowerBits;.  
5690: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
56a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46  ;.}../*.** LOCKF
56b0: 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
56c0: 54 45 4c 59 20 69 73 20 75 6e 64 65 66 69 6e 65  TELY is undefine
56d0: 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e 64 6f 77  d on some Window
56e0: 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69  s systems..*/.#i
56f0: 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 46  fndef LOCKFILE_F
5700: 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 0a  AIL_IMMEDIATELY.
5710: 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c  # define LOCKFIL
5720: 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
5730: 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  LY 1.#endif../*.
5740: 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 61  ** Acquire a rea
5750: 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66  der lock..** Dif
5760: 66 65 72 65 6e 74 20 41 50 49 20 72 6f 75 74 69  ferent API routi
5770: 6e 65 73 20 61 72 65 20 63 61 6c 6c 65 64 20 64  nes are called d
5780: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
5790: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a  her or not this.
57a0: 2a 2a 20 69 73 20 57 69 6e 39 35 20 6f 72 20 57  ** is Win95 or W
57b0: 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inNT..*/.static 
57c0: 69 6e 74 20 67 65 74 52 65 61 64 4c 6f 63 6b 28  int getReadLock(
57d0: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
57e0: 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 66  .  int res;.  if
57f0: 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
5800: 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b  OVERLAPPED ovlp;
5810: 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74  .    ovlp.Offset
5820: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
5830: 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74  .    ovlp.Offset
5840: 48 69 67 68 20 3d 20 30 3b 0a 20 20 20 20 6f 76  High = 0;.    ov
5850: 6c 70 2e 68 45 76 65 6e 74 20 3d 20 30 3b 0a 20  lp.hEvent = 0;. 
5860: 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c     res = LockFil
5870: 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  eEx(pFile->h, LO
5880: 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
5890: 44 49 41 54 45 4c 59 2c 0a 20 20 20 20 20 20 20  DIATELY,.       
58a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
58b0: 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 2c   SHARED_SIZE, 0,
58c0: 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65   &ovlp);.  }else
58d0: 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 3b 0a 20 20  {.    int lk;.  
58e0: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
58f0: 6e 65 73 73 28 73 69 7a 65 6f 66 28 6c 6b 29 2c  ness(sizeof(lk),
5900: 20 26 6c 6b 29 3b 0a 20 20 20 20 70 46 69 6c 65   &lk);.    pFile
5910: 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
5920: 20 3d 20 28 6c 6b 20 26 20 30 78 37 66 66 66 66   = (lk & 0x7ffff
5930: 66 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a  fff)%(SHARED_SIZ
5940: 45 20 2d 20 31 29 3b 0a 20 20 20 20 72 65 73 20  E - 1);.    res 
5950: 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65  = LockFile(pFile
5960: 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
5970: 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  T+pFile->sharedL
5980: 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30  ockByte, 0, 1, 0
5990: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
59a0: 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  res;.}../*.** Un
59b0: 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f  do a readlock.*/
59c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 6c 6f  .static int unlo
59d0: 63 6b 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69  ckReadLock(winFi
59e0: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e  le *pFile){.  in
59f0: 74 20 72 65 73 3b 0a 20 20 69 66 28 20 69 73 4e  t res;.  if( isN
5a00: 54 28 29 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  T() ){.    res =
5a10: 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c   UnlockFile(pFil
5a20: 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
5a30: 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49  ST, 0, SHARED_SI
5a40: 5a 45 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  ZE, 0);.  }else{
5a50: 0a 20 20 20 20 72 65 73 20 3d 20 55 6e 6c 6f 63  .    res = Unloc
5a60: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
5a70: 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 70  SHARED_FIRST + p
5a80: 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
5a90: 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  Byte, 0, 1, 0);.
5aa0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73    }.  return res
5ab0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
5ac0: 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
5ad0: 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
5ae0: 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f   by parameter lo
5af0: 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20  cktype - one.** 
5b00: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
5b10: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
5b20: 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
5b30: 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
5b40: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
5b50: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
5b60: 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
5b70: 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
5b80: 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
5b90: 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
5ba0: 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
5bb0: 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
5bc0: 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
5bd0: 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
5be0: 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
5bf0: 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
5c00: 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
5c10: 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
5c20: 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
5c30: 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
5c40: 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
5c50: 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
5c60: 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
5c70: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
5c80: 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
5c90: 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
5ca0: 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
5cb0: 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
5cc0: 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
5cd0: 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
5ce0: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
5cf0: 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
5d00: 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
5d10: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
5d20: 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
5d30: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
5d40: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
5d50: 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
5d60: 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
5d70: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
5d80: 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
5d90: 6f 63 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c  ock.  The winUnl
5da0: 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a  ock() routine.**
5db0: 20 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b   erases all lock
5dc0: 73 20 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65  s at once and re
5dd0: 74 75 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61  turns us immedia
5de0: 74 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20  tely to locking 
5df0: 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69  level 0..** It i
5e00: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
5e10: 6f 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  o lower the lock
5e20: 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74  ing level one st
5e30: 65 70 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59  ep at a time.  Y
5e40: 6f 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74  ou.** must go st
5e50: 72 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e  raight to lockin
5e60: 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74  g level 0..*/.st
5e70: 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b  atic int winLock
5e80: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
5e90: 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
5ea0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
5eb0: 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65  ITE_OK;    /* Re
5ec0: 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
5ed0: 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20  ubroutines */.  
5ee0: 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20  int res = 1;    
5ef0: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
5f00: 20 6f 66 20 61 20 77 69 6e 64 6f 77 73 20 6c 6f   of a windows lo
5f10: 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74  ck call */.  int
5f20: 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20   newLocktype;   
5f30: 20 20 20 20 2f 2a 20 53 65 74 20 70 46 69 6c 65      /* Set pFile
5f40: 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68  ->locktype to th
5f50: 69 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  is value before 
5f60: 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  exiting */.  int
5f70: 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
5f80: 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77  = 0;/* True if w
5f90: 65 20 61 63 71 75 69 72 65 64 20 61 20 50 45 4e  e acquired a PEN
5fa0: 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74  DING lock this t
5fb0: 69 6d 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ime */.  winFile
5fc0: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
5fd0: 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
5fe0: 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20  t( pFile!=0 );. 
5ff0: 20 4f 53 54 52 41 43 45 35 28 22 4c 4f 43 4b 20   OSTRACE5("LOCK 
6000: 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 29  %d %d was %d(%d)
6010: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  \n",.          p
6020: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
6030: 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  e, pFile->lockty
6040: 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  pe, pFile->share
6050: 64 4c 6f 63 6b 42 79 74 65 29 3b 0a 0a 20 20 2f  dLockByte);..  /
6060: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
6070: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
6080: 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
6090: 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
60a0: 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65   the.  ** OsFile
60b0: 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
60c0: 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f  n't use the end_
60d0: 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c  lock: exit path,
60e0: 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   as.  ** sqlite3
60f0: 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  OsEnterMutex() h
6100: 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
6110: 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
6120: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
6130: 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
6140: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6150: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
6160: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
6170: 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
6180: 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20   correct.  */.  
6190: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
61a0: 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b  ocktype!=NO_LOCK
61b0: 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   || locktype==SH
61c0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
61d0: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
61e0: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
61f0: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
6200: 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype!=RESERVED_LO
6210: 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK || pFile->loc
6220: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
6230: 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b  CK );..  /* Lock
6240: 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   the PENDING_LOC
6250: 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e 65 65  K byte if we nee
6260: 64 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 50  d to acquire a P
6270: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20  ENDING lock or. 
6280: 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63   ** a SHARED loc
6290: 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 63  k.  If we are ac
62a0: 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
62b0: 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69   lock, the acqui
62c0: 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74  sition of.  ** t
62d0: 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  he PENDING_LOCK 
62e0: 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72  byte is temporar
62f0: 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63  y..  */.  newLoc
6300: 6b 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c  ktype = pFile->l
6310: 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 70  ocktype;.  if( p
6320: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
6330: 4e 4f 5f 4c 4f 43 4b 0a 20 20 20 7c 7c 20 28 6c  NO_LOCK.   || (l
6340: 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
6350: 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  VE_LOCK && pFile
6360: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45  ->locktype==RESE
6370: 52 56 45 44 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a  RVED_LOCK).  ){.
6380: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b      int cnt = 3;
6390: 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d  .    while( cnt-
63a0: 2d 3e 30 20 26 26 20 28 72 65 73 20 3d 20 4c 6f  ->0 && (res = Lo
63b0: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
63c0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30   PENDING_BYTE, 0
63d0: 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20  , 1, 0))==0 ){. 
63e0: 20 20 20 20 20 2f 2a 20 54 72 79 20 33 20 74 69       /* Try 3 ti
63f0: 6d 65 73 20 74 6f 20 67 65 74 20 74 68 65 20 70  mes to get the p
6400: 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68  ending lock.  Th
6410: 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 6d  e pending lock m
6420: 69 67 68 74 20 62 65 0a 20 20 20 20 20 20 2a 2a  ight be.      **
6430: 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72   held by another
6440: 20 72 65 61 64 65 72 20 70 72 6f 63 65 73 73 20   reader process 
6450: 77 68 6f 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  who will release
6460: 20 69 74 20 6d 6f 6d 65 6e 74 61 72 69 6c 79 2e   it momentarily.
6470: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
6480: 4f 53 54 52 41 43 45 32 28 22 63 6f 75 6c 64 20  OSTRACE2("could 
6490: 6e 6f 74 20 67 65 74 20 61 20 50 45 4e 44 49 4e  not get a PENDIN
64a0: 47 20 6c 6f 63 6b 2e 20 63 6e 74 3d 25 64 5c 6e  G lock. cnt=%d\n
64b0: 22 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 53  ", cnt);.      S
64c0: 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20  leep(1);.    }. 
64d0: 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63     gotPendingLoc
64e0: 6b 20 3d 20 72 65 73 3b 0a 20 20 7d 0a 0a 20 20  k = res;.  }..  
64f0: 2f 2a 20 41 63 71 75 69 72 65 20 61 20 73 68 61  /* Acquire a sha
6500: 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  red lock.  */.  
6510: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
6520: 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73  ARED_LOCK && res
6530: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
6540: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
6550: 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  =NO_LOCK );.    
6560: 72 65 73 20 3d 20 67 65 74 52 65 61 64 4c 6f 63  res = getReadLoc
6570: 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66  k(pFile);.    if
6580: 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e  ( res ){.      n
6590: 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41  ewLocktype = SHA
65a0: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  RED_LOCK;.    }.
65b0: 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
65c0: 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  e a RESERVED loc
65d0: 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  k.  */.  if( loc
65e0: 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f  ktype==RESERVED_
65f0: 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
6600: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
6610: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ->locktype==SHAR
6620: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  ED_LOCK );.    r
6630: 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46  es = LockFile(pF
6640: 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44  ile->h, RESERVED
6650: 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
6660: 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a  .    if( res ){.
6670: 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70        newLocktyp
6680: 65 20 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  e = RESERVED_LOC
6690: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
66a0: 2f 2a 20 41 63 71 75 69 72 65 20 61 20 50 45 4e  /* Acquire a PEN
66b0: 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  DING lock.  */. 
66c0: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45   if( locktype==E
66d0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
66e0: 20 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c   res ){.    newL
66f0: 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e  ocktype = PENDIN
6700: 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50  G_LOCK;.    gotP
6710: 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a  endingLock = 0;.
6720: 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
6730: 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
6740: 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
6750: 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
6760: 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29  VE_LOCK && res )
6770: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  {.    assert( pF
6780: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53  ile->locktype>=S
6790: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
67a0: 20 20 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52 65    res = unlockRe
67b0: 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
67c0: 20 20 20 4f 53 54 52 41 43 45 32 28 22 75 6e 72     OSTRACE2("unr
67d0: 65 61 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22 2c  eadlock = %d\n",
67e0: 20 72 65 73 29 3b 0a 20 20 20 20 72 65 73 20 3d   res);.    res =
67f0: 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d   LockFile(pFile-
6800: 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
6810: 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  , 0, SHARED_SIZE
6820: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65  , 0);.    if( re
6830: 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
6840: 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49  cktype = EXCLUSI
6850: 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  VE_LOCK;.    }el
6860: 73 65 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  se{.      OSTRAC
6870: 45 32 28 22 65 72 72 6f 72 2d 63 6f 64 65 20 3d  E2("error-code =
6880: 20 25 64 5c 6e 22 2c 20 47 65 74 4c 61 73 74 45   %d\n", GetLastE
6890: 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 20 20 67  rror());.      g
68a0: 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  etReadLock(pFile
68b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
68c0: 2f 2a 20 49 66 20 77 65 20 61 72 65 20 68 6f 6c  /* If we are hol
68d0: 64 69 6e 67 20 61 20 50 45 4e 44 49 4e 47 20 6c  ding a PENDING l
68e0: 6f 63 6b 20 74 68 61 74 20 6f 75 67 68 74 20 74  ock that ought t
68f0: 6f 20 62 65 20 72 65 6c 65 61 73 65 64 2c 20 74  o be released, t
6900: 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65  hen.  ** release
6910: 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
6920: 69 66 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f  if( gotPendingLo
6930: 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  ck && locktype==
6940: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
6950: 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46     UnlockFile(pF
6960: 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  ile->h, PENDING_
6970: 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
6980: 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
6990: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
69a0: 65 20 6c 6f 63 6b 20 68 61 73 20 68 65 6c 64 20  e lock has held 
69b0: 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  in the file desc
69c0: 72 69 70 74 6f 72 20 74 68 65 6e 0a 20 20 2a 2a  riptor then.  **
69d0: 20 72 65 74 75 72 6e 20 74 68 65 20 61 70 70 72   return the appr
69e0: 6f 70 72 69 61 74 65 20 72 65 73 75 6c 74 20 63  opriate result c
69f0: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ode..  */.  if( 
6a00: 72 65 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  res ){.    rc = 
6a10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
6a20: 73 65 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 34  se{.    OSTRACE4
6a30: 28 22 4c 4f 43 4b 20 46 41 49 4c 45 44 20 25 64  ("LOCK FAILED %d
6a40: 20 74 72 79 69 6e 67 20 66 6f 72 20 25 64 20 62   trying for %d b
6a50: 75 74 20 67 6f 74 20 25 64 5c 6e 22 2c 20 70 46  ut got %d\n", pF
6a60: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
6a70: 20 20 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77     locktype, new
6a80: 4c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 72  Locktype);.    r
6a90: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
6aa0: 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f  .  }.  pFile->lo
6ab0: 63 6b 74 79 70 65 20 3d 20 6e 65 77 4c 6f 63 6b  cktype = newLock
6ac0: 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72  type;.  return r
6ad0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
6ae0: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
6af0: 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
6b00: 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
6b10: 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
6b20: 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
6b30: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
6b40: 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
6b50: 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
6b60: 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
6b70: 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65  ro, otherwise ze
6b80: 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
6b90: 74 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76  t winCheckReserv
6ba0: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
6bb0: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
6bc0: 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63  esOut){.  int rc
6bd0: 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  ;.  winFile *pFi
6be0: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
6bf0: 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  d;.  assert( pFi
6c00: 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  le!=0 );.  if( p
6c10: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
6c20: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
6c30: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
6c40: 20 4f 53 54 52 41 43 45 33 28 22 54 45 53 54 20   OSTRACE3("TEST 
6c50: 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 6c  WR-LOCK %d %d (l
6c60: 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  ocal)\n", pFile-
6c70: 3e 68 2c 20 72 63 29 3b 0a 20 20 7d 65 6c 73 65  >h, rc);.  }else
6c80: 7b 0a 20 20 20 20 72 63 20 3d 20 4c 6f 63 6b 46  {.    rc = LockF
6c90: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45  ile(pFile->h, RE
6ca0: 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
6cb0: 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
6cc0: 63 20 29 7b 0a 20 20 20 20 20 20 55 6e 6c 6f 63  c ){.      Unloc
6cd0: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
6ce0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
6cf0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 0);.    }. 
6d00: 20 20 20 72 63 20 3d 20 21 72 63 3b 0a 20 20 20     rc = !rc;.   
6d10: 20 4f 53 54 52 41 43 45 33 28 22 54 45 53 54 20   OSTRACE3("TEST 
6d20: 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 72  WR-LOCK %d %d (r
6d30: 65 6d 6f 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65  emote)\n", pFile
6d40: 2d 3e 68 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20  ->h, rc);.  }.  
6d50: 2a 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20  *pResOut = rc;. 
6d60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6d70: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  K;.}../*.** Lowe
6d80: 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
6d90: 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
6da0: 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63  riptor id to loc
6db0: 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65  ktype.  locktype
6dc0: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
6dd0: 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
6de0: 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
6df0: 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
6e00: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
6e10: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
6e20: 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
6e30: 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
6e40: 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
6e50: 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
6e60: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
6e70: 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  ** It is not pos
6e80: 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72  sible for this r
6e90: 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c 20 69  outine to fail i
6ea0: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
6eb0: 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c  ument.** is NO_L
6ec0: 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 73 65 63  OCK.  If the sec
6ed0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
6ee0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65 6e  SHARED_LOCK then
6ef0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
6f00: 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 53 51   might return SQ
6f10: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73  LITE_IOERR;.*/.s
6f20: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c  tatic int winUnl
6f30: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
6f40: 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
6f50: 70 65 29 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b  pe){.  int type;
6f60: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
6f70: 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
6f80: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
6f90: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
6fa0: 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20  ( pFile!=0 );.  
6fb0: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
6fc0: 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
6fd0: 0a 20 20 4f 53 54 52 41 43 45 35 28 22 55 4e 4c  .  OSTRACE5("UNL
6fe0: 4f 43 4b 20 25 64 20 74 6f 20 25 64 20 77 61 73  OCK %d to %d was
6ff0: 20 25 64 28 25 64 29 5c 6e 22 2c 20 70 46 69 6c   %d(%d)\n", pFil
7000: 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a  e->h, locktype,.
7010: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
7020: 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65  >locktype, pFile
7030: 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
7040: 29 3b 0a 20 20 74 79 70 65 20 3d 20 70 46 69 6c  );.  type = pFil
7050: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69  e->locktype;.  i
7060: 66 28 20 74 79 70 65 3e 3d 45 58 43 4c 55 53 49  f( type>=EXCLUSI
7070: 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55  VE_LOCK ){.    U
7080: 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d  nlockFile(pFile-
7090: 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
70a0: 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  , 0, SHARED_SIZE
70b0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f  , 0);.    if( lo
70c0: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
70d0: 4f 43 4b 20 26 26 20 21 67 65 74 52 65 61 64 4c  OCK && !getReadL
70e0: 6f 63 6b 28 70 46 69 6c 65 29 20 29 7b 0a 20 20  ock(pFile) ){.  
70f0: 20 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75      /* This shou
7100: 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 2e  ld never happen.
7110: 20 20 57 65 20 73 68 6f 75 6c 64 20 61 6c 77 61    We should alwa
7120: 79 73 20 62 65 20 61 62 6c 65 20 74 6f 0a 20 20  ys be able to.  
7130: 20 20 20 20 2a 2a 20 72 65 61 63 71 75 69 72 65      ** reacquire
7140: 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a   the read lock *
7150: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
7160: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
7170: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
7180: 28 20 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44  ( type>=RESERVED
7190: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c  _LOCK ){.    Unl
71a0: 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  ockFile(pFile->h
71b0: 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
71c0: 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 1, 0);.  }. 
71d0: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e   if( locktype==N
71e0: 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d  O_LOCK && type>=
71f0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
7200: 20 20 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63     unlockReadLoc
7210: 6b 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20  k(pFile);.  }.  
7220: 69 66 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e  if( type>=PENDIN
7230: 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e  G_LOCK ){.    Un
7240: 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e  lockFile(pFile->
7250: 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  h, PENDING_BYTE,
7260: 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 1, 0);.  }. 
7270: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
7280: 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72   = locktype;.  r
7290: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
72a0: 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 71  ** Control and q
72b0: 75 65 72 79 20 6f 66 20 74 68 65 20 6f 70 65 6e  uery of the open
72c0: 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f   file handle..*/
72d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46  .static int winF
72e0: 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  ileControl(sqlit
72f0: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
7300: 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29   op, void *pArg)
7310: 7b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  {.  switch( op )
7320: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
7330: 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54  E_FCNTL_LOCKSTAT
7340: 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  E: {.      *(int
7350: 2a 29 70 41 72 67 20 3d 20 28 28 77 69 6e 46 69  *)pArg = ((winFi
7360: 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74 79 70  le*)id)->locktyp
7370: 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e;.      return 
7380: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
7390: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
73a0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f  LITE_ERROR;.}../
73b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
73c0: 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62  sector size in b
73d0: 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65  ytes of the unde
73e0: 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76  rlying block dev
73f0: 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ice for.** the s
7400: 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54  pecified file. T
7410: 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c  his is almost al
7420: 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20  ways 512 bytes, 
7430: 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61  but may be.** la
7440: 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65  rger for some de
7450: 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  vices..**.** SQL
7460: 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73  ite code assumes
7470: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
7480: 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61  annot fail. It a
7490: 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74  lso assumes that
74a0: 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73  .** if two files
74b0: 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20   are created in 
74c0: 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79  the same file-sy
74d0: 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28  stem directory (
74e0: 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61  i.e..** a databa
74f0: 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e  se and its journ
7500: 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68  al file) that th
7510: 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69  e sector size wi
7520: 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d  ll be the.** sam
7530: 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73  e for both..*/.s
7540: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 63  tatic int winSec
7550: 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
7560: 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65 74  file *id){.  ret
7570: 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55  urn SQLITE_DEFAU
7580: 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
7590: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
75a0: 61 20 76 65 63 74 6f 72 20 6f 66 20 64 65 76 69  a vector of devi
75b0: 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
75c0: 63 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  cs..*/.static in
75d0: 74 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61  t winDeviceChara
75e0: 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74  cteristics(sqlit
75f0: 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
7600: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
7610: 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64  ** This vector d
7620: 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d  efines all the m
7630: 65 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20  ethods that can 
7640: 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a  operate on an.**
7650: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f   sqlite3_file fo
7660: 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74  r win32..*/.stat
7670: 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
7680: 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49  _io_methods winI
7690: 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 31 2c  oMethod = {.  1,
76a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76b0: 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
76c0: 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73  ion */.  winClos
76d0: 65 2c 0a 20 20 77 69 6e 52 65 61 64 2c 0a 20 20  e,.  winRead,.  
76e0: 77 69 6e 57 72 69 74 65 2c 0a 20 20 77 69 6e 54  winWrite,.  winT
76f0: 72 75 6e 63 61 74 65 2c 0a 20 20 77 69 6e 53 79  runcate,.  winSy
7700: 6e 63 2c 0a 20 20 77 69 6e 46 69 6c 65 53 69 7a  nc,.  winFileSiz
7710: 65 2c 0a 20 20 77 69 6e 4c 6f 63 6b 2c 0a 20 20  e,.  winLock,.  
7720: 77 69 6e 55 6e 6c 6f 63 6b 2c 0a 20 20 77 69 6e  winUnlock,.  win
7730: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
7740: 6b 2c 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74  k,.  winFileCont
7750: 72 6f 6c 2c 0a 20 20 77 69 6e 53 65 63 74 6f 72  rol,.  winSector
7760: 53 69 7a 65 2c 0a 20 20 77 69 6e 44 65 76 69 63  Size,.  winDevic
7770: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
7780: 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .};../**********
7790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77d0: 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74  *.** Here ends t
77e0: 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 74  he I/O methods t
77f0: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 73 71 6c  hat form the sql
7800: 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
7810: 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
7820: 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20  e next block of 
7830: 63 6f 64 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  code implements 
7840: 74 68 65 20 56 46 53 20 6d 65 74 68 6f 64 73 2e  the VFS methods.
7850: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
7860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
78a0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
78b0: 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69  UTF-8 filename i
78c0: 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
78d0: 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
78e0: 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79  .** operating sy
78f0: 73 74 65 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e  stem wants filen
7900: 61 6d 65 73 20 69 6e 2e 20 20 53 70 61 63 65 20  ames in.  Space 
7910: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75  to hold the resu
7920: 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65  lt.** is obtaine
7930: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e  d from malloc an
7940: 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
7950: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  by the calling.*
7960: 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  * function..*/.s
7970: 74 61 74 69 63 20 76 6f 69 64 20 2a 63 6f 6e 76  tatic void *conv
7980: 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
7990: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
79a0: 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69 64 20 2a  ename){.  void *
79b0: 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a  zConverted = 0;.
79c0: 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
79d0: 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
79e0: 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a   utf8ToUnicode(z
79f0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c  Filename);.  }el
7a00: 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74  se{.    zConvert
7a10: 65 64 20 3d 20 75 74 66 38 54 6f 4d 62 63 73 28  ed = utf8ToMbcs(
7a20: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zFilename);.  }.
7a30: 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c    /* caller will
7a40: 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d   handle out of m
7a50: 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72  emory */.  retur
7a60: 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a  n zConverted;.}.
7a70: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
7a80: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e  temporary file n
7a90: 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42  ame in zBuf.  zB
7aa0: 75 66 20 6d 75 73 74 20 62 65 20 62 69 67 20 65  uf must be big e
7ab0: 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64  nough to.** hold
7ac0: 20 61 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68   at pVfs->mxPath
7ad0: 6e 61 6d 65 20 63 68 61 72 61 63 74 65 72 73 2e  name characters.
7ae0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
7af0: 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e  etTempname(int n
7b00: 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
7b10: 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
7b20: 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22  zChars[] =.    "
7b30: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
7b40: 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20  qrstuvwxyz".    
7b50: 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
7b60: 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20  PQRSTUVWXYZ".   
7b70: 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20   "0123456789";. 
7b80: 20 73 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20   size_t i, j;.  
7b90: 63 68 61 72 20 7a 54 65 6d 70 50 61 74 68 5b 4d  char zTempPath[M
7ba0: 41 58 5f 50 41 54 48 2b 31 5d 3b 0a 20 20 69 66  AX_PATH+1];.  if
7bb0: 28 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  ( sqlite3_temp_d
7bc0: 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20  irectory ){.    
7bd0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7be0: 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54  (MAX_PATH-30, zT
7bf0: 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20 73  empPath, "%s", s
7c00: 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
7c10: 63 74 6f 72 79 29 3b 0a 20 20 7d 65 6c 73 65 20  ctory);.  }else 
7c20: 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
7c30: 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a    char *zMulti;.
7c40: 20 20 20 20 57 43 48 41 52 20 7a 57 69 64 65 50      WCHAR zWideP
7c50: 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20  ath[MAX_PATH];. 
7c60: 20 20 20 47 65 74 54 65 6d 70 50 61 74 68 57 28     GetTempPathW(
7c70: 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 57 69  MAX_PATH-30, zWi
7c80: 64 65 50 61 74 68 29 3b 0a 20 20 20 20 7a 4d 75  dePath);.    zMu
7c90: 6c 74 69 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55  lti = unicodeToU
7ca0: 74 66 38 28 7a 57 69 64 65 50 61 74 68 29 3b 0a  tf8(zWidePath);.
7cb0: 20 20 20 20 69 66 28 20 7a 4d 75 6c 74 69 20 29      if( zMulti )
7cc0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
7cd0: 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
7ce0: 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c  H-30, zTempPath,
7cf0: 20 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a   "%s", zMulti);.
7d00: 20 20 20 20 20 20 66 72 65 65 28 7a 4d 75 6c 74        free(zMult
7d10: 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i);.    }else{. 
7d20: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
7d30: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
7d40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
7d50: 72 20 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63 68  r *zUtf8;.    ch
7d60: 61 72 20 7a 4d 62 63 73 50 61 74 68 5b 4d 41 58  ar zMbcsPath[MAX
7d70: 5f 50 41 54 48 5d 3b 0a 20 20 20 20 47 65 74 54  _PATH];.    GetT
7d80: 65 6d 70 50 61 74 68 41 28 4d 41 58 5f 50 41 54  empPathA(MAX_PAT
7d90: 48 2d 33 30 2c 20 7a 4d 62 63 73 50 61 74 68 29  H-30, zMbcsPath)
7da0: 3b 0a 20 20 20 20 7a 55 74 66 38 20 3d 20 6d 62  ;.    zUtf8 = mb
7db0: 63 73 54 6f 55 74 66 38 28 7a 4d 62 63 73 50 61  csToUtf8(zMbcsPa
7dc0: 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 55 74  th);.    if( zUt
7dd0: 66 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  f8 ){.      sqli
7de0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58  te3_snprintf(MAX
7df0: 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50  _PATH-30, zTempP
7e00: 61 74 68 2c 20 22 25 73 22 2c 20 7a 55 74 66 38  ath, "%s", zUtf8
7e10: 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 55  );.      free(zU
7e20: 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tf8);.    }else{
7e30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
7e40: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
7e50: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73 74  }.  }.  for(i=st
7e60: 72 6c 65 6e 28 7a 54 65 6d 70 50 61 74 68 29 3b  rlen(zTempPath);
7e70: 20 69 3e 30 20 26 26 20 7a 54 65 6d 70 50 61 74   i>0 && zTempPat
7e80: 68 5b 69 2d 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d  h[i-1]=='\\'; i-
7e90: 2d 29 7b 7d 0a 20 20 7a 54 65 6d 70 50 61 74 68  -){}.  zTempPath
7ea0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  [i] = 0;.  sqlit
7eb0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
7ec0: 2d 33 30 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20  -30, zBuf,.     
7ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25                "%
7ee0: 73 5c 5c 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f  s\\"SQLITE_TEMP_
7ef0: 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 54 65  FILE_PREFIX, zTe
7f00: 6d 70 50 61 74 68 29 3b 0a 20 20 6a 20 3d 20 73  mpPath);.  j = s
7f10: 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 73  trlen(zBuf);.  s
7f20: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
7f30: 73 28 32 30 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b  s(20, &zBuf[j]);
7f40: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 30  .  for(i=0; i<20
7f50: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
7f60: 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72   zBuf[j] = (char
7f70: 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67  )zChars[ ((unsig
7f80: 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d  ned char)zBuf[j]
7f90: 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73  )%(sizeof(zChars
7fa0: 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42  )-1) ];.  }.  zB
7fb0: 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 4f 53 54  uf[j] = 0;.  OST
7fc0: 52 41 43 45 32 28 22 54 45 4d 50 20 46 49 4c 45  RACE2("TEMP FILE
7fd0: 4e 41 4d 45 3a 20 25 73 5c 6e 22 2c 20 7a 42 75  NAME: %s\n", zBu
7fe0: 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  f);.  return SQL
7ff0: 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  ITE_OK; .}../*.*
8000: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
8010: 75 65 20 6f 66 20 67 65 74 4c 61 73 74 45 72 72  ue of getLastErr
8020: 6f 72 4d 73 67 0a 2a 2a 20 69 73 20 7a 65 72 6f  orMsg.** is zero
8030: 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   if the error me
8040: 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74 68  ssage fits in th
8050: 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e  e buffer, or non
8060: 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69  -zero.** otherwi
8070: 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73 61  se (if the messa
8080: 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  ge was truncated
8090: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
80a0: 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67   getLastErrorMsg
80b0: 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20  (int nBuf, char 
80c0: 2a 7a 42 75 66 29 7b 0a 20 20 44 57 4f 52 44 20  *zBuf){.  DWORD 
80d0: 65 72 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 45  error = GetLastE
80e0: 72 72 6f 72 28 29 3b 0a 0a 23 69 66 20 53 51 4c  rror();..#if SQL
80f0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 73  ITE_OS_WINCE.  s
8100: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
8110: 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 4f 73 45  nBuf, zBuf, "OsE
8120: 72 72 6f 72 20 30 78 25 78 20 28 25 75 29 22 2c  rror 0x%x (%u)",
8130: 20 65 72 72 6f 72 2c 20 65 72 72 6f 72 29 3b 0a   error, error);.
8140: 23 65 6c 73 65 0a 20 20 2f 2a 20 46 6f 72 6d 61  #else.  /* Forma
8150: 74 4d 65 73 73 61 67 65 20 72 65 74 75 72 6e 73  tMessage returns
8160: 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20   0 on failure.  
8170: 4f 74 68 65 72 77 69 73 65 20 69 74 0a 20 20 2a  Otherwise it.  *
8180: 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  * returns the nu
8190: 6d 62 65 72 20 6f 66 20 54 43 48 41 52 73 20 77  mber of TCHARs w
81a0: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f 75  ritten to the ou
81b0: 74 70 75 74 0a 20 20 2a 2a 20 62 75 66 66 65 72  tput.  ** buffer
81c0: 2c 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20  , excluding the 
81d0: 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c  terminating null
81e0: 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 69 66   char..  */.  if
81f0: 20 28 21 46 6f 72 6d 61 74 4d 65 73 73 61 67 65   (!FormatMessage
8200: 41 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45  A(FORMAT_MESSAGE
8210: 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 2c 0a 20 20  _FROM_SYSTEM,.  
8220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8230: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8250: 65 72 72 6f 72 2c 0a 20 20 20 20 20 20 20 20 20  error,.         
8260: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a               0,.
8270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8280: 20 20 20 20 20 20 7a 42 75 66 2c 0a 20 20 20 20        zBuf,.    
8290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82a0: 20 20 6e 42 75 66 2d 31 2c 0a 20 20 20 20 20 20    nBuf-1,.      
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82c0: 30 29 29 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69  0)).  {.    sqli
82d0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
82e0: 66 2c 20 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f  f, zBuf, "OsErro
82f0: 72 20 30 78 25 78 20 28 25 75 29 22 2c 20 65 72  r 0x%x (%u)", er
8300: 72 6f 72 2c 20 65 72 72 6f 72 29 3b 0a 20 20 7d  ror, error);.  }
8310: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
8320: 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4f  n 0;.}.../*.** O
8330: 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  pen a file..*/.s
8340: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65  tatic int winOpe
8350: 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
8360: 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 2f   *pVfs,        /
8370: 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20  * Not used */.  
8380: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
8390: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  e,        /* Nam
83a0: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55  e of the file (U
83b0: 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74  TF-8) */.  sqlit
83c0: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20  e3_file *id,    
83d0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
83e0: 65 20 53 51 4c 69 74 65 20 66 69 6c 65 20 68 61  e SQLite file ha
83f0: 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  ndle here */.  i
8400: 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
8410: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
8420: 20 6d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20   mode flags */. 
8430: 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20   int *pOutFlags 
8440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
8450: 61 74 75 73 20 72 65 74 75 72 6e 20 66 6c 61 67  atus return flag
8460: 73 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c 45  s */.){.  HANDLE
8470: 20 68 3b 0a 20 20 44 57 4f 52 44 20 64 77 44 65   h;.  DWORD dwDe
8480: 73 69 72 65 64 41 63 63 65 73 73 3b 0a 20 20 44  siredAccess;.  D
8490: 57 4f 52 44 20 64 77 53 68 61 72 65 4d 6f 64 65  WORD dwShareMode
84a0: 3b 0a 20 20 44 57 4f 52 44 20 64 77 43 72 65 61  ;.  DWORD dwCrea
84b0: 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b  tionDisposition;
84c0: 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73  .  DWORD dwFlags
84d0: 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20  AndAttributes = 
84e0: 30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  0;.#if SQLITE_OS
84f0: 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 69 73 54  _WINCE.  int isT
8500: 65 6d 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  emp = 0;.#endif.
8510: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
8520: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
8530: 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
8540: 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ted;            
8550: 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65       /* Filename
8560: 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69 6e 67 20   in OS encoding 
8570: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
8580: 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 4e 61  *zUtf8Name = zNa
8590: 6d 65 3b 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61  me;    /* Filena
85a0: 6d 65 20 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f  me in UTF-8 enco
85b0: 64 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 7a  ding */.  char z
85c0: 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  Tmpname[MAX_PATH
85d0: 2b 31 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  +1];        /* B
85e0: 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 63 72  uffer used to cr
85f0: 65 61 74 65 20 74 65 6d 70 20 66 69 6c 65 6e 61  eate temp filena
8600: 6d 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  me */..  /* If t
8610: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
8620: 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
8630: 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 65 6e  ion is NULL, gen
8640: 65 72 61 74 65 20 61 20 0a 20 20 2a 2a 20 74 65  erate a .  ** te
8650: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
8660: 65 20 74 6f 20 75 73 65 20 0a 20 20 2a 2f 0a 20  e to use .  */. 
8670: 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20   if( !zUtf8Name 
8680: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
8690: 67 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f  getTempname(MAX_
86a0: 50 41 54 48 2b 31 2c 20 7a 54 6d 70 6e 61 6d 65  PATH+1, zTmpname
86b0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
86c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
86d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
86e0: 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e 61 6d 65   }.    zUtf8Name
86f0: 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d   = zTmpname;.  }
8700: 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74  ..  /* Convert t
8710: 68 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20 74  he filename to t
8720: 68 65 20 73 79 73 74 65 6d 20 65 6e 63 6f 64 69  he system encodi
8730: 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72  ng. */.  zConver
8740: 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66  ted = convertUtf
8750: 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e  8Filename(zUtf8N
8760: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ame);.  if( zCon
8770: 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
8780: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
8790: 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  OMEM;.  }..  if(
87a0: 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
87b0: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 29  OPEN_READWRITE )
87c0: 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41  {.    dwDesiredA
87d0: 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f  ccess = GENERIC_
87e0: 52 45 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57  READ | GENERIC_W
87f0: 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RITE;.  }else{. 
8800: 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
8810: 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41  ss = GENERIC_REA
8820: 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  D;.  }.  if( fla
8830: 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
8840: 5f 43 52 45 41 54 45 20 29 7b 0a 20 20 20 20 64  _CREATE ){.    d
8850: 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
8860: 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41  tion = OPEN_ALWA
8870: 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  YS;.  }else{.   
8880: 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
8890: 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58  sition = OPEN_EX
88a0: 49 53 54 49 4e 47 3b 0a 20 20 7d 0a 20 20 69 66  ISTING;.  }.  if
88b0: 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
88c0: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b  _OPEN_MAIN_DB ){
88d0: 0a 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65  .    dwShareMode
88e0: 20 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45   = FILE_SHARE_RE
88f0: 41 44 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f  AD | FILE_SHARE_
8900: 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  WRITE;.  }else{.
8910: 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20      dwShareMode 
8920: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  = 0;.  }.  if( f
8930: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
8940: 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
8950: 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
8960: 53 5f 57 49 4e 43 45 0a 20 20 20 20 64 77 46 6c  S_WINCE.    dwFl
8970: 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
8980: 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   = FILE_ATTRIBUT
8990: 45 5f 48 49 44 44 45 4e 3b 0a 20 20 20 20 69 73  E_HIDDEN;.    is
89a0: 54 65 6d 70 20 3d 20 31 3b 0a 23 65 6c 73 65 0a  Temp = 1;.#else.
89b0: 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
89c0: 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f  tributes = FILE_
89d0: 41 54 54 52 49 42 55 54 45 5f 54 45 4d 50 4f 52  ATTRIBUTE_TEMPOR
89e0: 41 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20  ARY.            
89f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a00: 20 20 20 7c 20 46 49 4c 45 5f 41 54 54 52 49 42     | FILE_ATTRIB
8a10: 55 54 45 5f 48 49 44 44 45 4e 0a 20 20 20 20 20  UTE_HIDDEN.     
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a30: 20 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45            | FILE
8a40: 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f  _FLAG_DELETE_ON_
8a50: 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 66 0a 20 20  CLOSE;.#endif.  
8a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 46 6c 61  }else{.    dwFla
8a70: 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
8a80: 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  = FILE_ATTRIBUTE
8a90: 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f  _NORMAL;.  }.  /
8aa0: 2a 20 52 65 70 6f 72 74 73 20 66 72 6f 6d 20 74  * Reports from t
8ab0: 68 65 20 69 6e 74 65 72 6e 65 74 20 61 72 65 20  he internet are 
8ac0: 74 68 61 74 20 70 65 72 66 6f 72 6d 61 6e 63 65  that performance
8ad0: 20 69 73 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20   is always.  ** 
8ae0: 62 65 74 74 65 72 20 69 66 20 46 49 4c 45 5f 46  better if FILE_F
8af0: 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53  LAG_RANDOM_ACCES
8b00: 53 20 69 73 20 75 73 65 64 2e 20 20 54 69 63 6b  S is used.  Tick
8b10: 65 74 20 23 32 36 39 39 2e 20 2a 2f 0a 23 69 66  et #2699. */.#if
8b20: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
8b30: 0a 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74  .  dwFlagsAndAtt
8b40: 72 69 62 75 74 65 73 20 7c 3d 20 46 49 4c 45 5f  ributes |= FILE_
8b50: 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45  FLAG_RANDOM_ACCE
8b60: 53 53 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  SS;.#endif.  if(
8b70: 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 68   isNT() ){.    h
8b80: 20 3d 20 43 72 65 61 74 65 46 69 6c 65 57 28 28   = CreateFileW((
8b90: 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65  WCHAR*)zConverte
8ba0: 64 2c 0a 20 20 20 20 20 20 20 64 77 44 65 73 69  d,.       dwDesi
8bb0: 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20  redAccess,.     
8bc0: 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a 20    dwShareMode,. 
8bd0: 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20        NULL,.    
8be0: 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
8bf0: 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20  position,.      
8c00: 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
8c10: 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 4e 55  butes,.       NU
8c20: 4c 4c 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73  LL.    );.  }els
8c30: 65 7b 0a 20 20 20 20 68 20 3d 20 43 72 65 61 74  e{.    h = Creat
8c40: 65 46 69 6c 65 41 28 28 63 68 61 72 2a 29 7a 43  eFileA((char*)zC
8c50: 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
8c60: 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
8c70: 2c 0a 20 20 20 20 20 20 20 64 77 53 68 61 72 65  ,.       dwShare
8c80: 4d 6f 64 65 2c 0a 20 20 20 20 20 20 20 4e 55 4c  Mode,.       NUL
8c90: 4c 2c 0a 20 20 20 20 20 20 20 64 77 43 72 65 61  L,.       dwCrea
8ca0: 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c  tionDisposition,
8cb0: 0a 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41  .       dwFlagsA
8cc0: 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20  ndAttributes,.  
8cd0: 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20 29 3b       NULL.    );
8ce0: 0a 20 20 7d 0a 20 20 69 66 28 20 68 3d 3d 49 4e  .  }.  if( h==IN
8cf0: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
8d00: 55 45 20 29 7b 0a 20 20 20 20 66 72 65 65 28 7a  UE ){.    free(z
8d10: 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
8d20: 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
8d30: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
8d40: 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E ){.      retur
8d50: 6e 20 77 69 6e 4f 70 65 6e 28 30 2c 20 7a 4e 61  n winOpen(0, zNa
8d60: 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20 20 20 20  me, id, .       
8d70: 20 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53 51        ((flags|SQ
8d80: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
8d90: 4c 59 29 26 7e 53 51 4c 49 54 45 5f 4f 50 45 4e  LY)&~SQLITE_OPEN
8da0: 5f 52 45 41 44 57 52 49 54 45 29 2c 20 70 4f 75  _READWRITE), pOu
8db0: 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c  tFlags);.    }el
8dc0: 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
8dd0: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
8de0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
8df0: 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20  ( pOutFlags ){. 
8e00: 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53     if( flags & S
8e10: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
8e20: 52 49 54 45 20 29 7b 0a 20 20 20 20 20 20 2a 70  RITE ){.      *p
8e30: 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  OutFlags = SQLIT
8e40: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
8e50: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8e60: 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20     *pOutFlags = 
8e70: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
8e80: 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ONLY;.    }.  }.
8e90: 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20    memset(pFile, 
8ea0: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 46 69 6c 65  0, sizeof(*pFile
8eb0: 29 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65  ));.  pFile->pMe
8ec0: 74 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74  thod = &winIoMet
8ed0: 68 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20  hod;.  pFile->h 
8ee0: 3d 20 68 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  = h;.#if SQLITE_
8ef0: 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66 28 20 28  OS_WINCE.  if( (
8f00: 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  flags & (SQLITE_
8f10: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
8f20: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
8f30: 44 42 29 29 20 3d 3d 0a 20 20 20 20 20 20 20 20  DB)) ==.        
8f40: 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f         (SQLITE_O
8f50: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
8f60: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
8f70: 42 29 0a 20 20 20 20 20 20 20 26 26 20 21 77 69  B).       && !wi
8f80: 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e  nceCreateLock(zN
8f90: 61 6d 65 2c 20 70 46 69 6c 65 29 0a 20 20 29 7b  ame, pFile).  ){
8fa0: 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65  .    CloseHandle
8fb0: 28 68 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 43  (h);.    free(zC
8fc0: 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 72  onverted);.    r
8fd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
8fe0: 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 69 66 28  TOPEN;.  }.  if(
8ff0: 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 70   isTemp ){.    p
9000: 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
9010: 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65  lose = zConverte
9020: 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  d;.  }else.#endi
9030: 66 0a 20 20 7b 0a 20 20 20 20 66 72 65 65 28 7a  f.  {.    free(z
9040: 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a  Converted);.  }.
9050: 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31    OpenCounter(+1
9060: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
9070: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
9080: 44 65 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64  Delete the named
9090: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   file..**.** Not
90a0: 65 20 74 68 61 74 20 77 69 6e 64 6f 77 73 20 64  e that windows d
90b0: 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20  oes not allow a 
90c0: 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74  file to be delet
90d0: 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ed if some other
90e0: 0a 2a 2a 20 70 72 6f 63 65 73 73 20 68 61 73 20  .** process has 
90f0: 69 74 20 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69  it open.  Someti
9100: 6d 65 73 20 61 20 76 69 72 75 73 20 73 63 61 6e  mes a virus scan
9110: 6e 65 72 20 6f 72 20 69 6e 64 65 78 69 6e 67 20  ner or indexing 
9120: 70 72 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20  program.** will 
9130: 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66  open a journal f
9140: 69 6c 65 20 73 68 6f 72 74 6c 79 20 61 66 74 65  ile shortly afte
9150: 72 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20  r it is created 
9160: 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a  in order to do.*
9170: 2a 20 77 68 61 74 65 76 65 72 20 69 74 20 64 6f  * whatever it do
9180: 65 73 2e 20 20 57 68 69 6c 65 20 74 68 69 73 20  es.  While this 
9190: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
91a0: 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20   holding the.** 
91b0: 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20 77 69  file open, we wi
91c0: 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20  ll be unable to 
91d0: 64 65 6c 65 74 65 20 69 74 2e 20 20 54 6f 20 77  delete it.  To w
91e0: 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 0a  ork around this.
91f0: 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64  ** problem, we d
9200: 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c 69 73 65  elay 100 millise
9210: 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 74 6f  conds and try to
9220: 20 64 65 6c 65 74 65 20 61 67 61 69 6e 2e 20 20   delete again.  
9230: 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c 45  Up.** to MX_DELE
9240: 54 49 4f 4e 5f 41 54 54 45 4d 50 54 73 20 64 65  TION_ATTEMPTs de
9250: 6c 65 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  letion attempts 
9260: 61 72 65 20 72 75 6e 20 62 65 66 6f 72 65 20 67  are run before g
9270: 69 76 69 6e 67 0a 2a 2a 20 75 70 20 61 6e 64 20  iving.** up and 
9280: 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  returning an err
9290: 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  or..*/.#define M
92a0: 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d  X_DELETION_ATTEM
92b0: 50 54 53 20 35 0a 73 74 61 74 69 63 20 69 6e 74  PTS 5.static int
92c0: 20 77 69 6e 44 65 6c 65 74 65 28 0a 20 20 73 71   winDelete(.  sq
92d0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
92e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74            /* Not
92f0: 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a   used on win32 *
9300: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
9310: 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20  zFilename,      
9320: 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
9330: 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69  to delete */.  i
9340: 6e 74 20 73 79 6e 63 44 69 72 20 20 20 20 20 20  nt syncDir      
9350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
9360: 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20  t used on win32 
9370: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20  */.){.  int cnt 
9380: 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 72 63 3b  = 0;.  DWORD rc;
9390: 0a 20 20 44 57 4f 52 44 20 65 72 72 6f 72 3b 0a  .  DWORD error;.
93a0: 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
93b0: 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38  ed = convertUtf8
93c0: 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Filename(zFilena
93d0: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  me);.  if( zConv
93e0: 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
93f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
9400: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c  MEM;.  }.  Simul
9410: 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
9420: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  n SQLITE_IOERR_D
9430: 45 4c 45 54 45 29 3b 0a 20 20 69 66 28 20 69 73  ELETE);.  if( is
9440: 4e 54 28 29 20 29 7b 0a 20 20 20 20 64 6f 7b 0a  NT() ){.    do{.
9450: 20 20 20 20 20 20 44 65 6c 65 74 65 46 69 6c 65        DeleteFile
9460: 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  W(zConverted);. 
9470: 20 20 20 7d 77 68 69 6c 65 28 20 20 20 28 20 20     }while(   (  
9480: 20 28 28 72 63 20 3d 20 47 65 74 46 69 6c 65 41   ((rc = GetFileA
9490: 74 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e 76  ttributesW(zConv
94a0: 65 72 74 65 64 29 29 20 21 3d 20 49 4e 56 41 4c  erted)) != INVAL
94b0: 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
94c0: 45 53 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ES).            
94d0: 20 20 20 7c 7c 20 28 28 65 72 72 6f 72 20 3d 20     || ((error = 
94e0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 20  GetLastError()) 
94f0: 3d 3d 20 45 52 52 4f 52 5f 41 43 43 45 53 53 5f  == ERROR_ACCESS_
9500: 44 45 4e 49 45 44 29 29 0a 20 20 20 20 20 20 20  DENIED)).       
9510: 20 20 20 20 26 26 20 28 2b 2b 63 6e 74 20 3c 20      && (++cnt < 
9520: 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45  MX_DELETION_ATTE
9530: 4d 50 54 53 29 0a 20 20 20 20 20 20 20 20 20 20  MPTS).          
9540: 20 26 26 20 28 53 6c 65 65 70 28 31 30 30 29 2c   && (Sleep(100),
9550: 20 31 29 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   1) );.  }else{.
9560: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 44 65      do{.      De
9570: 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65  leteFileA(zConve
9580: 72 74 65 64 29 3b 0a 20 20 20 20 7d 77 68 69 6c  rted);.    }whil
9590: 65 28 20 20 20 28 20 20 20 28 28 72 63 20 3d 20  e(   (   ((rc = 
95a0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
95b0: 73 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 29 20  sA(zConverted)) 
95c0: 21 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  != INVALID_FILE_
95d0: 41 54 54 52 49 42 55 54 45 53 29 0a 20 20 20 20  ATTRIBUTES).    
95e0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28             || ((
95f0: 65 72 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 45  error = GetLastE
9600: 72 72 6f 72 28 29 29 20 3d 3d 20 45 52 52 4f 52  rror()) == ERROR
9610: 5f 41 43 43 45 53 53 5f 44 45 4e 49 45 44 29 29  _ACCESS_DENIED))
9620: 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
9630: 2b 2b 63 6e 74 20 3c 20 4d 58 5f 44 45 4c 45 54  ++cnt < MX_DELET
9640: 49 4f 4e 5f 41 54 54 45 4d 50 54 53 29 0a 20 20  ION_ATTEMPTS).  
9650: 20 20 20 20 20 20 20 20 20 26 26 20 28 53 6c 65           && (Sle
9660: 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 20  ep(100), 1) );. 
9670: 20 7d 0a 20 20 66 72 65 65 28 7a 43 6f 6e 76 65   }.  free(zConve
9680: 72 74 65 64 29 3b 0a 20 20 4f 53 54 52 41 43 45  rted);.  OSTRACE
9690: 32 28 22 44 45 4c 45 54 45 20 5c 22 25 73 5c 22  2("DELETE \"%s\"
96a0: 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  \n", zFilename);
96b0: 0a 20 20 72 65 74 75 72 6e 20 28 20 20 20 28 72  .  return (   (r
96c0: 63 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c  c == INVALID_FIL
96d0: 45 5f 41 54 54 52 49 42 55 54 45 53 29 20 0a 20  E_ATTRIBUTES) . 
96e0: 20 20 20 20 20 20 20 20 20 26 26 20 28 65 72 72           && (err
96f0: 6f 72 20 3d 3d 20 45 52 52 4f 52 5f 46 49 4c 45  or == ERROR_FILE
9700: 5f 4e 4f 54 5f 46 4f 55 4e 44 29 29 20 3f 20 53  _NOT_FOUND)) ? S
9710: 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54  QLITE_OK : SQLIT
9720: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 3b 0a  E_IOERR_DELETE;.
9730: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
9740: 68 65 20 65 78 69 73 74 61 6e 63 65 20 61 6e 64  he existance and
9750: 20 73 74 61 74 75 73 20 6f 66 20 61 20 66 69 6c   status of a fil
9760: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
9770: 20 77 69 6e 41 63 63 65 73 73 28 0a 20 20 73 71   winAccess(.  sq
9780: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
9790: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
97a0: 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f  used on win32 */
97b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
97c0: 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Filename,     /*
97d0: 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f   Name of file to
97e0: 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20   check */.  int 
97f0: 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
9800: 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
9810: 66 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 6f  f test to make o
9820: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
9830: 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20   int *pResOut   
9840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
9850: 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 29 7b  UT: Result */.){
9860: 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20  .  DWORD attr;. 
9870: 20 69 6e 74 20 72 63 3b 0a 20 20 76 6f 69 64 20   int rc;.  void 
9880: 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f  *zConverted = co
9890: 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d  nvertUtf8Filenam
98a0: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
98b0: 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
98c0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
98d0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
98e0: 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  }.  if( isNT() )
98f0: 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 47 65 74  {.    attr = Get
9900: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28  FileAttributesW(
9910: 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74  (WCHAR*)zConvert
9920: 65 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ed);.  }else{.  
9930: 20 20 61 74 74 72 20 3d 20 47 65 74 46 69 6c 65    attr = GetFile
9940: 41 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61  AttributesA((cha
9950: 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  r*)zConverted);.
9960: 20 20 7d 0a 20 20 66 72 65 65 28 7a 43 6f 6e 76    }.  free(zConv
9970: 65 72 74 65 64 29 3b 0a 20 20 73 77 69 74 63 68  erted);.  switch
9980: 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63  ( flags ){.    c
9990: 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
99a0: 53 5f 52 45 41 44 3a 0a 20 20 20 20 63 61 73 65  S_READ:.    case
99b0: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
99c0: 58 49 53 54 53 3a 0a 20 20 20 20 20 20 72 63 20  XISTS:.      rc 
99d0: 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f  = attr!=INVALID_
99e0: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b  FILE_ATTRIBUTES;
99f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9a00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
9a10: 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a  CESS_READWRITE:.
9a20: 20 20 20 20 20 20 72 63 20 3d 20 28 61 74 74 72        rc = (attr
9a30: 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   & FILE_ATTRIBUT
9a40: 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a  E_READONLY)==0;.
9a50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9a60: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
9a70: 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64  assert(!"Invalid
9a80: 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22   flags argument"
9a90: 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75  );.  }.  *pResOu
9aa0: 74 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e  t = rc;.  return
9ab0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
9ac0: 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c  /*.** Turn a rel
9ad0: 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69  ative pathname i
9ae0: 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e  nto a full pathn
9af0: 61 6d 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ame.  Write the 
9b00: 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d 65  full.** pathname
9b10: 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a   into zOut[].  z
9b20: 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61 74  Out[] will be at
9b30: 20 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d 78 50   least pVfs->mxP
9b40: 61 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65 73  athname.** bytes
9b50: 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61   in size..*/.sta
9b60: 74 69 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c 50  tic int winFullP
9b70: 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74  athname(.  sqlit
9b80: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
9b90: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
9ba0: 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63  ter to vfs objec
9bb0: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
9bc0: 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20 20  r *zRelative,   
9bd0: 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
9be0: 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20   relative input 
9bf0: 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  path */.  int nF
9c00: 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ull,            
9c10: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
9c20: 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  of output buffer
9c30: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
9c40: 68 61 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20 20  har *zFull      
9c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9c60: 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  Output buffer */
9c70: 0a 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .){..#if defined
9c80: 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 63  (__CYGWIN__).  c
9c90: 79 67 77 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 66 75  ygwin_conv_to_fu
9ca0: 6c 6c 5f 77 69 6e 33 32 5f 70 61 74 68 28 7a 52  ll_win32_path(zR
9cb0: 65 6c 61 74 69 76 65 2c 20 7a 46 75 6c 6c 29 3b  elative, zFull);
9cc0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
9cd0: 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  _OK;.#endif..#if
9ce0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
9cf0: 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68 61 73 20  .  /* WinCE has 
9d00: 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20 61 20  no concept of a 
9d10: 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
9d20: 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f  e, or so I am to
9d30: 6c 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ld. */.  sqlite3
9d40: 5f 73 6e 70 72 69 6e 74 66 28 70 56 66 73 2d 3e  _snprintf(pVfs->
9d50: 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c  mxPathname, zFul
9d60: 6c 2c 20 22 25 73 22 2c 20 7a 52 65 6c 61 74 69  l, "%s", zRelati
9d70: 76 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ve);.  return SQ
9d80: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
9d90: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
9da0: 57 49 4e 43 45 20 26 26 20 21 64 65 66 69 6e 65  WINCE && !define
9db0: 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
9dc0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 76 6f 69  int nByte;.  voi
9dd0: 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
9de0: 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 20 20 7a   char *zOut;.  z
9df0: 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
9e00: 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
9e10: 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 69 66  zRelative);.  if
9e20: 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
9e30: 57 43 48 41 52 20 2a 7a 54 65 6d 70 3b 0a 20 20  WCHAR *zTemp;.  
9e40: 20 20 6e 42 79 74 65 20 3d 20 47 65 74 46 75 6c    nByte = GetFul
9e50: 6c 50 61 74 68 4e 61 6d 65 57 28 28 57 43 48 41  lPathNameW((WCHA
9e60: 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30  R*)zConverted, 0
9e70: 2c 20 30 2c 20 30 29 20 2b 20 33 3b 0a 20 20 20  , 0, 0) + 3;.   
9e80: 20 7a 54 65 6d 70 20 3d 20 6d 61 6c 6c 6f 63 28   zTemp = malloc(
9e90: 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54   nByte*sizeof(zT
9ea0: 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  emp[0]) );.    i
9eb0: 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20  f( zTemp==0 ){. 
9ec0: 20 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65       free(zConve
9ed0: 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
9ee0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
9ef0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 47 65 74 46  ;.    }.    GetF
9f00: 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 57 43  ullPathNameW((WC
9f10: 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c  HAR*)zConverted,
9f20: 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30   nByte, zTemp, 0
9f30: 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e  );.    free(zCon
9f40: 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75  verted);.    zOu
9f50: 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66  t = unicodeToUtf
9f60: 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 66 72  8(zTemp);.    fr
9f70: 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c  ee(zTemp);.  }el
9f80: 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  se{.    char *zT
9f90: 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  emp;.    nByte =
9fa0: 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65   GetFullPathName
9fb0: 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
9fc0: 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 20 2b 20  ted, 0, 0, 0) + 
9fd0: 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 6d  3;.    zTemp = m
9fe0: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a  alloc( nByte*siz
9ff0: 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b  eof(zTemp[0]) );
a000: 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d  .    if( zTemp==
a010: 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28  0 ){.      free(
a020: 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
a030: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a040: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
a050: 20 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d    GetFullPathNam
a060: 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  eA((char*)zConve
a070: 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65  rted, nByte, zTe
a080: 6d 70 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65  mp, 0);.    free
a090: 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
a0a0: 20 20 7a 4f 75 74 20 3d 20 6d 62 63 73 54 6f 55    zOut = mbcsToU
a0b0: 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  tf8(zTemp);.    
a0c0: 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d  free(zTemp);.  }
a0d0: 0a 20 20 69 66 28 20 7a 4f 75 74 20 29 7b 0a 20  .  if( zOut ){. 
a0e0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
a0f0: 6e 74 66 28 70 56 66 73 2d 3e 6d 78 50 61 74 68  ntf(pVfs->mxPath
a100: 6e 61 6d 65 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  name, zFull, "%s
a110: 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 66 72  ", zOut);.    fr
a120: 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65  ee(zOut);.    re
a130: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a140: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
a150: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
a160: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
a170: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a180: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
a190: 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61  ON./*.** Interfa
a1a0: 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20  ces for opening 
a1b0: 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  a shared library
a1c0: 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20  , finding entry 
a1d0: 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e  points.** within
a1e0: 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
a1f0: 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67  ary, and closing
a200: 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
a210: 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e  ary..*/./*.** In
a220: 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65  terfaces for ope
a230: 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69  ning a shared li
a240: 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65  brary, finding e
a250: 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77  ntry points.** w
a260: 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64  ithin the shared
a270: 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c   library, and cl
a280: 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  osing the shared
a290: 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61   library..*/.sta
a2a0: 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f  tic void *winDlO
a2b0: 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20  pen(sqlite3_vfs 
a2c0: 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61  *pVfs, const cha
a2d0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
a2e0: 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 76 6f 69   HANDLE h;.  voi
a2f0: 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  d *zConverted = 
a300: 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e  convertUtf8Filen
a310: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
a320: 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
a330: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
a340: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  n 0;.  }.  if( i
a350: 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 68 20 3d  sNT() ){.    h =
a360: 20 4c 6f 61 64 4c 69 62 72 61 72 79 57 28 28 57   LoadLibraryW((W
a370: 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64  CHAR*)zConverted
a380: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
a390: 68 20 3d 20 4c 6f 61 64 4c 69 62 72 61 72 79 41  h = LoadLibraryA
a3a0: 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
a3b0: 65 64 29 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28  ed);.  }.  free(
a3c0: 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 72  zConverted);.  r
a3d0: 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a  eturn (void*)h;.
a3e0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  }.static void wi
a3f0: 6e 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33  nDlError(sqlite3
a400: 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
a410: 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
a420: 4f 75 74 29 7b 0a 20 20 67 65 74 4c 61 73 74 45  Out){.  getLastE
a430: 72 72 6f 72 4d 73 67 28 6e 42 75 66 2c 20 7a 42  rrorMsg(nBuf, zB
a440: 75 66 4f 75 74 29 3b 0a 7d 0a 76 6f 69 64 20 2a  ufOut);.}.void *
a450: 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65 33  winDlSym(sqlite3
a460: 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64  _vfs *pVfs, void
a470: 20 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e 73 74   *pHandle, const
a480: 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c 29 7b   char *zSymbol){
a490: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
a4a0: 49 4e 43 45 0a 20 20 2f 2a 20 54 68 65 20 47 65  INCE.  /* The Ge
a4b0: 74 50 72 6f 63 41 64 64 72 65 73 73 41 28 29 20  tProcAddressA() 
a4c0: 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
a4d0: 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 77 69 6e  available on win
a4e0: 63 65 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ce. */.  return 
a4f0: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 28  GetProcAddressA(
a500: 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 2c  (HANDLE)pHandle,
a510: 20 7a 53 79 6d 62 6f 6c 29 3b 0a 23 65 6c 73 65   zSymbol);.#else
a520: 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20  .  /* All other 
a530: 77 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d  windows platform
a540: 73 20 65 78 70 65 63 74 20 47 65 74 50 72 6f 63  s expect GetProc
a550: 41 64 64 72 65 73 73 28 29 20 74 6f 20 74 61 6b  Address() to tak
a560: 65 0a 20 20 2a 2a 20 61 6e 20 41 6e 73 69 20 73  e.  ** an Ansi s
a570: 74 72 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73  tring regardless
a580: 20 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f 44 45   of the _UNICODE
a590: 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 72 65   setting */.  re
a5a0: 74 75 72 6e 20 47 65 74 50 72 6f 63 41 64 64 72  turn GetProcAddr
a5b0: 65 73 73 28 28 48 41 4e 44 4c 45 29 70 48 61 6e  ess((HANDLE)pHan
a5c0: 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 23  dle, zSymbol);.#
a5d0: 65 6e 64 69 66 0a 7d 0a 76 6f 69 64 20 77 69 6e  endif.}.void win
a5e0: 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  DlClose(sqlite3_
a5f0: 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20  vfs *pVfs, void 
a600: 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 46 72 65  *pHandle){.  Fre
a610: 65 4c 69 62 72 61 72 79 28 28 48 41 4e 44 4c 45  eLibrary((HANDLE
a620: 29 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c  )pHandle);.}.#el
a630: 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f  se /* if SQLITE_
a640: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
a650: 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20  ION is defined: 
a660: 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e  */.  #define win
a670: 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66  DlOpen  0.  #def
a680: 69 6e 65 20 77 69 6e 44 6c 45 72 72 6f 72 20 30  ine winDlError 0
a690: 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c  .  #define winDl
a6a0: 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e  Sym   0.  #defin
a6b0: 65 20 77 69 6e 44 6c 43 6c 6f 73 65 20 30 0a 23  e winDlClose 0.#
a6c0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  endif.../*.** Wr
a6d0: 69 74 65 20 75 70 20 74 6f 20 6e 42 75 66 20 62  ite up to nBuf b
a6e0: 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65  ytes of randomne
a6f0: 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f  ss into zBuf..*/
a700: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52  .static int winR
a710: 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65  andomness(sqlite
a720: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
a730: 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
a740: 66 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b  f){.  int n = 0;
a750: 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 53 59  .  if( sizeof(SY
a760: 53 54 45 4d 54 49 4d 45 29 3c 3d 6e 42 75 66 2d  STEMTIME)<=nBuf-
a770: 6e 20 29 7b 0a 20 20 20 20 53 59 53 54 45 4d 54  n ){.    SYSTEMT
a780: 49 4d 45 20 78 3b 0a 20 20 20 20 47 65 74 53 79  IME x;.    GetSy
a790: 73 74 65 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20  stemTime(&x);.  
a7a0: 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e    memcpy(&zBuf[n
a7b0: 5d 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29  ], &x, sizeof(x)
a7c0: 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65  );.    n += size
a7d0: 6f 66 28 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28  of(x);.  }.  if(
a7e0: 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d   sizeof(DWORD)<=
a7f0: 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57  nBuf-n ){.    DW
a800: 4f 52 44 20 70 69 64 20 3d 20 47 65 74 43 75 72  ORD pid = GetCur
a810: 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 3b  rentProcessId();
a820: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
a830: 66 5b 6e 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65  f[n], &pid, size
a840: 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20 6e 20  of(pid));.    n 
a850: 2b 3d 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a  += sizeof(pid);.
a860: 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66    }.  if( sizeof
a870: 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20  (DWORD)<=nBuf-n 
a880: 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 63 6e 74  ){.    DWORD cnt
a890: 20 3d 20 47 65 74 54 69 63 6b 43 6f 75 6e 74 28   = GetTickCount(
a8a0: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
a8b0: 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69  Buf[n], &cnt, si
a8c0: 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20  zeof(cnt));.    
a8d0: 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29  n += sizeof(cnt)
a8e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65  ;.  }.  if( size
a8f0: 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52  of(LARGE_INTEGER
a900: 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
a910: 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69   LARGE_INTEGER i
a920: 3b 0a 20 20 20 20 51 75 65 72 79 50 65 72 66 6f  ;.    QueryPerfo
a930: 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28 26 69  rmanceCounter(&i
a940: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
a950: 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a 65  Buf[n], &i, size
a960: 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  of(i));.    n +=
a970: 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20 7d 0a   sizeof(i);.  }.
a980: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a    return n;.}...
a990: 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
a9a0: 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
a9b0: 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
a9c0: 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
a9d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a9e0: 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 74 65 33  winSleep(sqlite3
a9f0: 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
aa00: 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 53 6c 65  microsec){.  Sle
aa10: 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39  ep((microsec+999
aa20: 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  )/1000);.  retur
aa30: 6e 20 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39  n ((microsec+999
aa40: 29 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a  )/1000)*1000;.}.
aa50: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
aa60: 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69  wing variable, i
aa70: 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a  f set to a non-z
aa80: 65 72 6f 20 76 61 6c 75 65 2c 20 62 65 63 6f 6d  ero value, becom
aa90: 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  es the result.**
aaa0: 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 73   returned from s
aab0: 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
aac0: 69 6d 65 28 29 2e 20 20 54 68 69 73 20 69 73 20  ime().  This is 
aad0: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
aae0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
aaf0: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
ab00: 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
ab10: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
ab20: 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
ab30: 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
ab40: 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
ab50: 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
ab60: 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  e the.** current
ab70: 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
ab80: 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
ab90: 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f  umber into *prNo
aba0: 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  w and.** return 
abb0: 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  0.  Return 1 if 
abc0: 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
abd0: 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
abe0: 64 2e 0a 2a 2f 0a 69 6e 74 20 77 69 6e 43 75 72  d..*/.int winCur
abf0: 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33  rentTime(sqlite3
ac00: 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62  _vfs *pVfs, doub
ac10: 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 46 49  le *prNow){.  FI
ac20: 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 2f 2a 20  LETIME ft;.  /* 
ac30: 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74 75  FILETIME structu
ac40: 72 65 20 69 73 20 61 20 36 34 2d 62 69 74 20 76  re is a 64-bit v
ac50: 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74 69 6e  alue representin
ac60: 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
ac70: 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65  .     100-nanose
ac80: 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 20 73  cond intervals s
ac90: 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31 2c 20  ince January 1, 
aca0: 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30 35 38  1601 (= JD 23058
acb0: 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20 20 64  13.5). .  */.  d
acc0: 6f 75 62 6c 65 20 6e 6f 77 3b 0a 23 69 66 20 53  ouble now;.#if S
acd0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
ace0: 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69 6d 65   SYSTEMTIME time
acf0: 3b 0a 20 20 47 65 74 53 79 73 74 65 6d 54 69 6d  ;.  GetSystemTim
ad00: 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f 2a 20 69  e(&time);.  /* i
ad10: 66 20 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  f SystemTimeToFi
ad20: 6c 65 54 69 6d 65 28 29 20 66 61 69 6c 73 2c 20  leTime() fails, 
ad30: 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e  it returns zero.
ad40: 20 2a 2f 0a 20 20 69 66 20 28 21 53 79 73 74 65   */.  if (!Syste
ad50: 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28  mTimeToFileTime(
ad60: 26 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20  &time,&ft)){.   
ad70: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23   return 1;.  }.#
ad80: 65 6c 73 65 0a 20 20 47 65 74 53 79 73 74 65 6d  else.  GetSystem
ad90: 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 28 20  TimeAsFileTime( 
ada0: 26 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  &ft );.#endif.  
adb0: 6e 6f 77 20 3d 20 28 28 64 6f 75 62 6c 65 29 66  now = ((double)f
adc0: 74 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65  t.dwHighDateTime
add0: 29 20 2a 20 34 32 39 34 39 36 37 32 39 36 2e 30  ) * 4294967296.0
ade0: 3b 20 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 28 6e  ; .  *prNow = (n
adf0: 6f 77 20 2b 20 66 74 2e 64 77 4c 6f 77 44 61 74  ow + ft.dwLowDat
ae00: 65 54 69 6d 65 29 2f 38 36 34 30 30 30 30 30 30  eTime)/864000000
ae10: 30 30 30 2e 30 20 2b 20 32 33 30 35 38 31 33 2e  000.0 + 2305813.
ae20: 35 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  5;.#ifdef SQLITE
ae30: 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69  _TEST.  if( sqli
ae40: 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
ae50: 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d   ){.    *prNow =
ae60: 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
ae70: 5f 74 69 6d 65 2f 38 36 34 30 30 2e 30 20 2b 20  _time/86400.0 + 
ae80: 32 34 34 30 35 38 37 2e 35 3b 0a 20 20 7d 0a 23  2440587.5;.  }.#
ae90: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 30  endif.  return 0
aea0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  ;.}../*.** The i
aeb0: 64 65 61 20 69 73 20 74 68 61 74 20 74 68 69 73  dea is that this
aec0: 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20   function works 
aed0: 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74 69  like a combinati
aee0: 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74  on of.** GetLast
aef0: 45 72 72 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d  Error() and Form
af00: 61 74 4d 65 73 73 61 67 65 28 29 20 6f 6e 20 77  atMessage() on w
af10: 69 6e 64 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f  indows (or errno
af20: 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72   and.** strerror
af30: 5f 72 28 29 20 6f 6e 20 75 6e 69 78 29 2e 20 41  _r() on unix). A
af40: 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 69 73  fter an error is
af50: 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20   returned by an 
af60: 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20  OS.** function, 
af70: 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69  SQLite calls thi
af80: 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  s function with 
af90: 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f  zBuf pointing to
afa0: 0a 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 66 20  .** a buffer of 
afb0: 6e 42 75 66 20 62 79 74 65 73 2e 20 54 68 65 20  nBuf bytes. The 
afc0: 4f 53 20 6c 61 79 65 72 20 73 68 6f 75 6c 64 20  OS layer should 
afd0: 70 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20  populate the.** 
afe0: 62 75 66 66 65 72 20 77 69 74 68 20 61 20 6e 75  buffer with a nu
aff0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46  l-terminated UTF
b000: 2d 38 20 65 6e 63 6f 64 65 64 20 65 72 72 6f 72  -8 encoded error
b010: 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64 65 73 63   message.** desc
b020: 72 69 62 69 6e 67 20 74 68 65 20 6c 61 73 74 20  ribing the last 
b030: 49 4f 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65  IO error to have
b040: 20 6f 63 63 75 72 65 64 20 77 69 74 68 69 6e 20   occured within 
b050: 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74  the calling.** t
b060: 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  hread..**.** If 
b070: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
b080: 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 66  e is too large f
b090: 6f 72 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  or the supplied 
b0a0: 62 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73 68  buffer,.** it sh
b0b0: 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65  ould be truncate
b0c0: 64 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  d. The return va
b0d0: 6c 75 65 20 6f 66 20 78 47 65 74 4c 61 73 74 45  lue of xGetLastE
b0e0: 72 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20  rror.** is zero 
b0f0: 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  if the error mes
b100: 73 61 67 65 20 66 69 74 73 20 69 6e 20 74 68 65  sage fits in the
b110: 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d   buffer, or non-
b120: 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73  zero.** otherwis
b130: 65 20 28 69 66 20 74 68 65 20 6d 65 73 73 61 67  e (if the messag
b140: 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 29  e was truncated)
b150: 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73  . If non-zero is
b160: 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74 68   returned,.** th
b170: 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  en it is not nec
b180: 65 73 73 61 72 79 20 74 6f 20 69 6e 63 6c 75 64  essary to includ
b190: 65 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  e the nul-termin
b1a0: 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a 2a  ator character.*
b1b0: 2a 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20  * in the output 
b1c0: 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  buffer..**.** No
b1d0: 74 20 73 75 70 70 6c 79 69 6e 67 20 61 6e 20 65  t supplying an e
b1e0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c  rror message wil
b1f0: 6c 20 68 61 76 65 20 6e 6f 20 61 64 76 65 72 73  l have no advers
b200: 65 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20 53  e effect.** on S
b210: 51 4c 69 74 65 2e 20 49 74 20 69 73 20 66 69 6e  QLite. It is fin
b220: 65 20 74 6f 20 68 61 76 65 20 61 6e 20 69 6d 70  e to have an imp
b230: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74  lementation that
b240: 20 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75 72 6e   never.** return
b250: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
b260: 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20  ge:.**.**   int 
b270: 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71  xGetLastError(sq
b280: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
b290: 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
b2a0: 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20 61  *zBuf){.**     a
b2b0: 73 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27  ssert(zBuf[0]=='
b2c0: 5c 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65 74  \0');.**     ret
b2d0: 75 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a  urn 0;.**   }.**
b2e0: 0a 2a 2a 20 48 6f 77 65 76 65 72 20 69 66 20 61  .** However if a
b2f0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
b300: 69 73 20 73 75 70 70 6c 69 65 64 2c 20 69 74 20  is supplied, it 
b310: 77 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72  will be incorpor
b320: 61 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74  ated.** by sqlit
b330: 65 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72  e into the error
b340: 20 6d 65 73 73 61 67 65 20 61 76 61 69 6c 61 62   message availab
b350: 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 20 75  le to the user u
b360: 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  sing.** sqlite3_
b370: 65 72 72 6d 73 67 28 29 2c 20 70 6f 73 73 69 62  errmsg(), possib
b380: 6c 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72  ly making IO err
b390: 6f 72 73 20 65 61 73 69 65 72 20 74 6f 20 64 65  ors easier to de
b3a0: 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  bug..*/.static i
b3b0: 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72  nt winGetLastErr
b3c0: 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
b3d0: 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20  pVfs, int nBuf, 
b3e0: 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 72  char *zBuf){.  r
b3f0: 65 74 75 72 6e 20 67 65 74 4c 61 73 74 45 72 72  eturn getLastErr
b400: 6f 72 4d 73 67 28 6e 42 75 66 2c 20 7a 42 75 66  orMsg(nBuf, zBuf
b410: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  );.}../*.** Init
b420: 69 61 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e 69  ialize and deini
b430: 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72  tialize the oper
b440: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74  ating system int
b450: 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erface..*/.int s
b460: 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76  qlite3_os_init(v
b470: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73  oid){.  static s
b480: 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 56 66  qlite3_vfs winVf
b490: 73 20 3d 20 7b 0a 20 20 20 20 31 2c 20 20 20 20  s = {.    1,    
b4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b4b0: 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  iVersion */.    
b4c0: 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c  sizeof(winFile),
b4d0: 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a     /* szOsFile *
b4e0: 2f 0a 20 20 20 20 4d 41 58 5f 50 41 54 48 2c 20  /.    MAX_PATH, 
b4f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 61           /* mxPa
b500: 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c  thname */.    0,
b510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b520: 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20   /* pNext */.   
b530: 20 22 77 69 6e 33 32 22 2c 20 20 20 20 20 20 20   "win32",       
b540: 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a      /* zName */.
b550: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
b560: 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61         /* pAppDa
b570: 74 61 20 2a 2f 0a 20 0a 20 20 20 20 77 69 6e 4f  ta */. .    winO
b580: 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pen,           /
b590: 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  * xOpen */.    w
b5a0: 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20  inDelete,       
b5b0: 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a    /* xDelete */.
b5c0: 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20      winAccess,  
b5d0: 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73         /* xAcces
b5e0: 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c  s */.    winFull
b5f0: 50 61 74 68 6e 61 6d 65 2c 20 20 20 2f 2a 20 78  Pathname,   /* x
b600: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  FullPathname */.
b610: 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20      winDlOpen,  
b620: 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65         /* xDlOpe
b630: 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72  n */.    winDlEr
b640: 72 6f 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 78  ror,        /* x
b650: 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77  DlError */.    w
b660: 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20  inDlSym,        
b670: 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20    /* xDlSym */. 
b680: 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20     winDlClose,  
b690: 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
b6a0: 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64  e */.    winRand
b6b0: 6f 6d 6e 65 73 73 2c 20 20 20 20 20 2f 2a 20 78  omness,     /* x
b6c0: 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20  Randomness */.  
b6d0: 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20    winSleep,     
b6e0: 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a       /* xSleep *
b6f0: 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74  /.    winCurrent
b700: 54 69 6d 65 2c 20 20 20 20 2f 2a 20 78 43 75 72  Time,    /* xCur
b710: 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20  rentTime */.    
b720: 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 20  winGetLastError 
b730: 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72     /* xGetLastEr
b740: 72 6f 72 20 2a 2f 0a 20 20 7d 3b 0a 20 20 73 71  ror */.  };.  sq
b750: 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
b760: 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29 3b 0a  er(&winVfs, 1);.
b770: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b780: 4f 4b 3b 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  OK; .}.int sqlit
b790: 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b  e3_os_end(void){
b7a0: 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
b7b0: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  E_OK;.}..#endif 
b7c0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  /* SQLITE_OS_WIN
b7d0: 20 2a 2f 0a                                       */.